From 0cc4b85df4cabe1c8163f5182fd48090cf2080ba Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Sun, 13 Sep 2026 22:31:51 +0200
Subject: [PATCH 01/62] Improve changelog generation
Use execFileSync for safer git command execution and wrap generated changelog output in a collapsible details block. This avoids shell quoting issues, keeps the output cleaner, and makes recent commit history easier to read in the generated changelog.
---
generate-changelog.js | 26 +++++++++++++++++---------
1 file changed, 17 insertions(+), 9 deletions(-)
diff --git a/generate-changelog.js b/generate-changelog.js
index c2225c08..6e18cc49 100644
--- a/generate-changelog.js
+++ b/generate-changelog.js
@@ -1,22 +1,30 @@
-const { execSync } = require("node:child_process");
+const { execFileSync } = require("node:child_process");
const { writeFileSync } = require("node:fs");
try {
- const lastTag = execSync("git describe --tags --abbrev=0", {
+ const lastTag = execFileSync("git", ["describe", "--tags", "--abbrev=0"], {
encoding: "utf8",
}).trim();
- const command = `git log ${lastTag}..HEAD --no-merges --pretty=format:"- _[%h](https://github.com/shadowdara/finder/tree/%H)_ %s%n%b"`;
+ const format =
+ "- _[%h](https://github.com/shadowdara/finder/tree/%H)_ %s%n%b";
+
+ const commits = execFileSync(
+ "git",
+ ["log", `${lastTag}..HEAD`, "--no-merges", `--pretty=format:${format}`],
+ { encoding: "utf8" },
+ ).trim();
const output =
- "# Newest Changes \n\n" +
- execSync(command, {
- encoding: "utf8",
- }).trim();
+ "# Newest Changes\n\n" +
+ "\n" +
+ "Commits \n\n" +
+ commits +
+ "\n\n \n";
- writeFileSync("Newest_Changes.md", output + "\n", "utf8");
+ writeFileSync("Newest_Changes.md", output, "utf8");
- console.log(`Changelog erstellt: Newest_Changes.md`);
+ console.log("Changelog erstellt: Newest_Changes.md");
console.log(`Seit Tag: ${lastTag}`);
} catch (error) {
console.error("Fehler beim Erstellen des Changelogs:");
From 3d4c3d0cb2144ae0e559a83538a7ffaa1d0f1821 Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Sun, 13 Sep 2026 23:08:46 +0200
Subject: [PATCH 02/62] Add template issue and build updates
Refreshes the repo's GitHub issue and PR templates to cover bug reports, feature requests, and new Finder templates with clearer validation guidance. It also adds a dedicated template issue form, updates the language metadata in .gitattributes, and extends the Windows build script to compile and report the CSF binary.
---
.gitattributes | 8 +-
.github/ISSUE_TEMPLATE/bug_report.yml | 46 +++++++++--
.github/ISSUE_TEMPLATE/feature_request.yml | 14 +++-
.github/ISSUE_TEMPLATE/new_template.yml | 91 ++++++++++++++++++++++
.github/PULL_REQUEST_TEMPLATE.md | 44 ++++++++++-
build.bat | 9 ++-
6 files changed, 192 insertions(+), 20 deletions(-)
create mode 100644 .github/ISSUE_TEMPLATE/new_template.yml
diff --git a/.gitattributes b/.gitattributes
index b53d643a..0d68cdfd 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -9,9 +9,9 @@
# mark samfile as shell
samfile linguist-language=Shell
-go.work linguist-language=go
-go.mod linguist-language=go
-go.sum linguist-language=go
+go.work linguist-language=Go
+go.mod linguist-language=Go
+go.sum linguist-language=Go
docker-compose.yml linguist-language=Dockerfile
@@ -29,3 +29,5 @@ docker-compose.yml linguist-language=Dockerfile
/npm/site/src/templates.js linguist-vendored
/.obsidian/** linguist-vendored
+
+/install2.sh linguist-vendored
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index dba7baf5..20f81cff 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -6,29 +6,61 @@ body:
- type: markdown
attributes:
value: |
- Thanks for taking the time to file a bug report! Please answer the questions below.
- - type: input
+ Thanks for taking the time to file a bug report! Please fill in as much detail as you can.
+
+ - type: textarea
id: description
attributes:
label: Describe the bug
description: What did you expect to happen? What happened instead?
placeholder: "Detailed bug description"
+ validations:
required: true
- - type: input
+
+ - type: textarea
id: steps
attributes:
label: Steps to Reproduce
description: Provide step-by-step instructions to reproduce the bug
placeholder: |
- 1. …
- 2. …
+ 1. Run `./finder ` in ...
+ 2. ...
+ validations:
+ required: true
+
- type: input
id: environment
attributes:
label: Environment
- description: OS, version, go version, etc.
+ description: OS, finder version (`./finder --version`), Go version (if building from source)
+ placeholder: "Windows 11, finder 0.3.17, Go 1.22"
+ validations:
+ required: true
+
+ - type: markdown
+ attributes:
+ value: |
+ ---
+ ## Template-related bug?
+
+ If the bug is about a specific Finder template, please also fill in the sections below.
+
+ - type: input
+ id: template_name
+ attributes:
+ label: Affected template
+ description: Name of the template, e.g. `django` — leave empty if this is not template-related
+ placeholder: "django"
+
+ - type: textarea
+ id: template_content
+ attributes:
+ label: Template file
+ description: Paste the JSON5 template and describe the folder it should have matched (or link to the file)
+ render: json
+
- type: textarea
id: logs
attributes:
label: Logs / Screenshots
- description: Paste any error messages or screenshots
+ description: Paste any error messages, terminal output, or screenshots
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml
index 5ac9ee74..5fe6cea8 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.yml
+++ b/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -7,23 +7,31 @@ body:
attributes:
value: |
Suggest a new feature or improvement. Please describe why this change is needed.
- - type: input
+
+ > **Tip:** Looking for a new Finder template? Please use the dedicated **🧩 New Finder Template** issue form instead — it collects everything needed to review a template quickly.
+
+ - type: textarea
id: goal
attributes:
label: What is the goal?
description: Summarize the suggestion in your own words
+ placeholder: "Finder should be able to detect ..."
+ validations:
required: true
+
- type: textarea
id: motivation
attributes:
label: Motivation and Context
description: Why is this change valuable? What problem does it solve?
+
- type: textarea
id: implementation
attributes:
label: Possible Implementation
- description: Optional ideas how this could be implemented
- - type: input
+ description: Optional ideas on how this could be implemented
+
+ - type: textarea
id: alternatives
attributes:
label: Alternatives considered
diff --git a/.github/ISSUE_TEMPLATE/new_template.yml b/.github/ISSUE_TEMPLATE/new_template.yml
new file mode 100644
index 00000000..ee6d68f9
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/new_template.yml
@@ -0,0 +1,91 @@
+name: 🧩 New Finder Template
+description: Propose or contribute a new Finder template (JSON5)
+title: "[TEMPLATE] "
+labels: ["template", "enhancement"]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Thanks for contributing a new Finder template! Templates are JSON5 files that describe a project type so Finder can detect it.
+
+ **Useful references:**
+ - Template authoring guide: [`AGENTS.md`](../../AGENTS.md)
+ - Custom templates guide: [`CUSTOM_TEMPLATES.md`](../../CUSTOM_TEMPLATES.md)
+ - JSON schemas: `.finder/shema/`
+
+ - type: input
+ id: template_name
+ attributes:
+ label: Template name
+ description: The filename without `.json5` becomes the template name, e.g. `my-template`
+ placeholder: "my-template"
+ validations:
+ required: true
+
+ - type: textarea
+ id: template_description
+ attributes:
+ label: Description
+ description: Short human-readable explanation of the project type this template matches
+ placeholder: "A monorepo using pnpm workspaces with apps/ and packages/"
+ validations:
+ required: true
+
+ - type: textarea
+ id: match_signals
+ attributes:
+ label: Match signals
+ description: The smallest set of reliable files and folders that uniquely identify this project type
+ value: |
+ Files:
+ - ...
+
+ Folders:
+ - ...
+ validations:
+ required: true
+
+ - type: input
+ id: tags
+ attributes:
+ label: Suggested tags
+ description: Comma-separated tags for discoverability
+ placeholder: "node, typescript, monorepo"
+
+ - type: textarea
+ id: template_content
+ attributes:
+ label: Template content (JSON5)
+ description: 'Paste the full valid JSON5 template. Use `name: "*"` unless a narrower pattern is necessary.'
+ render: json
+ placeholder: |
+ {
+ description: "My project type",
+ name: "*",
+ files: ["package.json"],
+ tags: ["my-tag"],
+ min_version: "0.3.16",
+ }
+ validations:
+ required: true
+
+ - type: textarea
+ id: validation
+ attributes:
+ label: Validation output
+ description: Paste the output of the validation commands below, if possible
+ render: shell
+ placeholder: |
+ ./finder check
+ ./finder
+
+ - type: checkboxes
+ id: checklist
+ attributes:
+ label: Checklist
+ options:
+ - label: Valid `.json5` file matching the schema in `.finder/shema/`
+ - label: '`name` set to `"*"` unless a narrower pattern is intentional'
+ - label: Minimal and specific required files/folders — no generic markers
+ - label: Includes a clear `description` and useful `tags`
+ - label: Validated with `./finder check`
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 4d822e55..bd92a4a6 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -1,31 +1,69 @@
## 📌 Summary
-*Describe the change in a few sentences*
+
+_Describe the change in a few sentences_
## 🔍 Related Issue
+
Closes #
## 🛠 Proposed Changes
+
- Change 1
- Change 2
-- ...
+- …
## 🧪 Testing
+
1. …
2. …
+---
+
+## 🧩 Finder Template Changes
+
+
+
+### Template checklist
+
+- [ ] Template is a valid `.json5` file
+- [ ] Template matches the schema in `.finder/shema/` (`finder-template.schema.json` / `finder-template.v2.schema.json`)
+- [ ] `name` is `"*"` unless a narrower pattern is intentional
+- [ ] Requires only the minimal set of files/folders needed to identify the project type
+- [ ] Includes a clear `description` and useful `tags`
+- [ ] Avoids generic markers that cause false positives (e.g. `README.md` alone)
+- [ ] Validated with `./finder check`
+- [ ] Tested against a real folder with `./finder `
+- [ ] Documentation updated (`CUSTOM_TEMPLATES.md`, `tags.md`) if applicable
+
+### Validation output
+
+
+
+```
+./finder check
+./finder
+```
+
+---
+
## 📸 Screenshots (if applicable)
-## ✅ Checklist
+## ✅ Final Checklist
- [ ] PR title is descriptive
- [ ] Changes are tested
diff --git a/build.bat b/build.bat
index 884ef91c..0e708669 100644
--- a/build.bat
+++ b/build.bat
@@ -3,10 +3,11 @@
go build -ldflags="-s -w" ./cmd/finder
go build -ldflags="-s -w" ./cmd/findergen
go build -ldflags="-s -w" ./cmd/tester
+go build -ldflags="-s -w" ./cmd/csf
-for %%F in ("finder.exe") do echo Größe: %%~zF Bytes
-for %%F in ("findergen.exe") do echo Größe: %%~zF Bytes
+for %%F in ("finder.exe") do echo Größe: %%~zF Bytes Finder
+for %%F in ("findergen.exe") do echo Größe: %%~zF Bytes Findergen
+for %%F in ("tester.exe") do echo Größe: %%~zF Bytes tester
+for %%F in ("csf.exe") do echo Größe: %%~zF Bytes CSF
echo Finished!
-
-.\findergen
From b51cc2601b2d7aec9e0637c9f4504bd0b063ba99 Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 00:01:49 +0200
Subject: [PATCH 03/62] Add 'validate' command for single template
Add a new CLI command 'validate' (alias 'val') to validate a single Finder template by path or by template name. Implements Validate(args []string) which loads a file or resolves built-in/custom templates, runs JSON5 preprocessing when needed, unmarshals into the template structure, validates the schema, prints a tabular result with warnings for JSON5-only templates, and exits non-zero on failures. Update README, npm site docs, and CUSTOM_TEMPLATES.md to document the new command.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---
CUSTOM_TEMPLATES.md | 16 ++++++
README.md | 26 +++++++++
internal/cli/commands.go | 8 +++
internal/cli/handle.go | 113 +++++++++++++++++++++++++++++++++++++++
npm/site/docs/readme.md | 1 +
5 files changed, 164 insertions(+)
diff --git a/CUSTOM_TEMPLATES.md b/CUSTOM_TEMPLATES.md
index 3079c6b0..00c4c2d9 100644
--- a/CUSTOM_TEMPLATES.md
+++ b/CUSTOM_TEMPLATES.md
@@ -138,6 +138,22 @@ finder check
This validates both built-in and custom templates.
+### Validate a single template:
+```bash
+finder validate my-template.json5
+```
+
+or by template name (built-in or custom):
+
+```bash
+finder validate mycustomtemplate
+```
+
+If the template is not plain JSON and only parses after the JSON5
+preprocessor runs, a warning is shown next to the result. This helps
+you notice that the template relies on JSON5-only syntax (like
+unquoted keys).
+
## Overriding Built-in Templates
If you place a custom template with the same name as a built-in template, your custom version will take precedence.
diff --git a/README.md b/README.md
index 5f8448b0..c0705485 100644
--- a/README.md
+++ b/README.md
@@ -120,6 +120,7 @@ finder git
| ------------------------ | --------- | ------------------------------------------ |
| `finder ` | | Search for projects matching a template |
| `finder check` | | Validate all built-in and custom templates |
+| `finder validate` | `val` | Validate a single template file |
| `finder list` | `ls` | List all available templates |
| `finder tags` | `tag` | Show all tags in the console |
| `finder -t ` | | Search for templates by tag |
@@ -165,6 +166,31 @@ finder -t python
finder list
```
+### Validate a single template
+
+```bash
+# Validate a template file by path
+finder validate my-template.json5
+
+# Validate a built-in or custom template by name
+finder validate go
+
+# Validate multiple templates at once
+finder validate templates/go.json5 templates/django.json5
+
+# Short alias
+finder val my-template.json5
+```
+
+If a template file is not plain JSON and only parses after the JSON5
+preprocessor runs, a warning is printed so you know the template
+depends on JSON5 features (e.g. unquoted keys):
+
+```text
+File Result Warning
+my-template.json5 OK (File) Template is not plain JSON - it needs the JSON5 preprocessor to be parsed
+```
+
## Templates
### Built-in templates
diff --git a/internal/cli/commands.go b/internal/cli/commands.go
index c468a90e..d73d61c2 100644
--- a/internal/cli/commands.go
+++ b/internal/cli/commands.go
@@ -80,6 +80,10 @@ func HandleCommand(args []string) {
checkCmd := argparser.NewCommand("check",
"to check all available Templates if their syntax is correct", "", false)
+ // Validate Command
+ validateCmd := argparser.NewCommand("validate",
+ "to validate a single finder template file", "", false, "val")
+
// list, ls Command
listCmd := argparser.NewCommand("list",
"list all available templates", "", false, "ls")
@@ -105,6 +109,7 @@ func HandleCommand(args []string) {
root.AddSubcommand(versionCmd)
root.AddSubcommand(templateCmd)
root.AddSubcommand(checkCmd)
+ root.AddSubcommand(validateCmd)
root.AddSubcommand(listCmd)
root.AddSubcommand(tagsCmd)
root.AddSubcommand(tagSearchCmd)
@@ -141,6 +146,9 @@ func HandleCommand(args []string) {
case checkCmd:
// Check
Check()
+ case validateCmd:
+ // Validate a single template file
+ Validate(cmd.Args)
case listCmd:
// List
List()
diff --git a/internal/cli/handle.go b/internal/cli/handle.go
index aa191c85..bc1d2820 100644
--- a/internal/cli/handle.go
+++ b/internal/cli/handle.go
@@ -5,6 +5,7 @@ import (
"fmt"
"log"
"os"
+ "path/filepath"
"text/tabwriter"
@@ -17,6 +18,7 @@ import (
"github.com/shadowdara/finder/internal/templates"
"github.com/shadowdara/finder/pub/color"
"github.com/shadowdara/finder/pub/goansi"
+ "github.com/shadowdara/finder/pub/json5"
)
// Function to search for a Template
@@ -285,6 +287,117 @@ func Check() error {
return nil
}
+// Validate checks a single finder template file for correctness.
+// The file can be passed as a path (relative or absolute) or as a
+// template name (built-in or custom). If the file is not valid JSON
+// but becomes valid after the JSON5 preprocessing step, a warning is
+// printed to inform the user that the template depends on the JSON5
+// preprocessor.
+func Validate(args []string) error {
+ templatecount := len(args)
+ fmt.Printf("%sValidating %d Template(s)%s\n", color.Yellow, templatecount, color.Reset)
+
+ if templatecount <= 0 {
+ fmt.Println("Usage: finder validate [more files ...]")
+ return nil
+ }
+
+ // Load user templates so custom template names can be resolved and
+ // so we can detect whether a name refers to a built-in template.
+ _, userTemplates, err := templates.LoadAllWithUserTemplates()
+ if err != nil {
+ fmt.Printf("%sWarning: %v%s\n", color.Yellow, err, color.Reset)
+ }
+
+ failed := false
+ w := tabwriter.NewWriter(os.Stdout, 0, 8, 2, ' ', 0)
+ fmt.Fprintf(w, "%sFile%s\t%sResult%s\tWarning\n", goansi.WHITE, goansi.END, goansi.WHITE, goansi.END)
+
+ for _, arg := range args {
+ name := filepath.Base(arg)
+ displayName := arg
+
+ // Resolve the template contents: prefer a file on disk
+ // (path given), otherwise fall back to built-in/custom
+ // template lookup by name.
+ var data []byte
+ fromName := false
+ if _, err := os.Stat(arg); err == nil {
+ data, err = os.ReadFile(arg)
+ if err != nil {
+ fmt.Fprintf(w, "%s%s%s\t%sError reading: %v%s\t%s\n", color.Red, displayName, color.Reset, color.Red, err, color.Reset, "---")
+ failed = true
+ continue
+ }
+ } else {
+ data, err = templates.JSONtemplateLoaderWithUserTemplates(name, userTemplates)
+ if err != nil {
+ fmt.Fprintf(w, "%s%s%s\t%sNOT FOUND%s\t%s\n", color.Red, displayName, color.Reset, color.Red, err, color.Reset)
+ failed = true
+ continue
+ }
+ fromName = true
+ }
+
+ content := string(data)
+
+ // Check whether the raw content is valid JSON (no JSON5 preprocessor needed)
+ validJSON := json.Valid([]byte(content))
+
+ // Load into the folder structure to catch schema/validation
+ // errors. We unmarshal manually (instead of structure.LoadJSON5,
+ // which would log.Fatalf on bad input and abort the whole
+ // command) so every file gets reported.
+ normalized := content
+ if !validJSON {
+ normalized = json5.PreprocessJSON5(content)
+ }
+
+ var folder structure.Folder
+ if err := json.Unmarshal([]byte(normalized), &folder); err != nil {
+ fmt.Fprintf(w, "%s%s%s\t%sINVALID%s\t%s%v%s\n", color.Red, displayName, color.Reset, color.Red, color.Reset, "---", err, color.Reset)
+ failed = true
+ continue
+ }
+
+ if err := folder.Files.Validate(); err != nil {
+ fmt.Fprintf(w, "%s%s%s\t%sINVALID%s\t%s%v%s\n", color.Red, displayName, color.Reset, color.Red, color.Reset, "---", err, color.Reset)
+ failed = true
+ continue
+ }
+
+ source := "Built-in"
+ if fromName {
+ if _, isCustom := userTemplates[name]; isCustom {
+ source = "Custom"
+ }
+ } else {
+ source = "File"
+ }
+
+ var warning string
+ if !validJSON {
+ warning = fmt.Sprintf("%sTemplate is not plain JSON - it needs the JSON5 preprocessor to be parsed%s", color.Yellow, color.Reset)
+ } else {
+ warning = "---"
+ }
+
+ fmt.Fprintf(w, "%s%s%s\t%sOK%s (%s)\t%s\n",
+ color.Cyan, displayName, color.Reset,
+ color.Green, color.Reset, source, warning)
+ }
+
+ w.Flush()
+
+ if failed {
+ fmt.Printf("%sValidation failed!%s\n", color.Red, color.Reset)
+ os.Exit(1)
+ }
+
+ fmt.Printf("%sValidation complete. All Templates are valid!%s\n", color.Green, color.Reset)
+ return nil
+}
+
// handleList displays all available templates
func List() error {
fmt.Println("List available Templates:")
diff --git a/npm/site/docs/readme.md b/npm/site/docs/readme.md
index 5f8448b0..279041ad 100644
--- a/npm/site/docs/readme.md
+++ b/npm/site/docs/readme.md
@@ -120,6 +120,7 @@ finder git
| ------------------------ | --------- | ------------------------------------------ |
| `finder ` | | Search for projects matching a template |
| `finder check` | | Validate all built-in and custom templates |
+| `finder validate` | `val` | Validate a single template file |
| `finder list` | `ls` | List all available templates |
| `finder tags` | `tag` | Show all tags in the console |
| `finder -t ` | | Search for templates by tag |
From 0200bcc9ffcf21381d4d14e25d76e2e90c68752c Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 00:11:58 +0200
Subject: [PATCH 04/62] Improve template validation and JSON output
This change hardens template validation by parsing templates manually, checking file validation rules, and surfacing template-specific errors without aborting the whole check. It also adds JSON output support to `finder validate` while preserving non-zero exit codes for failed validations. The Jaeger template metadata was fixed to use a proper `tags` array instead of a single string.
---
internal/cli/commands.go | 2 +-
internal/cli/handle.go | 151 ++++++++++++++++++++++++++++----
internal/templates/jaeger.json5 | 2 +-
templates/jaeger.json5 | 4 +-
4 files changed, 139 insertions(+), 20 deletions(-)
diff --git a/internal/cli/commands.go b/internal/cli/commands.go
index d73d61c2..08b98dc3 100644
--- a/internal/cli/commands.go
+++ b/internal/cli/commands.go
@@ -148,7 +148,7 @@ func HandleCommand(args []string) {
Check()
case validateCmd:
// Validate a single template file
- Validate(cmd.Args)
+ Validate(cmd.Args, finderconfig.OutputType)
case listCmd:
// List
List()
diff --git a/internal/cli/handle.go b/internal/cli/handle.go
index bc1d2820..219d6b4d 100644
--- a/internal/cli/handle.go
+++ b/internal/cli/handle.go
@@ -255,6 +255,7 @@ func Check() error {
w := tabwriter.NewWriter(os.Stdout, 0, 8, 2, ' ', 0)
fmt.Fprintf(w, "%sName%s\t%sSource%s\tDescription\n", goansi.WHITE, goansi.END, goansi.WHITE, goansi.END)
+ failed := false
for _, templ := range templateNames {
// Check for blocked templates
blockednames := loader.GetBlockedTemplateNames()
@@ -267,10 +268,37 @@ func Check() error {
data, err := templates.JSONtemplateLoaderWithUserTemplates(templ, userTemplates)
if err != nil {
fmt.Fprintf(w, "%s%s (ERROR)%s\t%s\t%s\n", color.Red, templ, color.Reset, "Error loading", "---")
+ failed = true
continue
}
- folder := structure.LoadJSON5(string(data))
+ // Parse manually instead of structure.LoadJSON5 (which would
+ // log.Fatalf and abort the whole check without telling us
+ // which template failed and why).
+ validJSON := json.Valid(data)
+ normalized := string(data)
+ if !validJSON {
+ normalized = json5.PreprocessJSON5(normalized)
+ }
+
+ var folder structure.Folder
+ if err := json.Unmarshal([]byte(normalized), &folder); err != nil {
+ fmt.Fprintf(w, "%s%s (ERROR)%s\t%s%s%s\t%s\n",
+ color.Red, templ, color.Reset,
+ "Error parsing", ":", err, color.Reset,
+ "---")
+ failed = true
+ continue
+ }
+
+ if err := folder.Files.Validate(); err != nil {
+ fmt.Fprintf(w, "%s%s (ERROR)%s\t%s%s%s\t%s\n",
+ color.Red, templ, color.Reset,
+ "Invalid template", ":", err, color.Reset,
+ "---")
+ failed = true
+ continue
+ }
// Determine source (built-in or custom)
source := goansi.WHITE + "Built-in" + goansi.END
@@ -283,6 +311,11 @@ func Check() error {
}
w.Flush()
+
+ if failed {
+ fmt.Printf("%sFinished Checking with Errors!%s\n", color.Red, color.Reset)
+ os.Exit(1)
+ }
fmt.Printf("%sFinished Checking!%s\n", color.Green, color.Reset)
return nil
}
@@ -293,11 +326,33 @@ func Check() error {
// but becomes valid after the JSON5 preprocessing step, a warning is
// printed to inform the user that the template depends on the JSON5
// preprocessor.
-func Validate(args []string) error {
+//
+// OutputType controls the result format: "json" produces a single
+// machine readable JSON object on stdout, any other value produces the
+// human readable table. In JSON mode the process still exits non-zero
+// if any template failed validation.
+func Validate(args []string, OutputType string) error {
templatecount := len(args)
- fmt.Printf("%sValidating %d Template(s)%s\n", color.Yellow, templatecount, color.Reset)
+ if OutputType != "json" {
+ fmt.Printf("%sValidating %d Template(s)%s\n", color.Yellow, templatecount, color.Reset)
+ }
if templatecount <= 0 {
+ if OutputType == "json" {
+ out := struct {
+ Valid bool `json:"valid"`
+ Count int `json:"count"`
+ Error string `json:"error"`
+ Usage string `json:"usage"`
+ }{
+ Valid: false,
+ Count: 0,
+ Error: "no templates given",
+ Usage: "finder validate [more files ...]",
+ }
+ json.NewEncoder(os.Stdout).Encode(out)
+ os.Exit(1)
+ }
fmt.Println("Usage: finder validate [more files ...]")
return nil
}
@@ -310,12 +365,26 @@ func Validate(args []string) error {
}
failed := false
+ // result of a single template validation
+ type validateResult struct {
+ File string `json:"file"`
+ Source string `json:"source"`
+ Valid bool `json:"valid"`
+ Error string `json:"error,omitempty"`
+ JSON5 bool `json:"json5,omitempty"` // true when JSON5 preprocessor was needed
+ Warning string `json:"warning,omitempty"`
+ }
+ results := []validateResult{}
+
w := tabwriter.NewWriter(os.Stdout, 0, 8, 2, ' ', 0)
- fmt.Fprintf(w, "%sFile%s\t%sResult%s\tWarning\n", goansi.WHITE, goansi.END, goansi.WHITE, goansi.END)
+ if OutputType != "json" {
+ fmt.Fprintf(w, "%sFile%s\t%sResult%s\tWarning\n", goansi.WHITE, goansi.END, goansi.WHITE, goansi.END)
+ }
for _, arg := range args {
name := filepath.Base(arg)
displayName := arg
+ res := validateResult{File: displayName}
// Resolve the template contents: prefer a file on disk
// (path given), otherwise fall back to built-in/custom
@@ -325,14 +394,24 @@ func Validate(args []string) error {
if _, err := os.Stat(arg); err == nil {
data, err = os.ReadFile(arg)
if err != nil {
- fmt.Fprintf(w, "%s%s%s\t%sError reading: %v%s\t%s\n", color.Red, displayName, color.Reset, color.Red, err, color.Reset, "---")
+ res.Valid = false
+ res.Error = fmt.Sprintf("error reading: %v", err)
+ results = append(results, res)
+ if OutputType != "json" {
+ fmt.Fprintf(w, "%s%s%s\t%sError reading: %v%s\t%s\n", color.Red, displayName, color.Reset, color.Red, err, color.Reset, "---")
+ }
failed = true
continue
}
} else {
data, err = templates.JSONtemplateLoaderWithUserTemplates(name, userTemplates)
if err != nil {
- fmt.Fprintf(w, "%s%s%s\t%sNOT FOUND%s\t%s\n", color.Red, displayName, color.Reset, color.Red, err, color.Reset)
+ res.Valid = false
+ res.Error = fmt.Sprintf("not found: %v", err)
+ results = append(results, res)
+ if OutputType != "json" {
+ fmt.Fprintf(w, "%s%s%s\t%sNOT FOUND%s\t%s\n", color.Red, displayName, color.Reset, color.Red, err, color.Reset)
+ }
failed = true
continue
}
@@ -355,13 +434,23 @@ func Validate(args []string) error {
var folder structure.Folder
if err := json.Unmarshal([]byte(normalized), &folder); err != nil {
- fmt.Fprintf(w, "%s%s%s\t%sINVALID%s\t%s%v%s\n", color.Red, displayName, color.Reset, color.Red, color.Reset, "---", err, color.Reset)
+ res.Valid = false
+ res.Error = err.Error()
+ results = append(results, res)
+ if OutputType != "json" {
+ fmt.Fprintf(w, "%s%s%s\t%sINVALID%s\t%s%v%s\n", color.Red, displayName, color.Reset, color.Red, color.Reset, "---", err, color.Reset)
+ }
failed = true
continue
}
if err := folder.Files.Validate(); err != nil {
- fmt.Fprintf(w, "%s%s%s\t%sINVALID%s\t%s%v%s\n", color.Red, displayName, color.Reset, color.Red, color.Reset, "---", err, color.Reset)
+ res.Valid = false
+ res.Error = err.Error()
+ results = append(results, res)
+ if OutputType != "json" {
+ fmt.Fprintf(w, "%s%s%s\t%sINVALID%s\t%s%v%s\n", color.Red, displayName, color.Reset, color.Red, color.Reset, "---", err, color.Reset)
+ }
failed = true
continue
}
@@ -375,26 +464,54 @@ func Validate(args []string) error {
source = "File"
}
- var warning string
+ warning := ""
if !validJSON {
- warning = fmt.Sprintf("%sTemplate is not plain JSON - it needs the JSON5 preprocessor to be parsed%s", color.Yellow, color.Reset)
- } else {
- warning = "---"
+ warning = "Template is not plain JSON - it needs the JSON5 preprocessor to be parsed"
}
- fmt.Fprintf(w, "%s%s%s\t%sOK%s (%s)\t%s\n",
- color.Cyan, displayName, color.Reset,
- color.Green, color.Reset, source, warning)
+ res.Valid = true
+ res.Source = source
+ res.JSON5 = !validJSON
+ res.Warning = warning
+ results = append(results, res)
+
+ if OutputType != "json" {
+ fmt.Fprintf(w, "%s%s%s\t%sOK%s (%s)\t%s%s%s\n",
+ color.Cyan, displayName, color.Reset,
+ color.Green, color.Reset, source,
+ color.Yellow, warning, color.Reset)
+ }
}
- w.Flush()
+ if OutputType == "json" {
+ // Single JSON object on stdout (machine readable).
+ out := struct {
+ Valid bool `json:"valid"`
+ Count int `json:"count"`
+ Results []validateResult `json:"results"`
+ }{
+ Valid: !failed,
+ Count: len(results),
+ Results: results,
+ }
+ if err := json.NewEncoder(os.Stdout).Encode(out); err != nil {
+ fmt.Println("JSON encoding error:", err)
+ }
+ } else {
+ w.Flush()
+ }
if failed {
+ if OutputType == "json" {
+ os.Exit(1)
+ }
fmt.Printf("%sValidation failed!%s\n", color.Red, color.Reset)
os.Exit(1)
}
- fmt.Printf("%sValidation complete. All Templates are valid!%s\n", color.Green, color.Reset)
+ if OutputType != "json" {
+ fmt.Printf("%sValidation complete. All Templates are valid!%s\n", color.Green, color.Reset)
+ }
return nil
}
diff --git a/internal/templates/jaeger.json5 b/internal/templates/jaeger.json5
index 16fdd003..5fbf9b47 100644
--- a/internal/templates/jaeger.json5
+++ b/internal/templates/jaeger.json5
@@ -1 +1 @@
-{"description":"Jaeger distributed tracing","files":["docker-compose.yml"],"folders":[],"min_version":"0.3.16","name":"*","tags":"docker"}
\ No newline at end of file
+{"description":"Jaeger distributed tracing","files":["docker-compose.yml"],"folders":[],"min_version":"0.3.16","name":"*","tags":["docker"]}
\ No newline at end of file
diff --git a/templates/jaeger.json5 b/templates/jaeger.json5
index 183d57d9..44397101 100644
--- a/templates/jaeger.json5
+++ b/templates/jaeger.json5
@@ -5,6 +5,8 @@
"files": [
"docker-compose.yml"
],
- "tags": "docker",
+ "tags": [
+ "docker"
+ ],
"min_version": "0.3.16"
}
From 8cb4626985ad0070b0e1a9b1216533897d405071 Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 00:18:23 +0200
Subject: [PATCH 05/62] safe lockfile
---
package.json | 11 +
pnpm-lock.yaml | 7429 +++++++++++++++++++++++++++++++++++++++++++
pnpm-workspace.yaml | 4 +
3 files changed, 7444 insertions(+)
create mode 100644 package.json
create mode 100644 pnpm-lock.yaml
create mode 100644 pnpm-workspace.yaml
diff --git a/package.json b/package.json
new file mode 100644
index 00000000..54ae5478
--- /dev/null
+++ b/package.json
@@ -0,0 +1,11 @@
+{
+ "name": "finder",
+ "private": true,
+ "scripts": {
+ "dev": "pnpm --filter web dev",
+ "build": "pnpm --filter web build"
+ },
+ "devDependencies": {
+ "@shadowdara/linguist-js": "*"
+ }
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 00000000..8acae43e
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,7429 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ devDependencies:
+ linguist-js:
+ specifier: ^3.0.3
+ version: 3.0.3
+
+ npm/finder-lib:
+ devDependencies:
+ '@types/node':
+ specifier: ^25.5.2
+ version: 25.9.6
+ typescript:
+ specifier: ^6.0.2
+ version: 6.0.3
+
+ npm/hub:
+ dependencies:
+ '@base-ui/react':
+ specifier: ^1.5.0
+ version: 1.8.0(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
+ '@monaco-editor/react':
+ specifier: ^4.7.0
+ version: 4.7.0(monaco-editor@0.56.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
+ '@prisma/client':
+ specifier: ^6.19.3
+ version: 6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3)
+ '@shadowdara/dlib':
+ specifier: ^0.0.4
+ version: 0.0.4
+ '@shadowdara/finder-lib':
+ specifier: 0.3.17
+ version: 0.3.17
+ '@vercel/analytics':
+ specifier: 1.6.1
+ version: 1.6.1(next@16.3.3(@babel/core@7.29.7)(@types/node@24.13.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(sass@1.104.1))(react@19.3.0)
+ better-auth:
+ specifier: ^1.7.4
+ version: 1.7.4(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(next@16.3.3(@babel/core@7.29.7)(@types/node@24.13.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(sass@1.104.1))(prisma@6.19.3(typescript@5.7.3))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
+ class-variance-authority:
+ specifier: ^0.7.1
+ version: 0.7.1
+ clsx:
+ specifier: ^2.1.1
+ version: 2.1.1
+ highlight.js:
+ specifier: ^11.12.0
+ version: 11.12.0
+ lucide-react:
+ specifier: ^1.16.0
+ version: 1.45.0(react@19.3.0)
+ next:
+ specifier: 16.3.3
+ version: 16.3.3(@babel/core@7.29.7)(@types/node@24.13.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(sass@1.104.1)
+ react:
+ specifier: ^19
+ version: 19.3.0
+ react-dom:
+ specifier: ^19
+ version: 19.3.0(react@19.3.0)
+ shadcn:
+ specifier: ^4.11.0
+ version: 4.21.0(typescript@5.7.3)
+ tailwind-merge:
+ specifier: ^3.3.1
+ version: 3.7.0
+ tw-animate-css:
+ specifier: ^1.4.0
+ version: 1.4.0
+ devDependencies:
+ '@tailwindcss/postcss':
+ specifier: ^4.3.3
+ version: 4.3.3
+ '@types/highlight.js':
+ specifier: ^10.1.0
+ version: 10.1.0
+ '@types/node':
+ specifier: ^24
+ version: 24.13.4
+ '@types/react':
+ specifier: ^19
+ version: 19.3.0
+ '@types/react-dom':
+ specifier: ^19
+ version: 19.3.0(@types/react@19.3.0)
+ postcss:
+ specifier: ^8.5
+ version: 8.5.28
+ prisma:
+ specifier: 6.19.3
+ version: 6.19.3(typescript@5.7.3)
+ tailwindcss:
+ specifier: ^4.3.3
+ version: 4.3.3
+ typescript:
+ specifier: 5.7.3
+ version: 5.7.3
+
+ npm/site:
+ dependencies:
+ '@shadowdara/dlib':
+ specifier: ^0.0.4
+ version: 0.0.4
+ '@shadowdara/finder-lib':
+ specifier: ^0.3.17
+ version: 0.3.17
+ highlight.js:
+ specifier: ^11.12.0
+ version: 11.12.0
+ jquery:
+ specifier: ^4.0.0
+ version: 4.0.0
+ tellraw-parser:
+ specifier: ^1.0.2
+ version: 1.0.2
+ devDependencies:
+ '@eslint/js':
+ specifier: ^10.0.1
+ version: 10.0.1(eslint@10.10.0(jiti@2.7.0))
+ '@rollup/plugin-yaml':
+ specifier: ^5.0.0
+ version: 5.0.0(rollup@4.63.2)
+ '@tailwindcss/vite':
+ specifier: ^4.3.3
+ version: 4.3.3(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))
+ '@types/html-minifier-terser':
+ specifier: ^7.0.2
+ version: 7.0.2
+ '@types/jquery':
+ specifier: ^4.0.1
+ version: 4.0.1
+ '@types/license-checker':
+ specifier: ^25.0.6
+ version: 25.0.6
+ '@types/node':
+ specifier: ^26.5.0
+ version: 26.5.1
+ '@vitejs/devtools':
+ specifier: ^0.7.2
+ version: 0.7.3(@devframes/json-render@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(crossws@0.4.12(srvx@1.0.4))(srvx@1.0.4)(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))
+ chalk:
+ specifier: ^6.0.0
+ version: 6.0.0
+ esbuild:
+ specifier: '>=0.25.0'
+ version: 0.28.2
+ eslint:
+ specifier: ^10.9.1
+ version: 10.10.0(jiti@2.7.0)
+ html-minifier-terser:
+ specifier: ^7.2.0
+ version: 7.2.0
+ license-checker:
+ specifier: ^25.0.1
+ version: 25.0.1
+ rollup-plugin-string:
+ specifier: ^3.0.0
+ version: 3.0.0
+ rollup-plugin-visualizer:
+ specifier: ^7.1.1
+ version: 7.1.1(rollup@4.63.2)
+ sass:
+ specifier: ^1.104.0
+ version: 1.104.1
+ tailwindcss:
+ specifier: ^4.3.3
+ version: 4.3.3
+ tinyglobby:
+ specifier: ^0.2.17
+ version: 0.2.17
+ tsx:
+ specifier: ^4.23.13
+ version: 4.23.13
+ typescript:
+ specifier: ^5.5.0
+ version: 5.7.3
+ typescript-eslint:
+ specifier: ^8.69.0
+ version: 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@5.7.3)
+ unplugin-remove:
+ specifier: ^1.0.3
+ version: 1.0.3(rollup@4.63.2)
+ vite:
+ specifier: 6.4.3
+ version: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)
+ vite-plugin-eslint:
+ specifier: ^1.8.1
+ version: 1.8.1(eslint@10.10.0(jiti@2.7.0))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))
+
+packages:
+
+ '@alloc/quick-lru@5.3.0':
+ resolution: {integrity: sha512-U4+70Pc5ZS9osnCBCE5Jha/ciHM+Yp+CNMNC/7HvYbNRk1Ldd+f7qO65W5qfhu/TCv+/ozljlXXe9Nj8419DMA==}
+ engines: {node: '>=10'}
+
+ '@babel/code-frame@7.29.7':
+ resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/compat-data@7.29.7':
+ resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.29.7':
+ resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@7.29.8':
+ resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-annotate-as-pure@7.29.7':
+ resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-compilation-targets@7.29.7':
+ resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-create-class-features-plugin@7.29.7':
+ resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-globals@7.29.7':
+ resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-member-expression-to-functions@7.29.7':
+ resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-imports@7.29.7':
+ resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-transforms@7.29.7':
+ resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-optimise-call-expression@7.29.7':
+ resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-plugin-utils@7.29.7':
+ resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-replace-supers@7.29.7':
+ resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-skip-transparent-expression-wrappers@7.29.7':
+ resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.29.7':
+ resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.29.7':
+ resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-option@7.29.7':
+ resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.29.7':
+ resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.29.8':
+ resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/plugin-syntax-jsx@7.29.7':
+ resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-typescript@7.29.7':
+ resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-modules-commonjs@7.29.7':
+ resolution: {integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-typescript@7.29.7':
+ resolution: {integrity: sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/preset-typescript@7.29.7':
+ resolution: {integrity: sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/runtime@7.29.7':
+ resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/template@7.29.7':
+ resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.29.8':
+ resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.29.8':
+ resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==}
+ engines: {node: '>=6.9.0'}
+
+ '@base-ui/react@1.8.0':
+ resolution: {integrity: sha512-P0/1sxo6SBVZOklKMIedvTWqw2s2IQzi9x5bIVsXu980cuSOD4NeuRSs+/L7LZQfDkZP/uRZyGPyfFl/B1oH+Q==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ '@date-fns/tz': ^1.2.0
+ '@types/react': ^17 || ^18 || ^19
+ date-fns: ^4.0.0
+ react: ^17 || ^18 || ^19
+ react-dom: ^17 || ^18 || ^19
+ peerDependenciesMeta:
+ '@date-fns/tz':
+ optional: true
+ '@types/react':
+ optional: true
+ date-fns:
+ optional: true
+
+ '@base-ui/utils@0.4.0':
+ resolution: {integrity: sha512-bO9fz25kKtPf+aZVyfQrC0PDmJdmVni31W2hCS5/Owb+inwdIL3XU26pCPRPlt4LSxZrBgLwubXQXQlKaFEZzw==}
+ peerDependencies:
+ '@types/react': ^17 || ^18 || ^19
+ react: ^17 || ^18 || ^19
+ react-dom: ^17 || ^18 || ^19
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@better-auth/core@1.7.4':
+ resolution: {integrity: sha512-g66dKOMB5PLxoujkxkZeYb6dh5wLhfAx/D+w9XtcO669Dslnyen2naBYqnD1r5ZwnxFKcr6aSrUPaH952V89Lg==}
+ peerDependencies:
+ '@better-auth/utils': 0.4.2
+ '@better-fetch/fetch': 1.3.1
+ '@cloudflare/workers-types': '>=4'
+ '@opentelemetry/api': ^1.9.0
+ better-call: 1.4.0
+ jose: ^6.1.0
+ kysely: ^0.28.5 || ^0.29.0
+ nanostores: ^1.0.1
+ peerDependenciesMeta:
+ '@cloudflare/workers-types':
+ optional: true
+ '@opentelemetry/api':
+ optional: true
+
+ '@better-auth/drizzle-adapter@1.7.4':
+ resolution: {integrity: sha512-J9JMl0DGYNYwtDj5nq/fzycU9dzPUDEtTNn89KmToUrwPDGfByDgfmiQ9jGK+LN3EnfsG1Pt/dDmRocbnfihlA==}
+ peerDependencies:
+ '@better-auth/core': ^1.7.4
+ '@better-auth/utils': 0.4.2
+ drizzle-orm: ^0.45.2 || >=1.0.0-rc.1 <2.0.0
+ peerDependenciesMeta:
+ drizzle-orm:
+ optional: true
+
+ '@better-auth/kysely-adapter@1.7.4':
+ resolution: {integrity: sha512-WHLsTs4ZwTKorifdK6Whol6Zy+0gIzOJEXzWsvzmLtlT1uIZFpd7IPBlDZTrXvIZnxPWJHPIv8/uHqS9QFPZOA==}
+ peerDependencies:
+ '@better-auth/core': ^1.7.4
+ '@better-auth/utils': 0.4.2
+ kysely: ^0.28.17 || ^0.29.0
+ peerDependenciesMeta:
+ kysely:
+ optional: true
+
+ '@better-auth/memory-adapter@1.7.4':
+ resolution: {integrity: sha512-xAihOPh4mFjvKLzmu2XNzj7RchDmytA/d/xjrGyps1oHVGCTGDGghlSt/rIT5fagtTn2R9+TBLh5QrZnTvYu9g==}
+ peerDependencies:
+ '@better-auth/core': ^1.7.4
+ '@better-auth/utils': 0.4.2
+
+ '@better-auth/mongo-adapter@1.7.4':
+ resolution: {integrity: sha512-sIdIc8vONXgQxKPfzL4bbk6gO3gdFEDzC5VG8rD18xSFB6j7blBKcuzOofbswbwwbyuspnshoViGRqSoqp2PnA==}
+ peerDependencies:
+ '@better-auth/core': ^1.7.4
+ '@better-auth/utils': 0.4.2
+ mongodb: ^6.0.0 || ^7.0.0
+ peerDependenciesMeta:
+ mongodb:
+ optional: true
+
+ '@better-auth/prisma-adapter@1.7.4':
+ resolution: {integrity: sha512-cvsMNaXLcwQiAIxQCx5Gq2VA1reW4RjkC5oLNXNJR4IhgeiqcvYF6qKF6UEC0vV2x3euKz5V/SDY/hblHWwx+w==}
+ peerDependencies:
+ '@better-auth/core': ^1.7.4
+ '@better-auth/utils': 0.4.2
+ '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0
+ prisma: ^5.0.0 || ^6.0.0 || ^7.0.0
+ peerDependenciesMeta:
+ '@prisma/client':
+ optional: true
+ prisma:
+ optional: true
+
+ '@better-auth/telemetry@1.7.4':
+ resolution: {integrity: sha512-FycnvWXP1gZ8BlSN1lW9L/YYFVqxi7+n6A9i66gJKdoJqREDdmhxBKOaVCbNhNC2UNDAo9PbBm/6J3gv6WmAEA==}
+ peerDependencies:
+ '@better-auth/core': ^1.7.4
+ '@better-auth/utils': 0.4.2
+ '@better-fetch/fetch': 1.3.1
+
+ '@better-auth/utils@0.4.2':
+ resolution: {integrity: sha512-AUxrvu+HaaODsUyzDxFgwd/8RZ1yZaYo42LXKSrU2oGgR38pS1ij8nqQKNgtTWoYGpNevNXtCfgTy6loHveW9A==}
+
+ '@better-auth/utils@0.5.0':
+ resolution: {integrity: sha512-BL8W4EfIZFwlu0r54m3v1ztjDhu6dDe/amLTm0xybmbZaNgYUqhD3SjpAsnq0q8YD6/ki4iwIgxJNLP/N3TxiA==}
+
+ '@better-fetch/fetch@1.3.1':
+ resolution: {integrity: sha512-ABkD1WhyfPZprKRQI3bhATjeiFuNWC9PXhfGWqL+sg/gKrM977oFrYkdb4msM3hgUGonr7KlOsOFT5TU2rht9g==}
+
+ '@cacheable/memory@2.2.0':
+ resolution: {integrity: sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==}
+
+ '@cacheable/utils@2.5.0':
+ resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==}
+
+ '@devframes/hub-ui@0.9.18':
+ resolution: {integrity: sha512-D3UpluQ7xSZNIDmVIt+rBkJ8b2UMgfC7cywHL6jJIoC5ceDtKfI3Ntid+x+bV+HB/ostTzuoYzSiBUJcCPmyPA==}
+ peerDependencies:
+ '@devframes/hub': 0.9.18
+ '@devframes/json-render': 0.9.18
+ devframe: 0.9.18
+ peerDependenciesMeta:
+ '@devframes/json-render':
+ optional: true
+
+ '@devframes/hub@0.9.18':
+ resolution: {integrity: sha512-sYsJEYiNBPMXRIcte+YNY0wBCV7J4rsh5TUuRC7jnulP/1cFDiHsT4mFxxKbm1VUX38KMAHtGVKBqk+/LYus+g==}
+ peerDependencies:
+ devframe: 0.9.18
+
+ '@devframes/json-render-ui@0.9.18':
+ resolution: {integrity: sha512-n+oBM5FXEq71DRNIronBsUL0ME3aamSSV/WLSZp+f88TbV/D97J8r/N9qMhvud0uUNf6FXG9637769E7XxCDEw==}
+ peerDependencies:
+ '@devframes/hub': 0.9.18
+ devframe: 0.9.18
+ peerDependenciesMeta:
+ '@devframes/hub':
+ optional: true
+ devframe:
+ optional: true
+
+ '@devframes/json-render@0.9.18':
+ resolution: {integrity: sha512-KMfcUxK3t6kbcoojDEXTy+mHZpt00IVXK6Yu9SJiqtLPTKmMsVU2MDkt+reafiX4ZczOycHHZUt5sMhl8tTDyQ==}
+ peerDependencies:
+ '@devframes/hub': 0.9.18
+ devframe: 0.9.18
+ peerDependenciesMeta:
+ '@devframes/hub':
+ optional: true
+
+ '@devframes/plugin-inspect@0.9.18':
+ resolution: {integrity: sha512-4YsTKz4HvlGqDJVE0Z7F75uq9bhaIkJ+nVoQtGRNLqBb/Kfn9ddc9puRbhf2gpyBXCRFkFsAnRlnmFxDt17CsA==}
+ hasBin: true
+ peerDependencies:
+ '@devframes/plugin-inspect--assets': 0.9.18
+ devframe: 0.9.18
+ vite: ^7.0.0 || ^8.0.0
+ peerDependenciesMeta:
+ '@devframes/plugin-inspect--assets':
+ optional: true
+ vite:
+ optional: true
+
+ '@devframes/plugin-messages@0.9.18':
+ resolution: {integrity: sha512-LVRR7E6qHc/wIL57P2N9IgIBQIDMZp3f5wNXPoU5x4rXfo1le2LZYw/M4Odtk3oCmi8/XicLJro1PhjoiadWcA==}
+ hasBin: true
+ peerDependencies:
+ '@devframes/hub': 0.9.18
+ '@devframes/plugin-messages--assets': 0.9.18
+ devframe: 0.9.18
+ vite: ^7.0.0 || ^8.0.0
+ peerDependenciesMeta:
+ '@devframes/plugin-messages--assets':
+ optional: true
+ vite:
+ optional: true
+
+ '@devframes/plugin-terminals@0.9.18':
+ resolution: {integrity: sha512-0OIk7LeE0umoT2CUf/2bpfaLHAe4ml9/m+KJKAHm6it6cnyK9o19SE23ccZro+pU8YM8/d6xb8fcyicND1phJQ==}
+ hasBin: true
+ peerDependencies:
+ '@devframes/plugin-terminals--assets': 0.9.18
+ devframe: 0.9.18
+ vite: ^8.0.0
+ peerDependenciesMeta:
+ '@devframes/plugin-terminals--assets':
+ optional: true
+ vite:
+ optional: true
+
+ '@devframes/service-open@0.9.18':
+ resolution: {integrity: sha512-4Sjm2J3WbjCkpjDz1FccHGpXwzgN/MwH3UMcbCTsa7VBoqtKGYTQHI1VZ3rEKkwWrSPu+FspYy7iVQP5rD5xRw==}
+ peerDependencies:
+ devframe: 0.9.18
+
+ '@devframes/vite@0.9.18':
+ resolution: {integrity: sha512-rWV4gwrRlihOgCBsqRomuP9b9urm9F1M3pxUSvpWFhJiA/Afa+7z+3ORs4ntZItZhMeLsOupT/0Fe6EsAui2Hg==}
+ peerDependencies:
+ '@devframes/hub': 0.9.18
+ '@devframes/hub-ui': 0.9.18
+ devframe: 0.9.18
+ vite: ^7.0.0 || ^8.0.0
+ peerDependenciesMeta:
+ '@devframes/hub':
+ optional: true
+ '@devframes/hub-ui':
+ optional: true
+ vite:
+ optional: true
+
+ '@dotenvx/dotenvx@1.75.1':
+ resolution: {integrity: sha512-/BITOC9dmS/edY2zQwZNicQ059O6RKabtQfyEafV0nGtfYRNHYy1DIPiYVcov40+tob9hfmBnbR963dS+EQ1DQ==}
+ hasBin: true
+
+ '@dotenvx/primitives@0.8.0':
+ resolution: {integrity: sha512-VYJy0uhFm9zTJ1TxBaW/pA8bjbOM/OttaNMwZ1RHG4JKyRG7DhSdiqD1ipQoAyoD22olUtxbP78W9xY3Wd11bg==}
+
+ '@emnapi/runtime@1.11.3':
+ resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==}
+
+ '@esbuild/aix-ppc64@0.25.12':
+ resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/aix-ppc64@0.28.2':
+ resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.25.12':
+ resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm64@0.28.2':
+ resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.25.12':
+ resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-arm@0.28.2':
+ resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.25.12':
+ resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/android-x64@0.28.2':
+ resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.25.12':
+ resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-arm64@0.28.2':
+ resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.25.12':
+ resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.28.2':
+ resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.25.12':
+ resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-arm64@0.28.2':
+ resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.25.12':
+ resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.28.2':
+ resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.25.12':
+ resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm64@0.28.2':
+ resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.25.12':
+ resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.28.2':
+ resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.25.12':
+ resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.28.2':
+ resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.25.12':
+ resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.28.2':
+ resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.25.12':
+ resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.28.2':
+ resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.25.12':
+ resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.28.2':
+ resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.25.12':
+ resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.28.2':
+ resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.25.12':
+ resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.28.2':
+ resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.25.12':
+ resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.28.2':
+ resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-arm64@0.25.12':
+ resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-arm64@0.28.2':
+ resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.25.12':
+ resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.28.2':
+ resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-arm64@0.25.12':
+ resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-arm64@0.28.2':
+ resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.25.12':
+ resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.28.2':
+ resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openharmony-arm64@0.25.12':
+ resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@esbuild/openharmony-arm64@0.28.2':
+ resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@esbuild/sunos-x64@0.25.12':
+ resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/sunos-x64@0.28.2':
+ resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.25.12':
+ resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-arm64@0.28.2':
+ resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.25.12':
+ resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.28.2':
+ resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.25.12':
+ resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.28.2':
+ resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@eslint-community/eslint-utils@4.10.1':
+ resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
+ '@eslint-community/regexpp@4.12.2':
+ resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+ '@eslint/config-array@0.23.5':
+ resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ '@eslint/config-helpers@0.7.0':
+ resolution: {integrity: sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ '@eslint/core@1.2.1':
+ resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ '@eslint/js@10.0.1':
+ resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+ peerDependencies:
+ eslint: ^10.0.0
+ peerDependenciesMeta:
+ eslint:
+ optional: true
+
+ '@eslint/object-schema@3.0.5':
+ resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ '@eslint/plugin-kit@0.7.3':
+ resolution: {integrity: sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ '@floating-ui/core@1.8.0':
+ resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==}
+
+ '@floating-ui/dom@1.8.0':
+ resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==}
+
+ '@floating-ui/react-dom@2.1.9':
+ resolution: {integrity: sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ '@floating-ui/utils@0.2.12':
+ resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==}
+
+ '@hono/node-server@2.1.1':
+ resolution: {integrity: sha512-ELuehkj5VCBdgEw9zs+ivkKwyzzUCSQuE96YmiPvn1ECBoZCczbFXJLeEGMTYjphP6gydh4pHMqEYPVMYUVgQg==}
+ engines: {node: '>=20'}
+ peerDependencies:
+ hono: ^4
+
+ '@humanfs/core@0.19.2':
+ resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/node@0.16.8':
+ resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/types@0.15.0':
+ resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanwhocodes/module-importer@1.0.1':
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+
+ '@humanwhocodes/retry@0.4.3':
+ resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
+ engines: {node: '>=18.18'}
+
+ '@img/colour@1.1.0':
+ resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==}
+ engines: {node: '>=18'}
+
+ '@img/sharp-darwin-arm64@0.35.4':
+ resolution: {integrity: sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==}
+ engines: {node: '>=20.9.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-darwin-x64@0.35.4':
+ resolution: {integrity: sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==}
+ engines: {node: '>=20.9.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-freebsd-wasm32@0.35.4':
+ resolution: {integrity: sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==}
+ engines: {node: '>=20.9.0'}
+ os: [freebsd]
+
+ '@img/sharp-libvips-darwin-arm64@1.3.3':
+ resolution: {integrity: sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-x64@1.3.3':
+ resolution: {integrity: sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-linux-arm64@1.3.3':
+ resolution: {integrity: sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linux-arm@1.3.3':
+ resolution: {integrity: sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linux-ppc64@1.3.3':
+ resolution: {integrity: sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linux-riscv64@1.3.3':
+ resolution: {integrity: sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linux-s390x@1.3.3':
+ resolution: {integrity: sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linux-x64@1.3.3':
+ resolution: {integrity: sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.3.3':
+ resolution: {integrity: sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@img/sharp-libvips-linuxmusl-x64@1.3.3':
+ resolution: {integrity: sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@img/sharp-linux-arm64@0.35.4':
+ resolution: {integrity: sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==}
+ engines: {node: '>=20.9.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-arm@0.35.4':
+ resolution: {integrity: sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==}
+ engines: {node: '>=20.9.0'}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-ppc64@0.35.4':
+ resolution: {integrity: sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==}
+ engines: {node: '>=20.9.0'}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-riscv64@0.35.4':
+ resolution: {integrity: sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==}
+ engines: {node: '>=20.9.0'}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-s390x@0.35.4':
+ resolution: {integrity: sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==}
+ engines: {node: '>=20.9.0'}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-x64@0.35.4':
+ resolution: {integrity: sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==}
+ engines: {node: '>=20.9.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linuxmusl-arm64@0.35.4':
+ resolution: {integrity: sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==}
+ engines: {node: '>=20.9.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@img/sharp-linuxmusl-x64@0.35.4':
+ resolution: {integrity: sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==}
+ engines: {node: '>=20.9.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@img/sharp-wasm32@0.35.4':
+ resolution: {integrity: sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==}
+ engines: {node: '>=20.9.0'}
+
+ '@img/sharp-webcontainers-wasm32@0.35.4':
+ resolution: {integrity: sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==}
+ engines: {node: '>=20.9.0'}
+ cpu: [wasm32]
+
+ '@img/sharp-win32-arm64@0.35.4':
+ resolution: {integrity: sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==}
+ engines: {node: '>=20.9.0'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@img/sharp-win32-ia32@0.35.4':
+ resolution: {integrity: sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==}
+ engines: {node: ^20.9.0}
+ cpu: [ia32]
+ os: [win32]
+
+ '@img/sharp-win32-x64@0.35.4':
+ resolution: {integrity: sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==}
+ engines: {node: '>=20.9.0'}
+ cpu: [x64]
+ os: [win32]
+
+ '@jridgewell/gen-mapping@0.3.13':
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
+ '@jridgewell/remapping@2.3.5':
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/source-map@0.3.11':
+ resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==}
+
+ '@jridgewell/sourcemap-codec@1.6.0':
+ resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+
+ '@json-render/core@0.20.0':
+ resolution: {integrity: sha512-cXAXn7h3QaylefQgh85AEGPuVq4C8SJ3k9JqigWLJhaBSozF1Fmsrm43DP16RmkqNiVgj5pBRdmB48lEO5qlow==}
+ peerDependencies:
+ zod: ^4.0.0
+
+ '@keyv/bigmap@1.3.1':
+ resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==}
+ engines: {node: '>= 18'}
+ peerDependencies:
+ keyv: ^5.6.0
+
+ '@keyv/serialize@1.1.1':
+ resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==}
+
+ '@modelcontextprotocol/core@2.0.0':
+ resolution: {integrity: sha512-pJCEwGG7Lfr/+PQp9ZTwKXNeO5wzbfKL7H3MYpCorM4oFBoQrdjnBgEoqG+RjhsvS1FKrDbKux+M1HhlnGWqcA==}
+ engines: {node: '>=20'}
+
+ '@modelcontextprotocol/sdk@1.30.0':
+ resolution: {integrity: sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@cfworker/json-schema': ^4.1.1
+ zod: ^3.25 || ^4.0
+ peerDependenciesMeta:
+ '@cfworker/json-schema':
+ optional: true
+
+ '@modelcontextprotocol/server@2.0.0':
+ resolution: {integrity: sha512-YhHWdHfpFMQfd0prsEnxKeS3Qz3ytIGmsS0sth4KDjnacIT7hxk6hXHkJ9KysxlkvTM+WZAtQbbcUhdoP4Hvtw==}
+ engines: {node: '>=20'}
+
+ '@monaco-editor/loader@1.7.0':
+ resolution: {integrity: sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==}
+
+ '@monaco-editor/react@4.7.0':
+ resolution: {integrity: sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==}
+ peerDependencies:
+ monaco-editor: '>= 0.25.0 < 1'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ '@napi-rs/lzma-linux-x64-gnu@1.5.1':
+ resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==}
+ engines: {node: ^22.20 || ^24.12 || >=25}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@next/env@16.3.3':
+ resolution: {integrity: sha512-U2eYQRwXj+dsqxV79zFqExDdatnNY/ZWc2nsJU1p/OgT7fd3dXwlF6OjYaFQCfMoeTA19PWq+wVmYgimVA+V+g==}
+
+ '@next/swc-darwin-arm64@16.3.3':
+ resolution: {integrity: sha512-8Hiv32QJPwdV6KYJ8meR9SBA061tQqnIKTJDocvOXlEQqib0xMFpzArosuffFUUc0sslbh7QQ8a3Yey1QV8EIw==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@next/swc-darwin-x64@16.3.3':
+ resolution: {integrity: sha512-A1lgKgwVchRYmSe467zdwhxT9040dd8lH+o65sL5Jet8fjB4kegw/rDyPIpYVRb6jAqwXFOJpjIXJLxQKLiE3A==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@next/swc-linux-arm64-gnu@16.3.3':
+ resolution: {integrity: sha512-bf0FIssMFueU2dm7vQEWWxk0c8UjKTdW0yzuh0sQsD8pf1+KCLDdaqhYZNMYGmXwEOiHAUzgBKudovIlcvvBjg==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@next/swc-linux-arm64-musl@16.3.3':
+ resolution: {integrity: sha512-W7viwCk9JY/cAkdz/A273rd5bb3RgT/IHwR7Upv90tunjBWNtAAhGhoecHh+teRNRSinuAFmE+l7fwZ4YKkrXg==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@next/swc-linux-x64-gnu@16.3.3':
+ resolution: {integrity: sha512-0W46zw1N3ODpI6n0GeivHvvob1pooozgZVqy65k0mh4/7vr+FbY9+WpHzNVXjHipJf/A3FDheBG19H1s5A25rA==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@next/swc-linux-x64-musl@16.3.3':
+ resolution: {integrity: sha512-H4mBso8ZTMBPtdT0PN0pBx2ayTvQuTuvS6qT13d77yVFJXAPCxkyIhLTmdMaGTJs0krQYI/qpzdHijCeihXhbg==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@next/swc-win32-arm64-msvc@16.3.3':
+ resolution: {integrity: sha512-cTMUJpcEGmeywofCUfhR+rSsoE33+rVPnPEYNTNdLNlsOeEg/vktOsKUSTb28vUGqD2jkm4Zaskcwn7OCI6FQg==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@next/swc-win32-x64-msvc@16.3.3':
+ resolution: {integrity: sha512-2VR4cTBzHXaBjnGsuH6GyJjENzQOmHeAh11uY1iUhjm3j5dEUrVJuUj+VL78jaGi/Dik8xS76zEj18BsFhlVZQ==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+
+ '@noble/ciphers@2.4.0':
+ resolution: {integrity: sha512-AnjFn0Jv92laAkvMrghlFZq4qQCIN/4DxFV/eooqtC2YTjB7kBeLMS2T9KJX4Dn+ZVXLOwK0lSgqDtx9gvxtiw==}
+ engines: {node: '>= 20.19.0'}
+
+ '@noble/hashes@2.4.0':
+ resolution: {integrity: sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==}
+ engines: {node: '>= 20.19.0'}
+
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+
+ '@opentelemetry/semantic-conventions@1.43.0':
+ resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==}
+ engines: {node: '>=14'}
+
+ '@parcel/watcher-android-arm64@2.6.0':
+ resolution: {integrity: sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [android]
+
+ '@parcel/watcher-darwin-arm64@2.6.0':
+ resolution: {integrity: sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@parcel/watcher-darwin-x64@2.6.0':
+ resolution: {integrity: sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@parcel/watcher-freebsd-x64@2.6.0':
+ resolution: {integrity: sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@parcel/watcher-linux-arm-glibc@2.6.0':
+ resolution: {integrity: sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
+ '@parcel/watcher-linux-arm-musl@2.6.0':
+ resolution: {integrity: sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm]
+ os: [linux]
+ libc: [musl]
+
+ '@parcel/watcher-linux-arm64-glibc@2.6.0':
+ resolution: {integrity: sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@parcel/watcher-linux-arm64-musl@2.6.0':
+ resolution: {integrity: sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@parcel/watcher-linux-x64-glibc@2.6.0':
+ resolution: {integrity: sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@parcel/watcher-linux-x64-musl@2.6.0':
+ resolution: {integrity: sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@parcel/watcher-win32-arm64@2.6.0':
+ resolution: {integrity: sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@parcel/watcher-win32-x64@2.6.0':
+ resolution: {integrity: sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [win32]
+
+ '@parcel/watcher@2.6.0':
+ resolution: {integrity: sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==}
+ engines: {node: '>= 10.0.0'}
+
+ '@prisma/client@6.19.3':
+ resolution: {integrity: sha512-mKq3jQFhjvko5LTJFHGilsuQs+W+T3Gm451NzuTDGQxwCzwXHYnIu2zGkRoW+Exq3Rob7yp2MfzSrdIiZVhrBg==}
+ engines: {node: '>=18.18'}
+ peerDependencies:
+ prisma: '*'
+ typescript: '>=5.1.0'
+ peerDependenciesMeta:
+ prisma:
+ optional: true
+ typescript:
+ optional: true
+
+ '@prisma/config@6.19.3':
+ resolution: {integrity: sha512-CBPT44BjlQxEt8kiMEauji2WHTDoVBOKl7UlewXmUgBPnr/oPRZC3psci5chJnYmH0ivEIog2OU9PGWoki3DLQ==}
+
+ '@prisma/debug@6.19.3':
+ resolution: {integrity: sha512-ljkJ+SgpXNktLG0Q/n4JGYCkKf0f8oYLyjImS2I8e2q2WCfdRRtWER062ZV/ixaNP2M2VKlWXVJiGzZaUgbKZw==}
+
+ '@prisma/engines-version@7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7':
+ resolution: {integrity: sha512-03bgb1VD5gvuumNf+7fVGBzfpJPjmqV423l/WxsWk2cNQ42JD0/SsFBPhN6z8iAvdHs07/7ei77SKu7aZfq8bA==}
+
+ '@prisma/engines@6.19.3':
+ resolution: {integrity: sha512-RSYxtlYFl5pJ8ZePgMv0lZ9IzVCOdTPOegrs2qcbAEFrBI1G33h6wyC9kjQvo0DnYEhEVY0X4LsuFHXLKQk88g==}
+
+ '@prisma/fetch-engine@6.19.3':
+ resolution: {integrity: sha512-tKtl/qco9Nt7LU5iKhpultD8O4vMCZcU2CHjNTnRrL1QvSUr5W/GcyFPjNL87GtRrwBc7ubXXD9xy4EvLvt8JA==}
+
+ '@prisma/get-platform@6.19.3':
+ resolution: {integrity: sha512-xFj1VcJ1N3MKooOQAGO0W5tsd0W2QzIvW7DD7c/8H14Zmp4jseeWAITm+w2LLoLrlhoHdPPh0NMZ8mfL6puoHA==}
+
+ '@rollup/plugin-yaml@5.0.0':
+ resolution: {integrity: sha512-9XOiRGYJjDwmEwR15kuxw+RytZFKtEWshoXuITrtS6+57BVMQMzDfhmSO/xfQOAY5psQv1IrxhQTUqPNppe4lQ==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^2.78.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ '@rollup/pluginutils@4.2.1':
+ resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==}
+ engines: {node: '>= 8.0.0'}
+
+ '@rollup/pluginutils@5.4.0':
+ resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ '@rollup/rollup-android-arm-eabi@4.63.2':
+ resolution: {integrity: sha512-Xa6RDoWa+hNiX6PgsljlH6W75RaONx3y6PVlbLhkEWW+GaPQ3dP5gwbL/erAzQHWwkvW5UxdD5l87Qx2FAQ/4A==}
+ cpu: [arm]
+ os: [android]
+
+ '@rollup/rollup-android-arm64@4.63.2':
+ resolution: {integrity: sha512-vNASxsghMfQ5s+v3PrpnJd+ryL/26lxCCaGI+sDJ7VzmHiYXIrrVltsDhaawxLM1WcoMU2oYlbPHLaYQtBzhcg==}
+ cpu: [arm64]
+ os: [android]
+
+ '@rollup/rollup-darwin-arm64@4.63.2':
+ resolution: {integrity: sha512-0dWDjmlrpZAgjPD/aPzUDhBW8APLRjAni5bOrM76wiiZm+E+KTMVKNhAzaTBohz8UyO2fKNAl0+fygbe2HZXOA==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-x64@4.63.2':
+ resolution: {integrity: sha512-N58uktcwzk3+qT4KHEuNdIxX1N01RWrkfVoml69EAbSaNDL+sbNVLx2RMl4Qd23lpA0fgPvyh5hHb4weD5WKmg==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-freebsd-arm64@4.63.2':
+ resolution: {integrity: sha512-HWF2zH8EAp2scWRpt2PGe6iUGz7zi04waXsdRr3zb4DWCk2ImIo5FZu0jjmD53nP/DGSvnW0e7/1ToCNZs2lZw==}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@rollup/rollup-freebsd-x64@4.63.2':
+ resolution: {integrity: sha512-MkvcwHMnzPSMOQEwB6wHnLzmc+hT8BGc5bW/Mhmjjgx3wbj6VBnlc47XsK74kD0K9MikFfXpQqyz4NUXaUW62A==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.63.2':
+ resolution: {integrity: sha512-xe1bCKPJaKsD0tfd7Rb6bGfUogJTpKbTEEthsfdb7hTfTRNJVQTdirabQx0o6ERVba/smkM720soMY+0QnrlSQ==}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-arm-musleabihf@4.63.2':
+ resolution: {integrity: sha512-yOM7LdK0p6gk6+Q773OEwtlsikT1TL3yMmYsTtRlDRPha5vV2DC5x7LqRWDr6f3cSYNMKVqxzffXv8ivxNBIFQ==}
+ cpu: [arm]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-arm64-gnu@4.63.2':
+ resolution: {integrity: sha512-qiWuJJV3DybA2IfzvRimeKXGrGuVPv1zobSY/26KnP3HbV0VcNb3ECzgvtbvF3xjSMkcooou6HASXZuLdjnhpQ==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-arm64-musl@4.63.2':
+ resolution: {integrity: sha512-akcZquRzCY/KpUoZAMBhGf7oi4LmXq1BzRA5CPAC3rkUf28Y/sAYV3jSL+JKd7cwEyFvR5G0XVZ0gaMedP+60A==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-loong64-gnu@4.63.2':
+ resolution: {integrity: sha512-fNwYHrPyYyxauPzX/cpYw8Z7LQpp+DGA0KCoswA0aVFBpmdMil9XgjB8V3Ny64Ihu797+GKcuJqnsOKEmor7fA==}
+ cpu: [loong64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-loong64-musl@4.63.2':
+ resolution: {integrity: sha512-XfvsgzR7DZqREdst7K1Mj3ilSUM5xLAHJcIMDFPKdxTs9q5VHOT8aMA+a683fqBu7DQl8+Sd9HCsQYL8EMY9qA==}
+ cpu: [loong64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-ppc64-gnu@4.63.2':
+ resolution: {integrity: sha512-Pp7gVZggEFlbcuztay+/U0gVG9S1XAh8i7I1Re/htbAzo43P5wHZHw6pTyzotISqlKohoh9RpIfnOz3RbemK1w==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-ppc64-musl@4.63.2':
+ resolution: {integrity: sha512-zkgL2xff6i7u5hau/m6FGeS8gRkLEdgLw522WGmdWWlLd9btmNl3S80mcEjtGq+kvgUekQ3+BOYLLLcPlS2LIA==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-riscv64-gnu@4.63.2':
+ resolution: {integrity: sha512-qOheJomrkVCbbHFJ7L3J97cnhfogKqguAQphv26+3ZsAQIF1L19b+dArl//s8rjJHJLz9byykyM8NBP4nmSa1g==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-riscv64-musl@4.63.2':
+ resolution: {integrity: sha512-XlxLD54wQhH3FciCgMofxBw27NzUe818gJH410qWvc41UT0ZFcgxVjyX5/EK8MPTupjeVWqN5oy+9pCA9mqfCA==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-s390x-gnu@4.63.2':
+ resolution: {integrity: sha512-vdryWeRb2bLJZf0Fv/W8se6nvsHe2PkTCxV0meheK3nQE+G90VCJcke51Miy1yQRsfm2uqIyjXOu4wmUzbTtkQ==}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-x64-gnu@4.63.2':
+ resolution: {integrity: sha512-bcq2h2pkKmH2po4cZV8VWzO4lL40STyu/nLoFpYMQp9C2tCVNTdcVv86MwSsn3D5s1FBe2Ty1atqvVAUTMimNg==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-x64-musl@4.63.2':
+ resolution: {integrity: sha512-EGoo5DMVMRkTId8fuTDaoxVlR5ZTsKULUezRjd9gCw5eeY+DjCvDpZAOlNUvKPGX+7rS1RWx6j+yOpNPx0cUgQ==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-openbsd-x64@4.63.2':
+ resolution: {integrity: sha512-MErl12k7BFHZG1TI9QF/3lSSZARzq9KgNy/FjnqFMCkv+N4RSSzoUCA5h2mqHX4Mox3WaTVKblyzhQ1zRb2ZuQ==}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@rollup/rollup-openharmony-arm64@4.63.2':
+ resolution: {integrity: sha512-ILs8k07Wh4p0PsNY4wYLEaXZKMOpVhrG5QDB0yHhGhuzOfDlnyHN6sflL4El/MpUP1y8uY2lUZrv4oBS6pTT3g==}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@rollup/rollup-win32-arm64-msvc@4.63.2':
+ resolution: {integrity: sha512-hKgB3nz/TKD3Wv78XEsyXzQsNjvhOHmwKQTvXADGOyU/cIClZDO7DsoggbdmJDPGp5V80tA3Vfv61PaKTLH3LA==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rollup/rollup-win32-ia32-msvc@4.63.2':
+ resolution: {integrity: sha512-T4wf1mudIDxN8Q/CWIBJC1u5gQUc+r5mPvlwoSbIvNkyVTP2TAFeobEmst5AQ4gMyAz4sSByVdoTDfvTmGK/8g==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-gnu@4.63.2':
+ resolution: {integrity: sha512-tC3IY7qoaD9Ll3/8WJQn49j5V2f/NuI9S41NOE2iM5MPs3sPIvOkVToLcz/7Bz4pyF7PSvrtwu8I/pUrGOSecQ==}
+ cpu: [x64]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.63.2':
+ resolution: {integrity: sha512-6NHnk/K3eq2ZFYcU1X8g67s9qIJRCOTT92gwLMVBp08dB2uuuwI1/Q/empzL2Bfr2f2WRLJVwpp90RmacQyFkw==}
+ cpu: [x64]
+ os: [win32]
+
+ '@sec-ant/readable-stream@0.4.1':
+ resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==}
+
+ '@shadowdara/dlib@0.0.4':
+ resolution: {integrity: sha512-eYvqbE0uhTCufVd5NjhYQEIZwJg2qu1DyHu9gVMJQUei0UZyYxe5F+hZYO7Hdr+yD2sm3dWvzZ+fBzVDeySnFg==}
+
+ '@shadowdara/finder-lib@0.3.17':
+ resolution: {integrity: sha512-8aOCR273G8vBtp/migYdQHAgD9Uu2ymtX49wfAPA3rfFs+2PooujmvMrRss1O+uJvce3ti0NY13if2UHqv080g==}
+
+ '@sindresorhus/merge-streams@4.0.0':
+ resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
+ engines: {node: '>=18'}
+
+ '@standard-schema/spec@1.1.0':
+ resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
+
+ '@swc/helpers@0.5.23':
+ resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==}
+
+ '@tailwindcss/node@4.3.3':
+ resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==}
+
+ '@tailwindcss/oxide-android-arm64@4.3.3':
+ resolution: {integrity: sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [android]
+
+ '@tailwindcss/oxide-darwin-arm64@4.3.3':
+ resolution: {integrity: sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@tailwindcss/oxide-darwin-x64@4.3.3':
+ resolution: {integrity: sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@tailwindcss/oxide-freebsd-x64@4.3.3':
+ resolution: {integrity: sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3':
+ resolution: {integrity: sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==}
+ engines: {node: '>= 20'}
+ cpu: [arm]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.3':
+ resolution: {integrity: sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@tailwindcss/oxide-linux-arm64-musl@4.3.3':
+ resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@tailwindcss/oxide-linux-x64-gnu@4.3.3':
+ resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@tailwindcss/oxide-linux-x64-musl@4.3.3':
+ resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@tailwindcss/oxide-wasm32-wasi@4.3.3':
+ resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+ bundledDependencies:
+ - '@napi-rs/wasm-runtime'
+ - '@emnapi/core'
+ - '@emnapi/runtime'
+ - '@tybys/wasm-util'
+ - '@emnapi/wasi-threads'
+ - tslib
+
+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.3':
+ resolution: {integrity: sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@tailwindcss/oxide-win32-x64-msvc@4.3.3':
+ resolution: {integrity: sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [win32]
+
+ '@tailwindcss/oxide@4.3.3':
+ resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==}
+ engines: {node: '>= 20'}
+
+ '@tailwindcss/postcss@4.3.3':
+ resolution: {integrity: sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg==}
+
+ '@tailwindcss/vite@4.3.3':
+ resolution: {integrity: sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==}
+ peerDependencies:
+ vite: ^5.2.0 || ^6 || ^7 || ^8
+
+ '@ts-morph/common@0.27.0':
+ resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==}
+
+ '@types/eslint@8.56.12':
+ resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==}
+
+ '@types/esrecurse@4.3.1':
+ resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==}
+
+ '@types/estree@1.0.9':
+ resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
+
+ '@types/highlight.js@10.1.0':
+ resolution: {integrity: sha512-77hF2dGBsOgnvZll1vymYiNUtqJ8cJfXPD6GG/2M0aLRc29PkvB7Au6sIDjIEFcSICBhCh2+Pyq6WSRS7LUm6A==}
+ deprecated: This is a stub types definition. highlight.js provides its own type definitions, so you do not need this installed.
+
+ '@types/html-minifier-terser@7.0.2':
+ resolution: {integrity: sha512-mm2HqV22l8lFQh4r2oSsOEVea+m0qqxEmwpc9kC1p/XzmjLWrReR9D/GRs8Pex2NX/imyEH9c5IU/7tMBQCHOA==}
+
+ '@types/jquery@4.0.1':
+ resolution: {integrity: sha512-9a59A/tycXgYuPABcp6/3spSShn0NT2UOM4EfHvMumjYi4lJWTsK5SZWjhx3yRm9IHGCeWXdV2YfNsrWrft/CA==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/license-checker@25.0.6':
+ resolution: {integrity: sha512-ju/75+YPkNE5vX1iPer+qtI1eI/LqJVYZgOsmSHI1iiEM1bQL5Gh1lEvyjR9T7ZXVE1FwJa2doWJEEmPNwbZkw==}
+
+ '@types/node@24.13.4':
+ resolution: {integrity: sha512-YJ7EqCstVTzIr0fMr7qul/977en+pQHrfmuKIo6Zr9i75Be21dr3MovcfvGtyvi2HAUrRerWps5sMO9I7WaxDw==}
+
+ '@types/node@25.9.6':
+ resolution: {integrity: sha512-JR6Q/PV5DKFvjrGFVqQJdeG0qvsqQQLDa3TzFrqVwhqRXqwNaxPo2KYCtCQXpOdIulCouKwT7a6in9nFthBAzw==}
+
+ '@types/node@26.5.1':
+ resolution: {integrity: sha512-CzNm2FezW4VR/LjG6yUdiEgLE/rAQ9Slj5gCu/C2VrdcW7I0ahNZ8DRbHT7zOZ6r3ONgd/bsQIeSaoDGrd1C6g==}
+
+ '@types/react-dom@19.3.0':
+ resolution: {integrity: sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==}
+ peerDependencies:
+ '@types/react': ^19.3.0
+
+ '@types/react@19.3.0':
+ resolution: {integrity: sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==}
+
+ '@types/trusted-types@2.0.7':
+ resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
+
+ '@types/validate-npm-package-name@4.0.2':
+ resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==}
+
+ '@typescript-eslint/eslint-plugin@8.70.0':
+ resolution: {integrity: sha512-/v8HZt6RlyIZxB3ntehELOcUcfxKPVGWXnQdJuHRmzrqgF8nQypcC/oxGW+Ot4VGKDq81XugPKxx0n5PBtf9PA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^8.70.0
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/parser@8.70.0':
+ resolution: {integrity: sha512-zYvrmj9Yxd63UGaXw+kdt6A0F0s0qveJyuatIM77bYC2DE4pgmg7a50u8LR7PRtXd0x+h+Tl3eXabGm06SWd3Q==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/project-service@8.70.0':
+ resolution: {integrity: sha512-hFHbTNqhU9G+2eKFXCBVb1tjFT/LceiJ4+HfLO4pTpDI0KHi6iajpcFFkaSQ9gXmCh7n82A0PthaayEdN6mspQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/scope-manager@8.70.0':
+ resolution: {integrity: sha512-8nP3Kwh5hlgZ4FicGvmznAmJe8UL4sdU8tLukrPaMuQmDuk4Y8xYfzu/aYZW4xT2JCgc7H/TpDI5cGlxcWJSqQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/tsconfig-utils@8.70.0':
+ resolution: {integrity: sha512-adnkeeNq9Sq1sUf4+FRVc0KdgYghzsgFpZSQVZVvY0LCuUuN0FnQgyGzCJeC4fW1cdXseBAjU2EOqUIjbNcZUw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/type-utils@8.70.0':
+ resolution: {integrity: sha512-NUMKIhYVaVIVLnRL9CRt+VVcuLgSHUCpXn4/+K8wql+vdInUzvx8BjUO1oJ7cG9shjFJKtF8F8Hh2kCh3/KBVw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/types@8.70.0':
+ resolution: {integrity: sha512-asTOIYhDg4zdzOScCyaytrsV3cR6B4ecPQlXw/dJIm7J/MZTtCtfVII9JD8Geh4jTCrK/Xe6cg5UevoleMcoJQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/typescript-estree@8.70.0':
+ resolution: {integrity: sha512-d9NmHMPEKQ7QCLLm1jI3zmoQBwT5KwFYjXBJ9ymZfKCUU+5rmTRykKAFvH5Qn/ZCds3CEAFS9OC9M/jkl0X2bA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/utils@8.70.0':
+ resolution: {integrity: sha512-oZmtKJz/4fufZ2p3+Cn3ijEojcdfR+1zYDH2xKYrEly0dR/Q/1xUPRCOlKGxod78nWlU2UnDe09GZ3TaknBFGA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/visitor-keys@8.70.0':
+ resolution: {integrity: sha512-BoC8PiO4Hkdo0TVJh9Ntxr5MxPDI7/oFsrygN5ADelFSeXG/qgNuucIGA+L5Z6JpPTE/uRfcTWtscjbUaufepQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@vercel/analytics@1.6.1':
+ resolution: {integrity: sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg==}
+ peerDependencies:
+ '@remix-run/react': ^2
+ '@sveltejs/kit': ^1 || ^2
+ next: '>= 13'
+ react: ^18 || ^19 || ^19.0.0-rc
+ svelte: '>= 4'
+ vue: ^3
+ vue-router: ^4
+ peerDependenciesMeta:
+ '@remix-run/react':
+ optional: true
+ '@sveltejs/kit':
+ optional: true
+ next:
+ optional: true
+ react:
+ optional: true
+ svelte:
+ optional: true
+ vue:
+ optional: true
+ vue-router:
+ optional: true
+
+ '@vitejs/devtools-kit@0.7.3':
+ resolution: {integrity: sha512-MsYO9EJ3fzanvS4FJ6C9Dh2iiR4ynhcp5C3lJEKHRZBr8wOyTBSbCP1ic81KHnm3Q5GbGt4lKBHTq7PZfpdmbg==}
+ peerDependencies:
+ vite: '*'
+
+ '@vitejs/devtools@0.7.3':
+ resolution: {integrity: sha512-ZcOIpuzV7rd3dQ6U9VJCw05xUPMlTz7cbx61LgrAFWmm+QM0Qg4Dp5n57WI8NEYPVXTb8Eatr1l7f2HARRfx/A==}
+ hasBin: true
+ peerDependencies:
+ '@vitejs/devtools-oxc': ^0.7.3
+ '@vitejs/devtools-rolldown': ^0.7.3
+ '@vitejs/devtools-vite': ^0.7.3
+ '@vitejs/devtools-vitest': ^0.7.3
+ vite: '*'
+ peerDependenciesMeta:
+ '@vitejs/devtools-oxc':
+ optional: true
+ '@vitejs/devtools-rolldown':
+ optional: true
+ '@vitejs/devtools-vite':
+ optional: true
+ '@vitejs/devtools-vitest':
+ optional: true
+
+ abbrev@1.1.1:
+ resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
+
+ accepts@2.0.0:
+ resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==}
+ engines: {node: '>= 0.6'}
+
+ acorn-jsx@5.3.2:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ acorn@8.18.0:
+ resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ ajv-formats@2.1.1:
+ resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv-formats@3.0.1:
+ resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv@6.15.0:
+ resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==}
+
+ ajv@8.20.0:
+ resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==}
+
+ ansi-colors@4.1.3:
+ resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
+ engines: {node: '>=6'}
+
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ ansi-regex@6.3.0:
+ resolution: {integrity: sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==}
+ engines: {node: '>=12'}
+
+ ansi-styles@3.2.1:
+ resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+ engines: {node: '>=4'}
+
+ ansi-styles@6.2.3:
+ resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
+ engines: {node: '>=12'}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ array-find-index@1.0.2:
+ resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==}
+ engines: {node: '>=0.10.0'}
+
+ asap@2.0.6:
+ resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
+
+ ast-types@0.16.3:
+ resolution: {integrity: sha512-FvWoWYfSCM6kRxCSH+MGLHIKKGRL6A6AW7Zek2O32REPQRdg131428uRTKMBYAeRd3XXAaHDS60Wpri7CdKDrA==}
+ engines: {node: '>=4'}
+
+ atomically@1.7.0:
+ resolution: {integrity: sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==}
+ engines: {node: '>=10.12.0'}
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ balanced-match@4.0.4:
+ resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
+ engines: {node: 18 || 20 || >=22}
+
+ baseline-browser-mapping@2.11.23:
+ resolution: {integrity: sha512-le521dGVfxM7yRX0EikCoSz+rOK+hHzdDt/E7mG1jOJB/6WAAUuwVroLwaB7ApaUsz5Q0kFlDXLSA9MheUIfRQ==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ better-auth@1.7.4:
+ resolution: {integrity: sha512-rjL9g8b8UvdwK/ZSdawhqYzOm8YegurB6Fuzqtu/zFJamlFrPa+eEhP8Qj2vFWsMzHOk2mb/L4FRYh9pgaU7OA==}
+ peerDependencies:
+ '@lynx-js/react': '*'
+ '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0
+ '@sveltejs/kit': ^2.0.0
+ '@tanstack/react-start': ^1.0.0
+ '@tanstack/solid-start': ^1.0.0
+ better-sqlite3: ^12.0.0
+ drizzle-kit: '>=0.31.4 || >=1.0.0-beta.1'
+ drizzle-orm: ^0.45.2 || >=1.0.0-rc.1 <2.0.0
+ mongodb: ^6.0.0 || ^7.0.0
+ mysql2: ^3.0.0
+ next: ^14.0.0 || ^15.0.0 || ^16.0.0
+ pg: ^8.0.0
+ prisma: ^5.0.0 || ^6.0.0 || ^7.0.0
+ react: ^18.0.0 || ^19.0.0
+ react-dom: ^18.0.0 || ^19.0.0
+ solid-js: ^1.0.0
+ svelte: ^4.0.0 || ^5.0.0
+ vitest: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0
+ vue: ^3.0.0
+ peerDependenciesMeta:
+ '@lynx-js/react':
+ optional: true
+ '@prisma/client':
+ optional: true
+ '@sveltejs/kit':
+ optional: true
+ '@tanstack/react-start':
+ optional: true
+ '@tanstack/solid-start':
+ optional: true
+ better-sqlite3:
+ optional: true
+ drizzle-kit:
+ optional: true
+ drizzle-orm:
+ optional: true
+ mongodb:
+ optional: true
+ mysql2:
+ optional: true
+ next:
+ optional: true
+ pg:
+ optional: true
+ prisma:
+ optional: true
+ react:
+ optional: true
+ react-dom:
+ optional: true
+ solid-js:
+ optional: true
+ svelte:
+ optional: true
+ vitest:
+ optional: true
+ vue:
+ optional: true
+
+ better-call@1.4.0:
+ resolution: {integrity: sha512-bBKOT4vv1kZLDgxVePdilk/Jwkn+dtRRsmi3DzHcDP+WnswyVl6dR59l2HEeP/0cB+bDoopASAesWDPIdd/zZA==}
+ peerDependencies:
+ zod: ^4.0.0
+ peerDependenciesMeta:
+ zod:
+ optional: true
+
+ binary-extensions@3.2.0:
+ resolution: {integrity: sha512-DjR9rgAOMQn9TrUHzijJUtvoKviDRvFxuIyqZrubxHqRpQN9OzfXrrLivm7xb3q8oJSKsiuBor4bAS2wafLnVQ==}
+ engines: {node: '>=18.20'}
+
+ birpc@4.2.0:
+ resolution: {integrity: sha512-KxgKcZPfrtzJDDALHPguGpGJUrzdgpymyiQQgzFjWreHMOpWrnFNVREr5J48x2DBh8ZVioscrV1SBkDipGiX+Q==}
+
+ body-parser@2.3.0:
+ resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==}
+ engines: {node: '>=18'}
+
+ brace-expansion@1.1.18:
+ resolution: {integrity: sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==}
+
+ brace-expansion@5.0.9:
+ resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==}
+ engines: {node: 20 || >=22}
+
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
+ browserslist@4.28.9:
+ resolution: {integrity: sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ buffer-from@1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+ bundle-name@4.1.0:
+ resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==}
+ engines: {node: '>=18'}
+
+ bytes@3.1.2:
+ resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
+ engines: {node: '>= 0.8'}
+
+ c12@3.1.0:
+ resolution: {integrity: sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==}
+ peerDependencies:
+ magicast: ^0.3.5
+ peerDependenciesMeta:
+ magicast:
+ optional: true
+
+ cac@7.0.0:
+ resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==}
+ engines: {node: '>=20.19.0'}
+
+ cacheable@2.5.0:
+ resolution: {integrity: sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==}
+
+ call-bind-apply-helpers@1.0.2:
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+ engines: {node: '>= 0.4'}
+
+ call-bound@1.0.4:
+ resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
+ engines: {node: '>= 0.4'}
+
+ callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ camel-case@4.1.2:
+ resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
+
+ caniuse-lite@1.0.30001810:
+ resolution: {integrity: sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==}
+
+ chalk@2.4.2:
+ resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
+ engines: {node: '>=4'}
+
+ chalk@5.6.2:
+ resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+
+ chalk@6.0.0:
+ resolution: {integrity: sha512-2uNTXIuTTxk7ciZgAU1BQcgnchcG0xXnrs6jzkQfj9SsRa9M2s5zE8WT96hS6KmG4MzWHSrvH43DF1m4XRkrFg==}
+ engines: {node: '>=22'}
+
+ chokidar@4.0.3:
+ resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
+ engines: {node: '>= 14.16.0'}
+
+ chokidar@5.0.0:
+ resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==}
+ engines: {node: '>= 20.19.0'}
+
+ citty@0.1.6:
+ resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==}
+
+ citty@0.2.2:
+ resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==}
+
+ class-variance-authority@0.7.1:
+ resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==}
+
+ clean-css@5.3.3:
+ resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==}
+ engines: {node: '>= 10.0'}
+
+ cli-cursor@5.0.0:
+ resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==}
+ engines: {node: '>=18'}
+
+ cli-spinners@2.9.2:
+ resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
+ engines: {node: '>=6'}
+
+ client-only@0.0.1:
+ resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
+
+ cliui@9.0.1:
+ resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==}
+ engines: {node: '>=20'}
+
+ clone@2.1.2:
+ resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==}
+ engines: {node: '>=0.8'}
+
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+
+ cn@0.2.6:
+ resolution: {integrity: sha512-+i4L0zUGgRcEnhsxueVrP7iBGxBx5iD0WOTYg1MwFEu2ZyCmH5Ov2V1cul2Ht5UchRQQgftCf4be/RxspuW6QQ==}
+ engines: {node: '>=20'}
+ hasBin: true
+
+ code-block-writer@13.0.3:
+ resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==}
+
+ color-convert@1.9.3:
+ resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+
+ color-name@1.1.3:
+ resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+
+ commander@10.0.1:
+ resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
+ engines: {node: '>=14'}
+
+ commander@11.1.0:
+ resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==}
+ engines: {node: '>=16'}
+
+ commander@14.0.3:
+ resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==}
+ engines: {node: '>=20'}
+
+ commander@2.20.3:
+ resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+
+ common-path-prefix@3.0.0:
+ resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ conf@10.2.0:
+ resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==}
+ engines: {node: '>=12'}
+
+ confbox@0.1.8:
+ resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
+ confbox@0.2.4:
+ resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==}
+
+ confbox@0.3.1:
+ resolution: {integrity: sha512-cKUSoKa8YxFZZSmraVi7onONx3amu77ngK3kGpsYHDH7drPwCRkQE1RYMPlLRrMtnciRj274XNRxcHxnKmDSnA==}
+
+ consola@3.4.2:
+ resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==}
+ engines: {node: ^14.18.0 || >=16.10.0}
+
+ content-disposition@1.1.0:
+ resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==}
+ engines: {node: '>=18'}
+
+ content-type@1.0.5:
+ resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
+ engines: {node: '>= 0.6'}
+
+ content-type@2.1.0:
+ resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==}
+ engines: {node: '>=18'}
+
+ convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+ cookie-signature@1.2.2:
+ resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==}
+ engines: {node: '>=6.6.0'}
+
+ cookie@0.7.2:
+ resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
+ engines: {node: '>= 0.6'}
+
+ cors@2.8.6:
+ resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==}
+ engines: {node: '>= 0.10'}
+
+ cosmiconfig@9.0.2:
+ resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ typescript: '>=4.9.5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
+
+ crossws@0.4.12:
+ resolution: {integrity: sha512-aypfsr6t0uNvkqaZc6zvBfXzC6pLI0/sIulpkV6RwCVtZqG5ebBzv4weImKK0VNCj91Wl9F5j7p5WU4MNrybng==}
+ peerDependencies:
+ srvx: '>=0.11.5'
+ peerDependenciesMeta:
+ srvx:
+ optional: true
+
+ cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ csstype@3.2.3:
+ resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
+
+ debounce-fn@4.0.0:
+ resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==}
+ engines: {node: '>=10'}
+
+ debug@3.2.7:
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@4.4.3:
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debuglog@1.0.1:
+ resolution: {integrity: sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==}
+ deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
+
+ dedent@1.7.2:
+ resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==}
+ peerDependencies:
+ babel-plugin-macros: ^3.1.0
+ peerDependenciesMeta:
+ babel-plugin-macros:
+ optional: true
+
+ deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+ deepmerge-ts@7.1.5:
+ resolution: {integrity: sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==}
+ engines: {node: '>=16.0.0'}
+
+ deepmerge@4.3.1:
+ resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+ engines: {node: '>=0.10.0'}
+
+ default-browser-id@5.0.1:
+ resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==}
+ engines: {node: '>=18'}
+
+ default-browser@5.5.1:
+ resolution: {integrity: sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==}
+ engines: {node: '>=18'}
+
+ define-lazy-prop@2.0.0:
+ resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
+ engines: {node: '>=8'}
+
+ define-lazy-prop@3.0.0:
+ resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
+ engines: {node: '>=12'}
+
+ defu@6.1.7:
+ resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==}
+
+ depd@2.0.0:
+ resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
+ engines: {node: '>= 0.8'}
+
+ destr@2.0.5:
+ resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==}
+
+ detect-libc@2.1.2:
+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
+ engines: {node: '>=8'}
+
+ devframe@0.9.18:
+ resolution: {integrity: sha512-SjvL9/MiqaG3m2bpfAb8fMsX6ALcyqFNIZ3VYjhZ/BZxSqkTknt3U6YcQTEAZOpFvGv+MVk6OeWkRW0IhzVxAg==}
+ hasBin: true
+ peerDependencies:
+ '@modelcontextprotocol/client': ^2.0.0
+ cac: ^7.0.0
+ peerDependenciesMeta:
+ '@modelcontextprotocol/client':
+ optional: true
+ cac:
+ optional: true
+
+ dezalgo@1.0.4:
+ resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==}
+
+ diff@8.0.4:
+ resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==}
+ engines: {node: '>=0.3.1'}
+
+ dompurify@3.4.8:
+ resolution: {integrity: sha512-yb1cEmaOum7wFvOCSQxyfgVlv5D47Rc30iZWoMpbDIWTnJ6grDDQyu2KFJzB2k7u0pMuJcQ1zphH//fFnw2tjQ==}
+
+ dot-case@3.0.4:
+ resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+
+ dot-prop@6.0.1:
+ resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==}
+ engines: {node: '>=10'}
+
+ dotenv@16.6.1:
+ resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==}
+ engines: {node: '>=12'}
+
+ dotenv@17.4.2:
+ resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==}
+ engines: {node: '>=12'}
+
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
+ ee-first@1.1.1:
+ resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+
+ effect@3.21.0:
+ resolution: {integrity: sha512-PPN80qRokCd1f015IANNhrwOnLO7GrrMQfk4/lnZRE/8j7UPWrNNjPV0uBrZutI/nHzernbW+J0hdqQysHiSnQ==}
+
+ electron-to-chromium@1.5.427:
+ resolution: {integrity: sha512-n14zb3FdsChZ2BNobqNHAJMcP3ifFv4paox2LvCrfVAQcqGiSURgbJl+PfMpHVCNFkStnNc+RRVtPBTVW5PDgw==}
+
+ emoji-regex@10.6.0:
+ resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
+
+ empathic@2.0.0:
+ resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==}
+ engines: {node: '>=14'}
+
+ encodeurl@2.0.0:
+ resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
+ engines: {node: '>= 0.8'}
+
+ enhanced-resolve@5.25.0:
+ resolution: {integrity: sha512-ghq3mhs649mvbarTCAlZn2wRhbfHmzAFiKxoWA14B3VtqnxtZt+wz8BroKXU0tF3GiJsnUldjVncQGZ8qk4rdA==}
+ engines: {node: '>=10.13.0'}
+
+ enquirer@2.4.1:
+ resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==}
+ engines: {node: '>=8.6'}
+
+ entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
+ env-paths@2.2.1:
+ resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
+ engines: {node: '>=6'}
+
+ error-ex@1.3.4:
+ resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==}
+
+ es-define-property@1.0.1:
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+ engines: {node: '>= 0.4'}
+
+ es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
+ es-object-atoms@1.1.2:
+ resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==}
+ engines: {node: '>= 0.4'}
+
+ esbuild@0.25.12:
+ resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ esbuild@0.28.2:
+ resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ escape-html@1.0.3:
+ resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
+ escape-string-regexp@1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ eslint-scope@9.1.2:
+ resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint-visitor-keys@5.0.1:
+ resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ eslint@10.10.0:
+ resolution: {integrity: sha512-NPXn6r5zl4uET1DAVPaOwzX3rut4c0wcmw3dWJAfOsTM5+TogXo0DDjz8pwm/hL8cyVNpHqeK4JpN0NjnyFFNw==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+ hasBin: true
+ peerDependencies:
+ jiti: '*'
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+
+ espree@11.2.0:
+ resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ esprima@4.0.1:
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ esquery@1.7.0:
+ resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==}
+ engines: {node: '>=0.10'}
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ estree-walker@0.6.1:
+ resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==}
+
+ estree-walker@2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+ esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+
+ etag@1.8.1:
+ resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+ engines: {node: '>= 0.6'}
+
+ eventsource-parser@3.1.1:
+ resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==}
+ engines: {node: '>=18.0.0'}
+
+ eventsource@3.0.7:
+ resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==}
+ engines: {node: '>=18.0.0'}
+
+ execa@5.1.1:
+ resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
+ engines: {node: '>=10'}
+
+ execa@9.6.1:
+ resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==}
+ engines: {node: ^18.19.0 || >=20.5.0}
+
+ express-rate-limit@8.7.0:
+ resolution: {integrity: sha512-hOwV7WOxXfjRpAM1DSJWZDXx3GhplwD8IfwuwvogD8i1Qnkgosw/H45s4ZnFAUHDAhPjlY9hLBvJhKmGMyY26g==}
+ engines: {node: '>= 16'}
+ peerDependencies:
+ express: '>= 4.11'
+
+ express@5.2.1:
+ resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==}
+ engines: {node: '>= 18'}
+
+ exsolve@1.1.1:
+ resolution: {integrity: sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==}
+
+ fast-check@3.23.2:
+ resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==}
+ engines: {node: '>=8.0.0'}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-glob@3.3.3:
+ resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+ engines: {node: '>=8.6.0'}
+
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+ fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+ fast-uri@3.1.7:
+ resolution: {integrity: sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==}
+
+ fastq@1.20.3:
+ resolution: {integrity: sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==}
+
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
+ figures@6.1.0:
+ resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==}
+ engines: {node: '>=18'}
+
+ file-entry-cache@11.1.5:
+ resolution: {integrity: sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==}
+
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
+ finalhandler@2.1.1:
+ resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==}
+ engines: {node: '>= 18.0.0'}
+
+ find-up@3.0.0:
+ resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==}
+ engines: {node: '>=6'}
+
+ find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+
+ flat-cache@6.1.23:
+ resolution: {integrity: sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==}
+
+ flatted@3.4.4:
+ resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==}
+
+ forwarded@0.2.0:
+ resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
+ engines: {node: '>= 0.6'}
+
+ fresh@2.0.0:
+ resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
+ engines: {node: '>= 0.8'}
+
+ fs-extra@11.4.0:
+ resolution: {integrity: sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==}
+ engines: {node: '>=14.14'}
+
+ fs.realpath@1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ fuzzysort@3.1.0:
+ resolution: {integrity: sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==}
+
+ gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
+ get-caller-file@2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+
+ get-east-asian-width@1.6.0:
+ resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==}
+ engines: {node: '>=18'}
+
+ get-intrinsic@1.3.0:
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+ engines: {node: '>= 0.4'}
+
+ get-own-enumerable-keys@1.0.0:
+ resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==}
+ engines: {node: '>=14.16'}
+
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
+ get-stream@6.0.1:
+ resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+ engines: {node: '>=10'}
+
+ get-stream@9.0.1:
+ resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==}
+ engines: {node: '>=18'}
+
+ giget@2.0.0:
+ resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==}
+ hasBin: true
+
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
+ glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+
+ glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
+
+ gopd@1.2.0:
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+ engines: {node: '>= 0.4'}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ h3@2.0.1-rc.31:
+ resolution: {integrity: sha512-AG7qZzF99a0BSYoXT3evJgIhwSIUKow7R+hwkLRZS06WJ9nbSb7QXUDgs1ByBjp6svTvl++N/GKA7I9YPz9cQQ==}
+ engines: {node: '>=20.11.1'}
+ hasBin: true
+ peerDependencies:
+ crossws: ^0.4.12
+ ocache: '>=0.3.0'
+ peerDependenciesMeta:
+ crossws:
+ optional: true
+ ocache:
+ optional: true
+
+ has-flag@3.0.0:
+ resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+ engines: {node: '>=4'}
+
+ has-symbols@1.1.0:
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+ engines: {node: '>= 0.4'}
+
+ hashery@1.5.1:
+ resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==}
+ engines: {node: '>=20'}
+
+ hasown@2.0.4:
+ resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==}
+ engines: {node: '>= 0.4'}
+
+ highlight.js@11.12.0:
+ resolution: {integrity: sha512-nbfWpyRMcMrPMmDwJB+dhX/eiaPKtc2RB+0QZskqJ3WjRA/FDS0e9hZrx8EC/lbEv8gXy98FcDbNa/dspAaJMg==}
+ engines: {node: '>=12.0.0'}
+
+ hono@4.13.7:
+ resolution: {integrity: sha512-c8/gF9ac8Y78/agExVocyLevgR+JlpNB444Py0FSX8pJoPdYUfUzRcXtYEYGwt6l19qIlVZPN5Mfsw9jFShmQQ==}
+ engines: {node: '>=16.9.0'}
+
+ hookified@1.15.1:
+ resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==}
+
+ hookified@2.2.0:
+ resolution: {integrity: sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==}
+
+ hosted-git-info@2.8.9:
+ resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
+
+ html-minifier-terser@7.2.0:
+ resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==}
+ engines: {node: ^14.13.1 || >=16.0.0}
+ hasBin: true
+
+ http-errors@2.0.1:
+ resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==}
+ engines: {node: '>= 0.8'}
+
+ human-signals@2.1.0:
+ resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
+ engines: {node: '>=10.17.0'}
+
+ human-signals@8.0.1:
+ resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==}
+ engines: {node: '>=18.18.0'}
+
+ iconv-lite@0.7.3:
+ resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==}
+ engines: {node: '>=0.10.0'}
+
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
+
+ ignore@7.0.9:
+ resolution: {integrity: sha512-brTTsvFRt5C1gGHtPst/281UjPD5t9fBqbgoMPlVWy11ZLTPfu7HxK4ZYqO9H7o/yC9rSTCI85EaQ4OoY12qYw==}
+ engines: {node: '>= 4'}
+
+ immutable@5.1.9:
+ resolution: {integrity: sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==}
+
+ import-fresh@3.3.1:
+ resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
+ engines: {node: '>=6'}
+
+ imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+
+ inflight@1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ ip-address@10.7.0:
+ resolution: {integrity: sha512-BGFsyJd5mpXp3rK6jIdADLNgpJUK1jnjzvYF8lK+VyDab9JAmqN0YOKDdP17HlgKb2+ehPgDc8EtnRLbGCAMhA==}
+ engines: {node: '>= 12'}
+
+ ipaddr.js@1.9.1:
+ resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
+ engines: {node: '>= 0.10'}
+
+ is-arrayish@0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+ is-core-module@2.16.2:
+ resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==}
+ engines: {node: '>= 0.4'}
+
+ is-docker@2.2.1:
+ resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+ engines: {node: '>=8'}
+ hasBin: true
+
+ is-docker@3.0.0:
+ resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ hasBin: true
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-in-ssh@1.0.0:
+ resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==}
+ engines: {node: '>=20'}
+
+ is-inside-container@1.0.0:
+ resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
+ engines: {node: '>=14.16'}
+ hasBin: true
+
+ is-interactive@2.0.0:
+ resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==}
+ engines: {node: '>=12'}
+
+ is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ is-obj@2.0.0:
+ resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
+ engines: {node: '>=8'}
+
+ is-obj@3.0.0:
+ resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==}
+ engines: {node: '>=12'}
+
+ is-plain-obj@4.1.0:
+ resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
+ engines: {node: '>=12'}
+
+ is-promise@4.0.0:
+ resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
+
+ is-regexp@3.1.0:
+ resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==}
+ engines: {node: '>=12'}
+
+ is-stream@2.0.1:
+ resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+ engines: {node: '>=8'}
+
+ is-stream@4.0.1:
+ resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==}
+ engines: {node: '>=18'}
+
+ is-unicode-supported@1.3.0:
+ resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==}
+ engines: {node: '>=12'}
+
+ is-unicode-supported@2.1.0:
+ resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==}
+ engines: {node: '>=18'}
+
+ is-wsl@2.2.0:
+ resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+ engines: {node: '>=8'}
+
+ is-wsl@3.1.1:
+ resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==}
+ engines: {node: '>=16'}
+
+ isbinaryfile@6.0.0:
+ resolution: {integrity: sha512-2FN2B8MAqKv6d5TaKsLvMrwMcghxwHTpcKy0L5mhNbRqjNqo2++SpCqN6eG1lCC1GmTQgvrYJYXv2+Chvyevag==}
+ engines: {node: '>= 24.0.0'}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ isexe@3.1.5:
+ resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==}
+ engines: {node: '>=18'}
+
+ jiti@2.7.0:
+ resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==}
+ hasBin: true
+
+ jose@6.2.12:
+ resolution: {integrity: sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==}
+
+ jquery@4.0.0:
+ resolution: {integrity: sha512-TXCHVR3Lb6TZdtw1l3RTLf8RBWVGexdxL6AC8/e0xZKEpBflBsjh9/8LXw+dkNFuOyW9B7iB3O1sP7hS0Kiacg==}
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ js-yaml@4.3.2:
+ resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==}
+ hasBin: true
+
+ jsesc@3.1.0:
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+ json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
+ json-schema-typed@7.0.3:
+ resolution: {integrity: sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==}
+
+ json-schema-typed@8.0.2:
+ resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==}
+
+ json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ jsonfile@6.2.1:
+ resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==}
+
+ keyv@5.6.0:
+ resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==}
+
+ kleur@3.0.3:
+ resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
+ engines: {node: '>=6'}
+
+ kleur@4.1.5:
+ resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
+ engines: {node: '>=6'}
+
+ kysely@0.29.5:
+ resolution: {integrity: sha512-ooa+eSbBNPTo3MycPEuW5jdrxQdQwdtB3LC3h43FiXQbIry5tR0C5lDG7eealK0E4D7XjrnOP5DIUg/LyjRMYQ==}
+ engines: {node: '>=22.0.0'}
+
+ levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+
+ license-checker@25.0.1:
+ resolution: {integrity: sha512-mET5AIwl7MR2IAKYYoVBBpV0OnkKQ1xGj2IMMeEFIs42QAkEVjRtFZGWmQ28WeU7MP779iAgOaOy93Mn44mn6g==}
+ hasBin: true
+
+ lightningcss-android-arm64@1.32.0:
+ resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [android]
+
+ lightningcss-darwin-arm64@1.32.0:
+ resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ lightningcss-darwin-x64@1.32.0:
+ resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ lightningcss-freebsd-x64@1.32.0:
+ resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
+ lightningcss-linux-arm-gnueabihf@1.32.0:
+ resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm]
+ os: [linux]
+
+ lightningcss-linux-arm64-gnu@1.32.0:
+ resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ lightningcss-linux-arm64-musl@1.32.0:
+ resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ lightningcss-linux-x64-gnu@1.32.0:
+ resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ lightningcss-linux-x64-musl@1.32.0:
+ resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ lightningcss-win32-arm64-msvc@1.32.0:
+ resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [win32]
+
+ lightningcss-win32-x64-msvc@1.32.0:
+ resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [win32]
+
+ lightningcss@1.32.0:
+ resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==}
+ engines: {node: '>= 12.0.0'}
+
+ lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+ linguist-js@3.0.3:
+ resolution: {integrity: sha512-egV9nG7vgX0mn/yJJ4FIyv9b6jjT+IPFF8vbdQeCXBWSTJteOJ7HctrsoCwWaHQaCiOLXX0t4jFZtqvXOJl3/w==}
+ engines: {node: '>=26', npm: '>=10'}
+ hasBin: true
+
+ local-pkg@1.2.1:
+ resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==}
+ engines: {node: '>=14'}
+
+ locate-path@3.0.0:
+ resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==}
+ engines: {node: '>=6'}
+
+ locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+
+ log-symbols@6.0.0:
+ resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==}
+ engines: {node: '>=18'}
+
+ lower-case@2.0.2:
+ resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
+
+ lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+ lucide-react@1.45.0:
+ resolution: {integrity: sha512-yH1ubCAduho9UR7oJhRXIQXogksRILBiTuZC4/bQIGeB9JOkxMlSuEHyyZpo1Z3S0yWJO2KTSUZbjiNvVxeOUw==}
+ peerDependencies:
+ react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ magic-string@0.30.21:
+ resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+
+ marked@14.0.0:
+ resolution: {integrity: sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==}
+ engines: {node: '>= 18'}
+ hasBin: true
+
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
+ media-typer@1.1.1:
+ resolution: {integrity: sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==}
+ engines: {node: '>= 0.8'}
+
+ merge-descriptors@2.0.0:
+ resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==}
+ engines: {node: '>=18'}
+
+ merge-stream@2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+
+ merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+ engines: {node: '>=8.6'}
+
+ mime-db@1.54.0:
+ resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
+ engines: {node: '>= 0.6'}
+
+ mime-types@3.0.2:
+ resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==}
+ engines: {node: '>=18'}
+
+ mimic-fn@2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+
+ mimic-fn@3.1.0:
+ resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==}
+ engines: {node: '>=8'}
+
+ mimic-function@5.0.1:
+ resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
+ engines: {node: '>=18'}
+
+ minimatch@10.2.6:
+ resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==}
+ engines: {node: 18 || 20 || >=22}
+
+ minimatch@3.1.5:
+ resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==}
+
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ mkdirp@0.5.6:
+ resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
+ hasBin: true
+
+ mlly@1.8.2:
+ resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==}
+
+ monaco-editor@0.56.0:
+ resolution: {integrity: sha512-sXboRm3BeBeLm938eaiyLMe0OxzfXIlZvbv4ir/jVgQy1zDhWjgmny0WoN45fuDKhCCQsYMbBJrv/A6jd8aCUg==}
+
+ mrmime@2.0.1:
+ resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
+ engines: {node: '>=10'}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ nanoid@3.3.19:
+ resolution: {integrity: sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ nanostores@1.5.3:
+ resolution: {integrity: sha512-rQLB6eV4f2AW/n3L0JmwCROpaisYy9EDEADvEFSd1C/qG8hB6O5TPlh9A791JRbJr4CnMQBzptDcvD9OR1+6WA==}
+ engines: {node: ^20.0.0 || >=22.0.0}
+
+ natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+ negotiator@1.1.0:
+ resolution: {integrity: sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==}
+ engines: {node: '>=18'}
+
+ next@16.3.3:
+ resolution: {integrity: sha512-tuRTx1nQ/yVw83cwJBo9F+njGUgMn3UHQycreWHB8XsStvvAh1AthbI8/4IpKnFaF58F+iSiHejYOlMQ/eq83g==}
+ engines: {node: '>=20.9.0'}
+ hasBin: true
+ peerDependencies:
+ '@opentelemetry/api': ^1.1.0
+ '@playwright/test': ^1.51.1
+ babel-plugin-react-compiler: '*'
+ react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
+ react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
+ sass: ^1.3.0
+ peerDependenciesMeta:
+ '@opentelemetry/api':
+ optional: true
+ '@playwright/test':
+ optional: true
+ babel-plugin-react-compiler:
+ optional: true
+ sass:
+ optional: true
+
+ no-case@3.0.4:
+ resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
+
+ node-addon-api@7.1.1:
+ resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
+
+ node-cache@5.1.2:
+ resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==}
+ engines: {node: '>= 8.0.0'}
+
+ node-fetch-native@1.6.7:
+ resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==}
+
+ node-releases@2.0.55:
+ resolution: {integrity: sha512-mIrE/Cw9y+9Au6dS5vDKDhQza9YvG6w+ZrS6X+ZzA7yFW/soAeaups4Qzn1bL6g5FVy8WtP79+0j82oPIbqRjQ==}
+ engines: {node: '>=18'}
+
+ nopt@4.0.3:
+ resolution: {integrity: sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==}
+ hasBin: true
+
+ normalize-package-data@2.5.0:
+ resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
+
+ nostics@1.2.0:
+ resolution: {integrity: sha512-FGqEfhQjrvo1lL8KFifdTQiNwwQHJxC1jtYE1Rc54qF/jxONUNL+kC9gS1krX8Q65PgrQ5fCqH/I4NhWBvdSqg==}
+
+ npm-normalize-package-bin@1.0.1:
+ resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==}
+
+ npm-run-path@4.0.1:
+ resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+ engines: {node: '>=8'}
+
+ npm-run-path@6.0.0:
+ resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==}
+ engines: {node: '>=18'}
+
+ nypm@0.6.10:
+ resolution: {integrity: sha512-W72Hrj1petq+b3Hk2aAC+9zswetlIFTnDW4s5djseZh2nYqBbyQLOtj472HwcbcWykPBUW1WpWpjOd4nK6gMRw==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ object-inspect@1.13.4:
+ resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
+ engines: {node: '>= 0.4'}
+
+ object-treeify@1.1.33:
+ resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==}
+ engines: {node: '>= 10'}
+
+ obug@2.2.1:
+ resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==}
+ engines: {node: '>=12.20.0'}
+
+ ohash@2.0.12:
+ resolution: {integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==}
+
+ on-finished@2.4.1:
+ resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
+ engines: {node: '>= 0.8'}
+
+ once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+ onetime@5.1.2:
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+ engines: {node: '>=6'}
+
+ onetime@7.0.0:
+ resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
+ engines: {node: '>=18'}
+
+ open@11.0.3:
+ resolution: {integrity: sha512-b3souUgU0VaAvMmzA4+9cRgrOgMdE0vc9H9VhQ0FYnjjcyZ8R/f9DiwMU9V8rl+vjf05On9UJhbgb06fsTs87Q==}
+ engines: {node: '>=20'}
+
+ open@8.4.2:
+ resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
+ engines: {node: '>=12'}
+
+ optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+ engines: {node: '>= 0.8.0'}
+
+ ora@8.2.0:
+ resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==}
+ engines: {node: '>=18'}
+
+ os-homedir@1.0.2:
+ resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==}
+ engines: {node: '>=0.10.0'}
+
+ os-tmpdir@1.0.2:
+ resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
+ engines: {node: '>=0.10.0'}
+
+ osenv@0.1.5:
+ resolution: {integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==}
+ deprecated: This package is no longer supported.
+
+ p-limit@2.3.0:
+ resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+ engines: {node: '>=6'}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+
+ p-locate@3.0.0:
+ resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==}
+ engines: {node: '>=6'}
+
+ p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+
+ p-try@2.2.0:
+ resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+ engines: {node: '>=6'}
+
+ param-case@3.0.4:
+ resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==}
+
+ parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+
+ parse-json@5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+
+ parse-ms@4.0.0:
+ resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==}
+ engines: {node: '>=18'}
+
+ parseurl@1.3.3:
+ resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+ engines: {node: '>= 0.8'}
+
+ pascal-case@3.1.2:
+ resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
+
+ path-browserify@1.0.1:
+ resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+
+ path-exists@3.0.0:
+ resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==}
+ engines: {node: '>=4'}
+
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ path-is-absolute@1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-key@4.0.0:
+ resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+ engines: {node: '>=12'}
+
+ path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+ path-to-regexp@8.4.2:
+ resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==}
+
+ pathe@2.0.3:
+ resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
+ perfect-debounce@1.0.0:
+ resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
+
+ perfect-debounce@2.1.0:
+ resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ picomatch@2.3.2:
+ resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==}
+ engines: {node: '>=8.6'}
+
+ picomatch@4.0.7:
+ resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==}
+ engines: {node: '>=12'}
+
+ pkce-challenge@5.0.1:
+ resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==}
+ engines: {node: '>=16.20.0'}
+
+ pkg-types@1.3.1:
+ resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
+
+ pkg-types@2.3.3:
+ resolution: {integrity: sha512-j/lCFdcppV0JxWpCEITdbDltBxPP6cHT+yNJ6Go2OgoSA9518X847X9z0p6LtA4Nc16+eQzCZjRrWanTGvHJ5w==}
+
+ pkg-up@3.1.0:
+ resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==}
+ engines: {node: '>=8'}
+
+ postcss-selector-parser@7.1.6:
+ resolution: {integrity: sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==}
+ engines: {node: '>=4'}
+
+ postcss@8.5.23:
+ resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ postcss@8.5.28:
+ resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ powershell-utils@0.1.0:
+ resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==}
+ engines: {node: '>=20'}
+
+ powershell-utils@0.2.1:
+ resolution: {integrity: sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A==}
+ engines: {node: '>=20'}
+
+ prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+
+ pretty-ms@9.3.1:
+ resolution: {integrity: sha512-HzMy3Geq23nVALD/M2LliU+F+M+gVNsvkQWWqeBZ8HDiCgzo6YPJ/Omrmtq24EFrIsk0a3EkQGEd7bDOo+IhGA==}
+ engines: {node: '>=18'}
+
+ prisma@6.19.3:
+ resolution: {integrity: sha512-++ZJ0ijLrDJF6hNB4t4uxg2br3fC4H9Yc9tcbjr2fcNFP3rh/SBNrAgjhsqBU4Ght8JPrVofG/ZkXfnSfnYsFg==}
+ engines: {node: '>=18.18'}
+ hasBin: true
+ peerDependencies:
+ typescript: '>=5.1.0'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ prompts@2.4.2:
+ resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
+ engines: {node: '>= 6'}
+
+ proxy-addr@2.0.7:
+ resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
+ engines: {node: '>= 0.10'}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ pure-rand@6.1.0:
+ resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==}
+
+ qified@0.10.1:
+ resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==}
+ engines: {node: '>=20'}
+
+ qs@6.16.0:
+ resolution: {integrity: sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==}
+ engines: {node: '>=0.6'}
+
+ quansync@0.2.11:
+ resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==}
+
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+ range-parser@1.3.0:
+ resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==}
+ engines: {node: '>= 0.6'}
+
+ raw-body@3.0.2:
+ resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==}
+ engines: {node: '>= 0.10'}
+
+ rc9@2.1.2:
+ resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==}
+
+ react-dom@19.3.0:
+ resolution: {integrity: sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==}
+ peerDependencies:
+ react: ^19.3.0
+
+ react@19.3.0:
+ resolution: {integrity: sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==}
+ engines: {node: '>=0.10.0'}
+
+ read-installed@4.0.3:
+ resolution: {integrity: sha512-O03wg/IYuV/VtnK2h/KXEt9VIbMUFbk3ERG0Iu4FhLZw0EP0T9znqrYDGn6ncbEsXUFaUjiVAWXHzxwt3lhRPQ==}
+ deprecated: This package is no longer supported.
+
+ read-package-json@2.1.2:
+ resolution: {integrity: sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==}
+ deprecated: This package is no longer supported. Please use @npmcli/package-json instead.
+
+ readdir-scoped-modules@1.1.0:
+ resolution: {integrity: sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==}
+ deprecated: This functionality has been moved to @npmcli/fs
+
+ readdirp@4.1.2:
+ resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
+ engines: {node: '>= 14.18.0'}
+
+ readdirp@5.1.1:
+ resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==}
+ engines: {node: '>= 20.19.0'}
+
+ recast@0.23.21:
+ resolution: {integrity: sha512-mFAyJq9vUbSTARLZUvAEf1z3YxlvAwswbmxMx2mPA/MSm4KmpwvwvhsH/NIrZhyOuwD60Lzyw2qh83uCbgTPYw==}
+ engines: {node: '>= 4'}
+
+ relateurl@0.2.7:
+ resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==}
+ engines: {node: '>= 0.10'}
+
+ require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+
+ reselect@5.3.0:
+ resolution: {integrity: sha512-XGoLeRAVzUTcJ1qkxPQhDJyIZ5d6zzZD9nT7AEZOaaU9UbWclhycElmhO+VD5bFeLuzhPBaOV2oXC8uG35ZSpg==}
+
+ resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+
+ resolve@1.22.12:
+ resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==}
+ engines: {node: '>= 0.4'}
+ hasBin: true
+
+ restore-cursor@5.1.0:
+ resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==}
+ engines: {node: '>=18'}
+
+ reusify@1.1.0:
+ resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ rollup-plugin-string@3.0.0:
+ resolution: {integrity: sha512-vqyzgn9QefAgeKi+Y4A7jETeIAU1zQmS6VotH6bzm/zmUQEnYkpIGRaOBPY41oiWYV4JyBoGAaBjYMYuv+6wVw==}
+
+ rollup-plugin-visualizer@7.1.1:
+ resolution: {integrity: sha512-ThaGiHTU8XW02OkK80TrTHATraJmM9OAduU4otal+7gyXLpYEtmGBLfx5kW+EHvvLwn03YGW2NnwKUIqsYlJAA==}
+ engines: {node: '>=22'}
+ hasBin: true
+ peerDependencies:
+ rolldown: 1.x || ^1.0.0-beta || ^1.0.0-rc
+ rollup: 2.x || 3.x || 4.x
+ peerDependenciesMeta:
+ rolldown:
+ optional: true
+ rollup:
+ optional: true
+
+ rollup-pluginutils@2.8.2:
+ resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==}
+
+ rollup@2.80.0:
+ resolution: {integrity: sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ==}
+ engines: {node: '>=10.0.0'}
+ hasBin: true
+
+ rollup@4.63.2:
+ resolution: {integrity: sha512-l5eyksV4tPBj6lJyEa37YzIOCSOV7lkZzEHUdpjWZbtD7wTcFYmEYXSgm5bT4vV+dZLb9rBG1W9GROOG4NS4Ew==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ rou3@0.9.2:
+ resolution: {integrity: sha512-3SOzvaAg8rkHrXtRjpCvCvbyO5to9oOO27Z/XqHEYXfMRVSw/qMIVdmaOk9W2lcRLtR6dlqTjo9hDeJk70QBYQ==}
+
+ router@2.2.0:
+ resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==}
+ engines: {node: '>= 18'}
+
+ run-applescript@7.1.0:
+ resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==}
+ engines: {node: '>=18'}
+
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+ safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+ sass@1.104.1:
+ resolution: {integrity: sha512-yDA+1aIG3EHgN4V/BvuhCvu61FF6hEd4e+9DxikUm9U0CAGuvdIZ/UYy7qbOxjhbbWQraoyLlMuzdRGOSV5Bmw==}
+ engines: {node: '>=20.19.0'}
+ hasBin: true
+
+ scheduler@0.28.0:
+ resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==}
+
+ semver@5.7.2:
+ resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
+ hasBin: true
+
+ semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
+ semver@7.8.5:
+ resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ send@1.2.1:
+ resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==}
+ engines: {node: '>= 18'}
+
+ serve-static@2.2.1:
+ resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==}
+ engines: {node: '>= 18'}
+
+ set-cookie-parser@3.1.2:
+ resolution: {integrity: sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw==}
+
+ setprototypeof@1.2.0:
+ resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+
+ shadcn@4.21.0:
+ resolution: {integrity: sha512-UU2mFNusW8C5rvadKdH69vERYZqUlOOlXBcf0MYhYLdTGP6DPti7X4qovCu+RTfCqsAgq/T+YfE0Vnttxh9aiw==}
+ engines: {node: '>=20.18.1'}
+ hasBin: true
+
+ sharp@0.35.4:
+ resolution: {integrity: sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==}
+ engines: {node: '>=20.9.0'}
+ peerDependencies:
+ '@types/node': '*'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ side-channel-list@1.0.1:
+ resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-map@1.0.1:
+ resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-weakmap@1.0.2:
+ resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+ engines: {node: '>= 0.4'}
+
+ side-channel@1.1.1:
+ resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==}
+ engines: {node: '>= 0.4'}
+
+ signal-exit@3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+
+ signal-exit@4.1.0:
+ resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+ engines: {node: '>=14'}
+
+ sisteransi@1.0.5:
+ resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+
+ slide@1.1.6:
+ resolution: {integrity: sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==}
+
+ smart-buffer@4.2.0:
+ resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==}
+ engines: {node: '>= 6.0.0', npm: '>= 3.0.0'}
+
+ socks@2.8.10:
+ resolution: {integrity: sha512-e0VyvkVTwVYViNovRkZ9aodhxVlyoMn7eJhVUPxZ+eK9P/7CBkxvvsBOHqFPEH416726W8tLXXXjKwqgTErrCQ==}
+ engines: {node: '>= 10.0.0', npm: '>= 3.0.0'}
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ source-map-support@0.5.21:
+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+
+ source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.8.0:
+ resolution: {integrity: sha512-d8EqvL+k/SOXCreS/SUzg2ciyHqBBLcN/yuRjFsbvVhHTE2pgei7oAhmPM7kWFbkX6OSMQfUq4KbkF3au9lhYQ==}
+ engines: {node: '>= 12'}
+
+ spdx-compare@1.0.0:
+ resolution: {integrity: sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==}
+
+ spdx-correct@3.2.0:
+ resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
+
+ spdx-exceptions@2.5.0:
+ resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==}
+
+ spdx-expression-parse@3.0.1:
+ resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
+
+ spdx-license-ids@3.0.23:
+ resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==}
+
+ spdx-ranges@2.1.1:
+ resolution: {integrity: sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==}
+
+ spdx-satisfies@4.0.1:
+ resolution: {integrity: sha512-WVzZ/cXAzoNmjCWiEluEA3BjHp5tiUmmhn9MK+X0tBbR9sOqtC6UQwmgCNrAIZvNlMuBUYAaHYfb2oqlF9SwKA==}
+
+ srvx@1.0.4:
+ resolution: {integrity: sha512-eZmYaxUfZSo7/8m8UdsHRJNmTLSCTPPom9d7a60vMmuVeZvwhbvflRR+00/CxTCjMOFa5+H8tgBeNDVZ+w7AAQ==}
+ engines: {node: '>=20.16.0'}
+ hasBin: true
+
+ state-local@1.0.7:
+ resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==}
+
+ statuses@2.0.2:
+ resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==}
+ engines: {node: '>= 0.8'}
+
+ stdin-discarder@0.2.2:
+ resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==}
+ engines: {node: '>=18'}
+
+ string-width@7.2.0:
+ resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
+ engines: {node: '>=18'}
+
+ string-width@8.2.2:
+ resolution: {integrity: sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==}
+ engines: {node: '>=20'}
+
+ stringify-object@5.0.0:
+ resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==}
+ engines: {node: '>=14.16'}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
+ strip-ansi@7.2.0:
+ resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==}
+ engines: {node: '>=12'}
+
+ strip-bom@3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
+
+ strip-final-newline@2.0.0:
+ resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
+ engines: {node: '>=6'}
+
+ strip-final-newline@4.0.0:
+ resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==}
+ engines: {node: '>=18'}
+
+ styled-jsx@5.1.6:
+ resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==}
+ engines: {node: '>= 12.0.0'}
+ peerDependencies:
+ '@babel/core': '*'
+ babel-plugin-macros: '*'
+ react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0'
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ babel-plugin-macros:
+ optional: true
+
+ supports-color@5.5.0:
+ resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+ engines: {node: '>=4'}
+
+ supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ systeminformation@5.33.10:
+ resolution: {integrity: sha512-/NXbMVASt2UbSVgmWto4aBTIAeuYY7zOELpZybmNxqpsrbo5uYHpuEPf5nkyrPng0uG5YOb+Yv6s0FyKY4mDQg==}
+ engines: {node: '>=10.0.0'}
+ os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android]
+ hasBin: true
+
+ tailwind-merge@3.7.0:
+ resolution: {integrity: sha512-XPPUyAc+cvspz3lHTcR/QgPfW2A0lv/xQNIjX3HGhLR+Nq2lHaLq5MtTesHn8GUr3W3DguT2KT5x3NVgRtYwmA==}
+
+ tailwindcss@4.3.3:
+ resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==}
+
+ tapable@2.3.3:
+ resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
+ engines: {node: '>=6'}
+
+ tellraw-parser@1.0.2:
+ resolution: {integrity: sha512-vIEuTAutJGXI6Xks5OoMdELbmDa6GC7Jty074lVgUWn+Ff/puks5DChmeIvNG7cnHzSPyftCB4rVSPG7Xl01kg==}
+
+ terser@5.51.2:
+ resolution: {integrity: sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ tiny-invariant@1.3.3:
+ resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
+
+ tinyexec@1.3.1:
+ resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==}
+ engines: {node: '>=18'}
+
+ tinyglobby@0.2.17:
+ resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==}
+ engines: {node: '>=12.0.0'}
+
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
+ toidentifier@1.0.1:
+ resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
+ engines: {node: '>=0.6'}
+
+ tosource@2.0.0-alpha.3:
+ resolution: {integrity: sha512-KAB2lrSS48y91MzFPFuDg4hLbvDiyTjOVgaK7Erw+5AmZXNq4sFRVn8r6yxSLuNs15PaokrDRpS61ERY9uZOug==}
+ engines: {node: '>=10'}
+
+ treeify@1.1.0:
+ resolution: {integrity: sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==}
+ engines: {node: '>=0.6'}
+
+ ts-api-utils@2.5.0:
+ resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==}
+ engines: {node: '>=18.12'}
+ peerDependencies:
+ typescript: '>=4.8.4'
+
+ ts-morph@26.0.0:
+ resolution: {integrity: sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==}
+
+ tsconfig-paths@4.2.0:
+ resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==}
+ engines: {node: '>=6'}
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ tsx@4.23.13:
+ resolution: {integrity: sha512-BL5MGkRln6aDYhb0xbQlEAGw743BaZYWdbWtdJOBriYJboKgUUYCadFp2/FpBBZquBC/ezNBn7wMMPx7FDZUDw==}
+ engines: {node: '>=18.0.0'}
+ hasBin: true
+
+ tw-animate-css@1.4.0:
+ resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==}
+
+ type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+
+ type-is@2.1.0:
+ resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==}
+ engines: {node: '>= 18'}
+
+ typescript-eslint@8.70.0:
+ resolution: {integrity: sha512-P/W5cz70/cQAuKfY3xwQMWWTV7BvJ0mAQmi+9mBcsVPaBUpd6Ohpa+fECv9rBFrQcig86jAiNBFNWUqnTjr4pw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.1.0'
+
+ typescript@5.7.3:
+ resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ typescript@6.0.3:
+ resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ ufo@1.6.4:
+ resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==}
+
+ undici-types@7.18.2:
+ resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==}
+
+ undici-types@7.24.6:
+ resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==}
+
+ undici-types@8.9.0:
+ resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==}
+
+ undici@7.29.1:
+ resolution: {integrity: sha512-RYONW2MeafgYlkVOKYKkA/Ag7BmXqgIWCa8t1m0JcxrQg9pI9lEqRhAOruOBCbAohOa/gkCF+iPi9hrgvTzu6Q==}
+ engines: {node: '>=20.18.1'}
+
+ unicorn-magic@0.3.0:
+ resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==}
+ engines: {node: '>=18'}
+
+ universalify@2.0.1:
+ resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+ engines: {node: '>= 10.0.0'}
+
+ unpipe@1.0.0:
+ resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
+ engines: {node: '>= 0.8'}
+
+ unplugin-remove@1.0.3:
+ resolution: {integrity: sha512-BZMt9v8Y/Z27cY7YQv+DpcW928znjP1cqplBXOirbANiFQtM2YCdiyNAJhHCvjppT0lScNn1aDrQnXqnRp32pQ==}
+
+ unplugin@1.16.1:
+ resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==}
+ engines: {node: '>=14.0.0'}
+
+ update-browserslist-db@1.3.3:
+ resolution: {integrity: sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+ use-sync-external-store@1.7.0:
+ resolution: {integrity: sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ util-extend@1.0.3:
+ resolution: {integrity: sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA==}
+
+ validate-npm-package-license@3.0.4:
+ resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
+
+ validate-npm-package-name@7.0.2:
+ resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==}
+ engines: {node: ^20.17.0 || >=22.9.0}
+
+ vary@1.1.2:
+ resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+ engines: {node: '>= 0.8'}
+
+ vite-plugin-eslint@1.8.1:
+ resolution: {integrity: sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang==}
+ peerDependencies:
+ eslint: '>=7'
+ vite: '>=2'
+
+ vite@6.4.3:
+ resolution: {integrity: sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
+ jiti: '>=1.21.0'
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ sass-embedded: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+
+ webpack-virtual-modules@0.6.2:
+ resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ which@4.0.0:
+ resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==}
+ engines: {node: ^16.13.0 || >=18.0.0}
+ hasBin: true
+
+ word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+
+ wrap-ansi@9.0.2:
+ resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==}
+ engines: {node: '>=18'}
+
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ wsl-utils@1.0.0:
+ resolution: {integrity: sha512-Hl0ZOAs672vg+06kfujwRhoS6/jehvULrlFkuF2dRu6pHgA8U06h3xqNIqNNU1LTXPcedxByAR4GS6pwQK0mgA==}
+ engines: {node: '>=20'}
+
+ y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+
+ yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+ yargs-parser@22.0.0:
+ resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==}
+ engines: {node: ^20.19.0 || ^22.12.0 || >=23}
+
+ yargs@18.1.0:
+ resolution: {integrity: sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==}
+ engines: {node: ^20.19.0 || ^22.12.0 || >=23}
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+ yocto-spinner@1.2.2:
+ resolution: {integrity: sha512-DODGl1wJjA/s5pnJFKau9lIYHT81lnhob1i3e1TjxZRxEhWRKl74nTbWE6H5KlkViQQTo/Z29YFdxzTZAMY3ng==}
+ engines: {node: '>=18.19'}
+
+ yoctocolors@2.2.0:
+ resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==}
+ engines: {node: '>=18'}
+
+ zigpty@0.2.1:
+ resolution: {integrity: sha512-MR9JqJx2wf5f4wz8zpx050AlqrmWeIW+1h0SO5iEyhG3HFRjY5luC3szS2ux2EGuPjE5OU9ZAuiCBeMWBTrqZw==}
+
+ zod-to-json-schema@3.25.2:
+ resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==}
+ peerDependencies:
+ zod: ^3.25.28 || ^4
+
+ zod@3.25.76:
+ resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
+
+ zod@4.6.2:
+ resolution: {integrity: sha512-lh5RCAGFa1Cm2hjtNwLQhSs/AsqdWnTQaBER9fEwN/88pSh7KOtJavtBx/0VlkN/uFd61SwYmljLMDAsHlvzBQ==}
+
+snapshots:
+
+ '@alloc/quick-lru@5.3.0': {}
+
+ '@babel/code-frame@7.29.7':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.29.7
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
+ '@babel/compat-data@7.29.7': {}
+
+ '@babel/core@7.29.7':
+ dependencies:
+ '@babel/code-frame': 7.29.7
+ '@babel/generator': 7.29.8
+ '@babel/helper-compilation-targets': 7.29.7
+ '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7)
+ '@babel/helpers': 7.29.7
+ '@babel/parser': 7.29.8
+ '@babel/template': 7.29.7
+ '@babel/traverse': 7.29.8
+ '@babel/types': 7.29.8
+ '@jridgewell/remapping': 2.3.5
+ convert-source-map: 2.0.0
+ debug: 4.4.3
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/generator@7.29.8':
+ dependencies:
+ '@babel/parser': 7.29.8
+ '@babel/types': 7.29.8
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ jsesc: 3.1.0
+
+ '@babel/helper-annotate-as-pure@7.29.7':
+ dependencies:
+ '@babel/types': 7.29.8
+
+ '@babel/helper-compilation-targets@7.29.7':
+ dependencies:
+ '@babel/compat-data': 7.29.7
+ '@babel/helper-validator-option': 7.29.7
+ browserslist: 4.28.9
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/helper-annotate-as-pure': 7.29.7
+ '@babel/helper-member-expression-to-functions': 7.29.7
+ '@babel/helper-optimise-call-expression': 7.29.7
+ '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7)
+ '@babel/helper-skip-transparent-expression-wrappers': 7.29.7
+ '@babel/traverse': 7.29.8
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-globals@7.29.7': {}
+
+ '@babel/helper-member-expression-to-functions@7.29.7':
+ dependencies:
+ '@babel/traverse': 7.29.8
+ '@babel/types': 7.29.8
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-imports@7.29.7':
+ dependencies:
+ '@babel/traverse': 7.29.8
+ '@babel/types': 7.29.8
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/helper-module-imports': 7.29.7
+ '@babel/helper-validator-identifier': 7.29.7
+ '@babel/traverse': 7.29.8
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-optimise-call-expression@7.29.7':
+ dependencies:
+ '@babel/types': 7.29.8
+
+ '@babel/helper-plugin-utils@7.29.7': {}
+
+ '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/helper-member-expression-to-functions': 7.29.7
+ '@babel/helper-optimise-call-expression': 7.29.7
+ '@babel/traverse': 7.29.8
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-skip-transparent-expression-wrappers@7.29.7':
+ dependencies:
+ '@babel/traverse': 7.29.8
+ '@babel/types': 7.29.8
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-string-parser@7.29.7': {}
+
+ '@babel/helper-validator-identifier@7.29.7': {}
+
+ '@babel/helper-validator-option@7.29.7': {}
+
+ '@babel/helpers@7.29.7':
+ dependencies:
+ '@babel/template': 7.29.7
+ '@babel/types': 7.29.8
+
+ '@babel/parser@7.29.8':
+ dependencies:
+ '@babel/types': 7.29.8
+
+ '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/helper-plugin-utils': 7.29.7
+
+ '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/helper-plugin-utils': 7.29.7
+
+ '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7)':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7)
+ '@babel/helper-plugin-utils': 7.29.7
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7)':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/helper-annotate-as-pure': 7.29.7
+ '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7)
+ '@babel/helper-plugin-utils': 7.29.7
+ '@babel/helper-skip-transparent-expression-wrappers': 7.29.7
+ '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/preset-typescript@7.29.7(@babel/core@7.29.7)':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/helper-plugin-utils': 7.29.7
+ '@babel/helper-validator-option': 7.29.7
+ '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7)
+ '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7)
+ '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/runtime@7.29.7': {}
+
+ '@babel/template@7.29.7':
+ dependencies:
+ '@babel/code-frame': 7.29.7
+ '@babel/parser': 7.29.8
+ '@babel/types': 7.29.8
+
+ '@babel/traverse@7.29.8':
+ dependencies:
+ '@babel/code-frame': 7.29.7
+ '@babel/generator': 7.29.8
+ '@babel/helper-globals': 7.29.7
+ '@babel/parser': 7.29.8
+ '@babel/template': 7.29.7
+ '@babel/types': 7.29.8
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/types@7.29.8':
+ dependencies:
+ '@babel/helper-string-parser': 7.29.7
+ '@babel/helper-validator-identifier': 7.29.7
+
+ '@base-ui/react@1.8.0(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
+ dependencies:
+ '@babel/runtime': 7.29.7
+ '@base-ui/utils': 0.4.0(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
+ '@floating-ui/react-dom': 2.1.9(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
+ '@floating-ui/utils': 0.2.12
+ react: 19.3.0
+ react-dom: 19.3.0(react@19.3.0)
+ use-sync-external-store: 1.7.0(react@19.3.0)
+ optionalDependencies:
+ '@types/react': 19.3.0
+
+ '@base-ui/utils@0.4.0(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
+ dependencies:
+ '@babel/runtime': 7.29.7
+ '@floating-ui/utils': 0.2.12
+ react: 19.3.0
+ react-dom: 19.3.0(react@19.3.0)
+ reselect: 5.3.0
+ use-sync-external-store: 1.7.0(react@19.3.0)
+ optionalDependencies:
+ '@types/react': 19.3.0
+
+ '@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)':
+ dependencies:
+ '@better-auth/utils': 0.4.2
+ '@better-fetch/fetch': 1.3.1
+ '@opentelemetry/semantic-conventions': 1.43.0
+ '@standard-schema/spec': 1.1.0
+ better-call: 1.4.0(zod@4.6.2)
+ jose: 6.2.12
+ kysely: 0.29.5
+ nanostores: 1.5.3
+ zod: 4.6.2
+
+ '@better-auth/drizzle-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
+ dependencies:
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/utils': 0.4.2
+
+ '@better-auth/kysely-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(kysely@0.29.5)':
+ dependencies:
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/utils': 0.4.2
+ optionalDependencies:
+ kysely: 0.29.5
+
+ '@better-auth/memory-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
+ dependencies:
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/utils': 0.4.2
+
+ '@better-auth/mongo-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
+ dependencies:
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/utils': 0.4.2
+
+ '@better-auth/prisma-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(prisma@6.19.3(typescript@5.7.3))':
+ dependencies:
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/utils': 0.4.2
+ optionalDependencies:
+ '@prisma/client': 6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3)
+ prisma: 6.19.3(typescript@5.7.3)
+
+ '@better-auth/telemetry@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)':
+ dependencies:
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/utils': 0.4.2
+ '@better-fetch/fetch': 1.3.1
+
+ '@better-auth/utils@0.4.2':
+ dependencies:
+ '@noble/hashes': 2.4.0
+
+ '@better-auth/utils@0.5.0':
+ dependencies:
+ '@noble/hashes': 2.4.0
+
+ '@better-fetch/fetch@1.3.1': {}
+
+ '@cacheable/memory@2.2.0':
+ dependencies:
+ '@cacheable/utils': 2.5.0
+ '@keyv/bigmap': 1.3.1(keyv@5.6.0)
+ hookified: 1.15.1
+ keyv: 5.6.0
+
+ '@cacheable/utils@2.5.0':
+ dependencies:
+ hashery: 1.5.1
+ keyv: 5.6.0
+
+ '@devframes/hub-ui@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/json-render@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))':
+ dependencies:
+ '@devframes/hub': 0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))
+ devframe: 0.9.18(cac@7.0.0)(srvx@1.0.4)
+ optionalDependencies:
+ '@devframes/json-render': 0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))
+
+ '@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))':
+ dependencies:
+ '@standard-schema/spec': 1.1.0
+ destr: 2.0.5
+ devframe: 0.9.18(cac@7.0.0)(srvx@1.0.4)
+ h3: 2.0.1-rc.31(crossws@0.4.12(srvx@1.0.4))
+ pathe: 2.0.3
+ perfect-debounce: 2.1.0
+ tinyexec: 1.3.1
+ ufo: 1.6.4
+ zigpty: 0.2.1
+ transitivePeerDependencies:
+ - crossws
+ - ocache
+
+ '@devframes/json-render-ui@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))':
+ optionalDependencies:
+ '@devframes/hub': 0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))
+ devframe: 0.9.18(cac@7.0.0)(srvx@1.0.4)
+
+ '@devframes/json-render@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))':
+ dependencies:
+ '@json-render/core': 0.20.0(zod@4.6.2)
+ '@standard-schema/spec': 1.1.0
+ devframe: 0.9.18(cac@7.0.0)(srvx@1.0.4)
+ zod: 4.6.2
+ optionalDependencies:
+ '@devframes/hub': 0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))
+
+ '@devframes/plugin-inspect@0.9.18(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))':
+ dependencies:
+ cac: 7.0.0
+ devframe: 0.9.18(cac@7.0.0)(srvx@1.0.4)
+ optionalDependencies:
+ vite: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)
+
+ '@devframes/plugin-messages@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))':
+ dependencies:
+ '@devframes/hub': 0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))
+ '@devframes/service-open': 0.9.18(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))
+ cac: 7.0.0
+ devframe: 0.9.18(cac@7.0.0)(srvx@1.0.4)
+ optionalDependencies:
+ vite: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)
+
+ '@devframes/plugin-terminals@0.9.18(@devframes/hub-ui@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/json-render@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))':
+ dependencies:
+ '@devframes/vite': 0.9.18(@devframes/hub-ui@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/json-render@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))
+ cac: 7.0.0
+ devframe: 0.9.18(cac@7.0.0)(srvx@1.0.4)
+ zigpty: 0.2.1
+ optionalDependencies:
+ vite: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)
+ transitivePeerDependencies:
+ - '@devframes/hub'
+ - '@devframes/hub-ui'
+
+ '@devframes/service-open@0.9.18(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))':
+ dependencies:
+ devframe: 0.9.18(cac@7.0.0)(srvx@1.0.4)
+ pathe: 2.0.3
+
+ '@devframes/vite@0.9.18(@devframes/hub-ui@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/json-render@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))':
+ dependencies:
+ devframe: 0.9.18(cac@7.0.0)(srvx@1.0.4)
+ pathe: 2.0.3
+ optionalDependencies:
+ '@devframes/hub': 0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))
+ '@devframes/hub-ui': 0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/json-render@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))
+ vite: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)
+
+ '@dotenvx/dotenvx@1.75.1':
+ dependencies:
+ '@dotenvx/primitives': 0.8.0
+ commander: 11.1.0
+ conf: 10.2.0
+ dotenv: 17.4.2
+ enquirer: 2.4.1
+ env-paths: 2.2.1
+ execa: 5.1.1
+ fdir: 6.5.0(picomatch@4.0.7)
+ ignore: 5.3.2
+ object-treeify: 1.1.33
+ open: 8.4.2
+ picomatch: 4.0.7
+ systeminformation: 5.33.10
+ undici: 7.29.1
+ which: 4.0.0
+ yocto-spinner: 1.2.2
+
+ '@dotenvx/primitives@0.8.0': {}
+
+ '@emnapi/runtime@1.11.3':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@esbuild/aix-ppc64@0.25.12':
+ optional: true
+
+ '@esbuild/aix-ppc64@0.28.2':
+ optional: true
+
+ '@esbuild/android-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/android-arm64@0.28.2':
+ optional: true
+
+ '@esbuild/android-arm@0.25.12':
+ optional: true
+
+ '@esbuild/android-arm@0.28.2':
+ optional: true
+
+ '@esbuild/android-x64@0.25.12':
+ optional: true
+
+ '@esbuild/android-x64@0.28.2':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.28.2':
+ optional: true
+
+ '@esbuild/darwin-x64@0.25.12':
+ optional: true
+
+ '@esbuild/darwin-x64@0.28.2':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.28.2':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.25.12':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.28.2':
+ optional: true
+
+ '@esbuild/linux-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-arm64@0.28.2':
+ optional: true
+
+ '@esbuild/linux-arm@0.25.12':
+ optional: true
+
+ '@esbuild/linux-arm@0.28.2':
+ optional: true
+
+ '@esbuild/linux-ia32@0.25.12':
+ optional: true
+
+ '@esbuild/linux-ia32@0.28.2':
+ optional: true
+
+ '@esbuild/linux-loong64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-loong64@0.28.2':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.25.12':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.28.2':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.28.2':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.28.2':
+ optional: true
+
+ '@esbuild/linux-s390x@0.25.12':
+ optional: true
+
+ '@esbuild/linux-s390x@0.28.2':
+ optional: true
+
+ '@esbuild/linux-x64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-x64@0.28.2':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.28.2':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.25.12':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.28.2':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.28.2':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.25.12':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.28.2':
+ optional: true
+
+ '@esbuild/openharmony-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/openharmony-arm64@0.28.2':
+ optional: true
+
+ '@esbuild/sunos-x64@0.25.12':
+ optional: true
+
+ '@esbuild/sunos-x64@0.28.2':
+ optional: true
+
+ '@esbuild/win32-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/win32-arm64@0.28.2':
+ optional: true
+
+ '@esbuild/win32-ia32@0.25.12':
+ optional: true
+
+ '@esbuild/win32-ia32@0.28.2':
+ optional: true
+
+ '@esbuild/win32-x64@0.25.12':
+ optional: true
+
+ '@esbuild/win32-x64@0.28.2':
+ optional: true
+
+ '@eslint-community/eslint-utils@4.10.1(eslint@10.10.0(jiti@2.7.0))':
+ dependencies:
+ eslint: 10.10.0(jiti@2.7.0)
+ eslint-visitor-keys: 3.4.3
+
+ '@eslint-community/regexpp@4.12.2': {}
+
+ '@eslint/config-array@0.23.5':
+ dependencies:
+ '@eslint/object-schema': 3.0.5
+ debug: 4.4.3
+ minimatch: 10.2.6
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/config-helpers@0.7.0':
+ dependencies:
+ '@eslint/core': 1.2.1
+
+ '@eslint/core@1.2.1':
+ dependencies:
+ '@types/json-schema': 7.0.15
+
+ '@eslint/js@10.0.1(eslint@10.10.0(jiti@2.7.0))':
+ optionalDependencies:
+ eslint: 10.10.0(jiti@2.7.0)
+
+ '@eslint/object-schema@3.0.5': {}
+
+ '@eslint/plugin-kit@0.7.3':
+ dependencies:
+ '@eslint/core': 1.2.1
+ levn: 0.4.1
+
+ '@floating-ui/core@1.8.0':
+ dependencies:
+ '@floating-ui/utils': 0.2.12
+
+ '@floating-ui/dom@1.8.0':
+ dependencies:
+ '@floating-ui/core': 1.8.0
+ '@floating-ui/utils': 0.2.12
+
+ '@floating-ui/react-dom@2.1.9(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
+ dependencies:
+ '@floating-ui/dom': 1.8.0
+ react: 19.3.0
+ react-dom: 19.3.0(react@19.3.0)
+
+ '@floating-ui/utils@0.2.12': {}
+
+ '@hono/node-server@2.1.1(hono@4.13.7)':
+ dependencies:
+ hono: 4.13.7
+
+ '@humanfs/core@0.19.2':
+ dependencies:
+ '@humanfs/types': 0.15.0
+
+ '@humanfs/node@0.16.8':
+ dependencies:
+ '@humanfs/core': 0.19.2
+ '@humanfs/types': 0.15.0
+ '@humanwhocodes/retry': 0.4.3
+
+ '@humanfs/types@0.15.0': {}
+
+ '@humanwhocodes/module-importer@1.0.1': {}
+
+ '@humanwhocodes/retry@0.4.3': {}
+
+ '@img/colour@1.1.0':
+ optional: true
+
+ '@img/sharp-darwin-arm64@0.35.4':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-arm64': 1.3.3
+ optional: true
+
+ '@img/sharp-darwin-x64@0.35.4':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-x64': 1.3.3
+ optional: true
+
+ '@img/sharp-freebsd-wasm32@0.35.4':
+ dependencies:
+ '@img/sharp-wasm32': 0.35.4
+ optional: true
+
+ '@img/sharp-libvips-darwin-arm64@1.3.3':
+ optional: true
+
+ '@img/sharp-libvips-darwin-x64@1.3.3':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm64@1.3.3':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm@1.3.3':
+ optional: true
+
+ '@img/sharp-libvips-linux-ppc64@1.3.3':
+ optional: true
+
+ '@img/sharp-libvips-linux-riscv64@1.3.3':
+ optional: true
+
+ '@img/sharp-libvips-linux-s390x@1.3.3':
+ optional: true
+
+ '@img/sharp-libvips-linux-x64@1.3.3':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.3.3':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-x64@1.3.3':
+ optional: true
+
+ '@img/sharp-linux-arm64@0.35.4':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm64': 1.3.3
+ optional: true
+
+ '@img/sharp-linux-arm@0.35.4':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm': 1.3.3
+ optional: true
+
+ '@img/sharp-linux-ppc64@0.35.4':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-ppc64': 1.3.3
+ optional: true
+
+ '@img/sharp-linux-riscv64@0.35.4':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-riscv64': 1.3.3
+ optional: true
+
+ '@img/sharp-linux-s390x@0.35.4':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-s390x': 1.3.3
+ optional: true
+
+ '@img/sharp-linux-x64@0.35.4':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-x64': 1.3.3
+ optional: true
+
+ '@img/sharp-linuxmusl-arm64@0.35.4':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-arm64': 1.3.3
+ optional: true
+
+ '@img/sharp-linuxmusl-x64@0.35.4':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-x64': 1.3.3
+ optional: true
+
+ '@img/sharp-wasm32@0.35.4':
+ dependencies:
+ '@emnapi/runtime': 1.11.3
+ optional: true
+
+ '@img/sharp-webcontainers-wasm32@0.35.4':
+ dependencies:
+ '@img/sharp-wasm32': 0.35.4
+ optional: true
+
+ '@img/sharp-win32-arm64@0.35.4':
+ optional: true
+
+ '@img/sharp-win32-ia32@0.35.4':
+ optional: true
+
+ '@img/sharp-win32-x64@0.35.4':
+ optional: true
+
+ '@jridgewell/gen-mapping@0.3.13':
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.6.0
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/remapping@2.3.5':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/source-map@0.3.11':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/sourcemap-codec@1.6.0': {}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.6.0
+
+ '@json-render/core@0.20.0(zod@4.6.2)':
+ dependencies:
+ zod: 4.6.2
+
+ '@keyv/bigmap@1.3.1(keyv@5.6.0)':
+ dependencies:
+ hashery: 1.5.1
+ hookified: 1.15.1
+ keyv: 5.6.0
+
+ '@keyv/serialize@1.1.1': {}
+
+ '@modelcontextprotocol/core@2.0.0':
+ dependencies:
+ zod: 4.6.2
+
+ '@modelcontextprotocol/sdk@1.30.0(zod@3.25.76)':
+ dependencies:
+ '@hono/node-server': 2.1.1(hono@4.13.7)
+ ajv: 8.20.0
+ ajv-formats: 3.0.1(ajv@8.20.0)
+ content-type: 1.0.5
+ cors: 2.8.6
+ cross-spawn: 7.0.6
+ eventsource: 3.0.7
+ eventsource-parser: 3.1.1
+ express: 5.2.1
+ express-rate-limit: 8.7.0(express@5.2.1)
+ hono: 4.13.7
+ jose: 6.2.12
+ json-schema-typed: 8.0.2
+ pkce-challenge: 5.0.1
+ raw-body: 3.0.2
+ zod: 3.25.76
+ zod-to-json-schema: 3.25.2(zod@3.25.76)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@modelcontextprotocol/server@2.0.0':
+ dependencies:
+ '@modelcontextprotocol/core': 2.0.0
+ zod: 4.6.2
+
+ '@monaco-editor/loader@1.7.0':
+ dependencies:
+ state-local: 1.0.7
+
+ '@monaco-editor/react@4.7.0(monaco-editor@0.56.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
+ dependencies:
+ '@monaco-editor/loader': 1.7.0
+ monaco-editor: 0.56.0
+ react: 19.3.0
+ react-dom: 19.3.0(react@19.3.0)
+
+ '@napi-rs/lzma-linux-x64-gnu@1.5.1':
+ optional: true
+
+ '@next/env@16.3.3': {}
+
+ '@next/swc-darwin-arm64@16.3.3':
+ optional: true
+
+ '@next/swc-darwin-x64@16.3.3':
+ optional: true
+
+ '@next/swc-linux-arm64-gnu@16.3.3':
+ optional: true
+
+ '@next/swc-linux-arm64-musl@16.3.3':
+ optional: true
+
+ '@next/swc-linux-x64-gnu@16.3.3':
+ optional: true
+
+ '@next/swc-linux-x64-musl@16.3.3':
+ optional: true
+
+ '@next/swc-win32-arm64-msvc@16.3.3':
+ optional: true
+
+ '@next/swc-win32-x64-msvc@16.3.3':
+ optional: true
+
+ '@noble/ciphers@2.4.0': {}
+
+ '@noble/hashes@2.4.0': {}
+
+ '@nodelib/fs.scandir@2.1.5':
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+
+ '@nodelib/fs.stat@2.0.5': {}
+
+ '@nodelib/fs.walk@1.2.8':
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.20.3
+
+ '@opentelemetry/semantic-conventions@1.43.0': {}
+
+ '@parcel/watcher-android-arm64@2.6.0':
+ optional: true
+
+ '@parcel/watcher-darwin-arm64@2.6.0':
+ optional: true
+
+ '@parcel/watcher-darwin-x64@2.6.0':
+ optional: true
+
+ '@parcel/watcher-freebsd-x64@2.6.0':
+ optional: true
+
+ '@parcel/watcher-linux-arm-glibc@2.6.0':
+ optional: true
+
+ '@parcel/watcher-linux-arm-musl@2.6.0':
+ optional: true
+
+ '@parcel/watcher-linux-arm64-glibc@2.6.0':
+ optional: true
+
+ '@parcel/watcher-linux-arm64-musl@2.6.0':
+ optional: true
+
+ '@parcel/watcher-linux-x64-glibc@2.6.0':
+ optional: true
+
+ '@parcel/watcher-linux-x64-musl@2.6.0':
+ optional: true
+
+ '@parcel/watcher-win32-arm64@2.6.0':
+ optional: true
+
+ '@parcel/watcher-win32-x64@2.6.0':
+ optional: true
+
+ '@parcel/watcher@2.6.0':
+ dependencies:
+ detect-libc: 2.1.2
+ is-glob: 4.0.3
+ node-addon-api: 7.1.1
+ picomatch: 4.0.7
+ optionalDependencies:
+ '@parcel/watcher-android-arm64': 2.6.0
+ '@parcel/watcher-darwin-arm64': 2.6.0
+ '@parcel/watcher-darwin-x64': 2.6.0
+ '@parcel/watcher-freebsd-x64': 2.6.0
+ '@parcel/watcher-linux-arm-glibc': 2.6.0
+ '@parcel/watcher-linux-arm-musl': 2.6.0
+ '@parcel/watcher-linux-arm64-glibc': 2.6.0
+ '@parcel/watcher-linux-arm64-musl': 2.6.0
+ '@parcel/watcher-linux-x64-glibc': 2.6.0
+ '@parcel/watcher-linux-x64-musl': 2.6.0
+ '@parcel/watcher-win32-arm64': 2.6.0
+ '@parcel/watcher-win32-x64': 2.6.0
+ optional: true
+
+ '@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3)':
+ optionalDependencies:
+ prisma: 6.19.3(typescript@5.7.3)
+ typescript: 5.7.3
+
+ '@prisma/config@6.19.3':
+ dependencies:
+ c12: 3.1.0
+ deepmerge-ts: 7.1.5
+ effect: 3.21.0
+ empathic: 2.0.0
+ transitivePeerDependencies:
+ - magicast
+
+ '@prisma/debug@6.19.3': {}
+
+ '@prisma/engines-version@7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7': {}
+
+ '@prisma/engines@6.19.3':
+ dependencies:
+ '@prisma/debug': 6.19.3
+ '@prisma/engines-version': 7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7
+ '@prisma/fetch-engine': 6.19.3
+ '@prisma/get-platform': 6.19.3
+
+ '@prisma/fetch-engine@6.19.3':
+ dependencies:
+ '@prisma/debug': 6.19.3
+ '@prisma/engines-version': 7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7
+ '@prisma/get-platform': 6.19.3
+
+ '@prisma/get-platform@6.19.3':
+ dependencies:
+ '@prisma/debug': 6.19.3
+
+ '@rollup/plugin-yaml@5.0.0(rollup@4.63.2)':
+ dependencies:
+ '@rollup/pluginutils': 5.4.0(rollup@4.63.2)
+ js-yaml: 4.3.2
+ tosource: 2.0.0-alpha.3
+ optionalDependencies:
+ rollup: 4.63.2
+
+ '@rollup/pluginutils@4.2.1':
+ dependencies:
+ estree-walker: 2.0.2
+ picomatch: 2.3.2
+
+ '@rollup/pluginutils@5.4.0(rollup@4.63.2)':
+ dependencies:
+ '@types/estree': 1.0.9
+ estree-walker: 2.0.2
+ picomatch: 4.0.7
+ optionalDependencies:
+ rollup: 4.63.2
+
+ '@rollup/rollup-android-arm-eabi@4.63.2':
+ optional: true
+
+ '@rollup/rollup-android-arm64@4.63.2':
+ optional: true
+
+ '@rollup/rollup-darwin-arm64@4.63.2':
+ optional: true
+
+ '@rollup/rollup-darwin-x64@4.63.2':
+ optional: true
+
+ '@rollup/rollup-freebsd-arm64@4.63.2':
+ optional: true
+
+ '@rollup/rollup-freebsd-x64@4.63.2':
+ optional: true
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.63.2':
+ optional: true
+
+ '@rollup/rollup-linux-arm-musleabihf@4.63.2':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-gnu@4.63.2':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-musl@4.63.2':
+ optional: true
+
+ '@rollup/rollup-linux-loong64-gnu@4.63.2':
+ optional: true
+
+ '@rollup/rollup-linux-loong64-musl@4.63.2':
+ optional: true
+
+ '@rollup/rollup-linux-ppc64-gnu@4.63.2':
+ optional: true
+
+ '@rollup/rollup-linux-ppc64-musl@4.63.2':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-gnu@4.63.2':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-musl@4.63.2':
+ optional: true
+
+ '@rollup/rollup-linux-s390x-gnu@4.63.2':
+ optional: true
+
+ '@rollup/rollup-linux-x64-gnu@4.63.2':
+ optional: true
+
+ '@rollup/rollup-linux-x64-musl@4.63.2':
+ optional: true
+
+ '@rollup/rollup-openbsd-x64@4.63.2':
+ optional: true
+
+ '@rollup/rollup-openharmony-arm64@4.63.2':
+ optional: true
+
+ '@rollup/rollup-win32-arm64-msvc@4.63.2':
+ optional: true
+
+ '@rollup/rollup-win32-ia32-msvc@4.63.2':
+ optional: true
+
+ '@rollup/rollup-win32-x64-gnu@4.63.2':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.63.2':
+ optional: true
+
+ '@sec-ant/readable-stream@0.4.1': {}
+
+ '@shadowdara/dlib@0.0.4': {}
+
+ '@shadowdara/finder-lib@0.3.17': {}
+
+ '@sindresorhus/merge-streams@4.0.0': {}
+
+ '@standard-schema/spec@1.1.0': {}
+
+ '@swc/helpers@0.5.23':
+ dependencies:
+ tslib: 2.8.1
+
+ '@tailwindcss/node@4.3.3':
+ dependencies:
+ '@jridgewell/remapping': 2.3.5
+ enhanced-resolve: 5.25.0
+ jiti: 2.7.0
+ lightningcss: 1.32.0
+ magic-string: 0.30.21
+ source-map-js: 1.2.1
+ tailwindcss: 4.3.3
+
+ '@tailwindcss/oxide-android-arm64@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide-darwin-arm64@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide-darwin-x64@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide-freebsd-x64@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide-linux-arm64-musl@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide-linux-x64-gnu@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide-linux-x64-musl@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide-wasm32-wasi@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide-win32-x64-msvc@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide@4.3.3':
+ optionalDependencies:
+ '@tailwindcss/oxide-android-arm64': 4.3.3
+ '@tailwindcss/oxide-darwin-arm64': 4.3.3
+ '@tailwindcss/oxide-darwin-x64': 4.3.3
+ '@tailwindcss/oxide-freebsd-x64': 4.3.3
+ '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.3
+ '@tailwindcss/oxide-linux-arm64-gnu': 4.3.3
+ '@tailwindcss/oxide-linux-arm64-musl': 4.3.3
+ '@tailwindcss/oxide-linux-x64-gnu': 4.3.3
+ '@tailwindcss/oxide-linux-x64-musl': 4.3.3
+ '@tailwindcss/oxide-wasm32-wasi': 4.3.3
+ '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3
+ '@tailwindcss/oxide-win32-x64-msvc': 4.3.3
+
+ '@tailwindcss/postcss@4.3.3':
+ dependencies:
+ '@alloc/quick-lru': 5.3.0
+ '@tailwindcss/node': 4.3.3
+ '@tailwindcss/oxide': 4.3.3
+ postcss: 8.5.28
+ tailwindcss: 4.3.3
+
+ '@tailwindcss/vite@4.3.3(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))':
+ dependencies:
+ '@tailwindcss/node': 4.3.3
+ '@tailwindcss/oxide': 4.3.3
+ tailwindcss: 4.3.3
+ vite: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)
+
+ '@ts-morph/common@0.27.0':
+ dependencies:
+ fast-glob: 3.3.3
+ minimatch: 10.2.6
+ path-browserify: 1.0.1
+
+ '@types/eslint@8.56.12':
+ dependencies:
+ '@types/estree': 1.0.9
+ '@types/json-schema': 7.0.15
+
+ '@types/esrecurse@4.3.1': {}
+
+ '@types/estree@1.0.9': {}
+
+ '@types/highlight.js@10.1.0':
+ dependencies:
+ highlight.js: 11.12.0
+
+ '@types/html-minifier-terser@7.0.2': {}
+
+ '@types/jquery@4.0.1': {}
+
+ '@types/json-schema@7.0.15': {}
+
+ '@types/license-checker@25.0.6': {}
+
+ '@types/node@24.13.4':
+ dependencies:
+ undici-types: 7.18.2
+
+ '@types/node@25.9.6':
+ dependencies:
+ undici-types: 7.24.6
+
+ '@types/node@26.5.1':
+ dependencies:
+ undici-types: 8.9.0
+
+ '@types/react-dom@19.3.0(@types/react@19.3.0)':
+ dependencies:
+ '@types/react': 19.3.0
+
+ '@types/react@19.3.0':
+ dependencies:
+ csstype: 3.2.3
+
+ '@types/trusted-types@2.0.7':
+ optional: true
+
+ '@types/validate-npm-package-name@4.0.2': {}
+
+ '@typescript-eslint/eslint-plugin@8.70.0(@typescript-eslint/parser@8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@5.7.3))(eslint@10.10.0(jiti@2.7.0))(typescript@5.7.3)':
+ dependencies:
+ '@eslint-community/regexpp': 4.12.2
+ '@typescript-eslint/parser': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@5.7.3)
+ '@typescript-eslint/scope-manager': 8.70.0
+ '@typescript-eslint/type-utils': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@5.7.3)
+ '@typescript-eslint/utils': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@5.7.3)
+ '@typescript-eslint/visitor-keys': 8.70.0
+ eslint: 10.10.0(jiti@2.7.0)
+ ignore: 7.0.9
+ natural-compare: 1.4.0
+ ts-api-utils: 2.5.0(typescript@5.7.3)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@5.7.3)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 8.70.0
+ '@typescript-eslint/types': 8.70.0
+ '@typescript-eslint/typescript-estree': 8.70.0(typescript@5.7.3)
+ '@typescript-eslint/visitor-keys': 8.70.0
+ debug: 4.4.3
+ eslint: 10.10.0(jiti@2.7.0)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/project-service@8.70.0(typescript@5.7.3)':
+ dependencies:
+ '@typescript-eslint/tsconfig-utils': 8.70.0(typescript@5.7.3)
+ '@typescript-eslint/types': 8.70.0
+ debug: 4.4.3
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/scope-manager@8.70.0':
+ dependencies:
+ '@typescript-eslint/types': 8.70.0
+ '@typescript-eslint/visitor-keys': 8.70.0
+
+ '@typescript-eslint/tsconfig-utils@8.70.0(typescript@5.7.3)':
+ dependencies:
+ typescript: 5.7.3
+
+ '@typescript-eslint/type-utils@8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@5.7.3)':
+ dependencies:
+ '@typescript-eslint/types': 8.70.0
+ '@typescript-eslint/typescript-estree': 8.70.0(typescript@5.7.3)
+ '@typescript-eslint/utils': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@5.7.3)
+ debug: 4.4.3
+ eslint: 10.10.0(jiti@2.7.0)
+ ts-api-utils: 2.5.0(typescript@5.7.3)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/types@8.70.0': {}
+
+ '@typescript-eslint/typescript-estree@8.70.0(typescript@5.7.3)':
+ dependencies:
+ '@typescript-eslint/project-service': 8.70.0(typescript@5.7.3)
+ '@typescript-eslint/tsconfig-utils': 8.70.0(typescript@5.7.3)
+ '@typescript-eslint/types': 8.70.0
+ '@typescript-eslint/visitor-keys': 8.70.0
+ debug: 4.4.3
+ minimatch: 10.2.6
+ semver: 7.8.5
+ tinyglobby: 0.2.17
+ ts-api-utils: 2.5.0(typescript@5.7.3)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/utils@8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@5.7.3)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0))
+ '@typescript-eslint/scope-manager': 8.70.0
+ '@typescript-eslint/types': 8.70.0
+ '@typescript-eslint/typescript-estree': 8.70.0(typescript@5.7.3)
+ eslint: 10.10.0(jiti@2.7.0)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/visitor-keys@8.70.0':
+ dependencies:
+ '@typescript-eslint/types': 8.70.0
+ eslint-visitor-keys: 5.0.1
+
+ '@vercel/analytics@1.6.1(next@16.3.3(@babel/core@7.29.7)(@types/node@24.13.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(sass@1.104.1))(react@19.3.0)':
+ optionalDependencies:
+ next: 16.3.3(@babel/core@7.29.7)(@types/node@24.13.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(sass@1.104.1)
+ react: 19.3.0
+
+ '@vitejs/devtools-kit@0.7.3(cac@7.0.0)(crossws@0.4.12(srvx@1.0.4))(srvx@1.0.4)(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))':
+ dependencies:
+ '@devframes/hub': 0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))
+ '@devframes/json-render': 0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))
+ devframe: 0.9.18(cac@7.0.0)(srvx@1.0.4)
+ local-pkg: 1.2.1
+ mlly: 1.8.2
+ nostics: 1.2.0
+ nypm: 0.6.10
+ vite: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)
+ transitivePeerDependencies:
+ - '@modelcontextprotocol/client'
+ - cac
+ - crossws
+ - ocache
+ - srvx
+
+ '@vitejs/devtools@0.7.3(@devframes/json-render@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(crossws@0.4.12(srvx@1.0.4))(srvx@1.0.4)(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))':
+ dependencies:
+ '@devframes/hub': 0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))
+ '@devframes/hub-ui': 0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/json-render@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))
+ '@devframes/json-render-ui': 0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))
+ '@devframes/plugin-inspect': 0.9.18(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))
+ '@devframes/plugin-messages': 0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))
+ '@devframes/plugin-terminals': 0.9.18(@devframes/hub-ui@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/json-render@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))
+ '@vitejs/devtools-kit': 0.7.3(cac@7.0.0)(crossws@0.4.12(srvx@1.0.4))(srvx@1.0.4)(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))
+ cac: 7.0.0
+ devframe: 0.9.18(cac@7.0.0)(srvx@1.0.4)
+ h3: 2.0.1-rc.31(crossws@0.4.12(srvx@1.0.4))
+ local-pkg: 1.2.1
+ nostics: 1.2.0
+ obug: 2.2.1
+ pathe: 2.0.3
+ vite: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)
+ transitivePeerDependencies:
+ - '@devframes/json-render'
+ - '@devframes/plugin-inspect--assets'
+ - '@devframes/plugin-messages--assets'
+ - '@devframes/plugin-terminals--assets'
+ - '@modelcontextprotocol/client'
+ - crossws
+ - ocache
+ - srvx
+
+ abbrev@1.1.1: {}
+
+ accepts@2.0.0:
+ dependencies:
+ mime-types: 3.0.2
+ negotiator: 1.1.0
+
+ acorn-jsx@5.3.2(acorn@8.18.0):
+ dependencies:
+ acorn: 8.18.0
+
+ acorn@8.18.0: {}
+
+ ajv-formats@2.1.1(ajv@8.20.0):
+ optionalDependencies:
+ ajv: 8.20.0
+
+ ajv-formats@3.0.1(ajv@8.20.0):
+ optionalDependencies:
+ ajv: 8.20.0
+
+ ajv@6.15.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+
+ ajv@8.20.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-uri: 3.1.7
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+
+ ansi-colors@4.1.3: {}
+
+ ansi-regex@5.0.1: {}
+
+ ansi-regex@6.3.0: {}
+
+ ansi-styles@3.2.1:
+ dependencies:
+ color-convert: 1.9.3
+
+ ansi-styles@6.2.3: {}
+
+ argparse@2.0.1: {}
+
+ array-find-index@1.0.2: {}
+
+ asap@2.0.6: {}
+
+ ast-types@0.16.3:
+ dependencies:
+ tslib: 2.8.1
+
+ atomically@1.7.0: {}
+
+ balanced-match@1.0.2: {}
+
+ balanced-match@4.0.4: {}
+
+ baseline-browser-mapping@2.11.23: {}
+
+ better-auth@1.7.4(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(next@16.3.3(@babel/core@7.29.7)(@types/node@24.13.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(sass@1.104.1))(prisma@6.19.3(typescript@5.7.3))(react-dom@19.3.0(react@19.3.0))(react@19.3.0):
+ dependencies:
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/drizzle-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
+ '@better-auth/kysely-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(kysely@0.29.5)
+ '@better-auth/memory-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
+ '@better-auth/mongo-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
+ '@better-auth/prisma-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(prisma@6.19.3(typescript@5.7.3))
+ '@better-auth/telemetry': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)
+ '@better-auth/utils': 0.4.2
+ '@better-fetch/fetch': 1.3.1
+ '@noble/ciphers': 2.4.0
+ '@noble/hashes': 2.4.0
+ better-call: 1.4.0(zod@4.6.2)
+ defu: 6.1.7
+ jose: 6.2.12
+ kysely: 0.29.5
+ nanostores: 1.5.3
+ zod: 4.6.2
+ optionalDependencies:
+ '@prisma/client': 6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3)
+ next: 16.3.3(@babel/core@7.29.7)(@types/node@24.13.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(sass@1.104.1)
+ prisma: 6.19.3(typescript@5.7.3)
+ react: 19.3.0
+ react-dom: 19.3.0(react@19.3.0)
+ transitivePeerDependencies:
+ - '@cloudflare/workers-types'
+ - '@opentelemetry/api'
+
+ better-call@1.4.0(zod@4.6.2):
+ dependencies:
+ '@better-auth/utils': 0.5.0
+ '@better-fetch/fetch': 1.3.1
+ rou3: 0.9.2
+ set-cookie-parser: 3.1.2
+ optionalDependencies:
+ zod: 4.6.2
+
+ binary-extensions@3.2.0: {}
+
+ birpc@4.2.0: {}
+
+ body-parser@2.3.0:
+ dependencies:
+ bytes: 3.1.2
+ content-type: 2.1.0
+ debug: 4.4.3
+ http-errors: 2.0.1
+ iconv-lite: 0.7.3
+ on-finished: 2.4.1
+ qs: 6.16.0
+ raw-body: 3.0.2
+ type-is: 2.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ brace-expansion@1.1.18:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ brace-expansion@5.0.9:
+ dependencies:
+ balanced-match: 4.0.4
+
+ braces@3.0.3:
+ dependencies:
+ fill-range: 7.1.1
+
+ browserslist@4.28.9:
+ dependencies:
+ baseline-browser-mapping: 2.11.23
+ caniuse-lite: 1.0.30001810
+ electron-to-chromium: 1.5.427
+ node-releases: 2.0.55
+ update-browserslist-db: 1.3.3(browserslist@4.28.9)
+
+ buffer-from@1.1.2: {}
+
+ bundle-name@4.1.0:
+ dependencies:
+ run-applescript: 7.1.0
+
+ bytes@3.1.2: {}
+
+ c12@3.1.0:
+ dependencies:
+ chokidar: 4.0.3
+ confbox: 0.2.4
+ defu: 6.1.7
+ dotenv: 16.6.1
+ exsolve: 1.1.1
+ giget: 2.0.0
+ jiti: 2.7.0
+ ohash: 2.0.12
+ pathe: 2.0.3
+ perfect-debounce: 1.0.0
+ pkg-types: 2.3.3
+ rc9: 2.1.2
+
+ cac@7.0.0: {}
+
+ cacheable@2.5.0:
+ dependencies:
+ '@cacheable/memory': 2.2.0
+ '@cacheable/utils': 2.5.0
+ hookified: 1.15.1
+ keyv: 5.6.0
+ qified: 0.10.1
+
+ call-bind-apply-helpers@1.0.2:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+
+ call-bound@1.0.4:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ get-intrinsic: 1.3.0
+
+ callsites@3.1.0: {}
+
+ camel-case@4.1.2:
+ dependencies:
+ pascal-case: 3.1.2
+ tslib: 2.8.1
+
+ caniuse-lite@1.0.30001810: {}
+
+ chalk@2.4.2:
+ dependencies:
+ ansi-styles: 3.2.1
+ escape-string-regexp: 1.0.5
+ supports-color: 5.5.0
+
+ chalk@5.6.2: {}
+
+ chalk@6.0.0: {}
+
+ chokidar@4.0.3:
+ dependencies:
+ readdirp: 4.1.2
+
+ chokidar@5.0.0:
+ dependencies:
+ readdirp: 5.1.1
+
+ citty@0.1.6:
+ dependencies:
+ consola: 3.4.2
+
+ citty@0.2.2: {}
+
+ class-variance-authority@0.7.1:
+ dependencies:
+ clsx: 2.1.1
+
+ clean-css@5.3.3:
+ dependencies:
+ source-map: 0.6.1
+
+ cli-cursor@5.0.0:
+ dependencies:
+ restore-cursor: 5.1.0
+
+ cli-spinners@2.9.2: {}
+
+ client-only@0.0.1: {}
+
+ cliui@9.0.1:
+ dependencies:
+ string-width: 7.2.0
+ strip-ansi: 7.2.0
+ wrap-ansi: 9.0.2
+
+ clone@2.1.2: {}
+
+ clsx@2.1.1: {}
+
+ cn@0.2.6: {}
+
+ code-block-writer@13.0.3: {}
+
+ color-convert@1.9.3:
+ dependencies:
+ color-name: 1.1.3
+
+ color-name@1.1.3: {}
+
+ commander@10.0.1: {}
+
+ commander@11.1.0: {}
+
+ commander@14.0.3: {}
+
+ commander@2.20.3: {}
+
+ common-path-prefix@3.0.0: {}
+
+ concat-map@0.0.1: {}
+
+ conf@10.2.0:
+ dependencies:
+ ajv: 8.20.0
+ ajv-formats: 2.1.1(ajv@8.20.0)
+ atomically: 1.7.0
+ debounce-fn: 4.0.0
+ dot-prop: 6.0.1
+ env-paths: 2.2.1
+ json-schema-typed: 7.0.3
+ onetime: 5.1.2
+ pkg-up: 3.1.0
+ semver: 7.8.5
+
+ confbox@0.1.8: {}
+
+ confbox@0.2.4: {}
+
+ confbox@0.3.1: {}
+
+ consola@3.4.2: {}
+
+ content-disposition@1.1.0: {}
+
+ content-type@1.0.5: {}
+
+ content-type@2.1.0: {}
+
+ convert-source-map@2.0.0: {}
+
+ cookie-signature@1.2.2: {}
+
+ cookie@0.7.2: {}
+
+ cors@2.8.6:
+ dependencies:
+ object-assign: 4.1.1
+ vary: 1.1.2
+
+ cosmiconfig@9.0.2(typescript@5.7.3):
+ dependencies:
+ env-paths: 2.2.1
+ import-fresh: 3.3.1
+ js-yaml: 4.3.2
+ parse-json: 5.2.0
+ optionalDependencies:
+ typescript: 5.7.3
+
+ cross-spawn@7.0.6:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ crossws@0.4.12(srvx@1.0.4):
+ optionalDependencies:
+ srvx: 1.0.4
+
+ cssesc@3.0.0: {}
+
+ csstype@3.2.3: {}
+
+ debounce-fn@4.0.0:
+ dependencies:
+ mimic-fn: 3.1.0
+
+ debug@3.2.7:
+ dependencies:
+ ms: 2.1.3
+
+ debug@4.4.3:
+ dependencies:
+ ms: 2.1.3
+
+ debuglog@1.0.1: {}
+
+ dedent@1.7.2: {}
+
+ deep-is@0.1.4: {}
+
+ deepmerge-ts@7.1.5: {}
+
+ deepmerge@4.3.1: {}
+
+ default-browser-id@5.0.1: {}
+
+ default-browser@5.5.1:
+ dependencies:
+ bundle-name: 4.1.0
+ default-browser-id: 5.0.1
+
+ define-lazy-prop@2.0.0: {}
+
+ define-lazy-prop@3.0.0: {}
+
+ defu@6.1.7: {}
+
+ depd@2.0.0: {}
+
+ destr@2.0.5: {}
+
+ detect-libc@2.1.2: {}
+
+ devframe@0.9.18(cac@7.0.0)(srvx@1.0.4):
+ dependencies:
+ '@modelcontextprotocol/server': 2.0.0
+ '@standard-schema/spec': 1.1.0
+ birpc: 4.2.0
+ crossws: 0.4.12(srvx@1.0.4)
+ h3: 2.0.1-rc.31(crossws@0.4.12(srvx@1.0.4))
+ mrmime: 2.0.1
+ nostics: 1.2.0
+ pathe: 2.0.3
+ ufo: 1.6.4
+ optionalDependencies:
+ cac: 7.0.0
+ transitivePeerDependencies:
+ - ocache
+ - srvx
+
+ dezalgo@1.0.4:
+ dependencies:
+ asap: 2.0.6
+ wrappy: 1.0.2
+
+ diff@8.0.4: {}
+
+ dompurify@3.4.8:
+ optionalDependencies:
+ '@types/trusted-types': 2.0.7
+
+ dot-case@3.0.4:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.8.1
+
+ dot-prop@6.0.1:
+ dependencies:
+ is-obj: 2.0.0
+
+ dotenv@16.6.1: {}
+
+ dotenv@17.4.2: {}
+
+ dunder-proto@1.0.1:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ ee-first@1.1.1: {}
+
+ effect@3.21.0:
+ dependencies:
+ '@standard-schema/spec': 1.1.0
+ fast-check: 3.23.2
+
+ electron-to-chromium@1.5.427: {}
+
+ emoji-regex@10.6.0: {}
+
+ empathic@2.0.0: {}
+
+ encodeurl@2.0.0: {}
+
+ enhanced-resolve@5.25.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.3.3
+
+ enquirer@2.4.1:
+ dependencies:
+ ansi-colors: 4.1.3
+ strip-ansi: 6.0.1
+
+ entities@4.5.0: {}
+
+ env-paths@2.2.1: {}
+
+ error-ex@1.3.4:
+ dependencies:
+ is-arrayish: 0.2.1
+
+ es-define-property@1.0.1: {}
+
+ es-errors@1.3.0: {}
+
+ es-object-atoms@1.1.2:
+ dependencies:
+ es-errors: 1.3.0
+
+ esbuild@0.25.12:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.25.12
+ '@esbuild/android-arm': 0.25.12
+ '@esbuild/android-arm64': 0.25.12
+ '@esbuild/android-x64': 0.25.12
+ '@esbuild/darwin-arm64': 0.25.12
+ '@esbuild/darwin-x64': 0.25.12
+ '@esbuild/freebsd-arm64': 0.25.12
+ '@esbuild/freebsd-x64': 0.25.12
+ '@esbuild/linux-arm': 0.25.12
+ '@esbuild/linux-arm64': 0.25.12
+ '@esbuild/linux-ia32': 0.25.12
+ '@esbuild/linux-loong64': 0.25.12
+ '@esbuild/linux-mips64el': 0.25.12
+ '@esbuild/linux-ppc64': 0.25.12
+ '@esbuild/linux-riscv64': 0.25.12
+ '@esbuild/linux-s390x': 0.25.12
+ '@esbuild/linux-x64': 0.25.12
+ '@esbuild/netbsd-arm64': 0.25.12
+ '@esbuild/netbsd-x64': 0.25.12
+ '@esbuild/openbsd-arm64': 0.25.12
+ '@esbuild/openbsd-x64': 0.25.12
+ '@esbuild/openharmony-arm64': 0.25.12
+ '@esbuild/sunos-x64': 0.25.12
+ '@esbuild/win32-arm64': 0.25.12
+ '@esbuild/win32-ia32': 0.25.12
+ '@esbuild/win32-x64': 0.25.12
+
+ esbuild@0.28.2:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.28.2
+ '@esbuild/android-arm': 0.28.2
+ '@esbuild/android-arm64': 0.28.2
+ '@esbuild/android-x64': 0.28.2
+ '@esbuild/darwin-arm64': 0.28.2
+ '@esbuild/darwin-x64': 0.28.2
+ '@esbuild/freebsd-arm64': 0.28.2
+ '@esbuild/freebsd-x64': 0.28.2
+ '@esbuild/linux-arm': 0.28.2
+ '@esbuild/linux-arm64': 0.28.2
+ '@esbuild/linux-ia32': 0.28.2
+ '@esbuild/linux-loong64': 0.28.2
+ '@esbuild/linux-mips64el': 0.28.2
+ '@esbuild/linux-ppc64': 0.28.2
+ '@esbuild/linux-riscv64': 0.28.2
+ '@esbuild/linux-s390x': 0.28.2
+ '@esbuild/linux-x64': 0.28.2
+ '@esbuild/netbsd-arm64': 0.28.2
+ '@esbuild/netbsd-x64': 0.28.2
+ '@esbuild/openbsd-arm64': 0.28.2
+ '@esbuild/openbsd-x64': 0.28.2
+ '@esbuild/openharmony-arm64': 0.28.2
+ '@esbuild/sunos-x64': 0.28.2
+ '@esbuild/win32-arm64': 0.28.2
+ '@esbuild/win32-ia32': 0.28.2
+ '@esbuild/win32-x64': 0.28.2
+
+ escalade@3.2.0: {}
+
+ escape-html@1.0.3: {}
+
+ escape-string-regexp@1.0.5: {}
+
+ escape-string-regexp@4.0.0: {}
+
+ eslint-scope@9.1.2:
+ dependencies:
+ '@types/esrecurse': 4.3.1
+ '@types/estree': 1.0.9
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+
+ eslint-visitor-keys@3.4.3: {}
+
+ eslint-visitor-keys@5.0.1: {}
+
+ eslint@10.10.0(jiti@2.7.0):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0))
+ '@eslint-community/regexpp': 4.12.2
+ '@eslint/config-array': 0.23.5
+ '@eslint/config-helpers': 0.7.0
+ '@eslint/core': 1.2.1
+ '@eslint/plugin-kit': 0.7.3
+ '@humanfs/node': 0.16.8
+ '@humanwhocodes/module-importer': 1.0.1
+ '@humanwhocodes/retry': 0.4.3
+ '@types/estree': 1.0.9
+ ajv: 6.15.0
+ cross-spawn: 7.0.6
+ debug: 4.4.3
+ escape-string-regexp: 4.0.0
+ eslint-scope: 9.1.2
+ eslint-visitor-keys: 5.0.1
+ espree: 11.2.0
+ esquery: 1.7.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 11.1.5
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ ignore: 5.3.2
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ json-stable-stringify-without-jsonify: 1.0.1
+ minimatch: 10.2.6
+ natural-compare: 1.4.0
+ optionator: 0.9.4
+ optionalDependencies:
+ jiti: 2.7.0
+ transitivePeerDependencies:
+ - supports-color
+
+ espree@11.2.0:
+ dependencies:
+ acorn: 8.18.0
+ acorn-jsx: 5.3.2(acorn@8.18.0)
+ eslint-visitor-keys: 5.0.1
+
+ esprima@4.0.1: {}
+
+ esquery@1.7.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ estraverse@5.3.0: {}
+
+ estree-walker@0.6.1: {}
+
+ estree-walker@2.0.2: {}
+
+ esutils@2.0.3: {}
+
+ etag@1.8.1: {}
+
+ eventsource-parser@3.1.1: {}
+
+ eventsource@3.0.7:
+ dependencies:
+ eventsource-parser: 3.1.1
+
+ execa@5.1.1:
+ dependencies:
+ cross-spawn: 7.0.6
+ get-stream: 6.0.1
+ human-signals: 2.1.0
+ is-stream: 2.0.1
+ merge-stream: 2.0.0
+ npm-run-path: 4.0.1
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ strip-final-newline: 2.0.0
+
+ execa@9.6.1:
+ dependencies:
+ '@sindresorhus/merge-streams': 4.0.0
+ cross-spawn: 7.0.6
+ figures: 6.1.0
+ get-stream: 9.0.1
+ human-signals: 8.0.1
+ is-plain-obj: 4.1.0
+ is-stream: 4.0.1
+ npm-run-path: 6.0.0
+ pretty-ms: 9.3.1
+ signal-exit: 4.1.0
+ strip-final-newline: 4.0.0
+ yoctocolors: 2.2.0
+
+ express-rate-limit@8.7.0(express@5.2.1):
+ dependencies:
+ debug: 4.4.3
+ express: 5.2.1
+ ip-address: 10.7.0
+ transitivePeerDependencies:
+ - supports-color
+
+ express@5.2.1:
+ dependencies:
+ accepts: 2.0.0
+ body-parser: 2.3.0
+ content-disposition: 1.1.0
+ content-type: 1.0.5
+ cookie: 0.7.2
+ cookie-signature: 1.2.2
+ debug: 4.4.3
+ depd: 2.0.0
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ etag: 1.8.1
+ finalhandler: 2.1.1
+ fresh: 2.0.0
+ http-errors: 2.0.1
+ merge-descriptors: 2.0.0
+ mime-types: 3.0.2
+ on-finished: 2.4.1
+ once: 1.4.0
+ parseurl: 1.3.3
+ proxy-addr: 2.0.7
+ qs: 6.16.0
+ range-parser: 1.3.0
+ router: 2.2.0
+ send: 1.2.1
+ serve-static: 2.2.1
+ statuses: 2.0.2
+ type-is: 2.1.0
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ exsolve@1.1.1: {}
+
+ fast-check@3.23.2:
+ dependencies:
+ pure-rand: 6.1.0
+
+ fast-deep-equal@3.1.3: {}
+
+ fast-glob@3.3.3:
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
+
+ fast-json-stable-stringify@2.1.0: {}
+
+ fast-levenshtein@2.0.6: {}
+
+ fast-uri@3.1.7: {}
+
+ fastq@1.20.3:
+ dependencies:
+ reusify: 1.1.0
+
+ fdir@6.5.0(picomatch@4.0.7):
+ optionalDependencies:
+ picomatch: 4.0.7
+
+ figures@6.1.0:
+ dependencies:
+ is-unicode-supported: 2.1.0
+
+ file-entry-cache@11.1.5:
+ dependencies:
+ flat-cache: 6.1.23
+
+ fill-range@7.1.1:
+ dependencies:
+ to-regex-range: 5.0.1
+
+ finalhandler@2.1.1:
+ dependencies:
+ debug: 4.4.3
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ statuses: 2.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ find-up@3.0.0:
+ dependencies:
+ locate-path: 3.0.0
+
+ find-up@5.0.0:
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+
+ flat-cache@6.1.23:
+ dependencies:
+ cacheable: 2.5.0
+ flatted: 3.4.4
+ hookified: 1.15.1
+
+ flatted@3.4.4: {}
+
+ forwarded@0.2.0: {}
+
+ fresh@2.0.0: {}
+
+ fs-extra@11.4.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.2.1
+ universalify: 2.0.1
+
+ fs.realpath@1.0.0: {}
+
+ fsevents@2.3.3:
+ optional: true
+
+ function-bind@1.1.2: {}
+
+ fuzzysort@3.1.0: {}
+
+ gensync@1.0.0-beta.2: {}
+
+ get-caller-file@2.0.5: {}
+
+ get-east-asian-width@1.6.0: {}
+
+ get-intrinsic@1.3.0:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.2
+ function-bind: 1.1.2
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.4
+ math-intrinsics: 1.1.0
+
+ get-own-enumerable-keys@1.0.0: {}
+
+ get-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.2
+
+ get-stream@6.0.1: {}
+
+ get-stream@9.0.1:
+ dependencies:
+ '@sec-ant/readable-stream': 0.4.1
+ is-stream: 4.0.1
+
+ giget@2.0.0:
+ dependencies:
+ citty: 0.1.6
+ consola: 3.4.2
+ defu: 6.1.7
+ node-fetch-native: 1.6.7
+ nypm: 0.6.10
+ pathe: 2.0.3
+
+ glob-parent@5.1.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob-parent@6.0.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob@7.2.3:
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.5
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+
+ gopd@1.2.0: {}
+
+ graceful-fs@4.2.11: {}
+
+ h3@2.0.1-rc.31(crossws@0.4.12(srvx@1.0.4)):
+ dependencies:
+ rou3: 0.9.2
+ srvx: 1.0.4
+ optionalDependencies:
+ crossws: 0.4.12(srvx@1.0.4)
+
+ has-flag@3.0.0: {}
+
+ has-symbols@1.1.0: {}
+
+ hashery@1.5.1:
+ dependencies:
+ hookified: 1.15.1
+
+ hasown@2.0.4:
+ dependencies:
+ function-bind: 1.1.2
+
+ highlight.js@11.12.0: {}
+
+ hono@4.13.7: {}
+
+ hookified@1.15.1: {}
+
+ hookified@2.2.0: {}
+
+ hosted-git-info@2.8.9: {}
+
+ html-minifier-terser@7.2.0:
+ dependencies:
+ camel-case: 4.1.2
+ clean-css: 5.3.3
+ commander: 10.0.1
+ entities: 4.5.0
+ param-case: 3.0.4
+ relateurl: 0.2.7
+ terser: 5.51.2
+
+ http-errors@2.0.1:
+ dependencies:
+ depd: 2.0.0
+ inherits: 2.0.4
+ setprototypeof: 1.2.0
+ statuses: 2.0.2
+ toidentifier: 1.0.1
+
+ human-signals@2.1.0: {}
+
+ human-signals@8.0.1: {}
+
+ iconv-lite@0.7.3:
+ dependencies:
+ safer-buffer: 2.1.2
+
+ ignore@5.3.2: {}
+
+ ignore@7.0.9: {}
+
+ immutable@5.1.9: {}
+
+ import-fresh@3.3.1:
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ imurmurhash@0.1.4: {}
+
+ inflight@1.0.6:
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+
+ inherits@2.0.4: {}
+
+ ip-address@10.7.0: {}
+
+ ipaddr.js@1.9.1: {}
+
+ is-arrayish@0.2.1: {}
+
+ is-core-module@2.16.2:
+ dependencies:
+ hasown: 2.0.4
+
+ is-docker@2.2.1: {}
+
+ is-docker@3.0.0: {}
+
+ is-extglob@2.1.1: {}
+
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
+
+ is-in-ssh@1.0.0: {}
+
+ is-inside-container@1.0.0:
+ dependencies:
+ is-docker: 3.0.0
+
+ is-interactive@2.0.0: {}
+
+ is-number@7.0.0: {}
+
+ is-obj@2.0.0: {}
+
+ is-obj@3.0.0: {}
+
+ is-plain-obj@4.1.0: {}
+
+ is-promise@4.0.0: {}
+
+ is-regexp@3.1.0: {}
+
+ is-stream@2.0.1: {}
+
+ is-stream@4.0.1: {}
+
+ is-unicode-supported@1.3.0: {}
+
+ is-unicode-supported@2.1.0: {}
+
+ is-wsl@2.2.0:
+ dependencies:
+ is-docker: 2.2.1
+
+ is-wsl@3.1.1:
+ dependencies:
+ is-inside-container: 1.0.0
+
+ isbinaryfile@6.0.0: {}
+
+ isexe@2.0.0: {}
+
+ isexe@3.1.5: {}
+
+ jiti@2.7.0: {}
+
+ jose@6.2.12: {}
+
+ jquery@4.0.0: {}
+
+ js-tokens@4.0.0: {}
+
+ js-yaml@4.3.2:
+ dependencies:
+ argparse: 2.0.1
+
+ jsesc@3.1.0: {}
+
+ json-parse-even-better-errors@2.3.1: {}
+
+ json-schema-traverse@0.4.1: {}
+
+ json-schema-traverse@1.0.0: {}
+
+ json-schema-typed@7.0.3: {}
+
+ json-schema-typed@8.0.2: {}
+
+ json-stable-stringify-without-jsonify@1.0.1: {}
+
+ json5@2.2.3: {}
+
+ jsonfile@6.2.1:
+ dependencies:
+ universalify: 2.0.1
+ optionalDependencies:
+ graceful-fs: 4.2.11
+
+ keyv@5.6.0:
+ dependencies:
+ '@keyv/serialize': 1.1.1
+
+ kleur@3.0.3: {}
+
+ kleur@4.1.5: {}
+
+ kysely@0.29.5: {}
+
+ levn@0.4.1:
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+
+ license-checker@25.0.1:
+ dependencies:
+ chalk: 2.4.2
+ debug: 3.2.7
+ mkdirp: 0.5.6
+ nopt: 4.0.3
+ read-installed: 4.0.3
+ semver: 5.7.2
+ spdx-correct: 3.2.0
+ spdx-expression-parse: 3.0.1
+ spdx-satisfies: 4.0.1
+ treeify: 1.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ lightningcss-android-arm64@1.32.0:
+ optional: true
+
+ lightningcss-darwin-arm64@1.32.0:
+ optional: true
+
+ lightningcss-darwin-x64@1.32.0:
+ optional: true
+
+ lightningcss-freebsd-x64@1.32.0:
+ optional: true
+
+ lightningcss-linux-arm-gnueabihf@1.32.0:
+ optional: true
+
+ lightningcss-linux-arm64-gnu@1.32.0:
+ optional: true
+
+ lightningcss-linux-arm64-musl@1.32.0:
+ optional: true
+
+ lightningcss-linux-x64-gnu@1.32.0:
+ optional: true
+
+ lightningcss-linux-x64-musl@1.32.0:
+ optional: true
+
+ lightningcss-win32-arm64-msvc@1.32.0:
+ optional: true
+
+ lightningcss-win32-x64-msvc@1.32.0:
+ optional: true
+
+ lightningcss@1.32.0:
+ dependencies:
+ detect-libc: 2.1.2
+ optionalDependencies:
+ lightningcss-android-arm64: 1.32.0
+ lightningcss-darwin-arm64: 1.32.0
+ lightningcss-darwin-x64: 1.32.0
+ lightningcss-freebsd-x64: 1.32.0
+ lightningcss-linux-arm-gnueabihf: 1.32.0
+ lightningcss-linux-arm64-gnu: 1.32.0
+ lightningcss-linux-arm64-musl: 1.32.0
+ lightningcss-linux-x64-gnu: 1.32.0
+ lightningcss-linux-x64-musl: 1.32.0
+ lightningcss-win32-arm64-msvc: 1.32.0
+ lightningcss-win32-x64-msvc: 1.32.0
+
+ lines-and-columns@1.2.4: {}
+
+ linguist-js@3.0.3:
+ dependencies:
+ binary-extensions: 3.2.0
+ commander: 14.0.3
+ common-path-prefix: 3.0.0
+ ignore: 7.0.9
+ isbinaryfile: 6.0.0
+ js-yaml: 4.3.2
+ node-cache: 5.1.2
+
+ local-pkg@1.2.1:
+ dependencies:
+ mlly: 1.8.2
+ pkg-types: 2.3.3
+ quansync: 0.2.11
+
+ locate-path@3.0.0:
+ dependencies:
+ p-locate: 3.0.0
+ path-exists: 3.0.0
+
+ locate-path@6.0.0:
+ dependencies:
+ p-locate: 5.0.0
+
+ log-symbols@6.0.0:
+ dependencies:
+ chalk: 5.6.2
+ is-unicode-supported: 1.3.0
+
+ lower-case@2.0.2:
+ dependencies:
+ tslib: 2.8.1
+
+ lru-cache@5.1.1:
+ dependencies:
+ yallist: 3.1.1
+
+ lucide-react@1.45.0(react@19.3.0):
+ dependencies:
+ react: 19.3.0
+
+ magic-string@0.30.21:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.6.0
+
+ marked@14.0.0: {}
+
+ math-intrinsics@1.1.0: {}
+
+ media-typer@1.1.1: {}
+
+ merge-descriptors@2.0.0: {}
+
+ merge-stream@2.0.0: {}
+
+ merge2@1.4.1: {}
+
+ micromatch@4.0.8:
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.2
+
+ mime-db@1.54.0: {}
+
+ mime-types@3.0.2:
+ dependencies:
+ mime-db: 1.54.0
+
+ mimic-fn@2.1.0: {}
+
+ mimic-fn@3.1.0: {}
+
+ mimic-function@5.0.1: {}
+
+ minimatch@10.2.6:
+ dependencies:
+ brace-expansion: 5.0.9
+
+ minimatch@3.1.5:
+ dependencies:
+ brace-expansion: 1.1.18
+
+ minimist@1.2.8: {}
+
+ mkdirp@0.5.6:
+ dependencies:
+ minimist: 1.2.8
+
+ mlly@1.8.2:
+ dependencies:
+ acorn: 8.18.0
+ pathe: 2.0.3
+ pkg-types: 1.3.1
+ ufo: 1.6.4
+
+ monaco-editor@0.56.0:
+ dependencies:
+ dompurify: 3.4.8
+ marked: 14.0.0
+
+ mrmime@2.0.1: {}
+
+ ms@2.1.3: {}
+
+ nanoid@3.3.19: {}
+
+ nanostores@1.5.3: {}
+
+ natural-compare@1.4.0: {}
+
+ negotiator@1.1.0:
+ dependencies:
+ content-type: 2.1.0
+
+ next@16.3.3(@babel/core@7.29.7)(@types/node@24.13.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(sass@1.104.1):
+ dependencies:
+ '@next/env': 16.3.3
+ '@swc/helpers': 0.5.23
+ baseline-browser-mapping: 2.11.23
+ caniuse-lite: 1.0.30001810
+ postcss: 8.5.23
+ react: 19.3.0
+ react-dom: 19.3.0(react@19.3.0)
+ styled-jsx: 5.1.6(@babel/core@7.29.7)(react@19.3.0)
+ optionalDependencies:
+ '@next/swc-darwin-arm64': 16.3.3
+ '@next/swc-darwin-x64': 16.3.3
+ '@next/swc-linux-arm64-gnu': 16.3.3
+ '@next/swc-linux-arm64-musl': 16.3.3
+ '@next/swc-linux-x64-gnu': 16.3.3
+ '@next/swc-linux-x64-musl': 16.3.3
+ '@next/swc-win32-arm64-msvc': 16.3.3
+ '@next/swc-win32-x64-msvc': 16.3.3
+ sass: 1.104.1
+ sharp: 0.35.4(@types/node@24.13.4)
+ transitivePeerDependencies:
+ - '@babel/core'
+ - '@types/node'
+ - babel-plugin-macros
+
+ no-case@3.0.4:
+ dependencies:
+ lower-case: 2.0.2
+ tslib: 2.8.1
+
+ node-addon-api@7.1.1:
+ optional: true
+
+ node-cache@5.1.2:
+ dependencies:
+ clone: 2.1.2
+
+ node-fetch-native@1.6.7: {}
+
+ node-releases@2.0.55: {}
+
+ nopt@4.0.3:
+ dependencies:
+ abbrev: 1.1.1
+ osenv: 0.1.5
+
+ normalize-package-data@2.5.0:
+ dependencies:
+ hosted-git-info: 2.8.9
+ resolve: 1.22.12
+ semver: 5.7.2
+ validate-npm-package-license: 3.0.4
+
+ nostics@1.2.0: {}
+
+ npm-normalize-package-bin@1.0.1: {}
+
+ npm-run-path@4.0.1:
+ dependencies:
+ path-key: 3.1.1
+
+ npm-run-path@6.0.0:
+ dependencies:
+ path-key: 4.0.0
+ unicorn-magic: 0.3.0
+
+ nypm@0.6.10:
+ dependencies:
+ citty: 0.2.2
+ pathe: 2.0.3
+ tinyexec: 1.3.1
+
+ object-assign@4.1.1: {}
+
+ object-inspect@1.13.4: {}
+
+ object-treeify@1.1.33: {}
+
+ obug@2.2.1: {}
+
+ ohash@2.0.12: {}
+
+ on-finished@2.4.1:
+ dependencies:
+ ee-first: 1.1.1
+
+ once@1.4.0:
+ dependencies:
+ wrappy: 1.0.2
+
+ onetime@5.1.2:
+ dependencies:
+ mimic-fn: 2.1.0
+
+ onetime@7.0.0:
+ dependencies:
+ mimic-function: 5.0.1
+
+ open@11.0.3:
+ dependencies:
+ default-browser: 5.5.1
+ define-lazy-prop: 3.0.0
+ is-in-ssh: 1.0.0
+ is-inside-container: 1.0.0
+ powershell-utils: 0.2.1
+ wsl-utils: 1.0.0
+
+ open@8.4.2:
+ dependencies:
+ define-lazy-prop: 2.0.0
+ is-docker: 2.2.1
+ is-wsl: 2.2.0
+
+ optionator@0.9.4:
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.5
+
+ ora@8.2.0:
+ dependencies:
+ chalk: 5.6.2
+ cli-cursor: 5.0.0
+ cli-spinners: 2.9.2
+ is-interactive: 2.0.0
+ is-unicode-supported: 2.1.0
+ log-symbols: 6.0.0
+ stdin-discarder: 0.2.2
+ string-width: 7.2.0
+ strip-ansi: 7.2.0
+
+ os-homedir@1.0.2: {}
+
+ os-tmpdir@1.0.2: {}
+
+ osenv@0.1.5:
+ dependencies:
+ os-homedir: 1.0.2
+ os-tmpdir: 1.0.2
+
+ p-limit@2.3.0:
+ dependencies:
+ p-try: 2.2.0
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+
+ p-locate@3.0.0:
+ dependencies:
+ p-limit: 2.3.0
+
+ p-locate@5.0.0:
+ dependencies:
+ p-limit: 3.1.0
+
+ p-try@2.2.0: {}
+
+ param-case@3.0.4:
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.8.1
+
+ parent-module@1.0.1:
+ dependencies:
+ callsites: 3.1.0
+
+ parse-json@5.2.0:
+ dependencies:
+ '@babel/code-frame': 7.29.7
+ error-ex: 1.3.4
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 1.2.4
+
+ parse-ms@4.0.0: {}
+
+ parseurl@1.3.3: {}
+
+ pascal-case@3.1.2:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.8.1
+
+ path-browserify@1.0.1: {}
+
+ path-exists@3.0.0: {}
+
+ path-exists@4.0.0: {}
+
+ path-is-absolute@1.0.1: {}
+
+ path-key@3.1.1: {}
+
+ path-key@4.0.0: {}
+
+ path-parse@1.0.7: {}
+
+ path-to-regexp@8.4.2: {}
+
+ pathe@2.0.3: {}
+
+ perfect-debounce@1.0.0: {}
+
+ perfect-debounce@2.1.0: {}
+
+ picocolors@1.1.1: {}
+
+ picomatch@2.3.2: {}
+
+ picomatch@4.0.7: {}
+
+ pkce-challenge@5.0.1: {}
+
+ pkg-types@1.3.1:
+ dependencies:
+ confbox: 0.1.8
+ mlly: 1.8.2
+ pathe: 2.0.3
+
+ pkg-types@2.3.3:
+ dependencies:
+ confbox: 0.3.1
+ exsolve: 1.1.1
+ pathe: 2.0.3
+
+ pkg-up@3.1.0:
+ dependencies:
+ find-up: 3.0.0
+
+ postcss-selector-parser@7.1.6:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
+ postcss@8.5.23:
+ dependencies:
+ nanoid: 3.3.19
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ postcss@8.5.28:
+ dependencies:
+ nanoid: 3.3.19
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ powershell-utils@0.1.0: {}
+
+ powershell-utils@0.2.1: {}
+
+ prelude-ls@1.2.1: {}
+
+ pretty-ms@9.3.1:
+ dependencies:
+ parse-ms: 4.0.0
+
+ prisma@6.19.3(typescript@5.7.3):
+ dependencies:
+ '@prisma/config': 6.19.3
+ '@prisma/engines': 6.19.3
+ optionalDependencies:
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - magicast
+
+ prompts@2.4.2:
+ dependencies:
+ kleur: 3.0.3
+ sisteransi: 1.0.5
+
+ proxy-addr@2.0.7:
+ dependencies:
+ forwarded: 0.2.0
+ ipaddr.js: 1.9.1
+
+ punycode@2.3.1: {}
+
+ pure-rand@6.1.0: {}
+
+ qified@0.10.1:
+ dependencies:
+ hookified: 2.2.0
+
+ qs@6.16.0:
+ dependencies:
+ es-define-property: 1.0.1
+ side-channel: 1.1.1
+
+ quansync@0.2.11: {}
+
+ queue-microtask@1.2.3: {}
+
+ range-parser@1.3.0: {}
+
+ raw-body@3.0.2:
+ dependencies:
+ bytes: 3.1.2
+ http-errors: 2.0.1
+ iconv-lite: 0.7.3
+ unpipe: 1.0.0
+
+ rc9@2.1.2:
+ dependencies:
+ defu: 6.1.7
+ destr: 2.0.5
+
+ react-dom@19.3.0(react@19.3.0):
+ dependencies:
+ react: 19.3.0
+ scheduler: 0.28.0
+
+ react@19.3.0: {}
+
+ read-installed@4.0.3:
+ dependencies:
+ debuglog: 1.0.1
+ read-package-json: 2.1.2
+ readdir-scoped-modules: 1.1.0
+ semver: 5.7.2
+ slide: 1.1.6
+ util-extend: 1.0.3
+ optionalDependencies:
+ graceful-fs: 4.2.11
+
+ read-package-json@2.1.2:
+ dependencies:
+ glob: 7.2.3
+ json-parse-even-better-errors: 2.3.1
+ normalize-package-data: 2.5.0
+ npm-normalize-package-bin: 1.0.1
+
+ readdir-scoped-modules@1.1.0:
+ dependencies:
+ debuglog: 1.0.1
+ dezalgo: 1.0.4
+ graceful-fs: 4.2.11
+ once: 1.4.0
+
+ readdirp@4.1.2: {}
+
+ readdirp@5.1.1: {}
+
+ recast@0.23.21:
+ dependencies:
+ ast-types: 0.16.3
+ esprima: 4.0.1
+ source-map: 0.6.1
+ tiny-invariant: 1.3.3
+ tslib: 2.8.1
+
+ relateurl@0.2.7: {}
+
+ require-from-string@2.0.2: {}
+
+ reselect@5.3.0: {}
+
+ resolve-from@4.0.0: {}
+
+ resolve@1.22.12:
+ dependencies:
+ es-errors: 1.3.0
+ is-core-module: 2.16.2
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ restore-cursor@5.1.0:
+ dependencies:
+ onetime: 7.0.0
+ signal-exit: 4.1.0
+
+ reusify@1.1.0: {}
+
+ rollup-plugin-string@3.0.0:
+ dependencies:
+ rollup-pluginutils: 2.8.2
+
+ rollup-plugin-visualizer@7.1.1(rollup@4.63.2):
+ dependencies:
+ open: 11.0.3
+ picomatch: 4.0.7
+ source-map: 0.8.0
+ yargs: 18.1.0
+ optionalDependencies:
+ rollup: 4.63.2
+
+ rollup-pluginutils@2.8.2:
+ dependencies:
+ estree-walker: 0.6.1
+
+ rollup@2.80.0:
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ rollup@4.63.2:
+ dependencies:
+ '@types/estree': 1.0.9
+ optionalDependencies:
+ '@napi-rs/lzma-linux-x64-gnu': 1.5.1
+ '@rollup/rollup-android-arm-eabi': 4.63.2
+ '@rollup/rollup-android-arm64': 4.63.2
+ '@rollup/rollup-darwin-arm64': 4.63.2
+ '@rollup/rollup-darwin-x64': 4.63.2
+ '@rollup/rollup-freebsd-arm64': 4.63.2
+ '@rollup/rollup-freebsd-x64': 4.63.2
+ '@rollup/rollup-linux-arm-gnueabihf': 4.63.2
+ '@rollup/rollup-linux-arm-musleabihf': 4.63.2
+ '@rollup/rollup-linux-arm64-gnu': 4.63.2
+ '@rollup/rollup-linux-arm64-musl': 4.63.2
+ '@rollup/rollup-linux-loong64-gnu': 4.63.2
+ '@rollup/rollup-linux-loong64-musl': 4.63.2
+ '@rollup/rollup-linux-ppc64-gnu': 4.63.2
+ '@rollup/rollup-linux-ppc64-musl': 4.63.2
+ '@rollup/rollup-linux-riscv64-gnu': 4.63.2
+ '@rollup/rollup-linux-riscv64-musl': 4.63.2
+ '@rollup/rollup-linux-s390x-gnu': 4.63.2
+ '@rollup/rollup-linux-x64-gnu': 4.63.2
+ '@rollup/rollup-linux-x64-musl': 4.63.2
+ '@rollup/rollup-openbsd-x64': 4.63.2
+ '@rollup/rollup-openharmony-arm64': 4.63.2
+ '@rollup/rollup-win32-arm64-msvc': 4.63.2
+ '@rollup/rollup-win32-ia32-msvc': 4.63.2
+ '@rollup/rollup-win32-x64-gnu': 4.63.2
+ '@rollup/rollup-win32-x64-msvc': 4.63.2
+ fsevents: 2.3.3
+
+ rou3@0.9.2: {}
+
+ router@2.2.0:
+ dependencies:
+ debug: 4.4.3
+ depd: 2.0.0
+ is-promise: 4.0.0
+ parseurl: 1.3.3
+ path-to-regexp: 8.4.2
+ transitivePeerDependencies:
+ - supports-color
+
+ run-applescript@7.1.0: {}
+
+ run-parallel@1.2.0:
+ dependencies:
+ queue-microtask: 1.2.3
+
+ safer-buffer@2.1.2: {}
+
+ sass@1.104.1:
+ dependencies:
+ chokidar: 5.0.0
+ immutable: 5.1.9
+ source-map-js: 1.2.1
+ optionalDependencies:
+ '@parcel/watcher': 2.6.0
+
+ scheduler@0.28.0: {}
+
+ semver@5.7.2: {}
+
+ semver@6.3.1: {}
+
+ semver@7.8.5: {}
+
+ send@1.2.1:
+ dependencies:
+ debug: 4.4.3
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ etag: 1.8.1
+ fresh: 2.0.0
+ http-errors: 2.0.1
+ mime-types: 3.0.2
+ ms: 2.1.3
+ on-finished: 2.4.1
+ range-parser: 1.3.0
+ statuses: 2.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ serve-static@2.2.1:
+ dependencies:
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ parseurl: 1.3.3
+ send: 1.2.1
+ transitivePeerDependencies:
+ - supports-color
+
+ set-cookie-parser@3.1.2: {}
+
+ setprototypeof@1.2.0: {}
+
+ shadcn@4.21.0(typescript@5.7.3):
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/parser': 7.29.8
+ '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7)
+ '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7)
+ '@dotenvx/dotenvx': 1.75.1
+ '@modelcontextprotocol/sdk': 1.30.0(zod@3.25.76)
+ '@types/validate-npm-package-name': 4.0.2
+ browserslist: 4.28.9
+ cn: 0.2.6
+ commander: 14.0.3
+ cosmiconfig: 9.0.2(typescript@5.7.3)
+ dedent: 1.7.2
+ deepmerge: 4.3.1
+ diff: 8.0.4
+ execa: 9.6.1
+ fast-glob: 3.3.3
+ fs-extra: 11.4.0
+ fuzzysort: 3.1.0
+ kleur: 4.1.5
+ open: 11.0.3
+ ora: 8.2.0
+ postcss: 8.5.28
+ postcss-selector-parser: 7.1.6
+ prompts: 2.4.2
+ recast: 0.23.21
+ socks: 2.8.10
+ stringify-object: 5.0.0
+ ts-morph: 26.0.0
+ tsconfig-paths: 4.2.0
+ undici: 7.29.1
+ validate-npm-package-name: 7.0.2
+ zod: 3.25.76
+ zod-to-json-schema: 3.25.2(zod@3.25.76)
+ transitivePeerDependencies:
+ - '@cfworker/json-schema'
+ - babel-plugin-macros
+ - supports-color
+ - typescript
+
+ sharp@0.35.4(@types/node@24.13.4):
+ dependencies:
+ '@img/colour': 1.1.0
+ detect-libc: 2.1.2
+ semver: 7.8.5
+ optionalDependencies:
+ '@img/sharp-darwin-arm64': 0.35.4
+ '@img/sharp-darwin-x64': 0.35.4
+ '@img/sharp-freebsd-wasm32': 0.35.4
+ '@img/sharp-libvips-darwin-arm64': 1.3.3
+ '@img/sharp-libvips-darwin-x64': 1.3.3
+ '@img/sharp-libvips-linux-arm': 1.3.3
+ '@img/sharp-libvips-linux-arm64': 1.3.3
+ '@img/sharp-libvips-linux-ppc64': 1.3.3
+ '@img/sharp-libvips-linux-riscv64': 1.3.3
+ '@img/sharp-libvips-linux-s390x': 1.3.3
+ '@img/sharp-libvips-linux-x64': 1.3.3
+ '@img/sharp-libvips-linuxmusl-arm64': 1.3.3
+ '@img/sharp-libvips-linuxmusl-x64': 1.3.3
+ '@img/sharp-linux-arm': 0.35.4
+ '@img/sharp-linux-arm64': 0.35.4
+ '@img/sharp-linux-ppc64': 0.35.4
+ '@img/sharp-linux-riscv64': 0.35.4
+ '@img/sharp-linux-s390x': 0.35.4
+ '@img/sharp-linux-x64': 0.35.4
+ '@img/sharp-linuxmusl-arm64': 0.35.4
+ '@img/sharp-linuxmusl-x64': 0.35.4
+ '@img/sharp-webcontainers-wasm32': 0.35.4
+ '@img/sharp-win32-arm64': 0.35.4
+ '@img/sharp-win32-ia32': 0.35.4
+ '@img/sharp-win32-x64': 0.35.4
+ '@types/node': 24.13.4
+ optional: true
+
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ side-channel-list@1.0.1:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-map@1.0.1:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-weakmap@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-map: 1.0.1
+
+ side-channel@1.1.1:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-list: 1.0.1
+ side-channel-map: 1.0.1
+ side-channel-weakmap: 1.0.2
+
+ signal-exit@3.0.7: {}
+
+ signal-exit@4.1.0: {}
+
+ sisteransi@1.0.5: {}
+
+ slide@1.1.6: {}
+
+ smart-buffer@4.2.0: {}
+
+ socks@2.8.10:
+ dependencies:
+ ip-address: 10.7.0
+ smart-buffer: 4.2.0
+
+ source-map-js@1.2.1: {}
+
+ source-map-support@0.5.21:
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+
+ source-map@0.6.1: {}
+
+ source-map@0.8.0: {}
+
+ spdx-compare@1.0.0:
+ dependencies:
+ array-find-index: 1.0.2
+ spdx-expression-parse: 3.0.1
+ spdx-ranges: 2.1.1
+
+ spdx-correct@3.2.0:
+ dependencies:
+ spdx-expression-parse: 3.0.1
+ spdx-license-ids: 3.0.23
+
+ spdx-exceptions@2.5.0: {}
+
+ spdx-expression-parse@3.0.1:
+ dependencies:
+ spdx-exceptions: 2.5.0
+ spdx-license-ids: 3.0.23
+
+ spdx-license-ids@3.0.23: {}
+
+ spdx-ranges@2.1.1: {}
+
+ spdx-satisfies@4.0.1:
+ dependencies:
+ spdx-compare: 1.0.0
+ spdx-expression-parse: 3.0.1
+ spdx-ranges: 2.1.1
+
+ srvx@1.0.4: {}
+
+ state-local@1.0.7: {}
+
+ statuses@2.0.2: {}
+
+ stdin-discarder@0.2.2: {}
+
+ string-width@7.2.0:
+ dependencies:
+ emoji-regex: 10.6.0
+ get-east-asian-width: 1.6.0
+ strip-ansi: 7.2.0
+
+ string-width@8.2.2:
+ dependencies:
+ get-east-asian-width: 1.6.0
+ strip-ansi: 7.2.0
+
+ stringify-object@5.0.0:
+ dependencies:
+ get-own-enumerable-keys: 1.0.0
+ is-obj: 3.0.0
+ is-regexp: 3.1.0
+
+ strip-ansi@6.0.1:
+ dependencies:
+ ansi-regex: 5.0.1
+
+ strip-ansi@7.2.0:
+ dependencies:
+ ansi-regex: 6.3.0
+
+ strip-bom@3.0.0: {}
+
+ strip-final-newline@2.0.0: {}
+
+ strip-final-newline@4.0.0: {}
+
+ styled-jsx@5.1.6(@babel/core@7.29.7)(react@19.3.0):
+ dependencies:
+ client-only: 0.0.1
+ react: 19.3.0
+ optionalDependencies:
+ '@babel/core': 7.29.7
+
+ supports-color@5.5.0:
+ dependencies:
+ has-flag: 3.0.0
+
+ supports-preserve-symlinks-flag@1.0.0: {}
+
+ systeminformation@5.33.10: {}
+
+ tailwind-merge@3.7.0: {}
+
+ tailwindcss@4.3.3: {}
+
+ tapable@2.3.3: {}
+
+ tellraw-parser@1.0.2: {}
+
+ terser@5.51.2:
+ dependencies:
+ '@jridgewell/source-map': 0.3.11
+ acorn: 8.18.0
+ commander: 2.20.3
+ source-map-support: 0.5.21
+
+ tiny-invariant@1.3.3: {}
+
+ tinyexec@1.3.1: {}
+
+ tinyglobby@0.2.17:
+ dependencies:
+ fdir: 6.5.0(picomatch@4.0.7)
+ picomatch: 4.0.7
+
+ to-regex-range@5.0.1:
+ dependencies:
+ is-number: 7.0.0
+
+ toidentifier@1.0.1: {}
+
+ tosource@2.0.0-alpha.3: {}
+
+ treeify@1.1.0: {}
+
+ ts-api-utils@2.5.0(typescript@5.7.3):
+ dependencies:
+ typescript: 5.7.3
+
+ ts-morph@26.0.0:
+ dependencies:
+ '@ts-morph/common': 0.27.0
+ code-block-writer: 13.0.3
+
+ tsconfig-paths@4.2.0:
+ dependencies:
+ json5: 2.2.3
+ minimist: 1.2.8
+ strip-bom: 3.0.0
+
+ tslib@2.8.1: {}
+
+ tsx@4.23.13:
+ dependencies:
+ esbuild: 0.28.2
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ tw-animate-css@1.4.0: {}
+
+ type-check@0.4.0:
+ dependencies:
+ prelude-ls: 1.2.1
+
+ type-is@2.1.0:
+ dependencies:
+ content-type: 2.1.0
+ media-typer: 1.1.1
+ mime-types: 3.0.2
+
+ typescript-eslint@8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@5.7.3):
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 8.70.0(@typescript-eslint/parser@8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@5.7.3))(eslint@10.10.0(jiti@2.7.0))(typescript@5.7.3)
+ '@typescript-eslint/parser': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@5.7.3)
+ '@typescript-eslint/typescript-estree': 8.70.0(typescript@5.7.3)
+ '@typescript-eslint/utils': 8.70.0(eslint@10.10.0(jiti@2.7.0))(typescript@5.7.3)
+ eslint: 10.10.0(jiti@2.7.0)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ typescript@5.7.3: {}
+
+ typescript@6.0.3: {}
+
+ ufo@1.6.4: {}
+
+ undici-types@7.18.2: {}
+
+ undici-types@7.24.6: {}
+
+ undici-types@8.9.0: {}
+
+ undici@7.29.1: {}
+
+ unicorn-magic@0.3.0: {}
+
+ universalify@2.0.1: {}
+
+ unpipe@1.0.0: {}
+
+ unplugin-remove@1.0.3(rollup@4.63.2):
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/generator': 7.29.8
+ '@babel/parser': 7.29.8
+ '@babel/traverse': 7.29.8
+ '@rollup/pluginutils': 5.4.0(rollup@4.63.2)
+ magic-string: 0.30.21
+ unplugin: 1.16.1
+ transitivePeerDependencies:
+ - rollup
+ - supports-color
+
+ unplugin@1.16.1:
+ dependencies:
+ acorn: 8.18.0
+ webpack-virtual-modules: 0.6.2
+
+ update-browserslist-db@1.3.3(browserslist@4.28.9):
+ dependencies:
+ browserslist: 4.28.9
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
+ uri-js@4.4.1:
+ dependencies:
+ punycode: 2.3.1
+
+ use-sync-external-store@1.7.0(react@19.3.0):
+ dependencies:
+ react: 19.3.0
+
+ util-deprecate@1.0.2: {}
+
+ util-extend@1.0.3: {}
+
+ validate-npm-package-license@3.0.4:
+ dependencies:
+ spdx-correct: 3.2.0
+ spdx-expression-parse: 3.0.1
+
+ validate-npm-package-name@7.0.2: {}
+
+ vary@1.1.2: {}
+
+ vite-plugin-eslint@1.8.1(eslint@10.10.0(jiti@2.7.0))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)):
+ dependencies:
+ '@rollup/pluginutils': 4.2.1
+ '@types/eslint': 8.56.12
+ eslint: 10.10.0(jiti@2.7.0)
+ rollup: 2.80.0
+ vite: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)
+
+ vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13):
+ dependencies:
+ esbuild: 0.25.12
+ fdir: 6.5.0(picomatch@4.0.7)
+ picomatch: 4.0.7
+ postcss: 8.5.28
+ rollup: 4.63.2
+ tinyglobby: 0.2.17
+ optionalDependencies:
+ '@types/node': 26.5.1
+ fsevents: 2.3.3
+ jiti: 2.7.0
+ lightningcss: 1.32.0
+ sass: 1.104.1
+ terser: 5.51.2
+ tsx: 4.23.13
+
+ webpack-virtual-modules@0.6.2: {}
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ which@4.0.0:
+ dependencies:
+ isexe: 3.1.5
+
+ word-wrap@1.2.5: {}
+
+ wrap-ansi@9.0.2:
+ dependencies:
+ ansi-styles: 6.2.3
+ string-width: 7.2.0
+ strip-ansi: 7.2.0
+
+ wrappy@1.0.2: {}
+
+ wsl-utils@1.0.0:
+ dependencies:
+ is-wsl: 3.1.1
+ powershell-utils: 0.1.0
+
+ y18n@5.0.8: {}
+
+ yallist@3.1.1: {}
+
+ yargs-parser@22.0.0: {}
+
+ yargs@18.1.0:
+ dependencies:
+ cliui: 9.0.1
+ escalade: 3.2.0
+ get-caller-file: 2.0.5
+ string-width: 8.2.2
+ y18n: 5.0.8
+ yargs-parser: 22.0.0
+
+ yocto-queue@0.1.0: {}
+
+ yocto-spinner@1.2.2:
+ dependencies:
+ yoctocolors: 2.2.0
+
+ yoctocolors@2.2.0: {}
+
+ zigpty@0.2.1: {}
+
+ zod-to-json-schema@3.25.2(zod@3.25.76):
+ dependencies:
+ zod: 3.25.76
+
+ zod@3.25.76: {}
+
+ zod@4.6.2: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
new file mode 100644
index 00000000..a302db2d
--- /dev/null
+++ b/pnpm-workspace.yaml
@@ -0,0 +1,4 @@
+packages:
+ - "npm/*"
+minimumReleaseAgeExclude:
+ - '@shadowdara/finder-lib@0.3.17'
From eb119b60135d6414cc931b3b03a213e03d8838d9 Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 00:22:56 +0200
Subject: [PATCH 06/62] dep up
---
package.json | 3 +-
pnpm-lock.yaml | 108 ++++++++++++++++----------------------------
pnpm-workspace.yaml | 8 ++++
3 files changed, 49 insertions(+), 70 deletions(-)
diff --git a/package.json b/package.json
index 54ae5478..98c4bf22 100644
--- a/package.json
+++ b/package.json
@@ -6,6 +6,7 @@
"build": "pnpm --filter web build"
},
"devDependencies": {
- "@shadowdara/linguist-js": "*"
+ "@shadowdara/linguist-js": "*",
+ "@shadowdara/seg": "0.2.4"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 8acae43e..82a753e7 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -8,9 +8,12 @@ importers:
.:
devDependencies:
- linguist-js:
- specifier: ^3.0.3
- version: 3.0.3
+ '@shadowdara/linguist-js':
+ specifier: '*'
+ version: 1.0.0
+ '@shadowdara/seg':
+ specifier: 0.2.4
+ version: 0.2.4
npm/finder-lib:
devDependencies:
@@ -1535,6 +1538,15 @@ packages:
'@shadowdara/finder-lib@0.3.17':
resolution: {integrity: sha512-8aOCR273G8vBtp/migYdQHAgD9Uu2ymtX49wfAPA3rfFs+2PooujmvMrRss1O+uJvce3ti0NY13if2UHqv080g==}
+ '@shadowdara/linguist-js@1.0.0':
+ resolution: {integrity: sha512-n0tCMv25du7H6ahsJ2FLlU/LoJefizYGHkZ+Fzh7XjLtWk2jEyhPOpDdLvyPQVMFQCVjtaqjk9PK7ZOy+P/MHQ==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ '@shadowdara/seg@0.2.4':
+ resolution: {integrity: sha512-vRujqP/5koUhu0ULoOGY5a2QGK4OYqw75gxqRqt74Mt31QYqlBGz0AygE7wsEP04PUMLhvhPqhSWX6Xp7mtNHA==}
+ hasBin: true
+
'@sindresorhus/merge-streams@4.0.0':
resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
engines: {node: '>=18'}
@@ -1961,10 +1973,6 @@ packages:
zod:
optional: true
- binary-extensions@3.2.0:
- resolution: {integrity: sha512-DjR9rgAOMQn9TrUHzijJUtvoKviDRvFxuIyqZrubxHqRpQN9OzfXrrLivm7xb3q8oJSKsiuBor4bAS2wafLnVQ==}
- engines: {node: '>=18.20'}
-
birpc@4.2.0:
resolution: {integrity: sha512-KxgKcZPfrtzJDDALHPguGpGJUrzdgpymyiQQgzFjWreHMOpWrnFNVREr5J48x2DBh8ZVioscrV1SBkDipGiX+Q==}
@@ -2080,10 +2088,6 @@ packages:
resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==}
engines: {node: '>=20'}
- clone@2.1.2:
- resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==}
- engines: {node: '>=0.8'}
-
clsx@2.1.1:
resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
engines: {node: '>=6'}
@@ -2117,9 +2121,6 @@ packages:
commander@2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
- common-path-prefix@3.0.0:
- resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==}
-
concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
@@ -2801,10 +2802,6 @@ packages:
resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==}
engines: {node: '>=16'}
- isbinaryfile@6.0.0:
- resolution: {integrity: sha512-2FN2B8MAqKv6d5TaKsLvMrwMcghxwHTpcKy0L5mhNbRqjNqo2++SpCqN6eG1lCC1GmTQgvrYJYXv2+Chvyevag==}
- engines: {node: '>= 24.0.0'}
-
isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
@@ -2960,11 +2957,6 @@ packages:
lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
- linguist-js@3.0.3:
- resolution: {integrity: sha512-egV9nG7vgX0mn/yJJ4FIyv9b6jjT+IPFF8vbdQeCXBWSTJteOJ7HctrsoCwWaHQaCiOLXX0t4jFZtqvXOJl3/w==}
- engines: {node: '>=26', npm: '>=10'}
- hasBin: true
-
local-pkg@1.2.1:
resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==}
engines: {node: '>=14'}
@@ -3113,10 +3105,6 @@ packages:
node-addon-api@7.1.1:
resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
- node-cache@5.1.2:
- resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==}
- engines: {node: '>= 8.0.0'}
-
node-fetch-native@1.6.7:
resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==}
@@ -4197,7 +4185,7 @@ snapshots:
optionalDependencies:
'@types/react': 19.3.0
- '@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)':
+ '@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)':
dependencies:
'@better-auth/utils': 0.4.2
'@better-fetch/fetch': 1.3.1
@@ -4209,39 +4197,39 @@ snapshots:
nanostores: 1.5.3
zod: 4.6.2
- '@better-auth/drizzle-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
+ '@better-auth/drizzle-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
- '@better-auth/kysely-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(kysely@0.29.5)':
+ '@better-auth/kysely-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(kysely@0.29.5)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
optionalDependencies:
kysely: 0.29.5
- '@better-auth/memory-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
+ '@better-auth/memory-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
- '@better-auth/mongo-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
+ '@better-auth/mongo-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
- '@better-auth/prisma-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(prisma@6.19.3(typescript@5.7.3))':
+ '@better-auth/prisma-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(prisma@6.19.3(typescript@5.7.3))':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
optionalDependencies:
'@prisma/client': 6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3)
prisma: 6.19.3(typescript@5.7.3)
- '@better-auth/telemetry@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)':
+ '@better-auth/telemetry@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
'@better-fetch/fetch': 1.3.1
@@ -5024,6 +5012,10 @@ snapshots:
'@shadowdara/finder-lib@0.3.17': {}
+ '@shadowdara/linguist-js@1.0.0': {}
+
+ '@shadowdara/seg@0.2.4': {}
+
'@sindresorhus/merge-streams@4.0.0': {}
'@standard-schema/spec@1.1.0': {}
@@ -5367,13 +5359,13 @@ snapshots:
better-auth@1.7.4(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(next@16.3.3(@babel/core@7.29.7)(@types/node@24.13.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(sass@1.104.1))(prisma@6.19.3(typescript@5.7.3))(react-dom@19.3.0(react@19.3.0))(react@19.3.0):
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
- '@better-auth/drizzle-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
- '@better-auth/kysely-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(kysely@0.29.5)
- '@better-auth/memory-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
- '@better-auth/mongo-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
- '@better-auth/prisma-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(prisma@6.19.3(typescript@5.7.3))
- '@better-auth/telemetry': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/drizzle-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
+ '@better-auth/kysely-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(kysely@0.29.5)
+ '@better-auth/memory-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
+ '@better-auth/mongo-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
+ '@better-auth/prisma-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(prisma@6.19.3(typescript@5.7.3))
+ '@better-auth/telemetry': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)
'@better-auth/utils': 0.4.2
'@better-fetch/fetch': 1.3.1
'@noble/ciphers': 2.4.0
@@ -5403,8 +5395,6 @@ snapshots:
optionalDependencies:
zod: 4.6.2
- binary-extensions@3.2.0: {}
-
birpc@4.2.0: {}
body-parser@2.3.0:
@@ -5540,8 +5530,6 @@ snapshots:
strip-ansi: 7.2.0
wrap-ansi: 9.0.2
- clone@2.1.2: {}
-
clsx@2.1.1: {}
cn@0.2.6: {}
@@ -5562,8 +5550,6 @@ snapshots:
commander@2.20.3: {}
- common-path-prefix@3.0.0: {}
-
concat-map@0.0.1: {}
conf@10.2.0:
@@ -6253,8 +6239,6 @@ snapshots:
dependencies:
is-inside-container: 1.0.0
- isbinaryfile@6.0.0: {}
-
isexe@2.0.0: {}
isexe@3.1.5: {}
@@ -6374,16 +6358,6 @@ snapshots:
lines-and-columns@1.2.4: {}
- linguist-js@3.0.3:
- dependencies:
- binary-extensions: 3.2.0
- commander: 14.0.3
- common-path-prefix: 3.0.0
- ignore: 7.0.9
- isbinaryfile: 6.0.0
- js-yaml: 4.3.2
- node-cache: 5.1.2
-
local-pkg@1.2.1:
dependencies:
mlly: 1.8.2
@@ -6523,10 +6497,6 @@ snapshots:
node-addon-api@7.1.1:
optional: true
- node-cache@5.1.2:
- dependencies:
- clone: 2.1.2
-
node-fetch-native@1.6.7: {}
node-releases@2.0.55: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index a302db2d..021808bf 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,4 +1,12 @@
packages:
- "npm/*"
+allowBuilds:
+ '@parcel/watcher': true
+ '@prisma/client': true
+ '@prisma/engines': true
+ '@shadowdara/seg': true
+ esbuild: true
+ prisma: true
minimumReleaseAgeExclude:
- '@shadowdara/finder-lib@0.3.17'
+ - '@shadowdara/linguist-js@1.0.0'
From 5f2ead51ca4a710c1a3e4723b028f7335cde0c44 Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 02:06:19 +0200
Subject: [PATCH 07/62] Add Liquid static pages and template validation
This change adds build-time Liquid page support to the SSG plugin, including render-time data loading and JS injection for static HTML pages. It also adds a lightweight install script, updates the docs for template validation, and fixes template tag metadata to ensure tag arrays are valid JSON5-compatible structures.
---
check.py | 52 +++-
npm/pages-plugin/package.json | 10 +
npm/site/data/backend.json | 44 ++--
npm/site/data/gh-pages.json | 35 +--
npm/site/docs/readme.md | 25 ++
npm/site/package.json | 15 +-
npm/site/pages-ssg-plugin.ts | 356 ++++++++++++++++++++++++++--
npm/site/pages/jekyll/page.build.js | 6 +
npm/site/pages/jekyll/page.html | 9 +
npm/site/pages/jekyll/page.js | 2 +
npm/site/public/dependencies.txt | 30 +--
npm/site/public/install.sh | 95 ++++++++
npm/site/src/main.ts | 8 +
npm/site/src/pages.d.ts | 9 +-
npm/site/src/templates.js | 4 +-
pnpm-lock.yaml | 73 ++++--
16 files changed, 662 insertions(+), 111 deletions(-)
create mode 100644 npm/pages-plugin/package.json
create mode 100644 npm/site/pages/jekyll/page.build.js
create mode 100644 npm/site/pages/jekyll/page.html
create mode 100644 npm/site/pages/jekyll/page.js
create mode 100644 npm/site/public/install.sh
diff --git a/check.py b/check.py
index d7515523..c324a8e8 100644
--- a/check.py
+++ b/check.py
@@ -5,15 +5,21 @@
MIN_VERSION = "0.3.17"
# Ordner, in dem dieses Script liegt
-folder = Path(__file__).parent
-folder = Path(str(folder) + "/templates")
+folder = Path(__file__).parent / "templates"
wrong = 0
-all = 0
+total = 0
notags = 0
+noarraytags = 0
+
+
+# ─────────────────────────────────────────────
+# min_version ergänzen
+# ─────────────────────────────────────────────
for json_file in folder.glob("*.json5"):
- all += 1
+ total += 1
+
try:
with json_file.open("r", encoding="utf-8") as f:
data = json.load(f)
@@ -27,31 +33,57 @@
f.write("\n")
print(f"Ergänzt: {json_file.name}")
- else:
- #print(f"Bereits vorhanden: {json_file.name}")
- pass
except json.JSONDecodeError:
print(f"Übersprungen (ungültiges JSON): {json_file.name}")
wrong += 1
+
except Exception as e:
print(f"Fehler bei {json_file.name}: {e}")
+# ─────────────────────────────────────────────
+# tags überprüfen
+# ─────────────────────────────────────────────
+
for json_file in folder.glob("*.json5"):
try:
with json_file.open("r", encoding="utf-8") as f:
data = json.load(f)
- # Nur ergänzen, wenn min_version nicht vorhanden ist
+ # Keine tags vorhanden
if "tags" not in data:
print(f"No Tags: {json_file.name}")
notags += 1
+ continue
+
+ # tags vorhanden, aber kein Array / keine Liste
+ if not isinstance(data["tags"], list):
+ print(
+ f"Tags is not an array: "
+ f"{json_file.name} "
+ f"(type: {type(data['tags']).__name__})"
+ )
+ noarraytags += 1
except json.JSONDecodeError:
+ # Bereits im ersten Durchlauf gezählt
pass
+
except Exception as e:
print(f"Fehler bei {json_file.name}: {e}")
-print(f"\nTemplates with wrong JSON {wrong} from {all}")
-print(f"Templates without tags {notags} from {all - wrong} Working Templates")
+
+# ─────────────────────────────────────────────
+# Statistik
+# ─────────────────────────────────────────────
+
+working = total - wrong
+
+print()
+print(f"Templates with wrong JSON: {wrong} from {total}")
+print(f"Templates without tags: {notags} from {working} working templates")
+print(
+ f"Templates where tags is not an array: "
+ f"{noarraytags} from {working - notags} templates with tags attribute"
+)
diff --git a/npm/pages-plugin/package.json b/npm/pages-plugin/package.json
new file mode 100644
index 00000000..515d0739
--- /dev/null
+++ b/npm/pages-plugin/package.json
@@ -0,0 +1,10 @@
+{
+ "name": "@shadowdara/ssg-pages-plugin",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "keywords": [],
+ "author": "",
+ "license": "Apache-2.0",
+ "type": "module"
+}
diff --git a/npm/site/data/backend.json b/npm/site/data/backend.json
index 38e69ea2..d38a7f19 100644
--- a/npm/site/data/backend.json
+++ b/npm/site/data/backend.json
@@ -1,48 +1,48 @@
{
- "generatedAt": "2026-09-13T20:23:12.767Z",
+ "generatedAt": "2026-09-14T00:04:59.897Z",
"total": {
- "files": 57,
- "bytes": 348597,
- "kilobytes": 340.43,
+ "files": 59,
+ "bytes": 349838,
+ "kilobytes": 341.64,
"megabytes": 0.33
},
"byExtension": [
{
"extension": ".js",
- "files": 20,
- "bytes": 272482,
- "percentage": 78.17
+ "files": 21,
+ "bytes": 273984,
+ "percentage": 78.32
},
{
"extension": ".css",
"files": 15,
"bytes": 56648,
- "percentage": 16.25
+ "percentage": 16.19
},
{
"extension": ".txt",
"files": 1,
- "bytes": 9809,
- "percentage": 2.81
+ "bytes": 9442,
+ "percentage": 2.7
},
{
"extension": ".html",
- "files": 20,
- "bytes": 7647,
- "percentage": 2.19
+ "files": 21,
+ "bytes": 7753,
+ "percentage": 2.22
},
{
"extension": ".sh",
"files": 1,
"bytes": 2011,
- "percentage": 0.58
+ "percentage": 0.57
}
],
"files": [
{
"path": "assets/main_entry.js",
"extension": ".js",
- "bytes": 87805
+ "bytes": 89073
},
{
"path": "assets/jquery.module.js",
@@ -67,7 +67,7 @@
{
"path": "dependencies.txt",
"extension": ".txt",
- "bytes": 9809
+ "bytes": 9442
},
{
"path": "assets/viewer.css",
@@ -77,7 +77,7 @@
{
"path": "assets/configeditor.js",
"extension": ".js",
- "bytes": 9040
+ "bytes": 9239
},
{
"path": "assets/viewer.js",
@@ -323,6 +323,16 @@
"path": "assets/about.js",
"extension": ".js",
"bytes": 228
+ },
+ {
+ "path": "jekyll/index.html",
+ "extension": ".html",
+ "bytes": 106
+ },
+ {
+ "path": "assets/page.js",
+ "extension": ".js",
+ "bytes": 35
}
]
}
\ No newline at end of file
diff --git a/npm/site/data/gh-pages.json b/npm/site/data/gh-pages.json
index 59392a76..36e348bc 100644
--- a/npm/site/data/gh-pages.json
+++ b/npm/site/data/gh-pages.json
@@ -1,34 +1,34 @@
{
- "generatedAt": "2026-09-13T20:23:26.926Z",
+ "generatedAt": "2026-09-13T23:34:52.067Z",
"total": {
- "files": 57,
- "bytes": 416176,
- "kilobytes": 406.42,
+ "files": 58,
+ "bytes": 417268,
+ "kilobytes": 407.49,
"megabytes": 0.4
},
"byExtension": [
{
"extension": ".js",
"files": 20,
- "bytes": 339860,
- "percentage": 81.66
+ "bytes": 341297,
+ "percentage": 81.79
},
{
"extension": ".css",
"files": 15,
"bytes": 56648,
- "percentage": 13.61
+ "percentage": 13.58
},
{
"extension": ".txt",
"files": 1,
- "bytes": 9809,
- "percentage": 2.36
+ "bytes": 9413,
+ "percentage": 2.26
},
{
"extension": ".html",
- "files": 20,
- "bytes": 7848,
+ "files": 21,
+ "bytes": 7899,
"percentage": 1.89
},
{
@@ -42,7 +42,7 @@
{
"path": "assets/main_entry.js",
"extension": ".js",
- "bytes": 87546
+ "bytes": 88782
},
{
"path": "assets/jquery.module.js",
@@ -52,7 +52,7 @@
{
"path": "assets/viewer.js",
"extension": ".js",
- "bytes": 77569
+ "bytes": 77571
},
{
"path": "assets/installscript.js",
@@ -72,7 +72,7 @@
{
"path": "dependencies.txt",
"extension": ".txt",
- "bytes": 9809
+ "bytes": 9413
},
{
"path": "assets/viewer.css",
@@ -82,7 +82,7 @@
{
"path": "assets/configeditor.js",
"extension": ".js",
- "bytes": 9040
+ "bytes": 9239
},
{
"path": "assets/regexcreator.js",
@@ -323,6 +323,11 @@
"path": "assets/about.js",
"extension": ".js",
"bytes": 228
+ },
+ {
+ "path": "jekyll/index.html",
+ "extension": ".html",
+ "bytes": 51
}
]
}
\ No newline at end of file
diff --git a/npm/site/docs/readme.md b/npm/site/docs/readme.md
index 279041ad..c0705485 100644
--- a/npm/site/docs/readme.md
+++ b/npm/site/docs/readme.md
@@ -166,6 +166,31 @@ finder -t python
finder list
```
+### Validate a single template
+
+```bash
+# Validate a template file by path
+finder validate my-template.json5
+
+# Validate a built-in or custom template by name
+finder validate go
+
+# Validate multiple templates at once
+finder validate templates/go.json5 templates/django.json5
+
+# Short alias
+finder val my-template.json5
+```
+
+If a template file is not plain JSON and only parses after the JSON5
+preprocessor runs, a warning is printed so you know the template
+depends on JSON5 features (e.g. unquoted keys):
+
+```text
+File Result Warning
+my-template.json5 OK (File) Template is not plain JSON - it needs the JSON5 preprocessor to be parsed
+```
+
## Templates
### Built-in templates
diff --git a/npm/site/package.json b/npm/site/package.json
index 57da95e8..393e866b 100644
--- a/npm/site/package.json
+++ b/npm/site/package.json
@@ -22,34 +22,37 @@
"devDependencies": {
"@eslint/js": "^10.0.1",
"@rollup/plugin-yaml": "^5.0.0",
+ "@tailwindcss/vite": "^4.3.3",
"@types/html-minifier-terser": "^7.0.2",
"@types/jquery": "^4.0.1",
"@types/license-checker": "^25.0.6",
"@types/node": "^26.5.0",
+ "@vitejs/devtools": "^0.7.2",
"chalk": "^6.0.0",
+ "esbuild": ">=0.25.0",
"eslint": "^10.9.1",
"html-minifier-terser": "^7.2.0",
"license-checker": "^25.0.1",
"rollup-plugin-string": "^3.0.0",
"rollup-plugin-visualizer": "^7.1.1",
"sass": "^1.104.0",
+ "tailwindcss": "^4.3.3",
"tinyglobby": "^0.2.17",
"tsx": "^4.23.13",
"typescript": "^5.5.0",
"typescript-eslint": "^8.69.0",
- "vite": "6.4.3",
- "vite-plugin-eslint": "^1.8.1",
- "esbuild": ">=0.25.0",
- "@tailwindcss/vite": "^4.3.3",
- "@vitejs/devtools": "^0.7.2",
"unplugin-remove": "^1.0.3",
- "tailwindcss": "^4.3.3"
+ "vite": "6.4.3",
+ "vite-plugin-eslint": "^1.8.1"
},
"dependencies": {
+ "@node-steam/vdf": "^2.2.0",
"@shadowdara/dlib": "^0.0.4",
"@shadowdara/finder-lib": "^0.3.17",
+ "ejs": "^6.0.1",
"highlight.js": "^11.12.0",
"jquery": "^4.0.0",
+ "liquidjs": "^10.29.0",
"tellraw-parser": "^1.0.2"
}
}
diff --git a/npm/site/pages-ssg-plugin.ts b/npm/site/pages-ssg-plugin.ts
index 01c6f6a0..b9a2e5be 100644
--- a/npm/site/pages-ssg-plugin.ts
+++ b/npm/site/pages-ssg-plugin.ts
@@ -8,6 +8,7 @@ import { transformWithEsbuild } from "vite";
import { tsImport } from "tsx/esm/api";
import { escapeHtml } from "./src/jsx-runtime";
import hljs from "highlight.js/lib/common";
+import { Liquid } from "liquidjs";
const MARKDOWN_PREFIX = "virtual:page-markdown:";
const RESOLVED_MARKDOWN_PREFIX = "\0" + MARKDOWN_PREFIX;
@@ -18,6 +19,15 @@ const RESOLVED_VIRTUAL_MODULE_ID = "\0" + VIRTUAL_MODULE_ID;
const STYLE_PREFIX = "virtual:page-style:";
const RESOLVED_STYLE_PREFIX = "\0" + STYLE_PREFIX;
+/**
+ * Placeholder rendered in place of `{{ JS_SCRIPT }}` while Liquid runs.
+ * The real script tag (pointing at the built `page.[tj]s`) is only known
+ * after bundling (build) or via the dev URL (dev), so it is substituted
+ * after rendering. Uses a plain ASCII token so liquidjs / minifiers do
+ * not mangle it.
+ */
+const LIQUID_SCRIPT_PLACEHOLDER = "__PAGES_LIQUID_JS_SCRIPT__";
+
/**
* Escape `<...>` sequences that are NOT valid HTML tags, so the output can
* safely pass through `html-minifier-terser` (which uses a strict HTML
@@ -172,9 +182,15 @@ export interface PageRenderContext {
globalVar: string;
scriptTag: string;
styleTag: string;
+
+ /**
+ * Pre-rendered body content (e.g. Liquid pages). When set, the template
+ * renders it as-is instead of bootstrapping the client app.
+ */
+ content?: string;
}
-type PageType = "component" | "markdown";
+type PageType = "component" | "markdown" | "liquid";
interface PageEntry {
/** Route id, e.g. "guide/installation" (posix, no extension). */
@@ -197,6 +213,13 @@ interface PageEntry {
/** Build-time generated data */
buildData?: unknown;
+
+ /**
+ * Liquid only: the `page.[tj]s` file next to the `.html` template that
+ * is built and injected where `{{ JS_SCRIPT }}` appears in the rendered
+ * output. Falls back to the `page.build.[tj]s` data file.
+ */
+ scriptSource?: string;
}
let resolvedStyles = new Map();
@@ -278,12 +301,26 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
);
for (const page of pages) {
- if (page.type !== "component") {
+ if (page.type !== "component" && page.type !== "liquid") {
continue;
}
page.buildData = await loadBuildData(page);
+ // Liquid pages: render the .html template with the build data at
+ // build time, so the emitted page is fully static HTML. `JS_SCRIPT`
+ // is rendered as a placeholder here — the real script tag is
+ // substituted after bundling (or via the dev URL in dev mode).
+ if (page.type === "liquid") {
+ page.html = await renderLiquidTemplate(
+ fs.readFileSync(page.source, "utf8"),
+ {
+ ...(page.buildData ?? {}),
+ JS_SCRIPT: LIQUID_SCRIPT_PLACEHOLDER,
+ },
+ );
+ }
+
if (verbose) {
console.log(
`[vite-plugin-pages-ssg] Build data loaded: ${page.id}`,
@@ -371,7 +408,8 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
);
}
- const files: string[] = [];
+ const componentFiles: string[] = [];
+ const htmlFiles: string[] = [];
function walk(directory: string) {
for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
@@ -382,25 +420,32 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
continue;
}
- if (
- entry.name.endsWith(".build.ts") ||
- entry.name.endsWith(".build.tsx")
- ) {
+ if (!entry.isFile()) {
continue;
}
- if (
- entry.isFile() &&
- extensions.includes(path.extname(entry.name).toLowerCase())
- ) {
- files.push(fullPath);
+ // Build-data modules (page.build.ts / page.build.js / ...) are not
+ // pages themselves — they only feed data into their sibling page.
+ if (/\.build\.(ts|tsx|js|jsx|mjs|cjs)$/i.test(entry.name)) {
+ continue;
+ }
+
+ const extension = path.extname(entry.name).toLowerCase();
+
+ if (extension === ".html") {
+ htmlFiles.push(fullPath);
+ continue;
+ }
+
+ if (extensions.includes(extension)) {
+ componentFiles.push(fullPath);
}
}
}
walk(root);
- return files
+ const componentPages = componentFiles
.sort()
.map((file): PageEntry => {
const relativePath = path.relative(root, file).replace(/\\/g, "/");
@@ -423,6 +468,82 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
};
})
.filter((page) => !shouldIgnore(page.id));
+
+ // Liquid pages: every `X.html` that has a sibling `X.build.[tj]s`
+ // becomes a build-time-rendered Liquid page. The `.html` template is
+ // rendered with the data returned by `build()` at build time.
+ const liquidPages: PageEntry[] = [];
+
+ for (const file of htmlFiles.sort()) {
+ const relativePath = path.relative(root, file).replace(/\\/g, "/");
+
+ let id = relativePath.slice(0, -".html".length);
+
+ // `page.html` acts as the folder's index template:
+ // jekyll/page.html -> jekyll/index
+ // page.html -> index
+ if (path.posix.basename(id) === "page") {
+ id = path.posix.join(path.posix.dirname(id), "index");
+ }
+
+ if (shouldIgnore(id)) {
+ continue;
+ }
+
+ // A real component/markdown page with the same id takes precedence.
+ if (componentPages.some((page) => page.id === id)) {
+ continue;
+ }
+
+ const buildFile = [".ts", ".tsx", ".js", ".jsx"]
+ .map((ext) => file.slice(0, -".html".length) + `.build${ext}`)
+ .find((candidate) => fs.existsSync(candidate));
+
+ if (!buildFile) {
+ continue;
+ }
+
+ // Script source for `{{ JS_SCRIPT }}`: prefer the plain page module
+ // (`page.ts` / `page.js` / ...) next to the template; fall back to
+ // the `page.build.[tj]s` data file itself.
+ const baseName = file.slice(0, -".html".length);
+
+ const scriptSource =
+ [".ts", ".tsx", ".js", ".jsx"]
+ .map((ext) => baseName + ext)
+ .find((candidate) => fs.existsSync(candidate)) ?? buildFile;
+
+ liquidPages.push({
+ id,
+ source: file,
+ type: "liquid",
+ scriptSource,
+ styles: options.styles?.[id] ?? [],
+ });
+ }
+
+ // A `page.js`/`page.ts` next to a `page.html` is used as the Liquid
+ // script source, not as its own `…/page` route — the Liquid index
+ // page takes precedence.
+ const liquidIds = new Set(liquidPages.map((page) => page.id));
+
+ const duplicateComponentIds = componentPages
+ .map((page) => page.id)
+ .filter((id) => {
+ // id "jekyll/page" conflicts with Liquid page "jekyll/index" only
+ // when the component is literally `/page`.
+ if (!id.endsWith("/page")) {
+ return false;
+ }
+
+ return liquidIds.has(id.slice(0, -"/page".length) + "/index");
+ });
+
+ const filteredComponentPages = componentPages.filter(
+ (page) => !duplicateComponentIds.includes(page.id),
+ );
+
+ return [...filteredComponentPages, ...liquidPages];
}
function createVirtualModule(): string {
@@ -496,6 +617,15 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
}`;
}
+ if (page.type === "liquid") {
+ return ` ${JSON.stringify(page.id)}: {
+ id: ${JSON.stringify(page.id)},
+ type: "liquid",
+ html: ${JSON.stringify(page.html ?? "")},
+ styles: [${styles}]
+ }`;
+ }
+
return ` ${JSON.stringify(page.id)}: {
id: ${JSON.stringify(page.id)},
type: "component",
@@ -566,7 +696,14 @@ declare module "virtual:pages" {
}>;
}
- export type PageEntry = ComponentPage | MarkdownPage;
+ export interface LiquidPage {
+ id: string;
+ type: "liquid";
+ html: string;
+ styles: string[];
+ }
+
+ export type PageEntry = ComponentPage | MarkdownPage | LiquidPage;
export const pages: Record;
}
@@ -592,6 +729,26 @@ declare module "virtual:pages" {
}
function defaultTemplate(ctx: PageRenderContext): string {
+ /*
+ * Pre-rendered content (e.g. Liquid pages): plain static HTML document
+ * without the client-side bootstrapping shell.
+ */
+ if (ctx.content != null) {
+ return `
+
+
+
+
+ ${escapeHtml(ctx.title)}
+ ${ctx.styleTag}
+
+
+${ctx.content}
+
+
+`;
+ }
+
return `
@@ -714,7 +871,13 @@ declare module "virtual:pages" {
file.startsWith(docsRoot) &&
path.extname(file).toLowerCase() === ".md";
- if (!isPageFile && !isDocFile) {
+ // Liquid templates (page.html) live in the pages dir but have
+ // the .html extension, which is not in `extensions`.
+ const isLiquidFile =
+ file.startsWith(pagesRoot) &&
+ path.extname(file).toLowerCase() === ".html";
+
+ if (!isPageFile && !isDocFile && !isLiquidFile) {
return;
}
@@ -781,6 +944,47 @@ declare module "virtual:pages" {
* /foo/bar -> foo/bar
*/
if (page) {
+ /*
+ * Liquid pages are rendered at build time and served as static
+ * HTML. `{{ JS_SCRIPT }}` is replaced with a script tag loading
+ * the page module (`page.[tj]s`) through the dev server.
+ */
+ if (page.type === "liquid") {
+ const scriptTag = page.scriptSource
+ ? ``
+ : "";
+
+ // Liquid pages are standalone: serve the rendered content as-is,
+ // without wrapping it in the default HTML shell.
+ let content =
+ page.html
+ ?.replaceAll(LIQUID_SCRIPT_PLACEHOLDER, scriptTag)
+ // Fallback: wörtliches `{{ JS_SCRIPT }}` ersetzen
+ .replaceAll("{{ JS_SCRIPT }}", scriptTag) ?? "";
+
+ if (options.minify) {
+ content = await minify(content, {
+ collapseWhitespace: true,
+ removeComments: true,
+ removeRedundantAttributes: true,
+ removeEmptyAttributes: true,
+ useShortDoctype: true,
+ minifyCSS: true,
+ minifyJS: true,
+ });
+ }
+
+ const transformed = await server.transformIndexHtml(url, content);
+
+ res.statusCode = 200;
+ res.setHeader("Content-Type", "text/html; charset=utf-8");
+ res.end(transformed);
+
+ return;
+ }
+
const ctx: PageRenderContext = {
id: page.id,
title: getTitle(page.id),
@@ -885,6 +1089,8 @@ declare module "virtual:pages" {
this.error(
`[vite-plugin-pages-ssg] Could not resolve style: ${style}`,
);
+
+ return;
}
resolvedStyles.set(style, resolved.id);
@@ -904,13 +1110,17 @@ declare module "virtual:pages" {
this.error(
"[vite-plugin-pages-ssg] Could not find the generated entry .js chunk.",
);
+
+ return;
}
+ const entryJsChunk = jsChunk;
+
for (const page of pages) {
const htmlFileName = outputFileName(page.id);
const htmlDir = path.dirname(htmlFileName);
- const scriptPath = getAssetPath(htmlFileName, jsChunk.fileName);
+ const scriptPath = getAssetPath(htmlFileName, entryJsChunk.fileName);
const scriptTag = ``;
/*
@@ -927,7 +1137,7 @@ declare module "virtual:pages" {
let styleTag = "";
const cssFiles = new Set(
- jsChunk.viteMetadata?.importedCss ?? [],
+ entryJsChunk.viteMetadata?.importedCss ?? [],
);
if (pageChunk?.type === "chunk" && pageChunk.viteMetadata) {
@@ -946,6 +1156,88 @@ declare module "virtual:pages" {
.join("\n ");
}
+ /*
+ * Liquid pages are standalone: emit the rendered content as-is,
+ * without wrapping it in the default HTML shell. `{{ JS_SCRIPT }}`
+ * is replaced with the built page module (`page.[tj]s`), compiled
+ * with esbuild and emitted as its own asset.
+ */
+ if (page.type === "liquid") {
+ let scriptTagForContent = "";
+
+ if (page.scriptSource && fs.existsSync(page.scriptSource)) {
+ const scriptSourceCode = fs.readFileSync(page.scriptSource, "utf8");
+
+ const scriptExtension = path
+ .extname(page.scriptSource)
+ .slice(1)
+ .toLowerCase();
+
+ const loader =
+ scriptExtension === "ts" || scriptExtension === "tsx"
+ ? "ts"
+ : scriptExtension === "jsx"
+ ? "jsx"
+ : "js";
+
+ const result = await transformWithEsbuild(
+ scriptSourceCode,
+ page.scriptSource,
+ {
+ loader,
+ target: "esnext",
+ },
+ );
+
+ const scriptName = path.basename(
+ page.scriptSource,
+ path.extname(page.scriptSource),
+ );
+
+ // Emit the compiled page script as a plain asset so Vite's
+ // import analysis stays happy (prebuilt chunks break
+ // `importedCss` in some setups). The file name is
+ // deterministic, so the placeholder can be replaced directly.
+ const scriptFileName = `assets/${scriptName}.js`;
+
+ this.emitFile({
+ type: "asset",
+ fileName: scriptFileName,
+ source: result.code,
+ });
+
+ scriptTagForContent = ``;
+ }
+
+ let liquidHtml =
+ page.html
+ ?.replaceAll(LIQUID_SCRIPT_PLACEHOLDER, scriptTagForContent)
+ .replaceAll("{{ JS_SCRIPT }}", scriptTagForContent) ?? "";
+
+ if (options.minify) {
+ liquidHtml = await minify(liquidHtml, {
+ collapseWhitespace: true,
+ removeComments: true,
+ removeRedundantAttributes: true,
+ removeEmptyAttributes: true,
+ useShortDoctype: true,
+ minifyCSS: true,
+ minifyJS: true,
+ });
+ }
+
+ this.emitFile({
+ type: "asset",
+ fileName: htmlFileName,
+ source: liquidHtml,
+ });
+
+ continue;
+ }
+
const ctx: PageRenderContext = {
id: page.id,
title: getTitle(page.id),
@@ -1015,13 +1307,23 @@ function getPageId(url: string, pages: PageEntry[]): string {
// Function to load the build data
async function loadBuildData(page: PageEntry): Promise {
- if (page.type !== "component") {
+ if (page.type !== "component" && page.type !== "liquid") {
return null;
}
- const buildFile = page.source.replace(/\.(tsx?|jsx?)$/, ".build.$1");
+ let buildFile: string;
+
+ if (page.type === "liquid") {
+ // page.html -> page.build.[tj]s
+ buildFile =
+ [".ts", ".tsx", ".js", ".jsx"]
+ .map((ext) => page.source.slice(0, -".html".length) + `.build${ext}`)
+ .find((candidate) => fs.existsSync(candidate)) ?? "";
+ } else {
+ buildFile = page.source.replace(/\.(tsx?|jsx?)$/, ".build.$1");
+ }
- if (!fs.existsSync(buildFile)) {
+ if (!buildFile || !fs.existsSync(buildFile)) {
return null;
}
@@ -1040,3 +1342,17 @@ async function loadBuildData(page: PageEntry): Promise {
);
}
}
+
+// Render a Liquid template with the given data at build time.
+//
+// Used for `X.html` pages: the template is read from disk and rendered
+// with the data returned by the sibling `X.build.[tj]s` module's `build()`
+// function, producing fully static HTML.
+async function renderLiquidTemplate(
+ template: string,
+ data: unknown,
+): Promise {
+ const engine = new Liquid();
+
+ return engine.parseAndRender(template, data as Record);
+}
diff --git a/npm/site/pages/jekyll/page.build.js b/npm/site/pages/jekyll/page.build.js
new file mode 100644
index 00000000..d0de6735
--- /dev/null
+++ b/npm/site/pages/jekyll/page.build.js
@@ -0,0 +1,6 @@
+export async function build() {
+ return {
+ title: "Benutzer",
+ users: [{ name: "Anna" }, { name: "Tom" }],
+ };
+}
diff --git a/npm/site/pages/jekyll/page.html b/npm/site/pages/jekyll/page.html
new file mode 100644
index 00000000..e5be9daa
--- /dev/null
+++ b/npm/site/pages/jekyll/page.html
@@ -0,0 +1,9 @@
+{{ title }}
+
+
+ {% for user in users %}
+ {{ user.name }}
+ {% endfor %}
+
+
+{{ JS_SCRIPT }}
diff --git a/npm/site/pages/jekyll/page.js b/npm/site/pages/jekyll/page.js
new file mode 100644
index 00000000..cd4d9660
--- /dev/null
+++ b/npm/site/pages/jekyll/page.js
@@ -0,0 +1,2 @@
+console.log("hallo");
+alert("ne");
diff --git a/npm/site/public/dependencies.txt b/npm/site/public/dependencies.txt
index 786d3c8a..2ff0b247 100644
--- a/npm/site/public/dependencies.txt
+++ b/npm/site/public/dependencies.txt
@@ -18,12 +18,7 @@
@devframes/hub@0.9.12 -- MIT
@devframes/json-render-ui@0.9.12 -- MIT
@devframes/json-render@0.9.12 -- MIT
-@devframes/plugin-inspect@0.9.12 -- MIT
-@devframes/plugin-messages@0.9.12 -- MIT
-@devframes/plugin-terminals@0.9.12 -- MIT
@devframes/service-open@0.9.12 -- MIT
-@devframes/vite@0.9.12 -- MIT
-@esbuild/win32-x64@0.25.12 -- MIT
@esbuild/win32-x64@0.28.2 -- MIT
@eslint-community/eslint-utils@4.10.1 -- MIT
@eslint-community/regexpp@4.12.2 -- MIT
@@ -47,13 +42,13 @@
@json-render/core@0.20.0 -- Apache-2.0
@modelcontextprotocol/core@2.0.0 -- MIT
@modelcontextprotocol/server@2.0.0 -- MIT
+@node-steam/vdf@2.2.0 -- MIT
@oxc-project/types@0.148.0 -- MIT
@parcel/watcher-win32-x64@2.6.0 -- MIT
@parcel/watcher@2.6.0 -- MIT
@rolldown/binding-win32-x64-msvc@1.2.7 -- MIT
@rolldown/pluginutils@1.0.1 -- MIT
@rollup/plugin-yaml@5.0.0 -- MIT
-@rollup/pluginutils@4.2.1 -- MIT
@rollup/pluginutils@5.4.0 -- MIT
@rollup/rollup-win32-x64-gnu@4.63.1 -- MIT
@rollup/rollup-win32-x64-msvc@4.63.1 -- MIT
@@ -71,7 +66,7 @@
@types/jquery@4.0.1 -- MIT
@types/json-schema@7.0.15 -- MIT
@types/license-checker@25.0.6 -- MIT
-@types/node@26.5.0 -- MIT
+@types/node@26.5.1 -- MIT
@typescript-eslint/eslint-plugin@8.69.0 -- MIT
@typescript-eslint/parser@8.69.0 -- MIT
@typescript-eslint/project-service@8.69.0 -- MIT
@@ -83,13 +78,12 @@
@typescript-eslint/utils@8.69.0 -- MIT
@typescript-eslint/visitor-keys@8.69.0 -- MIT
@vitejs/devtools-kit@0.7.2 -- MIT
-@vitejs/devtools@0.7.2 -- MIT
+@vitejs/devtools@0.7.3 -- MIT
abbrev@1.1.1 -- ISC
acorn-jsx@5.3.2 -- MIT
acorn@8.18.0 -- MIT
ajv@6.15.0 -- MIT
ansi-regex@6.3.0 -- MIT
-ansi-styles@3.2.1 -- MIT
ansi-styles@6.2.3 -- MIT
argparse@2.0.1 -- Python-2.0
array-find-index@1.0.2 -- MIT
@@ -106,7 +100,6 @@ bundle-name@4.1.0 -- MIT
cac@7.0.0 -- MIT
camel-case@4.1.2 -- MIT
caniuse-lite@1.0.30001810 -- CC-BY-4.0
-chalk@2.4.2 -- MIT
chalk@6.0.0 -- MIT
chokidar@5.0.0 -- MIT
citty@0.2.2 -- MIT
@@ -122,7 +115,6 @@ confbox@0.3.1 -- MIT
convert-source-map@2.0.0 -- MIT
cross-spawn@7.0.6 -- MIT
crossws@0.4.12 -- MIT
-debug@3.2.7 -- MIT
debug@4.4.3 -- MIT
debuglog@1.0.1 -- MIT
deep-is@0.1.4 -- MIT
@@ -134,20 +126,19 @@ detect-libc@2.1.2 -- Apache-2.0
devframe@0.9.12 -- MIT
dezalgo@1.0.4 -- ISC
dot-case@3.0.4 -- MIT
+ejs@6.0.1 -- Apache-2.0
electron-to-chromium@1.5.422 -- ISC
emoji-regex@10.6.0 -- MIT
enhanced-resolve@5.24.5 -- MIT
entities@4.5.0 -- BSD-2-Clause
es-errors@1.3.0 -- MIT
-esbuild@0.25.12 -- MIT
esbuild@0.28.2 -- MIT
escalade@3.2.0 -- MIT
-escape-string-regexp@1.0.5 -- MIT
escape-string-regexp@4.0.0 -- MIT
eslint-scope@9.1.2 -- BSD-2-Clause
eslint-visitor-keys@3.4.3 -- Apache-2.0
eslint-visitor-keys@5.0.1 -- Apache-2.0
-eslint@10.9.1 -- MIT
+eslint@10.10.0 -- MIT
espree@11.2.0 -- BSD-2-Clause
esquery@1.7.0 -- BSD-3-Clause
esrecurse@4.3.0 -- BSD-2-Clause
@@ -210,6 +201,7 @@ lightningcss-win32-x64-msvc@1.32.0 -- MPL-2.0
lightningcss-win32-x64-msvc@1.33.0 -- MPL-2.0
lightningcss@1.32.0 -- MPL-2.0
lightningcss@1.33.0 -- MPL-2.0
+liquidjs@10.29.0 -- MIT
local-pkg@1.2.1 -- MIT
locate-path@6.0.0 -- MIT
lower-case@2.0.2 -- MIT
@@ -250,7 +242,6 @@ path-parse@1.0.7 -- MIT
pathe@2.0.3 -- MIT
perfect-debounce@2.1.0 -- MIT
picocolors@1.1.1 -- ISC
-picomatch@2.3.2 -- MIT
picomatch@4.0.7 -- MIT
pkg-types@1.3.1 -- MIT
pkg-types@2.3.3 -- MIT
@@ -270,11 +261,10 @@ rolldown@1.2.7 -- MIT
rollup-plugin-string@3.0.0 -- MIT
rollup-plugin-visualizer@7.1.1 -- MIT
rollup-pluginutils@2.8.2 -- MIT
-rollup@2.80.0 -- MIT
rollup@4.63.1 -- MIT
rou3@0.9.2 -- MIT
run-applescript@7.1.0 -- MIT
-sass@1.104.0 -- MIT
+sass@1.104.1 -- MIT
semver@5.7.2 -- ISC
semver@6.3.1 -- ISC
semver@7.8.5 -- ISC
@@ -284,14 +274,12 @@ slide@1.1.6 -- ISC
source-map-js@1.2.1 -- BSD-3-Clause
source-map-support@0.5.21 -- MIT
source-map@0.6.1 -- BSD-3-Clause
-source-map@0.8.0 -- BSD-3-Clause
spdx-compare@1.0.0 -- MIT
spdx-correct@3.2.0 -- Apache-2.0
spdx-exceptions@2.5.0 -- CC-BY-3.0
spdx-expression-parse@3.0.1 -- MIT
spdx-license-ids@3.0.23 -- CC0-1.0
spdx-ranges@2.1.1 -- (MIT AND CC-BY-3.0)
-spdx-satisfies@4.0.1 -- MIT
srvx@1.0.4 -- MIT
string-width@7.2.0 -- MIT
string-width@8.2.2 -- MIT
@@ -310,8 +298,8 @@ ts-api-utils@2.5.0 -- MIT
tslib@2.8.1 -- 0BSD
tsx@4.23.13 -- MIT
type-check@0.4.0 -- MIT
-typescript-eslint@8.69.0 -- MIT
-typescript@5.9.3 -- Apache-2.0
+typescript-eslint@8.70.0 -- MIT
+typescript@5.7.3 -- Apache-2.0
ufo@1.6.4 -- MIT
undici-types@8.9.0 -- MIT
unplugin-remove@1.0.3 -- MIT
diff --git a/npm/site/public/install.sh b/npm/site/public/install.sh
new file mode 100644
index 00000000..61504b95
--- /dev/null
+++ b/npm/site/public/install.sh
@@ -0,0 +1,95 @@
+#!/usr/bin/env bash
+
+set -e
+
+REPO="shadowdara/finder"
+INSTALL_DIR="${INSTALL_DIR:-$HOME/.local/bin}"
+
+detect_os() {
+ case "$(uname -s)" in
+ Linux*) echo "linux" ;;
+ Darwin*) echo "darwin" ;;
+ MINGW*|MSYS*|CYGWIN*) echo "windows" ;;
+ *)
+ echo "Unsupported OS: $(uname -s)" >&2
+ exit 1
+ ;;
+ esac
+}
+
+detect_arch() {
+ case "$(uname -m)" in
+ x86_64|amd64) echo "amd64" ;;
+ arm64|aarch64) echo "arm64" ;;
+ *)
+ echo "Unsupported architecture: $(uname -m)" >&2
+ exit 1
+ ;;
+ esac
+}
+
+OS="$(detect_os)"
+ARCH="$(detect_arch)"
+
+echo "Detecting platform..."
+echo " OS: $OS"
+echo " Arch: $ARCH"
+
+VERSION="$(
+ curl -fsSL \
+ "https://api.github.com/repos/${REPO}/releases/latest" |
+ grep '"tag_name":' |
+ sed -E 's/.*"([^"]+)".*/\1/'
+)"
+
+if [ -z "$VERSION" ]; then
+ echo "Could not determine latest version." >&2
+ exit 1
+fi
+
+echo " Version: $VERSION"
+
+ARCHIVE="finder_${VERSION}_${OS}_${ARCH}"
+
+if [ "$OS" = "windows" ]; then
+ ARCHIVE="${ARCHIVE}.zip"
+else
+ ARCHIVE="${ARCHIVE}.tar.gz"
+fi
+
+URL="https://github.com/${REPO}/releases/download/${VERSION}/${ARCHIVE}"
+
+TMP="$(mktemp -d)"
+trap 'rm -rf "$TMP"' EXIT
+
+echo "Downloading:"
+echo " $URL"
+
+curl -fL "$URL" -o "$TMP/archive"
+
+mkdir -p "$INSTALL_DIR"
+
+if [ "$OS" = "windows" ]; then
+ unzip -q "$TMP/archive" -d "$TMP/package"
+else
+ mkdir "$TMP/package"
+ tar -xzf "$TMP/archive" -C "$TMP/package"
+fi
+
+if [ "$OS" = "windows" ]; then
+ cp "$TMP/package/finder.exe" "$INSTALL_DIR/finder.exe"
+else
+ install -m 755 "$TMP/package/finder" "$INSTALL_DIR/finder"
+fi
+
+echo
+echo "Finder installed successfully!"
+echo
+echo " $INSTALL_DIR/finder"
+
+if [[ ":$PATH:" != *":$INSTALL_DIR:"* ]]; then
+ echo "export PATH=\"\$PATH:$INSTALL_DIR\"" >> "$HOME/.bashrc"
+ export PATH="$PATH:$INSTALL_DIR"
+fi
+
+source ~/.bashrc
diff --git a/npm/site/src/main.ts b/npm/site/src/main.ts
index 77b2faaa..c3c17596 100644
--- a/npm/site/src/main.ts
+++ b/npm/site/src/main.ts
@@ -50,6 +50,14 @@ async function main() {
return;
}
+ // Liquid pages are rendered to static HTML at build time; this branch
+ // only acts as a safety net if such a page is ever loaded client-side.
+ if (page.type === "liquid") {
+ app.innerHTML = page.html ?? "";
+
+ return;
+ }
+
const module = await page.load();
await module.default(app, page.data);
diff --git a/npm/site/src/pages.d.ts b/npm/site/src/pages.d.ts
index 581801f8..6261410d 100644
--- a/npm/site/src/pages.d.ts
+++ b/npm/site/src/pages.d.ts
@@ -48,7 +48,14 @@ declare module "virtual:pages" {
}>;
}
- export type PageEntry = ComponentPage | MarkdownPage;
+ export interface LiquidPage {
+ id: string;
+ type: "liquid";
+ html: string;
+ styles: string[];
+ }
+
+ export type PageEntry = ComponentPage | MarkdownPage | LiquidPage;
export const pages: Record;
}
diff --git a/npm/site/src/templates.js b/npm/site/src/templates.js
index c1283c9e..4399dd77 100644
--- a/npm/site/src/templates.js
+++ b/npm/site/src/templates.js
@@ -2676,7 +2676,9 @@ export default {
"folders": [],
"min_version": "0.3.16",
"name": "*",
- "tags": "docker"
+ "tags": [
+ "docker"
+ ]
},
"java-gradle.json5": {
"description": "Java project with Gradle build tool",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 82a753e7..f81c63b1 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -106,20 +106,31 @@ importers:
specifier: 5.7.3
version: 5.7.3
+ npm/pages-plugin: {}
+
npm/site:
dependencies:
+ '@node-steam/vdf':
+ specifier: ^2.2.0
+ version: 2.2.0
'@shadowdara/dlib':
specifier: ^0.0.4
version: 0.0.4
'@shadowdara/finder-lib':
specifier: ^0.3.17
version: 0.3.17
+ ejs:
+ specifier: ^6.0.1
+ version: 6.0.1
highlight.js:
specifier: ^11.12.0
version: 11.12.0
jquery:
specifier: ^4.0.0
version: 4.0.0
+ liquidjs:
+ specifier: ^10.29.0
+ version: 10.29.0
tellraw-parser:
specifier: ^1.0.2
version: 1.0.2
@@ -1241,6 +1252,10 @@ packages:
resolution: {integrity: sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==}
engines: {node: '>= 20.19.0'}
+ '@node-steam/vdf@2.2.0':
+ resolution: {integrity: sha512-YCfIPsIpyrtOP5AdsarjPqjTElVFrXJlWedWNzjCaIeam06v9ebYgApRAcw9b93awNDboTEiHFMnCvlJJHqKcA==}
+ engines: {node: '>=8.0.0'}
+
'@nodelib/fs.scandir@2.1.5':
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
@@ -2318,6 +2333,11 @@ packages:
effect@3.21.0:
resolution: {integrity: sha512-PPN80qRokCd1f015IANNhrwOnLO7GrrMQfk4/lnZRE/8j7UPWrNNjPV0uBrZutI/nHzernbW+J0hdqQysHiSnQ==}
+ ejs@6.0.1:
+ resolution: {integrity: sha512-UaaM14yby8U3k02ihS1Bmj5Kz2d7CCQM1scxpgs4Mhkq8F1wR2gl3+Ts4h5Ne4Mnt7M9m4Dw7jsuMr3+xO4vZA==}
+ engines: {node: '>=0.12.18'}
+ hasBin: true
+
electron-to-chromium@1.5.427:
resolution: {integrity: sha512-n14zb3FdsChZ2BNobqNHAJMcP3ifFv4paox2LvCrfVAQcqGiSURgbJl+PfMpHVCNFkStnNc+RRVtPBTVW5PDgw==}
@@ -2957,6 +2977,11 @@ packages:
lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+ liquidjs@10.29.0:
+ resolution: {integrity: sha512-pCVOhs6FLAR8su3ItJ07diN26t6W5dHQRnmTMy8HPyTFuv1+oSCVJIGp5pGjfQyOZfh50KswvKtMTp6p4JEIdw==}
+ engines: {node: '>=16'}
+ hasBin: true
+
local-pkg@1.2.1:
resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==}
engines: {node: '>=14'}
@@ -4185,7 +4210,7 @@ snapshots:
optionalDependencies:
'@types/react': 19.3.0
- '@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)':
+ '@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)':
dependencies:
'@better-auth/utils': 0.4.2
'@better-fetch/fetch': 1.3.1
@@ -4197,39 +4222,39 @@ snapshots:
nanostores: 1.5.3
zod: 4.6.2
- '@better-auth/drizzle-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
+ '@better-auth/drizzle-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
- '@better-auth/kysely-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(kysely@0.29.5)':
+ '@better-auth/kysely-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(kysely@0.29.5)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
optionalDependencies:
kysely: 0.29.5
- '@better-auth/memory-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
+ '@better-auth/memory-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
- '@better-auth/mongo-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
+ '@better-auth/mongo-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
- '@better-auth/prisma-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(prisma@6.19.3(typescript@5.7.3))':
+ '@better-auth/prisma-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(prisma@6.19.3(typescript@5.7.3))':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
optionalDependencies:
'@prisma/client': 6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3)
prisma: 6.19.3(typescript@5.7.3)
- '@better-auth/telemetry@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)':
+ '@better-auth/telemetry@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
'@better-fetch/fetch': 1.3.1
@@ -4804,6 +4829,8 @@ snapshots:
'@noble/hashes@2.4.0': {}
+ '@node-steam/vdf@2.2.0': {}
+
'@nodelib/fs.scandir@2.1.5':
dependencies:
'@nodelib/fs.stat': 2.0.5
@@ -5359,13 +5386,13 @@ snapshots:
better-auth@1.7.4(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(next@16.3.3(@babel/core@7.29.7)(@types/node@24.13.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(sass@1.104.1))(prisma@6.19.3(typescript@5.7.3))(react-dom@19.3.0(react@19.3.0))(react@19.3.0):
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
- '@better-auth/drizzle-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
- '@better-auth/kysely-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(kysely@0.29.5)
- '@better-auth/memory-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
- '@better-auth/mongo-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
- '@better-auth/prisma-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(prisma@6.19.3(typescript@5.7.3))
- '@better-auth/telemetry': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/drizzle-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
+ '@better-auth/kysely-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(kysely@0.29.5)
+ '@better-auth/memory-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
+ '@better-auth/mongo-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
+ '@better-auth/prisma-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(prisma@6.19.3(typescript@5.7.3))
+ '@better-auth/telemetry': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)
'@better-auth/utils': 0.4.2
'@better-fetch/fetch': 1.3.1
'@noble/ciphers': 2.4.0
@@ -5708,6 +5735,8 @@ snapshots:
'@standard-schema/spec': 1.1.0
fast-check: 3.23.2
+ ejs@6.0.1: {}
+
electron-to-chromium@1.5.427: {}
emoji-regex@10.6.0: {}
@@ -6358,6 +6387,10 @@ snapshots:
lines-and-columns@1.2.4: {}
+ liquidjs@10.29.0:
+ dependencies:
+ commander: 10.0.1
+
local-pkg@1.2.1:
dependencies:
mlly: 1.8.2
From ca9d42f3922710ba4d448eeea3584f1024cce0d8 Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 02:12:25 +0200
Subject: [PATCH 08/62] Add removeConsole option to pages plugin
Introduce a removeConsole option to pages-ssg-plugin to strip console.* calls from production builds (uses esbuild.drop). Refactor config() to conditionally merge esbuild and build settings (preserving singleBundle behavior). Enable removeConsole in npm/site/vite.config.ts. Add a simple Jekyll header (pages/jekyll/header.html). Update generated npm/site/data/backend.json (timestamps and size stats).
---
npm/site/data/backend.json | 26 ++++++++++-----------
npm/site/pages-ssg-plugin.ts | 39 ++++++++++++++++++++++++-------
npm/site/pages/jekyll/header.html | 1 +
npm/site/vite.config.ts | 2 ++
4 files changed, 47 insertions(+), 21 deletions(-)
create mode 100644 npm/site/pages/jekyll/header.html
diff --git a/npm/site/data/backend.json b/npm/site/data/backend.json
index d38a7f19..5e3ebc26 100644
--- a/npm/site/data/backend.json
+++ b/npm/site/data/backend.json
@@ -1,23 +1,23 @@
{
- "generatedAt": "2026-09-14T00:04:59.897Z",
+ "generatedAt": "2026-09-14T00:11:13.161Z",
"total": {
"files": 59,
- "bytes": 349838,
- "kilobytes": 341.64,
+ "bytes": 349476,
+ "kilobytes": 341.29,
"megabytes": 0.33
},
"byExtension": [
{
"extension": ".js",
"files": 21,
- "bytes": 273984,
- "percentage": 78.32
+ "bytes": 273622,
+ "percentage": 78.29
},
{
"extension": ".css",
"files": 15,
"bytes": 56648,
- "percentage": 16.19
+ "percentage": 16.21
},
{
"extension": ".txt",
@@ -35,14 +35,14 @@
"extension": ".sh",
"files": 1,
"bytes": 2011,
- "percentage": 0.57
+ "percentage": 0.58
}
],
"files": [
{
"path": "assets/main_entry.js",
"extension": ".js",
- "bytes": 89073
+ "bytes": 88972
},
{
"path": "assets/jquery.module.js",
@@ -57,7 +57,7 @@
{
"path": "assets/creator.js",
"extension": ".js",
- "bytes": 16428
+ "bytes": 16327
},
{
"path": "assets/markdown.js",
@@ -82,7 +82,7 @@
{
"path": "assets/viewer.js",
"extension": ".js",
- "bytes": 7951
+ "bytes": 7931
},
{
"path": "assets/regexcreator.js",
@@ -117,7 +117,7 @@
{
"path": "assets/cacheviewer.js",
"extension": ".js",
- "bytes": 4573
+ "bytes": 4508
},
{
"path": "assets/configeditor.css",
@@ -137,7 +137,7 @@
{
"path": "assets/samfile.js",
"extension": ".js",
- "bytes": 3291
+ "bytes": 3256
},
{
"path": "assets/samfile.css",
@@ -197,7 +197,7 @@
{
"path": "assets/worlds.js",
"extension": ".js",
- "bytes": 1139
+ "bytes": 1099
},
{
"path": "assets/index3.js",
diff --git a/npm/site/pages-ssg-plugin.ts b/npm/site/pages-ssg-plugin.ts
index b9a2e5be..fe5378a7 100644
--- a/npm/site/pages-ssg-plugin.ts
+++ b/npm/site/pages-ssg-plugin.ts
@@ -100,6 +100,14 @@ export interface PagesPluginOptions {
/** Minify emitted HTML with html-minifier-terser. @default false */
minify?: boolean;
+ /**
+ * Remove `console.log` / `console.warn` / `console.error` / `console.debug`
+ * / `console.info` calls from all built page scripts (production only).
+ *
+ * @default false
+ */
+ removeConsole?: boolean;
+
/**
* Write a `pages.d.ts` ambient module declaration next to `vite.config.ts`
* so `import { pages } from "virtual:pages"` is typed in consumers.
@@ -237,6 +245,7 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
const splitMarkdown = options.splitMarkdown ?? false;
const verbose = options.verbose ?? false;
const singleBundle = options.singleBundle ?? false;
+ const removeConsole = options.removeConsole ?? false;
const relativePath = options.relativePaths ?? false;
const addRawMarkdown = options.addRawMarkdown ?? false;
const pagesDirOpt = options.pagesDir ?? "pages";
@@ -1033,18 +1042,32 @@ ${ctx.content}
// for single bundle
config() {
- if (!singleBundle) {
+ if (!singleBundle && !removeConsole) {
return {};
}
- return {
- build: {
- rollupOptions: {
- output: {
- inlineDynamicImports: true,
- },
+ const esbuild: Record = {};
+
+ if (removeConsole) {
+ // Release builds: strip console.log/warn/error/debug/info from
+ // everything esbuild transforms. Dev mode (vite dev) keeps console
+ // output — esbuild handling only applies to the production build.
+ esbuild.drop = ["console"];
+ }
+
+ const build: Record = {};
+
+ if (singleBundle) {
+ build.rollupOptions = {
+ output: {
+ inlineDynamicImports: true,
},
- },
+ };
+ }
+
+ return {
+ ...(Object.keys(esbuild).length > 0 ? { esbuild } : {}),
+ ...(Object.keys(build).length > 0 ? { build } : {}),
};
},
diff --git a/npm/site/pages/jekyll/header.html b/npm/site/pages/jekyll/header.html
new file mode 100644
index 00000000..9f49c3bf
--- /dev/null
+++ b/npm/site/pages/jekyll/header.html
@@ -0,0 +1 @@
+header
diff --git a/npm/site/vite.config.ts b/npm/site/vite.config.ts
index aac22956..47638e9d 100644
--- a/npm/site/vite.config.ts
+++ b/npm/site/vite.config.ts
@@ -111,6 +111,8 @@ export default defineConfig(({ mode }) => {
// splitMarkdown: true,
prettyUrls: true,
entry: "src/main.ts",
+ // Release-Builds: alle console.log/warn/error/debug/info entfernen
+ removeConsole: true,
minify: true,
title: (id) => {
const titles: Record = {
From c5d6f678868e6fd9e9f41c3afde6ccf0b7aa8878 Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 02:15:27 +0200
Subject: [PATCH 09/62] Enable split-markdown chunks & async rendering
Make markdown rendering async and resilient: renderMarkdown now returns early for non-markdown, dynamically loads chunked markdown via page.load() when available, and injects the loaded HTML. main.ts now awaits renderMarkdown. Vite config enables splitMarkdown so markdown is emitted as separate JS chunks. Regenerated backend.json with updated asset list and file size/stats.
---
npm/site/data/backend.json | 54 ++++++++++++++++++++++++++------------
npm/site/src/main.ts | 2 +-
npm/site/src/markdown.tsx | 29 ++++++++++++++------
npm/site/vite.config.ts | 4 ++-
4 files changed, 62 insertions(+), 27 deletions(-)
diff --git a/npm/site/data/backend.json b/npm/site/data/backend.json
index 5e3ebc26..68460a13 100644
--- a/npm/site/data/backend.json
+++ b/npm/site/data/backend.json
@@ -1,23 +1,23 @@
{
- "generatedAt": "2026-09-14T00:11:13.161Z",
+ "generatedAt": "2026-09-14T00:13:53.753Z",
"total": {
- "files": 59,
- "bytes": 349476,
- "kilobytes": 341.29,
+ "files": 63,
+ "bytes": 350096,
+ "kilobytes": 341.89,
"megabytes": 0.33
},
"byExtension": [
{
"extension": ".js",
- "files": 21,
- "bytes": 273622,
- "percentage": 78.29
+ "files": 25,
+ "bytes": 274242,
+ "percentage": 78.33
},
{
"extension": ".css",
"files": 15,
"bytes": 56648,
- "percentage": 16.21
+ "percentage": 16.18
},
{
"extension": ".txt",
@@ -29,31 +29,41 @@
"extension": ".html",
"files": 21,
"bytes": 7753,
- "percentage": 2.22
+ "percentage": 2.21
},
{
"extension": ".sh",
"files": 1,
"bytes": 2011,
- "percentage": 0.58
+ "percentage": 0.57
}
],
"files": [
{
- "path": "assets/main_entry.js",
+ "path": "assets/jquery.module.js",
"extension": ".js",
- "bytes": 88972
+ "bytes": 79109
},
{
- "path": "assets/jquery.module.js",
+ "path": "assets/main_entry.js",
"extension": ".js",
- "bytes": 79109
+ "bytes": 33423
},
{
"path": "assets/installscript.js",
"extension": ".js",
"bytes": 32265
},
+ {
+ "path": "assets/_virtual_page-markdown_changelog.js",
+ "extension": ".js",
+ "bytes": 30566
+ },
+ {
+ "path": "assets/_virtual_page-markdown_readme.js",
+ "extension": ".js",
+ "bytes": 24851
+ },
{
"path": "assets/creator.js",
"extension": ".js",
@@ -190,7 +200,7 @@
"bytes": 1355
},
{
- "path": "assets/index.js",
+ "path": "assets/index2.js",
"extension": ".js",
"bytes": 1146
},
@@ -200,10 +210,15 @@
"bytes": 1099
},
{
- "path": "assets/index3.js",
+ "path": "assets/index4.js",
"extension": ".js",
"bytes": 1069
},
+ {
+ "path": "assets/config.js",
+ "extension": ".js",
+ "bytes": 623
+ },
{
"path": "assets/info.js",
"extension": ".js",
@@ -265,7 +280,7 @@
"bytes": 391
},
{
- "path": "assets/index2.js",
+ "path": "assets/index3.js",
"extension": ".js",
"bytes": 369
},
@@ -324,6 +339,11 @@
"extension": ".js",
"bytes": 228
},
+ {
+ "path": "assets/index.js",
+ "extension": ".js",
+ "bytes": 129
+ },
{
"path": "jekyll/index.html",
"extension": ".html",
diff --git a/npm/site/src/main.ts b/npm/site/src/main.ts
index c3c17596..f9e393c0 100644
--- a/npm/site/src/main.ts
+++ b/npm/site/src/main.ts
@@ -45,7 +45,7 @@ async function main() {
loadStyles(page.styles);
if (page.type === "markdown") {
- renderMarkdown(app, page);
+ await renderMarkdown(app, page);
return;
}
diff --git a/npm/site/src/markdown.tsx b/npm/site/src/markdown.tsx
index 59998190..af6a3d44 100644
--- a/npm/site/src/markdown.tsx
+++ b/npm/site/src/markdown.tsx
@@ -2,13 +2,26 @@ import { jsx, Fragment } from "../src/jsx-runtime";
import { raw } from "../src/jsx-runtime";
import { PageEntry } from "virtual:pages";
-export function renderMarkdown(app: HTMLElement, page: PageEntry) {
- if (page.type === "markdown") {
- app.innerHTML = (
- <>
- Home
- {raw(page.html ?? "")}
- >
- );
+export async function renderMarkdown(app: HTMLElement, page: PageEntry) {
+ if (page.type !== "markdown") {
+ return;
}
+
+ let html = page.html ?? "";
+
+ /*
+ * Split-Modus: Das Markdown-HTML liegt in einem eigenen Chunk, der über
+ * `page.load()` nachgeladen wird (statt im main_entry.js zu stecken).
+ */
+ if (typeof page.load === "function") {
+ const module = await page.load();
+ html = module.default.html ?? html;
+ }
+
+ app.innerHTML = (
+ <>
+ Home
+ {raw(html)}
+ >
+ );
}
diff --git a/npm/site/vite.config.ts b/npm/site/vite.config.ts
index 47638e9d..0b5d17f3 100644
--- a/npm/site/vite.config.ts
+++ b/npm/site/vite.config.ts
@@ -108,7 +108,9 @@ export default defineConfig(({ mode }) => {
"docs/config": ["/src/markdownrootstyle.css"],
"docs/index": ["/src/markdownrootstyle.css"],
},
- // splitMarkdown: true,
+ // Markdown-Bundle in eigene JS-Chunks aufteilen, statt alles im
+ // main_entry.js zu bündeln (wird per dynamic import() geladen).
+ splitMarkdown: true,
prettyUrls: true,
entry: "src/main.ts",
// Release-Builds: alle console.log/warn/error/debug/info entfernen
From 2604d31c0a2f06004b243cf439ecb3632d87a9f2 Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 02:31:19 +0200
Subject: [PATCH 10/62] Refresh site build and install setup
This commit reorganizes the install test Dockerfiles, adds Liquid template root support and minification to the site SSG pipeline, and updates the Jekyll page templates to use the shared header include. It also removes the generated install script from the published site assets and refreshes the generated backend metadata to match the new build output.
---
docker-compose.yml | 14 +++
.../test-install-ubuntu/Dockerfile | 0
Dockerfile => docker/test-install/Dockerfile | 0
npm/site/data/backend.json | 35 +++----
npm/site/pages-ssg-plugin.ts | 47 ++++++---
npm/site/pages/jekyll/page.html | 2 +-
npm/site/prebuild.js | 1 -
npm/site/public/install.sh | 95 -------------------
.../{pages/jekyll => templates}/header.html | 0
9 files changed, 60 insertions(+), 134 deletions(-)
rename Dockerfile.ubuntu => docker/test-install-ubuntu/Dockerfile (100%)
rename Dockerfile => docker/test-install/Dockerfile (100%)
delete mode 100644 npm/site/public/install.sh
rename npm/site/{pages/jekyll => templates}/header.html (100%)
diff --git a/docker-compose.yml b/docker-compose.yml
index 337771cc..c3f194b6 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,3 +1,4 @@
+# Docker Containers
services:
findergen:
build:
@@ -62,5 +63,18 @@ services:
volumes:
- postgres_data:/var/lib/postgresql
+ test-install:
+ build:
+ context: .
+ dockerfile: docker/test-install/Dockerfile
+ container_name: test-install
+
+ test-install-ubuntu:
+ build:
+ context: .
+ dockerfile: docker/test-install-ubuntu/Dockerfile
+ container_name: test-install
+
+# Saved Data
volumes:
postgres_data:
diff --git a/Dockerfile.ubuntu b/docker/test-install-ubuntu/Dockerfile
similarity index 100%
rename from Dockerfile.ubuntu
rename to docker/test-install-ubuntu/Dockerfile
diff --git a/Dockerfile b/docker/test-install/Dockerfile
similarity index 100%
rename from Dockerfile
rename to docker/test-install/Dockerfile
diff --git a/npm/site/data/backend.json b/npm/site/data/backend.json
index 68460a13..50267f3d 100644
--- a/npm/site/data/backend.json
+++ b/npm/site/data/backend.json
@@ -1,9 +1,9 @@
{
- "generatedAt": "2026-09-14T00:13:53.753Z",
+ "generatedAt": "2026-09-14T00:30:53.073Z",
"total": {
- "files": 63,
- "bytes": 350096,
- "kilobytes": 341.89,
+ "files": 62,
+ "bytes": 348083,
+ "kilobytes": 339.92,
"megabytes": 0.33
},
"byExtension": [
@@ -11,31 +11,25 @@
"extension": ".js",
"files": 25,
"bytes": 274242,
- "percentage": 78.33
+ "percentage": 78.79
},
{
"extension": ".css",
"files": 15,
"bytes": 56648,
- "percentage": 16.18
+ "percentage": 16.27
},
{
"extension": ".txt",
"files": 1,
"bytes": 9442,
- "percentage": 2.7
+ "percentage": 2.71
},
{
"extension": ".html",
"files": 21,
- "bytes": 7753,
- "percentage": 2.21
- },
- {
- "extension": ".sh",
- "files": 1,
- "bytes": 2011,
- "percentage": 0.57
+ "bytes": 7751,
+ "percentage": 2.23
}
],
"files": [
@@ -47,7 +41,7 @@
{
"path": "assets/main_entry.js",
"extension": ".js",
- "bytes": 33423
+ "bytes": 33424
},
{
"path": "assets/installscript.js",
@@ -179,11 +173,6 @@
"extension": ".css",
"bytes": 2194
},
- {
- "path": "install.sh",
- "extension": ".sh",
- "bytes": 2011
- },
{
"path": "assets/index.css",
"extension": ".css",
@@ -347,12 +336,12 @@
{
"path": "jekyll/index.html",
"extension": ".html",
- "bytes": 106
+ "bytes": 104
},
{
"path": "assets/page.js",
"extension": ".js",
- "bytes": 35
+ "bytes": 34
}
]
}
\ No newline at end of file
diff --git a/npm/site/pages-ssg-plugin.ts b/npm/site/pages-ssg-plugin.ts
index fe5378a7..749e8306 100644
--- a/npm/site/pages-ssg-plugin.ts
+++ b/npm/site/pages-ssg-plugin.ts
@@ -182,6 +182,13 @@ export interface PagesPluginOptions {
* @default ["/@", "/node_modules/", "/src/"]
*/
ignoredPathnames?: string[];
+
+ /**
+ * Liquid Template root folder
+ *
+ * @default "templates"
+ */
+ liquidTemplateRoot?: string;
}
export interface PageRenderContext {
@@ -259,6 +266,7 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
options.ignore ?? ((id: string) => id.split("/").pop()!.startsWith("_"));
const getTitle = options.title ?? ((id: string) => id);
const writeDts = options.dts ?? true;
+ const liquidTemplateRoot = options.liquidTemplateRoot ?? "templates";
let config: ResolvedConfig;
let pages: PageEntry[] = [];
@@ -273,6 +281,27 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
return path.resolve(config.root, clean);
}
+ // Render a Liquid template with the given data at build time.
+ //
+ // Used for `X.html` pages: the template is read from disk and rendered
+ // with the data returned by the sibling `X.build.[tj]s` module's `build()`
+ // function, producing fully static HTML.
+ async function renderLiquidTemplate(
+ template: string,
+ data: unknown,
+ ): Promise {
+ // liquidjs braucht einen absoluten Pfad als `root`, damit
+ // `{% include header.html %}` die Partials-Dateien findet.
+ // `jekyllInclude: true` erlaubt die Jekyll-Syntax ohne Quotes
+ // (sonst würde `header.html` als Variablen-Zugriff geparst).
+ const engine = new Liquid({
+ root: path.resolve(config.root, liquidTemplateRoot),
+ jekyllInclude: true,
+ });
+
+ return engine.parseAndRender(template, data as Record);
+ }
+
function getAssetPath(htmlFileName: string, assetFileName: string): string {
const normalizedAsset = assetFileName
.replace(/^\/+/, "")
@@ -1209,6 +1238,10 @@ ${ctx.content}
{
loader,
target: "esnext",
+ // Das Script wird als eigenes Asset ausgegeben und läuft
+ // nicht durch Vites normalen Minify-Pass — daher hier
+ // direkt minifizieren.
+ minify: true,
},
);
@@ -1365,17 +1398,3 @@ async function loadBuildData(page: PageEntry): Promise {
);
}
}
-
-// Render a Liquid template with the given data at build time.
-//
-// Used for `X.html` pages: the template is read from disk and rendered
-// with the data returned by the sibling `X.build.[tj]s` module's `build()`
-// function, producing fully static HTML.
-async function renderLiquidTemplate(
- template: string,
- data: unknown,
-): Promise {
- const engine = new Liquid();
-
- return engine.parseAndRender(template, data as Record);
-}
diff --git a/npm/site/pages/jekyll/page.html b/npm/site/pages/jekyll/page.html
index e5be9daa..5ca56457 100644
--- a/npm/site/pages/jekyll/page.html
+++ b/npm/site/pages/jekyll/page.html
@@ -1,4 +1,4 @@
-{{ title }}
+{% include header.html %}
{% for user in users %}
diff --git a/npm/site/prebuild.js b/npm/site/prebuild.js
index bef269dd..122d3dd9 100644
--- a/npm/site/prebuild.js
+++ b/npm/site/prebuild.js
@@ -3,7 +3,6 @@ import { copyFile } from "fs/promises";
await copyFile("./../../AGENTS.md", "./data/agents.md");
await copyFile("./../../CHANGELOG.md", "./docs/changelog.md");
await copyFile("./../../README.md", "./docs/readme.md");
-await copyFile("./../../install.sh", "./public/install.sh");
// Save all templates for static frontend
diff --git a/npm/site/public/install.sh b/npm/site/public/install.sh
deleted file mode 100644
index 61504b95..00000000
--- a/npm/site/public/install.sh
+++ /dev/null
@@ -1,95 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-
-REPO="shadowdara/finder"
-INSTALL_DIR="${INSTALL_DIR:-$HOME/.local/bin}"
-
-detect_os() {
- case "$(uname -s)" in
- Linux*) echo "linux" ;;
- Darwin*) echo "darwin" ;;
- MINGW*|MSYS*|CYGWIN*) echo "windows" ;;
- *)
- echo "Unsupported OS: $(uname -s)" >&2
- exit 1
- ;;
- esac
-}
-
-detect_arch() {
- case "$(uname -m)" in
- x86_64|amd64) echo "amd64" ;;
- arm64|aarch64) echo "arm64" ;;
- *)
- echo "Unsupported architecture: $(uname -m)" >&2
- exit 1
- ;;
- esac
-}
-
-OS="$(detect_os)"
-ARCH="$(detect_arch)"
-
-echo "Detecting platform..."
-echo " OS: $OS"
-echo " Arch: $ARCH"
-
-VERSION="$(
- curl -fsSL \
- "https://api.github.com/repos/${REPO}/releases/latest" |
- grep '"tag_name":' |
- sed -E 's/.*"([^"]+)".*/\1/'
-)"
-
-if [ -z "$VERSION" ]; then
- echo "Could not determine latest version." >&2
- exit 1
-fi
-
-echo " Version: $VERSION"
-
-ARCHIVE="finder_${VERSION}_${OS}_${ARCH}"
-
-if [ "$OS" = "windows" ]; then
- ARCHIVE="${ARCHIVE}.zip"
-else
- ARCHIVE="${ARCHIVE}.tar.gz"
-fi
-
-URL="https://github.com/${REPO}/releases/download/${VERSION}/${ARCHIVE}"
-
-TMP="$(mktemp -d)"
-trap 'rm -rf "$TMP"' EXIT
-
-echo "Downloading:"
-echo " $URL"
-
-curl -fL "$URL" -o "$TMP/archive"
-
-mkdir -p "$INSTALL_DIR"
-
-if [ "$OS" = "windows" ]; then
- unzip -q "$TMP/archive" -d "$TMP/package"
-else
- mkdir "$TMP/package"
- tar -xzf "$TMP/archive" -C "$TMP/package"
-fi
-
-if [ "$OS" = "windows" ]; then
- cp "$TMP/package/finder.exe" "$INSTALL_DIR/finder.exe"
-else
- install -m 755 "$TMP/package/finder" "$INSTALL_DIR/finder"
-fi
-
-echo
-echo "Finder installed successfully!"
-echo
-echo " $INSTALL_DIR/finder"
-
-if [[ ":$PATH:" != *":$INSTALL_DIR:"* ]]; then
- echo "export PATH=\"\$PATH:$INSTALL_DIR\"" >> "$HOME/.bashrc"
- export PATH="$PATH:$INSTALL_DIR"
-fi
-
-source ~/.bashrc
diff --git a/npm/site/pages/jekyll/header.html b/npm/site/templates/header.html
similarity index 100%
rename from npm/site/pages/jekyll/header.html
rename to npm/site/templates/header.html
From c56cb311c5d4ebe9b141ad751227a37759a3ffe2 Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 02:44:01 +0200
Subject: [PATCH 11/62] Lazy-load large page build data
Move large generated page payloads out of the main bundle and load them via virtual imports when a page is opened. Liquid pages are treated as static and skipped in the client-side pages map, while page modules support an optional `loadData()` hook. This reduces bundle size and keeps the page API stable. A root `stats` script was also added for bundle analysis.
---
npm/site/data/backend.json | 27 ++++++++++-------
npm/site/pages-ssg-plugin.ts | 57 ++++++++++++++++++++++++++++++------
npm/site/src/main.ts | 12 ++++----
npm/site/src/pages.d.ts | 2 ++
package.json | 3 +-
5 files changed, 75 insertions(+), 26 deletions(-)
diff --git a/npm/site/data/backend.json b/npm/site/data/backend.json
index 50267f3d..f329723a 100644
--- a/npm/site/data/backend.json
+++ b/npm/site/data/backend.json
@@ -1,16 +1,16 @@
{
- "generatedAt": "2026-09-14T00:30:53.073Z",
+ "generatedAt": "2026-09-14T00:39:06.781Z",
"total": {
- "files": 62,
- "bytes": 348083,
- "kilobytes": 339.92,
+ "files": 63,
+ "bytes": 348096,
+ "kilobytes": 339.94,
"megabytes": 0.33
},
"byExtension": [
{
"extension": ".js",
- "files": 25,
- "bytes": 274242,
+ "files": 26,
+ "bytes": 274255,
"percentage": 78.79
},
{
@@ -38,11 +38,6 @@
"extension": ".js",
"bytes": 79109
},
- {
- "path": "assets/main_entry.js",
- "extension": ".js",
- "bytes": 33424
- },
{
"path": "assets/installscript.js",
"extension": ".js",
@@ -53,6 +48,11 @@
"extension": ".js",
"bytes": 30566
},
+ {
+ "path": "assets/_virtual_page-data_index.js",
+ "extension": ".js",
+ "bytes": 25412
+ },
{
"path": "assets/_virtual_page-markdown_readme.js",
"extension": ".js",
@@ -83,6 +83,11 @@
"extension": ".js",
"bytes": 9239
},
+ {
+ "path": "assets/main_entry.js",
+ "extension": ".js",
+ "bytes": 8025
+ },
{
"path": "assets/viewer.js",
"extension": ".js",
diff --git a/npm/site/pages-ssg-plugin.ts b/npm/site/pages-ssg-plugin.ts
index 749e8306..9c035046 100644
--- a/npm/site/pages-ssg-plugin.ts
+++ b/npm/site/pages-ssg-plugin.ts
@@ -19,6 +19,9 @@ const RESOLVED_VIRTUAL_MODULE_ID = "\0" + VIRTUAL_MODULE_ID;
const STYLE_PREFIX = "virtual:page-style:";
const RESOLVED_STYLE_PREFIX = "\0" + STYLE_PREFIX;
+const DATA_PREFIX = "virtual:page-data:";
+const RESOLVED_DATA_PREFIX = "\0" + DATA_PREFIX;
+
/**
* Placeholder rendered in place of `{{ JS_SCRIPT }}` while Liquid runs.
* The real script tag (pointing at the built `page.[tj]s`) is only known
@@ -626,6 +629,13 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
.map((style) => styleImports.get(style)!)
.join(", ");
+ /* Liquid pages are fully static (rendered at build time) — they
+ * are served/emitted as-is and do not need a client-side entry in
+ * the pages map (which would bloat the main bundle). */
+ if (page.type === "liquid") {
+ return null;
+ }
+
if (page.type === "markdown") {
const styles = page.styles
.map((style) => styleImports.get(style)!)
@@ -655,23 +665,29 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
}`;
}
- if (page.type === "liquid") {
- return ` ${JSON.stringify(page.id)}: {
- id: ${JSON.stringify(page.id)},
- type: "liquid",
- html: ${JSON.stringify(page.html ?? "")},
- styles: [${styles}]
- }`;
- }
+ // Große Build-Daten (z. B. gerendertes Markdown) nicht inline in
+ // den Entry packen, sondern in einen eigenen Chunk auslagern, der
+ // erst beim Laden der Seite per import() geholt wird.
+ const dataSize =
+ typeof page.buildData === "string" ? page.buildData.length : 1024;
+
+ const inlineData = dataSize < 8 * 1024;
+
+ const dataField = inlineData
+ ? `data: ${JSON.stringify(page.buildData ?? null)},`
+ : `loadData: () => import(${JSON.stringify(
+ DATA_PREFIX + page.id,
+ )}).then((m) => m.default),`;
return ` ${JSON.stringify(page.id)}: {
id: ${JSON.stringify(page.id)},
type: "component",
load: () => import(${JSON.stringify(page.importPath)}),
- data: ${JSON.stringify(page.buildData ?? null)},
+ ${dataField}
styles: [${styles}]
}`;
})
+ .filter((entry): entry is string => entry != null)
.join(",\n");
return `${imports}
@@ -714,6 +730,8 @@ declare module "virtual:pages" {
id: string;
type: "component";
data?: unknown;
+ /** Lazy-loaded build data (large payloads). */
+ loadData?: () => Promise;
load: () => Promise;
styles: string[];
}
@@ -841,6 +859,10 @@ ${ctx.content}
return RESOLVED_STYLE_PREFIX + id.slice(STYLE_PREFIX.length);
}
+ if (id.startsWith(DATA_PREFIX)) {
+ return RESOLVED_DATA_PREFIX + id.slice(DATA_PREFIX.length);
+ }
+
return null;
},
@@ -877,6 +899,23 @@ ${ctx.content}
return `export { default } from ${JSON.stringify(stylePath + "?url")};`;
}
+ if (id.startsWith(RESOLVED_DATA_PREFIX)) {
+ const pageId = id.slice(RESOLVED_DATA_PREFIX.length);
+ const page = pages.find(
+ (page) => page.type === "component" && page.id === pageId,
+ );
+
+ if (!page) {
+ throw new Error(
+ `[vite-plugin-pages-ssg] Data page not found: ${pageId}`,
+ );
+ }
+
+ return `
+ export default ${JSON.stringify(page.buildData ?? null)};
+ `;
+ }
+
return null;
},
diff --git a/npm/site/src/main.ts b/npm/site/src/main.ts
index f9e393c0..237498a0 100644
--- a/npm/site/src/main.ts
+++ b/npm/site/src/main.ts
@@ -50,17 +50,19 @@ async function main() {
return;
}
- // Liquid pages are rendered to static HTML at build time; this branch
- // only acts as a safety net if such a page is ever loaded client-side.
if (page.type === "liquid") {
- app.innerHTML = page.html ?? "";
-
return;
}
const module = await page.load();
- await module.default(app, page.data);
+ // Große Build-Daten werden optional in einem eigenen Chunk geladen.
+ const data =
+ "loadData" in page && typeof page.loadData === "function"
+ ? await page.loadData()
+ : page.data;
+
+ await module.default(app, data);
} catch (error) {
ErrorPage(app, id, error);
}
diff --git a/npm/site/src/pages.d.ts b/npm/site/src/pages.d.ts
index 6261410d..1eacf866 100644
--- a/npm/site/src/pages.d.ts
+++ b/npm/site/src/pages.d.ts
@@ -28,6 +28,8 @@ declare module "virtual:pages" {
id: string;
type: "component";
data?: unknown;
+ /** Lazy-loaded build data (large payloads). */
+ loadData?: () => Promise;
load: () => Promise;
styles: string[];
}
diff --git a/package.json b/package.json
index 98c4bf22..47a2c871 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,8 @@
"private": true,
"scripts": {
"dev": "pnpm --filter web dev",
- "build": "pnpm --filter web build"
+ "build": "pnpm --filter web build",
+ "stats": "pnpx linguist-js"
},
"devDependencies": {
"@shadowdara/linguist-js": "*",
From f2dc908b64a86644455987049dc4ed6b36680586 Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 13:02:24 +0200
Subject: [PATCH 12/62] Add EJS templates and virtual filesystem
This change adds EJS page rendering support alongside Liquid in the site SSG plugin and updates the template root to src/templates. It also introduces a new npm/vfs package with an in-memory filesystem API, ZIP import/export, persistence helpers, and TypeScript build configuration.
The site fixtures were updated to include an EJS example page and move Jekyll test assets under the test folder, while .gitignore was adjusted for the new package artifacts.
---
.gitignore | 2 +
npm/site/data/backend.json | 31 +-
npm/site/pages-ssg-plugin.ts | 121 +++-
npm/site/pages/test/ejs/page.build.js | 6 +
npm/site/pages/test/ejs/page.ejs | 7 +
.../pages/{ => test}/jekyll/page.build.js | 0
npm/site/pages/{ => test}/jekyll/page.html | 0
npm/site/pages/{ => test}/jekyll/page.js | 0
npm/site/{ => src}/templates/header.html | 0
npm/vfs/README.md | 117 ++++
npm/vfs/package.json | 22 +
npm/vfs/src/errors.ts | 20 +
npm/vfs/src/index.ts | 19 +
npm/vfs/src/types.ts | 91 +++
npm/vfs/src/vfs.ts | 618 ++++++++++++++++++
npm/vfs/tsconfig.json | 16 +
pnpm-lock.yaml | 70 +-
17 files changed, 1086 insertions(+), 54 deletions(-)
create mode 100644 npm/site/pages/test/ejs/page.build.js
create mode 100644 npm/site/pages/test/ejs/page.ejs
rename npm/site/pages/{ => test}/jekyll/page.build.js (100%)
rename npm/site/pages/{ => test}/jekyll/page.html (100%)
rename npm/site/pages/{ => test}/jekyll/page.js (100%)
rename npm/site/{ => src}/templates/header.html (100%)
create mode 100644 npm/vfs/README.md
create mode 100644 npm/vfs/package.json
create mode 100644 npm/vfs/src/errors.ts
create mode 100644 npm/vfs/src/index.ts
create mode 100644 npm/vfs/src/types.ts
create mode 100644 npm/vfs/src/vfs.ts
create mode 100644 npm/vfs/tsconfig.json
diff --git a/.gitignore b/.gitignore
index 6bc0ffcf..1156886f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -34,3 +34,5 @@ npm/site/static-stats.html
/npm/site/dist
/npm/site/dist-static
npm/site/tsconfig.tsbuildinfo
+/npm/vfs/node_modules
+/npm/vfs/dist
diff --git a/npm/site/data/backend.json b/npm/site/data/backend.json
index f329723a..b383d7f8 100644
--- a/npm/site/data/backend.json
+++ b/npm/site/data/backend.json
@@ -1,23 +1,23 @@
{
- "generatedAt": "2026-09-14T00:39:06.781Z",
+ "generatedAt": "2026-09-14T11:00:04.290Z",
"total": {
- "files": 63,
- "bytes": 348096,
- "kilobytes": 339.94,
+ "files": 64,
+ "bytes": 348548,
+ "kilobytes": 340.38,
"megabytes": 0.33
},
"byExtension": [
{
"extension": ".js",
"files": 26,
- "bytes": 274255,
- "percentage": 78.79
+ "bytes": 274346,
+ "percentage": 78.71
},
{
"extension": ".css",
"files": 15,
"bytes": 56648,
- "percentage": 16.27
+ "percentage": 16.25
},
{
"extension": ".txt",
@@ -27,9 +27,9 @@
},
{
"extension": ".html",
- "files": 21,
- "bytes": 7751,
- "percentage": 2.23
+ "files": 22,
+ "bytes": 8112,
+ "percentage": 2.33
}
],
"files": [
@@ -86,7 +86,7 @@
{
"path": "assets/main_entry.js",
"extension": ".js",
- "bytes": 8025
+ "bytes": 8116
},
{
"path": "assets/viewer.js",
@@ -278,6 +278,11 @@
"extension": ".js",
"bytes": 369
},
+ {
+ "path": "test/ejs/index.html",
+ "extension": ".html",
+ "bytes": 358
+ },
{
"path": "mcapp/worlds/index.html",
"extension": ".html",
@@ -339,9 +344,9 @@
"bytes": 129
},
{
- "path": "jekyll/index.html",
+ "path": "test/jekyll/index.html",
"extension": ".html",
- "bytes": 104
+ "bytes": 107
},
{
"path": "assets/page.js",
diff --git a/npm/site/pages-ssg-plugin.ts b/npm/site/pages-ssg-plugin.ts
index 9c035046..480c04d5 100644
--- a/npm/site/pages-ssg-plugin.ts
+++ b/npm/site/pages-ssg-plugin.ts
@@ -9,6 +9,7 @@ import { tsImport } from "tsx/esm/api";
import { escapeHtml } from "./src/jsx-runtime";
import hljs from "highlight.js/lib/common";
import { Liquid } from "liquidjs";
+import ejs from "ejs";
const MARKDOWN_PREFIX = "virtual:page-markdown:";
const RESOLVED_MARKDOWN_PREFIX = "\0" + MARKDOWN_PREFIX;
@@ -189,7 +190,7 @@ export interface PagesPluginOptions {
/**
* Liquid Template root folder
*
- * @default "templates"
+ * @default "src/templates"
*/
liquidTemplateRoot?: string;
}
@@ -208,7 +209,7 @@ export interface PageRenderContext {
content?: string;
}
-type PageType = "component" | "markdown" | "liquid";
+type PageType = "component" | "markdown" | "liquid" | "ejs";
interface PageEntry {
/** Route id, e.g. "guide/installation" (posix, no extension). */
@@ -269,7 +270,7 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
options.ignore ?? ((id: string) => id.split("/").pop()!.startsWith("_"));
const getTitle = options.title ?? ((id: string) => id);
const writeDts = options.dts ?? true;
- const liquidTemplateRoot = options.liquidTemplateRoot ?? "templates";
+ const liquidTemplateRoot = options.liquidTemplateRoot ?? "src/templates";
let config: ResolvedConfig;
let pages: PageEntry[] = [];
@@ -305,6 +306,19 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
return engine.parseAndRender(template, data as Record);
}
+ // Render an EJS template with the given data at build time.
+ // Used for `X.ejs` pages (same data flow as Liquid).
+ async function renderEjsTemplate(
+ template: string,
+ data: unknown,
+ sourceFile: string,
+ ): Promise {
+ // `filename` only matters for `include`-relative paths in EJS.
+ return ejs.render(template, data, {
+ filename: sourceFile,
+ });
+ }
+
function getAssetPath(htmlFileName: string, assetFileName: string): string {
const normalizedAsset = assetFileName
.replace(/^\/+/, "")
@@ -342,7 +356,11 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
);
for (const page of pages) {
- if (page.type !== "component" && page.type !== "liquid") {
+ if (
+ page.type !== "component" &&
+ page.type !== "liquid" &&
+ page.type !== "ejs"
+ ) {
continue;
}
@@ -362,6 +380,18 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
);
}
+ // EJS pages: same data flow as Liquid, but rendered with EJS.
+ if (page.type === "ejs") {
+ page.html = await renderEjsTemplate(
+ fs.readFileSync(page.source, "utf8"),
+ {
+ ...(page.buildData ?? {}),
+ JS_SCRIPT: LIQUID_SCRIPT_PLACEHOLDER,
+ },
+ page.source,
+ );
+ }
+
if (verbose) {
console.log(
`[vite-plugin-pages-ssg] Build data loaded: ${page.id}`,
@@ -451,6 +481,7 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
const componentFiles: string[] = [];
const htmlFiles: string[] = [];
+ const ejsFiles: string[] = [];
function walk(directory: string) {
for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
@@ -478,6 +509,11 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
continue;
}
+ if (extension === ".ejs") {
+ ejsFiles.push(fullPath);
+ continue;
+ }
+
if (extensions.includes(extension)) {
componentFiles.push(fullPath);
}
@@ -510,9 +546,11 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
})
.filter((page) => !shouldIgnore(page.id));
- // Liquid pages: every `X.html` that has a sibling `X.build.[tj]s`
- // becomes a build-time-rendered Liquid page. The `.html` template is
- // rendered with the data returned by `build()` at build time.
+ // Template pages: every `X.html` / `X.ejs` that has a sibling
+ // `X.build.[tj]s` becomes a build-time-rendered template page.
+ //
+ // - .html => Liquid
+ // - .ejs => EJS
const liquidPages: PageEntry[] = [];
for (const file of htmlFiles.sort()) {
@@ -520,9 +558,6 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
let id = relativePath.slice(0, -".html".length);
- // `page.html` acts as the folder's index template:
- // jekyll/page.html -> jekyll/index
- // page.html -> index
if (path.posix.basename(id) === "page") {
id = path.posix.join(path.posix.dirname(id), "index");
}
@@ -531,7 +566,6 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
continue;
}
- // A real component/markdown page with the same id takes precedence.
if (componentPages.some((page) => page.id === id)) {
continue;
}
@@ -544,11 +578,7 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
continue;
}
- // Script source for `{{ JS_SCRIPT }}`: prefer the plain page module
- // (`page.ts` / `page.js` / ...) next to the template; fall back to
- // the `page.build.[tj]s` data file itself.
const baseName = file.slice(0, -".html".length);
-
const scriptSource =
[".ts", ".tsx", ".js", ".jsx"]
.map((ext) => baseName + ext)
@@ -563,16 +593,55 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
});
}
- // A `page.js`/`page.ts` next to a `page.html` is used as the Liquid
- // script source, not as its own `…/page` route — the Liquid index
- // page takes precedence.
+ for (const file of ejsFiles.sort()) {
+ const relativePath = path.relative(root, file).replace(/\\/g, "/");
+
+ let id = relativePath.slice(0, -".ejs".length);
+
+ if (path.posix.basename(id) === "page") {
+ id = path.posix.join(path.posix.dirname(id), "index");
+ }
+
+ if (shouldIgnore(id)) {
+ continue;
+ }
+
+ if (componentPages.some((page) => page.id === id)) {
+ continue;
+ }
+
+ const buildFile = [".ts", ".tsx", ".js", ".jsx"]
+ .map((ext) => file.slice(0, -".ejs".length) + `.build${ext}`)
+ .find((candidate) => fs.existsSync(candidate));
+
+ if (!buildFile) {
+ continue;
+ }
+
+ const baseName = file.slice(0, -".ejs".length);
+ const scriptSource =
+ [".ts", ".tsx", ".js", ".jsx"]
+ .map((ext) => baseName + ext)
+ .find((candidate) => fs.existsSync(candidate)) ?? buildFile;
+
+ liquidPages.push({
+ id,
+ source: file,
+ type: "ejs",
+ scriptSource,
+ styles: options.styles?.[id] ?? [],
+ });
+ }
+
+ // A `page.js`/`page.ts` next to a template page is used as the client
+ // script source, not as its own route — the template index page
+ // takes precedence.
const liquidIds = new Set(liquidPages.map((page) => page.id));
const duplicateComponentIds = componentPages
.map((page) => page.id)
.filter((id) => {
- // id "jekyll/page" conflicts with Liquid page "jekyll/index" only
- // when the component is literally `/page`.
+ // id "/page" conflicts with template index "/index".
if (!id.endsWith("/page")) {
return false;
}
@@ -1402,7 +1471,11 @@ function getPageId(url: string, pages: PageEntry[]): string {
// Function to load the build data
async function loadBuildData(page: PageEntry): Promise {
- if (page.type !== "component" && page.type !== "liquid") {
+ if (
+ page.type !== "component" &&
+ page.type !== "liquid" &&
+ page.type !== "ejs"
+ ) {
return null;
}
@@ -1414,6 +1487,12 @@ async function loadBuildData(page: PageEntry): Promise {
[".ts", ".tsx", ".js", ".jsx"]
.map((ext) => page.source.slice(0, -".html".length) + `.build${ext}`)
.find((candidate) => fs.existsSync(candidate)) ?? "";
+ } else if (page.type === "ejs") {
+ // page.ejs -> page.build.[tj]s
+ buildFile =
+ [".ts", ".tsx", ".js", ".jsx"]
+ .map((ext) => page.source.slice(0, -".ejs".length) + `.build${ext}`)
+ .find((candidate) => fs.existsSync(candidate)) ?? "";
} else {
buildFile = page.source.replace(/\.(tsx?|jsx?)$/, ".build.$1");
}
diff --git a/npm/site/pages/test/ejs/page.build.js b/npm/site/pages/test/ejs/page.build.js
new file mode 100644
index 00000000..1a6336bb
--- /dev/null
+++ b/npm/site/pages/test/ejs/page.build.js
@@ -0,0 +1,6 @@
+export async function build() {
+ return {
+ name: "Max",
+ age: 20,
+ };
+}
diff --git a/npm/site/pages/test/ejs/page.ejs b/npm/site/pages/test/ejs/page.ejs
new file mode 100644
index 00000000..80db6f1f
--- /dev/null
+++ b/npm/site/pages/test/ejs/page.ejs
@@ -0,0 +1,7 @@
+
+
+
+ Hallo <%= name %>!
+ Du bist <%= age %> Jahre alt.
+
+
diff --git a/npm/site/pages/jekyll/page.build.js b/npm/site/pages/test/jekyll/page.build.js
similarity index 100%
rename from npm/site/pages/jekyll/page.build.js
rename to npm/site/pages/test/jekyll/page.build.js
diff --git a/npm/site/pages/jekyll/page.html b/npm/site/pages/test/jekyll/page.html
similarity index 100%
rename from npm/site/pages/jekyll/page.html
rename to npm/site/pages/test/jekyll/page.html
diff --git a/npm/site/pages/jekyll/page.js b/npm/site/pages/test/jekyll/page.js
similarity index 100%
rename from npm/site/pages/jekyll/page.js
rename to npm/site/pages/test/jekyll/page.js
diff --git a/npm/site/templates/header.html b/npm/site/src/templates/header.html
similarity index 100%
rename from npm/site/templates/header.html
rename to npm/site/src/templates/header.html
diff --git a/npm/vfs/README.md b/npm/vfs/README.md
new file mode 100644
index 00000000..d024798e
--- /dev/null
+++ b/npm/vfs/README.md
@@ -0,0 +1,117 @@
+# virtual-fs
+
+Ein leichtgewichtiges, komplett im Speicher laufendes virtuelles Dateisystem in TypeScript — gedacht als Datenmodell für einen Web-basierten Datei-Editor (Dateibaum, Tabs, etc.).
+
+## Features
+
+- Ordner & Dateien mit `id`, `name`, Timestamps
+- Pfad-basierte API (`/src/index.ts`), inkl. `mkdir -p`-artiger `recursive`-Option
+- CRUD: `createFolder`, `createFile`, `readFile`, `writeFile`, `delete`, `rename`, `move`, `copy`
+- Baum-Export (`getTree`) für z.B. eine Sidebar-Komponente
+- Volltextsuche über Dateinamen (`find`)
+- Event-System (`vfs.on(...)`) für reaktive UIs
+- **ZIP-Import/-Export** (`importFromZip` / `exportToZip`) via [`fflate`](https://github.com/101arrowz/fflate)
+- JSON-Serialisierung (`toJSON` / `fromJSON`) für Persistenz z.B. in `localStorage`
+
+## Installation
+
+```bash
+npm install
+npm run build
+```
+
+## Beispiele
+
+```ts
+import { VirtualFileSystem } from 'virtual-fs';
+
+const vfs = new VirtualFileSystem();
+
+// Ordner & Dateien anlegen
+vfs.createFolder('/src/components', { recursive: true });
+vfs.createFile('/src/index.ts', 'console.log("hello")');
+vfs.createFile('/src/components/Button.tsx', 'export const Button = () => null;');
+
+// Lesen / Schreiben
+vfs.readFile('/src/index.ts', 'text'); // -> string
+vfs.writeFile('/src/index.ts', 'console.log("updated")');
+
+// Umbenennen / Verschieben / Kopieren
+vfs.rename('/src/index.ts', 'main.ts');
+vfs.move('/src/main.ts', '/main.ts');
+vfs.copy('/src/components', '/src/components-backup');
+
+// Baum für UI (z.B. Sidebar-Tree)
+const tree = vfs.getTree('/');
+
+// Auf Änderungen reagieren (z.B. um den Editor-State zu aktualisieren)
+const unsubscribe = vfs.on((event) => {
+ console.log(event.type, event.path);
+});
+
+// Suche
+vfs.find('Button'); // -> passende Knoten
+
+// --- ZIP ---
+
+// Export als ZIP (z.B. zum Download-Button im Editor)
+const zipBytes = vfs.exportToZip('/'); // Uint8Array
+
+// Import aus ZIP (z.B. Drag & Drop einer .zip-Datei)
+const vfs2 = new VirtualFileSystem();
+vfs2.importFromZip(zipBytes, { targetPath: '/', overwrite: true });
+```
+
+### Im Browser: ZIP-Datei per ` ` importieren
+
+```ts
+fileInput.addEventListener('change', async () => {
+ const file = fileInput.files![0];
+ const buffer = await file.arrayBuffer();
+ vfs.importFromZip(buffer);
+});
+```
+
+### ZIP-Export als Download anbieten
+
+```ts
+const zipBytes = vfs.exportToZip('/');
+const blob = new Blob([zipBytes], { type: 'application/zip' });
+const url = URL.createObjectURL(blob);
+const a = document.createElement('a');
+a.href = url;
+a.download = 'projekt.zip';
+a.click();
+URL.revokeObjectURL(url);
+```
+
+## API-Übersicht
+
+| Methode | Beschreibung |
+|---|---|
+| `createFolder(path, { recursive })` | Ordner anlegen |
+| `createFile(path, content, { mimeType, overwrite, recursive })` | Datei anlegen |
+| `readFile(path, 'text' \| 'binary')` | Dateiinhalt lesen |
+| `writeFile(path, content, { create, mimeType })` | Datei schreiben/erstellen |
+| `list(path)` | Direkte Kind-Knoten eines Ordners |
+| `getTree(path)` | Rekursive Baumstruktur (JSON-freundlich) |
+| `exists` / `isFile` / `isFolder` / `stat` | Existenz- und Typ-Checks |
+| `rename(path, newName)` | Umbenennen |
+| `move(sourcePath, destinationPath)` | Verschieben/Umbenennen |
+| `copy(sourcePath, destinationPath)` | Tiefes Kopieren |
+| `delete(path)` | Löschen (inkl. Unterbaum) |
+| `find(query, path?)` | Suche nach Namen (String oder RegExp) |
+| `exportToZip(path?)` | Export als ZIP (`Uint8Array`) |
+| `importFromZip(data, { targetPath, overwrite })` | Import aus ZIP-Daten |
+| `toJSON()` / `VirtualFileSystem.fromJSON(data)` | Persistenz außerhalb von ZIP |
+| `on(listener)` | Auf Änderungen abonnieren |
+
+## Projektstruktur
+
+```
+src/
+ types.ts Typdefinitionen
+ errors.ts Fehlerklassen
+ vfs.ts Kernklasse VirtualFileSystem
+ index.ts Barrel-Export
+```
diff --git a/npm/vfs/package.json b/npm/vfs/package.json
new file mode 100644
index 00000000..6b640b07
--- /dev/null
+++ b/npm/vfs/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "virtual-fs",
+ "version": "0.1.0",
+ "description": "In-memory virtuelles Dateisystem (Ordner/Dateien) mit ZIP Import/Export, gedacht als Backend für einen Web-Editor.",
+ "type": "module",
+ "main": "./dist/index.js",
+ "types": "./dist/index.d.ts",
+ "files": [
+ "dist"
+ ],
+ "scripts": {
+ "build": "tsc -p tsconfig.json",
+ "dev": "tsc -p tsconfig.json --watch"
+ },
+ "dependencies": {
+ "fflate": "^0.8.2"
+ },
+ "devDependencies": {
+ "typescript": "^5.5.4",
+ "@types/node": "^20.14.0"
+ }
+}
diff --git a/npm/vfs/src/errors.ts b/npm/vfs/src/errors.ts
new file mode 100644
index 00000000..ca909da0
--- /dev/null
+++ b/npm/vfs/src/errors.ts
@@ -0,0 +1,20 @@
+export class VfsError extends Error {
+ constructor(message: string) {
+ super(message);
+ this.name = 'VfsError';
+ }
+}
+
+export class VfsNotFoundError extends VfsError {
+ constructor(path: string) {
+ super(`Pfad nicht gefunden: ${path}`);
+ this.name = 'VfsNotFoundError';
+ }
+}
+
+export class VfsExistsError extends VfsError {
+ constructor(path: string) {
+ super(`Pfad existiert bereits: ${path}`);
+ this.name = 'VfsExistsError';
+ }
+}
diff --git a/npm/vfs/src/index.ts b/npm/vfs/src/index.ts
new file mode 100644
index 00000000..5f6b4341
--- /dev/null
+++ b/npm/vfs/src/index.ts
@@ -0,0 +1,19 @@
+export { VirtualFileSystem } from "../vfs.js";
+export { VfsError, VfsNotFoundError, VfsExistsError } from "../errors.js";
+export type {
+ NodeId,
+ VNode,
+ FileNode,
+ FolderNode,
+ TreeEntry,
+ TreeFileEntry,
+ TreeFolderEntry,
+ VfsEvent,
+ VfsEventType,
+ VfsListener,
+ CreateFolderOptions,
+ CreateFileOptions,
+ WriteFileOptions,
+ ImportZipOptions,
+ SerializedVfs,
+} from "../types.js";
diff --git a/npm/vfs/src/types.ts b/npm/vfs/src/types.ts
new file mode 100644
index 00000000..940111cf
--- /dev/null
+++ b/npm/vfs/src/types.ts
@@ -0,0 +1,91 @@
+export type NodeId = string;
+
+export interface BaseNode {
+ id: NodeId;
+ name: string;
+ parentId: NodeId | null;
+ createdAt: number;
+ updatedAt: number;
+}
+
+export interface FileNode extends BaseNode {
+ type: 'file';
+ content: Uint8Array;
+ mimeType?: string;
+}
+
+export interface FolderNode extends BaseNode {
+ type: 'folder';
+ children: NodeId[];
+}
+
+export type VNode = FileNode | FolderNode;
+
+/** Serialisierbare Baum-Repräsentation, z.B. für ein Editor-Sidebar/Tree-View */
+export interface TreeFileEntry {
+ type: 'file';
+ id: NodeId;
+ name: string;
+ path: string;
+ size: number;
+ mimeType?: string;
+ createdAt: number;
+ updatedAt: number;
+}
+
+export interface TreeFolderEntry {
+ type: 'folder';
+ id: NodeId;
+ name: string;
+ path: string;
+ createdAt: number;
+ updatedAt: number;
+ children: TreeEntry[];
+}
+
+export type TreeEntry = TreeFileEntry | TreeFolderEntry;
+
+export type VfsEventType = 'create' | 'update' | 'delete' | 'move' | 'rename';
+
+export interface VfsEvent {
+ type: VfsEventType;
+ path: string;
+ node: VNode;
+}
+
+export type VfsListener = (event: VfsEvent) => void;
+
+export interface CreateFolderOptions {
+ /** Fehlende Zwischenordner automatisch anlegen (wie `mkdir -p`) */
+ recursive?: boolean;
+}
+
+export interface CreateFileOptions {
+ mimeType?: string;
+ /** Vorhandene Datei überschreiben statt Fehler zu werfen */
+ overwrite?: boolean;
+ /** Fehlende Zwischenordner automatisch anlegen */
+ recursive?: boolean;
+}
+
+export interface WriteFileOptions {
+ mimeType?: string;
+ /** Datei (und ggf. Ordner) anlegen, falls sie noch nicht existiert (Default: true) */
+ create?: boolean;
+}
+
+export interface ImportZipOptions {
+ /** Zielordner im VFS, in den entpackt wird (Default: '/') */
+ targetPath?: string;
+ /** true = bestehende Dateien überschreiben, false = Fehler bei Konflikt (Default: true) */
+ overwrite?: boolean;
+}
+
+/** Ebene Repräsentation für Persistenz (z.B. localStorage), unabhängig vom Zip-Format */
+export interface SerializedVfs {
+ rootId: NodeId;
+ nodes: Array<
+ | (Omit & { content: string /* base64 */ })
+ | FolderNode
+ >;
+}
diff --git a/npm/vfs/src/vfs.ts b/npm/vfs/src/vfs.ts
new file mode 100644
index 00000000..08f54797
--- /dev/null
+++ b/npm/vfs/src/vfs.ts
@@ -0,0 +1,618 @@
+import { zipSync, unzipSync } from "fflate";
+import { VfsError, VfsNotFoundError, VfsExistsError } from "../errors.js";
+import type {
+ NodeId,
+ VNode,
+ FileNode,
+ FolderNode,
+ TreeEntry,
+ VfsEvent,
+ VfsEventType,
+ VfsListener,
+ CreateFolderOptions,
+ CreateFileOptions,
+ WriteFileOptions,
+ ImportZipOptions,
+ SerializedVfs,
+} from "../types.js";
+
+const textEncoder = new TextEncoder();
+const textDecoder = new TextDecoder();
+
+function generateId(): string {
+ const g = globalThis as unknown as { crypto?: { randomUUID?: () => string } };
+ if (g.crypto?.randomUUID) return g.crypto.randomUUID();
+ return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
+}
+
+/** Zerlegt einen Pfad in Segmente, löst "." und ".." auf, ignoriert leere Segmente. */
+function normalize(path: string): string[] {
+ const stack: string[] = [];
+ for (const raw of path.split("/")) {
+ const part = raw.trim();
+ if (part === "" || part === ".") continue;
+ if (part === "..") {
+ stack.pop();
+ continue;
+ }
+ stack.push(part);
+ }
+ return stack;
+}
+
+function toBytes(content: string | Uint8Array): Uint8Array {
+ return typeof content === "string" ? textEncoder.encode(content) : content;
+}
+
+export class VirtualFileSystem {
+ private nodes = new Map();
+ private rootId: NodeId;
+ private listeners = new Set();
+
+ constructor() {
+ const now = Date.now();
+ this.rootId = generateId();
+ this.nodes.set(this.rootId, {
+ id: this.rootId,
+ name: "",
+ type: "folder",
+ parentId: null,
+ createdAt: now,
+ updatedAt: now,
+ children: [],
+ });
+ }
+
+ get root(): FolderNode {
+ return this.nodes.get(this.rootId) as FolderNode;
+ }
+
+ // ---------------------------------------------------------------------
+ // Events
+ // ---------------------------------------------------------------------
+
+ on(listener: VfsListener): () => void {
+ this.listeners.add(listener);
+ return () => this.listeners.delete(listener);
+ }
+
+ private emit(type: VfsEventType, path: string, node: VNode): void {
+ const event: VfsEvent = { type, path, node };
+ for (const listener of this.listeners) listener(event);
+ }
+
+ // ---------------------------------------------------------------------
+ // Pfad-Auflösung (intern)
+ // ---------------------------------------------------------------------
+
+ private resolveFolder(parts: string[]): FolderNode | undefined {
+ let current: FolderNode = this.root;
+ for (const part of parts) {
+ const childId = current.children.find(
+ (id) => this.nodes.get(id)!.name === part,
+ );
+ if (!childId) return undefined;
+ const child = this.nodes.get(childId)!;
+ if (child.type !== "folder") return undefined;
+ current = child;
+ }
+ return current;
+ }
+
+ private splitParentAndName(path: string): {
+ parentParts: string[];
+ name: string;
+ } {
+ const parts = normalize(path);
+ const name = parts.pop();
+ if (!name)
+ throw new VfsError(`Ungültiger Pfad (kein Dateiname): "${path}"`);
+ return { parentParts: parts, name };
+ }
+
+ /** Liefert den absoluten Pfad ("/a/b/c") eines Knotens. */
+ getPath(node: VNode | NodeId): string {
+ const target = typeof node === "string" ? this.nodes.get(node) : node;
+ if (!target) throw new VfsNotFoundError(String(node));
+ const segments: string[] = [];
+ let current: VNode | undefined = target;
+ while (current && current.id !== this.rootId) {
+ segments.unshift(current.name);
+ current = current.parentId ? this.nodes.get(current.parentId) : undefined;
+ }
+ return "/" + segments.join("/");
+ }
+
+ // ---------------------------------------------------------------------
+ // Lookup / Existenz
+ // ---------------------------------------------------------------------
+
+ resolveNode(path: string): VNode | undefined {
+ const parts = normalize(path);
+ if (parts.length === 0) return this.root;
+ const name = parts.pop()!;
+ const parent = this.resolveFolder(parts);
+ if (!parent) return undefined;
+ const id = parent.children.find(
+ (cid) => this.nodes.get(cid)!.name === name,
+ );
+ return id ? this.nodes.get(id) : undefined;
+ }
+
+ exists(path: string): boolean {
+ return this.resolveNode(path) !== undefined;
+ }
+
+ isFile(path: string): boolean {
+ return this.resolveNode(path)?.type === "file";
+ }
+
+ isFolder(path: string): boolean {
+ return this.resolveNode(path)?.type === "folder";
+ }
+
+ stat(path: string): VNode {
+ const node = this.resolveNode(path);
+ if (!node) throw new VfsNotFoundError(path);
+ return node;
+ }
+
+ // ---------------------------------------------------------------------
+ // Ordner
+ // ---------------------------------------------------------------------
+
+ createFolder(path: string, options: CreateFolderOptions = {}): FolderNode {
+ const parts = normalize(path);
+ let current: FolderNode = this.root;
+
+ for (let i = 0; i < parts.length; i++) {
+ const part = parts[i];
+ const existingId = current.children.find(
+ (id) => this.nodes.get(id)!.name === part,
+ );
+
+ if (existingId) {
+ const existing = this.nodes.get(existingId)!;
+ if (existing.type !== "folder") {
+ throw new VfsError(
+ `Pfadsegment "${part}" ist eine Datei, kein Ordner`,
+ );
+ }
+ current = existing;
+ continue;
+ }
+
+ if (!options.recursive && i < parts.length - 1) {
+ throw new VfsNotFoundError("/" + parts.slice(0, i + 1).join("/"));
+ }
+
+ const now = Date.now();
+ const folder: FolderNode = {
+ id: generateId(),
+ name: part,
+ type: "folder",
+ parentId: current.id,
+ createdAt: now,
+ updatedAt: now,
+ children: [],
+ };
+ this.nodes.set(folder.id, folder);
+ current.children.push(folder.id);
+ current.updatedAt = now;
+ this.emit("create", this.getPath(folder), folder);
+ current = folder;
+ }
+
+ return current;
+ }
+
+ /** Liefert die direkten Kind-Knoten eines Ordners. */
+ list(path: string = "/"): VNode[] {
+ const node = this.resolveNode(path);
+ if (!node) throw new VfsNotFoundError(path);
+ if (node.type !== "folder") throw new VfsError(`Kein Ordner: ${path}`);
+ return node.children.map((id) => this.nodes.get(id)!);
+ }
+
+ /** Liefert eine verschachtelte, JSON-freundliche Baumstruktur (z.B. für eine Sidebar). */
+ getTree(path: string = "/"): TreeEntry {
+ const node = this.resolveNode(path);
+ if (!node) throw new VfsNotFoundError(path);
+ return this.toTreeEntry(node);
+ }
+
+ private toTreeEntry(node: VNode): TreeEntry {
+ const path = this.getPath(node);
+ if (node.type === "file") {
+ return {
+ type: "file",
+ id: node.id,
+ name: node.name,
+ path,
+ size: node.content.byteLength,
+ mimeType: node.mimeType,
+ createdAt: node.createdAt,
+ updatedAt: node.updatedAt,
+ };
+ }
+ return {
+ type: "folder",
+ id: node.id,
+ name: node.name,
+ path,
+ createdAt: node.createdAt,
+ updatedAt: node.updatedAt,
+ children: node.children.map((id) =>
+ this.toTreeEntry(this.nodes.get(id)!),
+ ),
+ };
+ }
+
+ // ---------------------------------------------------------------------
+ // Dateien
+ // ---------------------------------------------------------------------
+
+ createFile(
+ path: string,
+ content: string | Uint8Array = new Uint8Array(0),
+ options: CreateFileOptions = {},
+ ): FileNode {
+ const { parentParts, name } = this.splitParentAndName(path);
+
+ const parentFolder = options.recursive
+ ? this.createFolder("/" + parentParts.join("/"), { recursive: true })
+ : this.resolveFolder(parentParts);
+
+ if (!parentFolder) throw new VfsNotFoundError("/" + parentParts.join("/"));
+
+ const data = toBytes(content);
+ const existingId = parentFolder.children.find(
+ (id) => this.nodes.get(id)!.name === name,
+ );
+
+ if (existingId) {
+ const existing = this.nodes.get(existingId)!;
+ if (existing.type !== "file")
+ throw new VfsError(`"${name}" ist ein Ordner, keine Datei`);
+ if (!options.overwrite) throw new VfsExistsError(path);
+ existing.content = data;
+ existing.mimeType = options.mimeType ?? existing.mimeType;
+ existing.updatedAt = Date.now();
+ this.emit("update", this.getPath(existing), existing);
+ return existing;
+ }
+
+ const now = Date.now();
+ const file: FileNode = {
+ id: generateId(),
+ name,
+ type: "file",
+ parentId: parentFolder.id,
+ content: data,
+ mimeType: options.mimeType,
+ createdAt: now,
+ updatedAt: now,
+ };
+ this.nodes.set(file.id, file);
+ parentFolder.children.push(file.id);
+ parentFolder.updatedAt = now;
+ this.emit("create", this.getPath(file), file);
+ return file;
+ }
+
+ readFile(path: string, as: "text"): string;
+ readFile(path: string, as?: "binary"): Uint8Array;
+ readFile(
+ path: string,
+ as: "text" | "binary" = "binary",
+ ): string | Uint8Array {
+ const node = this.resolveNode(path);
+ if (!node) throw new VfsNotFoundError(path);
+ if (node.type !== "file") throw new VfsError(`Kein Datei-Knoten: ${path}`);
+ return as === "text" ? textDecoder.decode(node.content) : node.content;
+ }
+
+ writeFile(
+ path: string,
+ content: string | Uint8Array,
+ options: WriteFileOptions = {},
+ ): FileNode {
+ const shouldCreate = options.create ?? true;
+ const node = this.resolveNode(path);
+
+ if (node) {
+ if (node.type !== "file")
+ throw new VfsError(`Kein Datei-Knoten: ${path}`);
+ node.content = toBytes(content);
+ node.mimeType = options.mimeType ?? node.mimeType;
+ node.updatedAt = Date.now();
+ this.emit("update", path, node);
+ return node;
+ }
+
+ if (!shouldCreate) throw new VfsNotFoundError(path);
+ return this.createFile(path, content, {
+ mimeType: options.mimeType,
+ recursive: true,
+ });
+ }
+
+ // ---------------------------------------------------------------------
+ // Löschen / Umbenennen / Verschieben / Kopieren
+ // ---------------------------------------------------------------------
+
+ delete(path: string): void {
+ const parts = normalize(path);
+ if (parts.length === 0)
+ throw new VfsError("Root-Ordner kann nicht gelöscht werden");
+ const name = parts.pop()!;
+ const parent = this.resolveFolder(parts);
+ if (!parent) throw new VfsNotFoundError(path);
+
+ const idx = parent.children.findIndex(
+ (id) => this.nodes.get(id)!.name === name,
+ );
+ if (idx === -1) throw new VfsNotFoundError(path);
+
+ const node = this.nodes.get(parent.children[idx])!;
+ parent.children.splice(idx, 1);
+ parent.updatedAt = Date.now();
+
+ this.removeSubtree(node);
+ this.emit("delete", path, node);
+ }
+
+ private removeSubtree(node: VNode): void {
+ if (node.type === "folder") {
+ for (const childId of node.children) {
+ this.removeSubtree(this.nodes.get(childId)!);
+ }
+ }
+ this.nodes.delete(node.id);
+ }
+
+ rename(path: string, newName: string): VNode {
+ const node = this.resolveNode(path);
+ if (!node) throw new VfsNotFoundError(path);
+ const parent = node.parentId
+ ? (this.nodes.get(node.parentId) as FolderNode)
+ : this.root;
+
+ const collision = parent.children.some(
+ (id) => id !== node.id && this.nodes.get(id)!.name === newName,
+ );
+ if (collision)
+ throw new VfsExistsError(`${this.getPath(parent)}/${newName}`);
+
+ node.name = newName;
+ node.updatedAt = Date.now();
+ this.emit("rename", this.getPath(node), node);
+ return node;
+ }
+
+ /** Verschiebt (und/oder benennt um) einen Knoten. `destinationPath` ist der volle Zielpfad. */
+ move(sourcePath: string, destinationPath: string): VNode {
+ const node = this.resolveNode(sourcePath);
+ if (!node) throw new VfsNotFoundError(sourcePath);
+
+ const oldParent = node.parentId
+ ? (this.nodes.get(node.parentId) as FolderNode)
+ : this.root;
+ const { parentParts, name } = this.splitParentAndName(destinationPath);
+ const newParent = this.resolveFolder(parentParts);
+ if (!newParent) throw new VfsNotFoundError("/" + parentParts.join("/"));
+
+ if (newParent.children.some((id) => this.nodes.get(id)!.name === name)) {
+ throw new VfsExistsError(destinationPath);
+ }
+
+ oldParent.children = oldParent.children.filter((id) => id !== node.id);
+ oldParent.updatedAt = Date.now();
+
+ node.name = name;
+ node.parentId = newParent.id;
+ node.updatedAt = Date.now();
+ newParent.children.push(node.id);
+ newParent.updatedAt = Date.now();
+
+ this.emit("move", destinationPath, node);
+ return node;
+ }
+
+ copy(sourcePath: string, destinationPath: string): VNode {
+ const node = this.resolveNode(sourcePath);
+ if (!node) throw new VfsNotFoundError(sourcePath);
+ const { parentParts, name } = this.splitParentAndName(destinationPath);
+ const newParent = this.resolveFolder(parentParts);
+ if (!newParent) throw new VfsNotFoundError("/" + parentParts.join("/"));
+ if (newParent.children.some((id) => this.nodes.get(id)!.name === name)) {
+ throw new VfsExistsError(destinationPath);
+ }
+ const clone = this.cloneSubtree(node, newParent.id, name);
+ newParent.children.push(clone.id);
+ newParent.updatedAt = Date.now();
+ this.emit("create", destinationPath, clone);
+ return clone;
+ }
+
+ private cloneSubtree(node: VNode, parentId: NodeId, name: string): VNode {
+ const now = Date.now();
+ if (node.type === "file") {
+ const clone: FileNode = {
+ id: generateId(),
+ name,
+ type: "file",
+ parentId,
+ content: node.content.slice(),
+ mimeType: node.mimeType,
+ createdAt: now,
+ updatedAt: now,
+ };
+ this.nodes.set(clone.id, clone);
+ return clone;
+ }
+ const clone: FolderNode = {
+ id: generateId(),
+ name,
+ type: "folder",
+ parentId,
+ createdAt: now,
+ updatedAt: now,
+ children: [],
+ };
+ this.nodes.set(clone.id, clone);
+ for (const childId of node.children) {
+ const child = this.nodes.get(childId)!;
+ const childClone = this.cloneSubtree(child, clone.id, child.name);
+ clone.children.push(childClone.id);
+ }
+ return clone;
+ }
+
+ // ---------------------------------------------------------------------
+ // Suche
+ // ---------------------------------------------------------------------
+
+ /** Durchsucht rekursiv (ab `path`) nach Knoten, deren Name das Muster enthält. */
+ find(query: string | RegExp, path: string = "/"): VNode[] {
+ const start = this.resolveNode(path);
+ if (!start) throw new VfsNotFoundError(path);
+ const matches: VNode[] = [];
+ const matcher =
+ typeof query === "string"
+ ? (n: string) => n.includes(query)
+ : (n: string) => query.test(n);
+
+ const walk = (node: VNode) => {
+ if (matcher(node.name)) matches.push(node);
+ if (node.type === "folder") {
+ for (const childId of node.children) walk(this.nodes.get(childId)!);
+ }
+ };
+ walk(start);
+ return matches;
+ }
+
+ // ---------------------------------------------------------------------
+ // ZIP Export / Import
+ // ---------------------------------------------------------------------
+
+ /** Exportiert einen Ordner (Default: Root) als ZIP-Binärdaten. */
+ exportToZip(path: string = "/"): Uint8Array {
+ const node = this.resolveNode(path);
+ if (!node) throw new VfsNotFoundError(path);
+ if (node.type !== "folder") throw new VfsError(`Kein Ordner: ${path}`);
+
+ const files: Record = {};
+
+ const walk = (folder: FolderNode, prefix: string) => {
+ if (folder.children.length === 0 && prefix !== "") {
+ files[`${prefix}/`] = new Uint8Array(0);
+ return;
+ }
+ for (const childId of folder.children) {
+ const child = this.nodes.get(childId)!;
+ const childPath = prefix ? `${prefix}/${child.name}` : child.name;
+ if (child.type === "folder") {
+ walk(child, childPath);
+ } else {
+ files[childPath] = child.content;
+ }
+ }
+ };
+
+ walk(node, "");
+ return zipSync(files, { level: 6 });
+ }
+
+ /** Importiert ZIP-Binärdaten in den angegebenen Zielordner (Default: '/'). */
+ importFromZip(
+ data: Uint8Array | ArrayBuffer,
+ options: ImportZipOptions = {},
+ ): void {
+ const targetPath = options.targetPath ?? "/";
+ const overwrite = options.overwrite ?? true;
+ const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);
+
+ this.createFolder(targetPath, { recursive: true });
+ const entries = unzipSync(bytes);
+
+ // Ordner zuerst anlegen, damit auch leere Ordner erhalten bleiben.
+ const sortedPaths = Object.keys(entries).sort(
+ (a, b) => a.split("/").length - b.split("/").length,
+ );
+
+ for (const entryPath of sortedPaths) {
+ const content = entries[entryPath];
+ const fullPath = joinPath(targetPath, entryPath);
+
+ if (entryPath.endsWith("/")) {
+ this.createFolder(fullPath, { recursive: true });
+ } else {
+ this.createFile(fullPath, content, { overwrite, recursive: true });
+ }
+ }
+ }
+
+ // ---------------------------------------------------------------------
+ // Persistenz (unabhängig von ZIP, z.B. für localStorage/IndexedDB)
+ // ---------------------------------------------------------------------
+
+ toJSON(): SerializedVfs {
+ const nodes: SerializedVfs["nodes"] = [];
+ for (const node of this.nodes.values()) {
+ if (node.type === "file") {
+ nodes.push({ ...node, content: bytesToBase64(node.content) });
+ } else {
+ nodes.push(node);
+ }
+ }
+ return { rootId: this.rootId, nodes };
+ }
+
+ static fromJSON(data: SerializedVfs): VirtualFileSystem {
+ const vfs = new VirtualFileSystem();
+ vfs.nodes.clear();
+ vfs.rootId = data.rootId;
+ for (const node of data.nodes) {
+ if (node.type === "file") {
+ vfs.nodes.set(node.id, {
+ ...node,
+ content: base64ToBytes(node.content),
+ });
+ } else {
+ vfs.nodes.set(node.id, node);
+ }
+ }
+ return vfs;
+ }
+}
+
+function joinPath(...segments: string[]): string {
+ return (
+ "/" +
+ segments
+ .map((s) => normalize(s).join("/"))
+ .filter(Boolean)
+ .join("/")
+ );
+}
+
+function bytesToBase64(bytes: Uint8Array): string {
+ let binary = "";
+ for (let i = 0; i < bytes.byteLength; i++)
+ binary += String.fromCharCode(bytes[i]);
+ return typeof btoa === "function"
+ ? btoa(binary)
+ : Buffer.from(bytes).toString("base64");
+}
+
+function base64ToBytes(base64: string): Uint8Array {
+ if (typeof atob === "function") {
+ const binary = atob(base64);
+ const bytes = new Uint8Array(binary.length);
+ for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
+ return bytes;
+ }
+ return new Uint8Array(Buffer.from(base64, "base64"));
+}
diff --git a/npm/vfs/tsconfig.json b/npm/vfs/tsconfig.json
new file mode 100644
index 00000000..b4e01be6
--- /dev/null
+++ b/npm/vfs/tsconfig.json
@@ -0,0 +1,16 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "module": "ESNext",
+ "moduleResolution": "Bundler",
+ "lib": ["ES2020", "DOM"],
+ "declaration": true,
+ "outDir": "dist",
+ "rootDir": "src",
+ "strict": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "forceConsistentCasingInFileNames": true
+ },
+ "include": ["src"]
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f81c63b1..3c637b3f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -208,6 +208,19 @@ importers:
specifier: ^1.8.1
version: 1.8.1(eslint@10.10.0(jiti@2.7.0))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))
+ npm/vfs:
+ dependencies:
+ fflate:
+ specifier: ^0.8.2
+ version: 0.8.3
+ devDependencies:
+ '@types/node':
+ specifier: ^20.14.0
+ version: 20.19.43
+ typescript:
+ specifier: ^5.5.4
+ version: 5.7.3
+
packages:
'@alloc/quick-lru@5.3.0':
@@ -1697,6 +1710,9 @@ packages:
'@types/license-checker@25.0.6':
resolution: {integrity: sha512-ju/75+YPkNE5vX1iPer+qtI1eI/LqJVYZgOsmSHI1iiEM1bQL5Gh1lEvyjR9T7ZXVE1FwJa2doWJEEmPNwbZkw==}
+ '@types/node@20.19.43':
+ resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==}
+
'@types/node@24.13.4':
resolution: {integrity: sha512-YJ7EqCstVTzIr0fMr7qul/977en+pQHrfmuKIo6Zr9i75Be21dr3MovcfvGtyvi2HAUrRerWps5sMO9I7WaxDw==}
@@ -2526,6 +2542,9 @@ packages:
picomatch:
optional: true
+ fflate@0.8.3:
+ resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==}
+
figures@6.1.0:
resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==}
engines: {node: '>=18'}
@@ -3817,6 +3836,9 @@ packages:
ufo@1.6.4:
resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==}
+ undici-types@6.21.0:
+ resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+
undici-types@7.18.2:
resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==}
@@ -4210,7 +4232,7 @@ snapshots:
optionalDependencies:
'@types/react': 19.3.0
- '@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)':
+ '@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)':
dependencies:
'@better-auth/utils': 0.4.2
'@better-fetch/fetch': 1.3.1
@@ -4222,39 +4244,39 @@ snapshots:
nanostores: 1.5.3
zod: 4.6.2
- '@better-auth/drizzle-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
+ '@better-auth/drizzle-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
- '@better-auth/kysely-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(kysely@0.29.5)':
+ '@better-auth/kysely-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(kysely@0.29.5)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
optionalDependencies:
kysely: 0.29.5
- '@better-auth/memory-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
+ '@better-auth/memory-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
- '@better-auth/mongo-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
+ '@better-auth/mongo-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
- '@better-auth/prisma-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(prisma@6.19.3(typescript@5.7.3))':
+ '@better-auth/prisma-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(prisma@6.19.3(typescript@5.7.3))':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
optionalDependencies:
'@prisma/client': 6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3)
prisma: 6.19.3(typescript@5.7.3)
- '@better-auth/telemetry@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)':
+ '@better-auth/telemetry@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
'@better-fetch/fetch': 1.3.1
@@ -5154,6 +5176,10 @@ snapshots:
'@types/license-checker@25.0.6': {}
+ '@types/node@20.19.43':
+ dependencies:
+ undici-types: 6.21.0
+
'@types/node@24.13.4':
dependencies:
undici-types: 7.18.2
@@ -5386,13 +5412,13 @@ snapshots:
better-auth@1.7.4(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(next@16.3.3(@babel/core@7.29.7)(@types/node@24.13.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(sass@1.104.1))(prisma@6.19.3(typescript@5.7.3))(react-dom@19.3.0(react@19.3.0))(react@19.3.0):
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
- '@better-auth/drizzle-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
- '@better-auth/kysely-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(kysely@0.29.5)
- '@better-auth/memory-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
- '@better-auth/mongo-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
- '@better-auth/prisma-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(prisma@6.19.3(typescript@5.7.3))
- '@better-auth/telemetry': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/drizzle-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
+ '@better-auth/kysely-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(kysely@0.29.5)
+ '@better-auth/memory-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
+ '@better-auth/mongo-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
+ '@better-auth/prisma-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(prisma@6.19.3(typescript@5.7.3))
+ '@better-auth/telemetry': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)
'@better-auth/utils': 0.4.2
'@better-fetch/fetch': 1.3.1
'@noble/ciphers': 2.4.0
@@ -6015,6 +6041,8 @@ snapshots:
optionalDependencies:
picomatch: 4.0.7
+ fflate@0.8.3: {}
+
figures@6.1.0:
dependencies:
is-unicode-supported: 2.1.0
@@ -7289,6 +7317,8 @@ snapshots:
ufo@1.6.4: {}
+ undici-types@6.21.0: {}
+
undici-types@7.18.2: {}
undici-types@7.24.6: {}
From 30e5ab50426eced79572026caf729e23520b0736 Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 13:18:24 +0200
Subject: [PATCH 13/62] Treat EJS pages as static and emit HTML
Update pages-ssg-plugin to treat EJS pages like liquid pages (skip creating a client entry) and emit the already-rendered page.html as a build asset, optionally minifying it. Minor code/comment cleanup around script emission logic. Also update generated backend.json (timestamps and file size/statistics adjustments, including test/ejs/index.html byte count).
---
npm/site/data/backend.json | 28 +++++++++++++-------------
npm/site/pages-ssg-plugin.ts | 38 ++++++++++++++++++++++++++++--------
2 files changed, 44 insertions(+), 22 deletions(-)
diff --git a/npm/site/data/backend.json b/npm/site/data/backend.json
index b383d7f8..9d820d83 100644
--- a/npm/site/data/backend.json
+++ b/npm/site/data/backend.json
@@ -1,23 +1,23 @@
{
- "generatedAt": "2026-09-14T11:00:04.290Z",
+ "generatedAt": "2026-09-14T11:17:44.952Z",
"total": {
"files": 64,
- "bytes": 348548,
- "kilobytes": 340.38,
+ "bytes": 348163,
+ "kilobytes": 340,
"megabytes": 0.33
},
"byExtension": [
{
"extension": ".js",
"files": 26,
- "bytes": 274346,
- "percentage": 78.71
+ "bytes": 274231,
+ "percentage": 78.77
},
{
"extension": ".css",
"files": 15,
"bytes": 56648,
- "percentage": 16.25
+ "percentage": 16.27
},
{
"extension": ".txt",
@@ -28,8 +28,8 @@
{
"extension": ".html",
"files": 22,
- "bytes": 8112,
- "percentage": 2.33
+ "bytes": 7842,
+ "percentage": 2.25
}
],
"files": [
@@ -86,7 +86,7 @@
{
"path": "assets/main_entry.js",
"extension": ".js",
- "bytes": 8116
+ "bytes": 8001
},
{
"path": "assets/viewer.js",
@@ -278,11 +278,6 @@
"extension": ".js",
"bytes": 369
},
- {
- "path": "test/ejs/index.html",
- "extension": ".html",
- "bytes": 358
- },
{
"path": "mcapp/worlds/index.html",
"extension": ".html",
@@ -348,6 +343,11 @@
"extension": ".html",
"bytes": 107
},
+ {
+ "path": "test/ejs/index.html",
+ "extension": ".html",
+ "bytes": 88
+ },
{
"path": "assets/page.js",
"extension": ".js",
diff --git a/npm/site/pages-ssg-plugin.ts b/npm/site/pages-ssg-plugin.ts
index 480c04d5..077617ce 100644
--- a/npm/site/pages-ssg-plugin.ts
+++ b/npm/site/pages-ssg-plugin.ts
@@ -698,10 +698,11 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
.map((style) => styleImports.get(style)!)
.join(", ");
- /* Liquid pages are fully static (rendered at build time) — they
- * are served/emitted as-is and do not need a client-side entry in
- * the pages map (which would bloat the main bundle). */
- if (page.type === "liquid") {
+ /* Liquid/EJS template pages are fully static (rendered at build
+ * time) — they are served/emitted as-is and do not need a
+ * client-side entry in the pages map (which would bloat the
+ * main bundle). */
+ if (page.type === "liquid" || page.type === "ejs") {
return null;
}
@@ -1358,10 +1359,6 @@ ${ctx.content}
path.extname(page.scriptSource),
);
- // Emit the compiled page script as a plain asset so Vite's
- // import analysis stays happy (prebuilt chunks break
- // `importedCss` in some setups). The file name is
- // deterministic, so the placeholder can be replaced directly.
const scriptFileName = `assets/${scriptName}.js`;
this.emitFile({
@@ -1402,6 +1399,31 @@ ${ctx.content}
continue;
}
+ // EJS: already rendered in preparePages() into page.html
+ if (page.type === "ejs") {
+ let ejsHtml = page.html ?? "";
+
+ if (options.minify) {
+ ejsHtml = await minify(ejsHtml, {
+ collapseWhitespace: true,
+ removeComments: true,
+ removeRedundantAttributes: true,
+ removeEmptyAttributes: true,
+ useShortDoctype: true,
+ minifyCSS: true,
+ minifyJS: true,
+ });
+ }
+
+ this.emitFile({
+ type: "asset",
+ fileName: htmlFileName,
+ source: ejsHtml,
+ });
+
+ continue;
+ }
+
const ctx: PageRenderContext = {
id: page.id,
title: getTitle(page.id),
From f3572f4754ae91cf881f7b8846544e458a782895 Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 13:35:44 +0200
Subject: [PATCH 14/62] Add site tool pages, components & ejs types
Add new generator tool pages (line_formatter, line_extender, picture-mode-maker) with HTML, scripts and styles; introduce client components (extend, format, main, settings) and CSS. Add ejs type declaration and @types/ejs dependency (package.json, dependencies.txt, pnpm-lock.yaml). Update pages-ssg-plugin: loosen .build exclusion regex, cast EJS data to any, and treat Liquid/EJS scriptSource as a component entry. Regenerate backend.json to include new assets.
---
npm/site/data/backend.json | 55 +++--
npm/site/package.json | 1 +
npm/site/pages-ssg-plugin.ts | 22 +-
.../line_formatter/line_extender/page.html | 47 ++++
.../line_formatter/line_extender/page.js | 0
npm/site/pages/tools/line_formatter/page.html | 45 ++++
npm/site/pages/tools/line_formatter/page.js | 0
.../pages/tools/picture-mode-maker/index.html | 48 ++++
.../pages/tools/picture-mode-maker/page.js | 20 ++
npm/site/public/dependencies.txt | 1 +
npm/site/src/components/extend.js | 5 +
npm/site/src/components/format.js | 5 +
npm/site/src/components/main.js | 26 +++
npm/site/src/components/projects.css | 95 ++++++++
npm/site/src/components/settings.js | 74 ++++++
npm/site/src/components/style.css | 218 ++++++++++++++++++
npm/site/src/types/ejs.d.ts | 7 +
pnpm-lock.yaml | 48 ++--
18 files changed, 680 insertions(+), 37 deletions(-)
create mode 100644 npm/site/pages/tools/line_formatter/line_extender/page.html
create mode 100644 npm/site/pages/tools/line_formatter/line_extender/page.js
create mode 100644 npm/site/pages/tools/line_formatter/page.html
create mode 100644 npm/site/pages/tools/line_formatter/page.js
create mode 100644 npm/site/pages/tools/picture-mode-maker/index.html
create mode 100644 npm/site/pages/tools/picture-mode-maker/page.js
create mode 100644 npm/site/src/components/extend.js
create mode 100644 npm/site/src/components/format.js
create mode 100644 npm/site/src/components/main.js
create mode 100644 npm/site/src/components/projects.css
create mode 100644 npm/site/src/components/settings.js
create mode 100644 npm/site/src/components/style.css
create mode 100644 npm/site/src/types/ejs.d.ts
diff --git a/npm/site/data/backend.json b/npm/site/data/backend.json
index 9d820d83..076fde5f 100644
--- a/npm/site/data/backend.json
+++ b/npm/site/data/backend.json
@@ -1,35 +1,35 @@
{
- "generatedAt": "2026-09-14T11:17:44.952Z",
+ "generatedAt": "2026-09-14T11:34:39.009Z",
"total": {
- "files": 64,
- "bytes": 348163,
- "kilobytes": 340,
+ "files": 69,
+ "bytes": 351109,
+ "kilobytes": 342.88,
"megabytes": 0.33
},
"byExtension": [
{
"extension": ".js",
- "files": 26,
- "bytes": 274231,
- "percentage": 78.77
+ "files": 28,
+ "bytes": 276004,
+ "percentage": 78.61
},
{
"extension": ".css",
"files": 15,
"bytes": 56648,
- "percentage": 16.27
+ "percentage": 16.13
},
{
"extension": ".txt",
"files": 1,
- "bytes": 9442,
- "percentage": 2.71
+ "bytes": 9466,
+ "percentage": 2.7
},
{
"extension": ".html",
- "files": 22,
- "bytes": 7842,
- "percentage": 2.25
+ "files": 25,
+ "bytes": 8991,
+ "percentage": 2.56
}
],
"files": [
@@ -71,7 +71,7 @@
{
"path": "dependencies.txt",
"extension": ".txt",
- "bytes": 9442
+ "bytes": 9466
},
{
"path": "assets/viewer.css",
@@ -86,7 +86,7 @@
{
"path": "assets/main_entry.js",
"extension": ".js",
- "bytes": 8001
+ "bytes": 8971
},
{
"path": "assets/viewer.js",
@@ -208,6 +208,11 @@
"extension": ".js",
"bytes": 1069
},
+ {
+ "path": "assets/page2.js",
+ "extension": ".js",
+ "bytes": 738
+ },
{
"path": "assets/config.js",
"extension": ".js",
@@ -268,11 +273,26 @@
"extension": ".html",
"bytes": 397
},
+ {
+ "path": "tools/line_formatter/line_extender/page/index.html",
+ "extension": ".html",
+ "bytes": 395
+ },
{
"path": "home/index.html",
"extension": ".html",
"bytes": 391
},
+ {
+ "path": "tools/picture-mode-maker/page/index.html",
+ "extension": ".html",
+ "bytes": 379
+ },
+ {
+ "path": "tools/line_formatter/page/index.html",
+ "extension": ".html",
+ "bytes": 375
+ },
{
"path": "assets/index3.js",
"extension": ".js",
@@ -348,6 +368,11 @@
"extension": ".html",
"bytes": 88
},
+ {
+ "path": "assets/page.build.js",
+ "extension": ".js",
+ "bytes": 65
+ },
{
"path": "assets/page.js",
"extension": ".js",
diff --git a/npm/site/package.json b/npm/site/package.json
index 393e866b..584a8af9 100644
--- a/npm/site/package.json
+++ b/npm/site/package.json
@@ -23,6 +23,7 @@
"@eslint/js": "^10.0.1",
"@rollup/plugin-yaml": "^5.0.0",
"@tailwindcss/vite": "^4.3.3",
+ "@types/ejs": "^3.1.5",
"@types/html-minifier-terser": "^7.0.2",
"@types/jquery": "^4.0.1",
"@types/license-checker": "^25.0.6",
diff --git a/npm/site/pages-ssg-plugin.ts b/npm/site/pages-ssg-plugin.ts
index 077617ce..fb65d262 100644
--- a/npm/site/pages-ssg-plugin.ts
+++ b/npm/site/pages-ssg-plugin.ts
@@ -314,7 +314,7 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
sourceFile: string,
): Promise {
// `filename` only matters for `include`-relative paths in EJS.
- return ejs.render(template, data, {
+ return ejs.render(template, data as any, {
filename: sourceFile,
});
}
@@ -498,7 +498,12 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
// Build-data modules (page.build.ts / page.build.js / ...) are not
// pages themselves — they only feed data into their sibling page.
- if (/\.build\.(ts|tsx|js|jsx|mjs|cjs)$/i.test(entry.name)) {
+ // Exclude anything that contains `.build.` before the extension.
+ // Examples:
+ // - page.build.ts
+ // - page.build.js
+ // - nested/page.build.tsx
+ if (/\.build\.[^.]+$/i.test(entry.name)) {
continue;
}
@@ -703,6 +708,19 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
* client-side entry in the pages map (which would bloat the
* main bundle). */
if (page.type === "liquid" || page.type === "ejs") {
+ // Liquid/EJS: Der page.scriptSource wird als eigenständige Seite (component)
+ // behandelt, damit es durch Vite/Rollup gebündelt wird.
+ // Hinweis: die HTML selbst wird weiter als Asset emittiert.
+ if (page.scriptSource) {
+ const scriptId = `__pages_script__:${page.id}`;
+ return ` ${JSON.stringify(page.id)}: {
+ id: ${JSON.stringify(page.id)},
+ type: "component",
+ load: () => import(${JSON.stringify(page.importPath ?? page.scriptSource)}),
+ styles: []
+ }`;
+ }
+
return null;
}
diff --git a/npm/site/pages/tools/line_formatter/line_extender/page.html b/npm/site/pages/tools/line_formatter/line_extender/page.html
new file mode 100644
index 00000000..4a172be6
--- /dev/null
+++ b/npm/site/pages/tools/line_formatter/line_extender/page.html
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+ {{ JS_SCRIPT }}
+ Line Extender
+
+
+
+
+
+
+ Line Extender
+
+ In the other direction
+
+ More Infos here!
+
+
+
+ Generate
+
+
+
+
+
+
+ Made with ❤️ by Shadowdara
+
+
+
+
+
+
+
+
+
diff --git a/npm/site/pages/tools/line_formatter/line_extender/page.js b/npm/site/pages/tools/line_formatter/line_extender/page.js
new file mode 100644
index 00000000..e69de29b
diff --git a/npm/site/pages/tools/line_formatter/page.html b/npm/site/pages/tools/line_formatter/page.html
new file mode 100644
index 00000000..cb8e7bd2
--- /dev/null
+++ b/npm/site/pages/tools/line_formatter/page.html
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+ {{ JS_SCRIPT }}
+ Line Formatter
+
+
+
+
+
+
+ Line Formatter
+
+ In the other direction
+
+ More Infos here!
+
+
+
+ Generate
+
+
+
+
+
+
+ Made with ❤️ by Shadowdara
+
+
+
+
+
+
diff --git a/npm/site/pages/tools/line_formatter/page.js b/npm/site/pages/tools/line_formatter/page.js
new file mode 100644
index 00000000..e69de29b
diff --git a/npm/site/pages/tools/picture-mode-maker/index.html b/npm/site/pages/tools/picture-mode-maker/index.html
new file mode 100644
index 00000000..3556b887
--- /dev/null
+++ b/npm/site/pages/tools/picture-mode-maker/index.html
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+ GH Picture Mode Maker
+ {{ JS_SCRIPT }}
+
+
+
+
+
+
+
+ Picture Mode Maker
+ More Infos here!
+
+
+
color sheme: dark
+
color sheme: light, no color sheme
+
normal:
+
+
+
+ Generate
+
+
+
+
+ Made with ❤️ by Shadowdara
+
+
+
+
+
+
diff --git a/npm/site/pages/tools/picture-mode-maker/page.js b/npm/site/pages/tools/picture-mode-maker/page.js
new file mode 100644
index 00000000..69d4369e
--- /dev/null
+++ b/npm/site/pages/tools/picture-mode-maker/page.js
@@ -0,0 +1,20 @@
+// JS Code for creating Github README Pictures for both
+// ligth and Darkmode
+
+document.getElementById('generate').addEventListener("click", async function () {
+ const link1 = document.getElementById('link1')
+ const link2 = document.getElementById('link2')
+ const link3 = document.getElementById('link3')
+
+ const template_content = ` > `;
+
+ document.getElementById('output').innerText = template_content;
+
+ document.getElementById('copy-button').innerHTML = "Copy Link ";
+
+ document.getElementById('b-copy').addEventListener("click", async function () {
+ navigator.clipboard.writeText(template_content).then(function () {
+ document.getElementById("b-copy").innerText = "Link copied";
+ })
+ })
+});
diff --git a/npm/site/public/dependencies.txt b/npm/site/public/dependencies.txt
index 2ff0b247..6413ca85 100644
--- a/npm/site/public/dependencies.txt
+++ b/npm/site/public/dependencies.txt
@@ -59,6 +59,7 @@
@tailwindcss/oxide-win32-x64-msvc@4.3.3 -- MIT
@tailwindcss/oxide@4.3.3 -- MIT
@tailwindcss/vite@4.3.3 -- MIT
+@types/ejs@3.1.5 -- MIT
@types/eslint@8.56.12 -- MIT
@types/esrecurse@4.3.1 -- MIT
@types/estree@1.0.9 -- MIT
diff --git a/npm/site/src/components/extend.js b/npm/site/src/components/extend.js
new file mode 100644
index 00000000..4543767a
--- /dev/null
+++ b/npm/site/src/components/extend.js
@@ -0,0 +1,5 @@
+document.getElementById('generate_mul').addEventListener("click", function () {
+ const input = document.getElementById('input');
+ const content = formatTextTomultiLine(input.value);
+ do_copy(content)
+});
diff --git a/npm/site/src/components/format.js b/npm/site/src/components/format.js
new file mode 100644
index 00000000..a7113d30
--- /dev/null
+++ b/npm/site/src/components/format.js
@@ -0,0 +1,5 @@
+document.getElementById('generate_sin').addEventListener("click", function () {
+ const input1 = document.getElementById('input1');
+ const content = formatTextToSingleLine(input1.value);
+ do_copy(content)
+});
diff --git a/npm/site/src/components/main.js b/npm/site/src/components/main.js
new file mode 100644
index 00000000..c98e0aae
--- /dev/null
+++ b/npm/site/src/components/main.js
@@ -0,0 +1,26 @@
+function formatTextToSingleLine(text) {
+ let formattedText = text.replace(/\t/g, '\\t').replace(/\n/g, '\\n');
+ return formattedText;
+}
+
+function formatTextTomultiLine(text) {
+ let formattedText = text.replace(/\\t/g, '\t').replace(/\\n/g, '\n');
+ return formattedText;
+}
+
+function do_copy(content){
+ document.getElementById('output').innerText = content;
+
+ const copyButton = document.createElement("button");
+ copyButton.id = 'b-copy';
+ copyButton.innerText = 'Copy Text';
+
+ document.getElementById('copy-button').innerHTML = '';
+ document.getElementById('copy-button').appendChild(copyButton);
+
+ copyButton.addEventListener("click", function () {
+ navigator.clipboard.writeText(content).then(function () {
+ copyButton.innerText = "Textk copied";
+ })
+ });
+}
diff --git a/npm/site/src/components/projects.css b/npm/site/src/components/projects.css
new file mode 100644
index 00000000..3fc683dc
--- /dev/null
+++ b/npm/site/src/components/projects.css
@@ -0,0 +1,95 @@
+/* Google Font einbinden (im einfügen)
+
+*/
+
+:root {
+ --bg-color: #f5f7fa;
+ --text-color: #1a1a1a;
+ --card-bg: #ffffff;
+ --accent: #4f46e5;
+}
+
+/* Dark Mode automatisch erkennen */
+/*@media (prefers-color-scheme: dark) {
+ :root {
+ --bg-color: #0f172a;
+ --text-color: #e5e7eb;
+ --card-bg: #1e293b;
+ --accent: #6366f1;
+ }
+}*/
+
+body {
+ margin: 0;
+ font-family:
+ "Inter",
+ system-ui,
+ -apple-system,
+ sans-serif;
+ background-color: var(--bg-color);
+ color: var(--text-color);
+ line-height: 1.6;
+}
+
+/* Inhalt links & rechts begrenzen */
+.container {
+ max-width: 70%;
+ margin: 0 auto;
+ padding: 20px 20px;
+ /*border-radius: 10px;*/
+ /*background-color: var(--card-bg);*/
+}
+
+/* Karten Design */
+.card {
+ background: var(--card-bg);
+ padding: 2rem;
+ border-radius: 12px;
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.05);
+ margin-bottom: 2rem;
+ transition:
+ transform 0.2s ease,
+ box-shadow 0.2s ease;
+}
+
+.card:hover {
+ transform: translateY(-4px);
+ box-shadow: 0 12px 28px rgba(0, 0, 0, 0.1);
+}
+
+/* Buttons */
+button {
+ background: var(--accent);
+ color: white;
+ border: none;
+ padding: 0.75rem 1.5rem;
+ border-radius: 8px;
+ font-weight: 600;
+ cursor: pointer;
+ transition:
+ background 0.2s ease,
+ transform 0.1s ease;
+}
+
+button:hover {
+ transform: translateY(-2px);
+ opacity: 0.9;
+}
+
+/* Überschriften */
+h1,
+h2,
+h3 {
+ font-weight: 600;
+ margin-top: 0;
+}
+
+/* Links */
+a {
+ color: var(--accent);
+ text-decoration: none;
+}
+
+a:hover {
+ text-decoration: underline;
+}
diff --git a/npm/site/src/components/settings.js b/npm/site/src/components/settings.js
new file mode 100644
index 00000000..9194ab9e
--- /dev/null
+++ b/npm/site/src/components/settings.js
@@ -0,0 +1,74 @@
+let theme_mode = 1
+var mode = localStorage.getItem('mode')
+
+//
+
+const info_pop_up = `×
+
Shadowdara.github.io
+
+
`
+
+const infos = document.getElementById("infos");
+
+infos.innerHTML = info_pop_up
+
+switch_mode()
+
+const openBtn = document.getElementById("openInfoBtn");
+const closeBtn = document.querySelector(".closeBtn");
+
+openBtn.onclick = function () {
+ infos.style.display = "block";
+}
+
+closeBtn.onclick = function () {
+ infos.style.display = "none";
+}
+
+window.onclick = function (event) {
+ if (event.target == infos) {
+ infos.style.display = "none";
+ }
+}
+
+//
+
+if (mode == 'dark') {
+ theme_mode = 2
+ switch_mode()
+}
+
+function switch_mode() {
+ if (theme_mode == 1) {
+ document.documentElement.style.setProperty("--bg-color", "rgb(255, 255, 255)");
+ document.documentElement.style.setProperty("--bar-bg-color", "rgb(231, 231, 231)");
+ document.documentElement.style.setProperty("--text-color", "#000000");
+ document.documentElement.style.setProperty("--title-color", "rgb(0, 0, 0)");
+ document.documentElement.style.setProperty("--pp-title-color", "rgb(235, 90, 0)");
+ document.documentElement.style.setProperty("--pop-up-bg-color", "rgba(196, 196, 196, 1)");
+ document.getElementById("theme").innerText = "Light";
+ localStorage.setItem('mode', 'light');
+ }
+ else if (theme_mode == 2) {
+ document.documentElement.style.removeProperty("--bg-color");
+ document.documentElement.style.removeProperty("--bar-bg-color");
+ document.documentElement.style.removeProperty("--text-color");
+ document.documentElement.style.removeProperty("--title-color");
+ document.documentElement.style.removeProperty("--pp-title-color");
+ document.documentElement.style.removeProperty("--pop-up-bg-color");
+ document.getElementById("theme").innerText = "Dark";
+ localStorage.setItem('mode', 'dark');
+ }
+}
+
+document.getElementById('switch_theme').addEventListener("click", function () {
+ theme_mode += 1
+ if (theme_mode >= 3) {
+ theme_mode = 1
+ }
+ switch_mode()
+});
diff --git a/npm/site/src/components/style.css b/npm/site/src/components/style.css
new file mode 100644
index 00000000..8c55b125
--- /dev/null
+++ b/npm/site/src/components/style.css
@@ -0,0 +1,218 @@
+* {
+ box-sizing: border-box;
+}
+
+:root {
+ --bg-color: #1e1e2f;
+ --bar-bg-color: #191919;
+ --text-color: #ecf0f1;
+ --title-color: #e74c3c;
+ --pp-title-color: #ff4e3a;
+ --pop-up-bg-color: #2d2d51;
+}
+
+body {
+ margin: 0;
+ padding: 0;
+ background-color: var(--bg-color);
+ font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
+ color: var(--text-color);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ height: 100vh;
+ text-align: center;
+}
+
+header {
+ margin: 0px;
+ padding: 0.5rem;
+ top: 0;
+ position: fixed;
+ width: 100%;
+ background-color: var(--bar-bg-color);
+ text-align: right;
+}
+
+header p,
+header a {
+ display: inline;
+ font-size: 1.1rem;
+ margin: 0 5% auto;
+ color: var(--text-color);
+}
+
+footer {
+ margin: 0px;
+ padding: 0.5rem;
+ bottom: 0;
+ position: fixed;
+ width: 100%;
+ background-color: var(--bar-bg-color);
+}
+
+.container {
+ display: flex;
+ gap: 20px;
+ justify-content: center;
+}
+
+.container-box {
+ text-align: left;
+}
+
+header button {
+ all: unset;
+}
+
+h1 {
+ font-size: 3rem;
+ margin: 0;
+ color: var(--title-color);
+ word-break: break-all;
+}
+
+.title {
+ font-size: 6rem;
+}
+
+h4 {
+ margin: 10px 0;
+ font-style: italic;
+ color: #bdc3c7;
+}
+
+a {
+ margin-top: 20px;
+ color: #4a90e2;
+ text-decoration: none;
+ font-size: 1.2rem;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+p {
+ color: var(--text-color);
+ font-size: 1.3rem;
+}
+
+a {
+ font-size: 1.4rem;
+}
+
+input,
+textarea {
+ background-color: var(--bar-bg-color);
+ color: var(--text-color);
+}
+
+button {
+ border: none;
+ background-color: #575775;
+ color: var(--text-color);
+ font-size: 1.3rem;
+ padding: 13px 13px;
+ border-radius: 15px;
+}
+
+button:hover {
+ background-color: var(--bar-bg-color);
+}
+
+.modal {
+ display: none;
+ position: fixed;
+ z-index: 1000;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ background-color: rgba(0, 0, 0, 0.6);
+ backdrop-filter: blur(4px);
+ color: #000000;
+}
+
+.modal-content {
+ background-color: var(--pop-up-bg-color);
+ margin: 10% auto;
+ padding: 20px;
+ border-radius: 16px;
+ width: 400px;
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.3);
+ animation: slideDown 0.4s ease;
+}
+
+.modal-content h2 {
+ color: var(--pp-title-color);
+}
+
+.modal-content p,
+.modal-content a {
+ font-size: 1.4rem;
+ color: var(--text-color);
+}
+
+@keyframes slideDown {
+ from {
+ transform: translateY(-50px);
+ opacity: 0;
+ }
+
+ to {
+ transform: translateY(0);
+ opacity: 1;
+ }
+}
+
+.closeBtn {
+ float: right;
+ font-size: 24px;
+ font-weight: bold;
+ cursor: pointer;
+ color: #333;
+}
+
+.closeBtn:hover {
+ color: #e74c3c;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --bg-color: #1e1e2f;
+ --bar-bg-color: #191919;
+ --text-color: #ecf0f1;
+ --title-color: #e74c3c;
+ --pp-title-color: #ff4e3a;
+ --pop-up-bg-color: #2d2d51;
+ }
+
+ /*
+ a:hover {
+ color: #24c8db;
+ }
+
+ input,
+ button {
+ color: #ffffff;
+ background-color: #0f0f0f98;
+ }
+ button:active {
+ background-color: #0f0f0f69;
+ }
+ }*/
+}
+
+@media (max-width: 768px) {
+ .title {
+ font-size: 4rem;
+ }
+}
+
+@media (max-width: 480px) {
+ .title {
+ font-size: 2.6rem;
+ }
+}
diff --git a/npm/site/src/types/ejs.d.ts b/npm/site/src/types/ejs.d.ts
new file mode 100644
index 00000000..b3e8cd7d
--- /dev/null
+++ b/npm/site/src/types/ejs.d.ts
@@ -0,0 +1,7 @@
+declare module "ejs" {
+ const ejs: {
+ render: (template: string, data?: any, options?: { filename?: string }) => string;
+ };
+
+ export default ejs;
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 3c637b3f..18f9f698 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -144,6 +144,9 @@ importers:
'@tailwindcss/vite':
specifier: ^4.3.3
version: 4.3.3(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))
+ '@types/ejs':
+ specifier: ^3.1.5
+ version: 3.1.5
'@types/html-minifier-terser':
specifier: ^7.0.2
version: 7.0.2
@@ -1685,6 +1688,9 @@ packages:
'@ts-morph/common@0.27.0':
resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==}
+ '@types/ejs@3.1.5':
+ resolution: {integrity: sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==}
+
'@types/eslint@8.56.12':
resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==}
@@ -4232,7 +4238,7 @@ snapshots:
optionalDependencies:
'@types/react': 19.3.0
- '@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)':
+ '@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)':
dependencies:
'@better-auth/utils': 0.4.2
'@better-fetch/fetch': 1.3.1
@@ -4244,39 +4250,39 @@ snapshots:
nanostores: 1.5.3
zod: 4.6.2
- '@better-auth/drizzle-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
+ '@better-auth/drizzle-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
- '@better-auth/kysely-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(kysely@0.29.5)':
+ '@better-auth/kysely-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(kysely@0.29.5)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
optionalDependencies:
kysely: 0.29.5
- '@better-auth/memory-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
+ '@better-auth/memory-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
- '@better-auth/mongo-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
+ '@better-auth/mongo-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
- '@better-auth/prisma-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(prisma@6.19.3(typescript@5.7.3))':
+ '@better-auth/prisma-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(prisma@6.19.3(typescript@5.7.3))':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
optionalDependencies:
'@prisma/client': 6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3)
prisma: 6.19.3(typescript@5.7.3)
- '@better-auth/telemetry@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)':
+ '@better-auth/telemetry@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
'@better-fetch/fetch': 1.3.1
@@ -5155,6 +5161,8 @@ snapshots:
minimatch: 10.2.6
path-browserify: 1.0.1
+ '@types/ejs@3.1.5': {}
+
'@types/eslint@8.56.12':
dependencies:
'@types/estree': 1.0.9
@@ -5412,13 +5420,13 @@ snapshots:
better-auth@1.7.4(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(next@16.3.3(@babel/core@7.29.7)(@types/node@24.13.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(sass@1.104.1))(prisma@6.19.3(typescript@5.7.3))(react-dom@19.3.0(react@19.3.0))(react@19.3.0):
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
- '@better-auth/drizzle-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
- '@better-auth/kysely-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(kysely@0.29.5)
- '@better-auth/memory-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
- '@better-auth/mongo-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
- '@better-auth/prisma-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(prisma@6.19.3(typescript@5.7.3))
- '@better-auth/telemetry': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/drizzle-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
+ '@better-auth/kysely-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(kysely@0.29.5)
+ '@better-auth/memory-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
+ '@better-auth/mongo-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
+ '@better-auth/prisma-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(prisma@6.19.3(typescript@5.7.3))
+ '@better-auth/telemetry': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)
'@better-auth/utils': 0.4.2
'@better-fetch/fetch': 1.3.1
'@noble/ciphers': 2.4.0
From 392cdcfa85683a9a082b41d851a18d90874f596a Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 13:44:27 +0200
Subject: [PATCH 15/62] Bump version to v0.3.18 and add author fields
Raise the project version to 0.3.18 across the codebase (check.py, internal/finderversion/version.go, npm packages and root package.json). Add Author and Authors fields to the Folder struct and initialize them in NewFolder. Add a TypeScript v0_3_18 namespace in finder-lib including author/authors and related template types. Prepares repository for the 0.3.18 release and adds template author metadata support.
---
check.py | 2 +-
internal/finderversion/version.go | 2 +-
internal/structure/folderstruct.go | 6 +++-
npm/finder-lib/package.json | 2 +-
npm/finder-lib/src/index.ts | 50 ++++++++++++++++++++++++++++++
npm/hub/package.json | 2 +-
npm/site/package.json | 2 +-
package.json | 1 +
8 files changed, 61 insertions(+), 6 deletions(-)
diff --git a/check.py b/check.py
index c324a8e8..3d3792f8 100644
--- a/check.py
+++ b/check.py
@@ -2,7 +2,7 @@
from pathlib import Path
-MIN_VERSION = "0.3.17"
+MIN_VERSION = "0.3.18"
# Ordner, in dem dieses Script liegt
folder = Path(__file__).parent / "templates"
diff --git a/internal/finderversion/version.go b/internal/finderversion/version.go
index 5bde75d4..443b0057 100644
--- a/internal/finderversion/version.go
+++ b/internal/finderversion/version.go
@@ -1,5 +1,5 @@
package finderversion
// Version for the Program
-const Version = "0.3.17"
+const Version = "0.3.18"
const BuildTime = "September 2026"
diff --git a/internal/structure/folderstruct.go b/internal/structure/folderstruct.go
index e82e151d..a26450c3 100644
--- a/internal/structure/folderstruct.go
+++ b/internal/structure/folderstruct.go
@@ -28,7 +28,9 @@ type Folder struct {
// including newlines, is collapsed to single spaces) so arbitrary
// content survives plain-JSON serialization. Displayed e.g. in the web
// interface / community template hub.
- MarkdownNote string `json:"mdnote,omitempty"`
+ MarkdownNote string `json:"mdnote,omitempty"`
+ Author string `json:"author,omitempty"`
+ Authors []string `json:"authors,omitempty"`
}
// NewFolder constructs a minimal Folder instance with reasonable defaults.
@@ -44,6 +46,8 @@ func NewFolder(foldername string) Folder {
Tags: []string{},
DataSize: NewSize(),
MarkdownNote: "",
+ Author: "",
+ Authors: []string{},
}
}
diff --git a/npm/finder-lib/package.json b/npm/finder-lib/package.json
index d9804460..c89dbf40 100644
--- a/npm/finder-lib/package.json
+++ b/npm/finder-lib/package.json
@@ -1,6 +1,6 @@
{
"name": "@shadowdara/finder-lib",
- "version": "0.3.17",
+ "version": "0.3.18",
"description": "lib to parse finder templates in TS",
"scripts": {
"build": "tsc"
diff --git a/npm/finder-lib/src/index.ts b/npm/finder-lib/src/index.ts
index 7f5ff86b..3b90a58c 100644
--- a/npm/finder-lib/src/index.ts
+++ b/npm/finder-lib/src/index.ts
@@ -232,4 +232,54 @@ export namespace versions {
export type SizeType = "B" | "KB" | "MB" | "GB";
}
+
+ /// Version v0.3.18
+ export namespace v0_3_18 {
+ export interface Template {
+ min_version?: string;
+ description?: string;
+ tags?: string[];
+ name: string;
+ folders?: Folder[];
+ files?: File[] | string[];
+ command?: string;
+ invert_command?: boolean;
+ size?: Size;
+ mdnote?: string;
+ author?: string;
+ authors?: string[];
+ }
+
+ export interface Folder {
+ name: string;
+ folders?: Folder[];
+ files?: File[] | string[];
+ command?: string;
+ invert_command?: boolean;
+ size?: Size;
+ }
+
+ export interface File {
+ name: string;
+ existence?: Existence;
+ size?: Size;
+ checksums?: Checksums;
+ }
+
+ export interface Size {
+ min?: number;
+ max?: number;
+ min_size_type?: SizeType;
+ max_size_type?: SizeType;
+ }
+
+ export interface Checksums {
+ sha256?: string;
+ sha512?: string;
+ }
+
+ export type Existence = "required" | "forbidden" | "optional";
+
+ export type SizeType = "B" | "KB" | "MB" | "GB";
+ }
}
diff --git a/npm/hub/package.json b/npm/hub/package.json
index 73c87494..4a4df930 100644
--- a/npm/hub/package.json
+++ b/npm/hub/package.json
@@ -1,6 +1,6 @@
{
"name": "my-project",
- "version": "0.3.17",
+ "version": "0.3.18",
"private": true,
"scripts": {
"dev": "next dev",
diff --git a/npm/site/package.json b/npm/site/package.json
index 584a8af9..6a7b2fef 100644
--- a/npm/site/package.json
+++ b/npm/site/package.json
@@ -1,7 +1,7 @@
{
"name": "finder-template-generator",
"private": true,
- "version": "0.3.17",
+ "version": "0.3.18",
"type": "module",
"license": "arr for now, i'll change it later when i decide it",
"scripts": {
diff --git a/package.json b/package.json
index 47a2c871..d548c784 100644
--- a/package.json
+++ b/package.json
@@ -6,6 +6,7 @@
"build": "pnpm --filter web build",
"stats": "pnpx linguist-js"
},
+ "version": "0.3.18",
"devDependencies": {
"@shadowdara/linguist-js": "*",
"@shadowdara/seg": "0.2.4"
From 01a264487aa97eabf3d7b6706b7a1b512e1f1238 Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 13:51:55 +0200
Subject: [PATCH 16/62] Exclude build-data modules from page bundles
This change prevents *.build.* modules from being treated as client pages or injected script sources, avoiding accidental bundling in Liquid/EJS pages. It also adds the lucide dependency and refreshes generated site metadata and dependency snapshots.
---
npm/site/data/backend.json | 23 ++++------
npm/site/package.json | 1 +
npm/site/pages-ssg-plugin.ts | 74 +++++++++++++++++++-------------
npm/site/public/dependencies.txt | 2 +-
pnpm-lock.yaml | 8 ++++
5 files changed, 62 insertions(+), 46 deletions(-)
diff --git a/npm/site/data/backend.json b/npm/site/data/backend.json
index 076fde5f..911b3914 100644
--- a/npm/site/data/backend.json
+++ b/npm/site/data/backend.json
@@ -1,23 +1,23 @@
{
- "generatedAt": "2026-09-14T11:34:39.009Z",
+ "generatedAt": "2026-09-14T11:49:03.816Z",
"total": {
- "files": 69,
- "bytes": 351109,
- "kilobytes": 342.88,
+ "files": 68,
+ "bytes": 350917,
+ "kilobytes": 342.69,
"megabytes": 0.33
},
"byExtension": [
{
"extension": ".js",
- "files": 28,
- "bytes": 276004,
- "percentage": 78.61
+ "files": 27,
+ "bytes": 275812,
+ "percentage": 78.6
},
{
"extension": ".css",
"files": 15,
"bytes": 56648,
- "percentage": 16.13
+ "percentage": 16.14
},
{
"extension": ".txt",
@@ -86,7 +86,7 @@
{
"path": "assets/main_entry.js",
"extension": ".js",
- "bytes": 8971
+ "bytes": 8844
},
{
"path": "assets/viewer.js",
@@ -368,11 +368,6 @@
"extension": ".html",
"bytes": 88
},
- {
- "path": "assets/page.build.js",
- "extension": ".js",
- "bytes": 65
- },
{
"path": "assets/page.js",
"extension": ".js",
diff --git a/npm/site/package.json b/npm/site/package.json
index 6a7b2fef..3f204c1a 100644
--- a/npm/site/package.json
+++ b/npm/site/package.json
@@ -54,6 +54,7 @@
"highlight.js": "^11.12.0",
"jquery": "^4.0.0",
"liquidjs": "^10.29.0",
+ "lucide": "^1.45.0",
"tellraw-parser": "^1.0.2"
}
}
diff --git a/npm/site/pages-ssg-plugin.ts b/npm/site/pages-ssg-plugin.ts
index fb65d262..7bd6a60a 100644
--- a/npm/site/pages-ssg-plugin.ts
+++ b/npm/site/pages-ssg-plugin.ts
@@ -32,6 +32,15 @@ const RESOLVED_DATA_PREFIX = "\0" + DATA_PREFIX;
*/
const LIQUID_SCRIPT_PLACEHOLDER = "__PAGES_LIQUID_JS_SCRIPT__";
+/**
+ * Build-data modules (`page.build.ts`, `index.build.tsx`, …) run only at
+ * build time via `loadBuildData()`. They must never become a client page
+ * or land in the production bundle.
+ */
+function isBuildDataFile(filePath: string): boolean {
+ return /\.build\.[^.]+$/i.test(path.basename(filePath));
+}
+
/**
* Escape `<...>` sequences that are NOT valid HTML tags, so the output can
* safely pass through `html-minifier-terser` (which uses a strict HTML
@@ -234,9 +243,8 @@ interface PageEntry {
buildData?: unknown;
/**
- * Liquid only: the `page.[tj]s` file next to the `.html` template that
- * is built and injected where `{{ JS_SCRIPT }}` appears in the rendered
- * output. Falls back to the `page.build.[tj]s` data file.
+ * Liquid/EJS only: the client `page.[tj]s` next to the template, injected
+ * where `{{ JS_SCRIPT }}` appears. Never a `*.build.[tj]s` data module.
*/
scriptSource?: string;
}
@@ -497,13 +505,9 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
}
// Build-data modules (page.build.ts / page.build.js / ...) are not
- // pages themselves — they only feed data into their sibling page.
- // Exclude anything that contains `.build.` before the extension.
- // Examples:
- // - page.build.ts
- // - page.build.js
- // - nested/page.build.tsx
- if (/\.build\.[^.]+$/i.test(entry.name)) {
+ // pages themselves — they only feed data into their sibling page
+ // and must not be scanned as client entries.
+ if (isBuildDataFile(entry.name)) {
continue;
}
@@ -584,16 +588,18 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
}
const baseName = file.slice(0, -".html".length);
- const scriptSource =
- [".ts", ".tsx", ".js", ".jsx"]
- .map((ext) => baseName + ext)
- .find((candidate) => fs.existsSync(candidate)) ?? buildFile;
+ const scriptSource = [".ts", ".tsx", ".js", ".jsx"]
+ .map((ext) => baseName + ext)
+ .find(
+ (candidate) =>
+ fs.existsSync(candidate) && !isBuildDataFile(candidate),
+ );
liquidPages.push({
id,
source: file,
type: "liquid",
- scriptSource,
+ ...(scriptSource ? { scriptSource } : {}),
styles: options.styles?.[id] ?? [],
});
}
@@ -624,16 +630,18 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
}
const baseName = file.slice(0, -".ejs".length);
- const scriptSource =
- [".ts", ".tsx", ".js", ".jsx"]
- .map((ext) => baseName + ext)
- .find((candidate) => fs.existsSync(candidate)) ?? buildFile;
+ const scriptSource = [".ts", ".tsx", ".js", ".jsx"]
+ .map((ext) => baseName + ext)
+ .find(
+ (candidate) =>
+ fs.existsSync(candidate) && !isBuildDataFile(candidate),
+ );
liquidPages.push({
id,
source: file,
type: "ejs",
- scriptSource,
+ ...(scriptSource ? { scriptSource } : {}),
styles: options.styles?.[id] ?? [],
});
}
@@ -708,11 +716,10 @@ export function pagesPlugin(options: PagesPluginOptions = {}): Plugin {
* client-side entry in the pages map (which would bloat the
* main bundle). */
if (page.type === "liquid" || page.type === "ejs") {
- // Liquid/EJS: Der page.scriptSource wird als eigenständige Seite (component)
- // behandelt, damit es durch Vite/Rollup gebündelt wird.
- // Hinweis: die HTML selbst wird weiter als Asset emittiert.
- if (page.scriptSource) {
- const scriptId = `__pages_script__:${page.id}`;
+ // Client scripts (`page.[tj]s`) are bundled separately and injected
+ // via `{{ JS_SCRIPT }}`. Build-data modules must not be imported
+ // here — that would pull them into the production bundle.
+ if (page.scriptSource && !isBuildDataFile(page.scriptSource)) {
return ` ${JSON.stringify(page.id)}: {
id: ${JSON.stringify(page.id)},
type: "component",
@@ -1115,11 +1122,12 @@ ${ctx.content}
* the page module (`page.[tj]s`) through the dev server.
*/
if (page.type === "liquid") {
- const scriptTag = page.scriptSource
- ? ``
- : "";
+ const scriptTag =
+ page.scriptSource && !isBuildDataFile(page.scriptSource)
+ ? ``
+ : "";
// Liquid pages are standalone: serve the rendered content as-is,
// without wrapping it in the default HTML shell.
@@ -1344,7 +1352,11 @@ ${ctx.content}
if (page.type === "liquid") {
let scriptTagForContent = "";
- if (page.scriptSource && fs.existsSync(page.scriptSource)) {
+ if (
+ page.scriptSource &&
+ !isBuildDataFile(page.scriptSource) &&
+ fs.existsSync(page.scriptSource)
+ ) {
const scriptSourceCode = fs.readFileSync(page.scriptSource, "utf8");
const scriptExtension = path
diff --git a/npm/site/public/dependencies.txt b/npm/site/public/dependencies.txt
index 6413ca85..829ab2f9 100644
--- a/npm/site/public/dependencies.txt
+++ b/npm/site/public/dependencies.txt
@@ -154,7 +154,7 @@ fast-levenshtein@2.0.6 -- MIT
fdir@6.5.0 -- MIT
file-entry-cache@8.0.0 -- MIT
find-up@5.0.0 -- MIT
-finder-template-generator@0.3.17 -- UNLICENSED
+finder-template-generator@0.3.18 -- UNLICENSED
flat-cache@4.0.1 -- MIT
flatted@3.4.4 -- ISC
fs.realpath@1.0.0 -- ISC
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 18f9f698..d8c51f44 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -131,6 +131,9 @@ importers:
liquidjs:
specifier: ^10.29.0
version: 10.29.0
+ lucide:
+ specifier: ^1.45.0
+ version: 1.45.0
tellraw-parser:
specifier: ^1.0.2
version: 1.0.2
@@ -3034,6 +3037,9 @@ packages:
peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ lucide@1.45.0:
+ resolution: {integrity: sha512-Paze7TONAGAOSwg2qh2GXY0zkNY6p4+E6BTthwyY6LpVQnqcpV73jtY9UtAZeMfDiZpevZhKINpLu4WeahOXyw==}
+
magic-string@0.30.21:
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
@@ -6459,6 +6465,8 @@ snapshots:
dependencies:
react: 19.3.0
+ lucide@1.45.0: {}
+
magic-string@0.30.21:
dependencies:
'@jridgewell/sourcemap-codec': 1.6.0
From 61f4f66845415d51630d8c9c52a593126900c540 Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 14:02:21 +0200
Subject: [PATCH 17/62] rename
---
npm/site/pages/tools/picture-mode-maker/{index.html => page.html} | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename npm/site/pages/tools/picture-mode-maker/{index.html => page.html} (100%)
diff --git a/npm/site/pages/tools/picture-mode-maker/index.html b/npm/site/pages/tools/picture-mode-maker/page.html
similarity index 100%
rename from npm/site/pages/tools/picture-mode-maker/index.html
rename to npm/site/pages/tools/picture-mode-maker/page.html
From 369bf4561da7cf05df7d6ecaf695c83cdc84e9a4 Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 14:09:47 +0200
Subject: [PATCH 18/62] Update CHANGELOG.md
---
CHANGELOG.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0c48cb65..2cf09beb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,7 +13,7 @@ _The whole finder CHANGELOG_
- updated the regex creator
- fixed a bug in the argparser lib where global flag where not found in subcommands
-### Commits
+Commits
- _[8e63902](https://github.com/shadowdara/finder/tree/8e6390298c29bfeb6984a7e40190cb6eaa6d3350)_ Update frontend assets, templates & deps
Regenerate frontend/site assets and metadata: update cmd/findergen frontend main_entry.js (changelog/docs/markdown additions), bump lightningcss to 1.33 in dependency lists, and refresh generated site stats (npm/site/data/backend.json and gh-pages.json). Also update templates index (npm/site/src/templates.js) to add min_version/tags for many templates. These changes reflect a site build and template metadata refresh.
@@ -245,6 +245,8 @@ Improves flexibility for file-extension and substring matching and allows saving
- _[c41219a](https://github.com/shadowdara/finder/tree/c41219ae4b2326a88abdd3c7c15627f179b0ed4e)_ add csf
+
+
## 0.3.16 - 08.09.2026
- added cache creation
From 009867baebb65dc577d05c8f791cf4a50e6100cb Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 14:11:22 +0200
Subject: [PATCH 19/62] Update CHANGELOG.md
---
CHANGELOG.md | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2cf09beb..fb8cb07f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,12 @@
_The whole finder CHANGELOG_
-## Newest prob 0.3.17
+## Newest
+
+- added Author field to finder templates
+- added a subcommand to validate templates
+
+## 0.3.17 - 13.09.2026
- added regex support
- added mcapp minecraft world dashboard
From eefd1724f88b60d8acfd6ad953ad03d453a04eaf Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 14:12:13 +0200
Subject: [PATCH 20/62] Update docker-compose.yml
---
docker-compose.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/docker-compose.yml b/docker-compose.yml
index c3f194b6..257fdd55 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -67,13 +67,13 @@ services:
build:
context: .
dockerfile: docker/test-install/Dockerfile
- container_name: test-install
+ # container_name: test-install
test-install-ubuntu:
build:
context: .
dockerfile: docker/test-install-ubuntu/Dockerfile
- container_name: test-install
+ # container_name: test-install
# Saved Data
volumes:
From 52fa1543de3308af0d2858a7deae2fba33bde926 Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 14:13:37 +0200
Subject: [PATCH 21/62] Create lol.json5
---
registry/lol.json5 | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 registry/lol.json5
diff --git a/registry/lol.json5 b/registry/lol.json5
new file mode 100644
index 00000000..3ee8e2c1
--- /dev/null
+++ b/registry/lol.json5
@@ -0,0 +1,4 @@
+{
+ "name": "*",
+ "description": "this is a test"
+}
\ No newline at end of file
From 771c84585262177e849894f80ee39ad42ec4c482 Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 14:26:47 +0200
Subject: [PATCH 22/62] Add filepkg package for file-based assets
Introduce pub/filepkg: a small library to manage single files by URL with a Lockfile. Provides Manager, File and Lockfile types plus operations: Add, Remove, Install, Sync, Pull, Check, Verify, Diff and IsLocked. Implements HTTP downloads, SHA-256 verification, atomic lockfile writes and path validation. Adds unit tests covering download, hash verification, sync/pull, diff, check and error cases. Files added: download.go, filepkg.go, manage.go, filepkg_test.go.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---
pub/filepkg/download.go | 148 ++++++++++++++++++
pub/filepkg/filepkg.go | 205 +++++++++++++++++++++++++
pub/filepkg/filepkg_test.go | 297 ++++++++++++++++++++++++++++++++++++
pub/filepkg/manage.go | 210 +++++++++++++++++++++++++
4 files changed, 860 insertions(+)
create mode 100644 pub/filepkg/download.go
create mode 100644 pub/filepkg/filepkg.go
create mode 100644 pub/filepkg/filepkg_test.go
create mode 100644 pub/filepkg/manage.go
diff --git a/pub/filepkg/download.go b/pub/filepkg/download.go
new file mode 100644
index 00000000..92ab717b
--- /dev/null
+++ b/pub/filepkg/download.go
@@ -0,0 +1,148 @@
+package filepkg
+
+import (
+ "context"
+ "crypto/sha256"
+ "encoding/hex"
+ "fmt"
+ "io"
+ "net/http"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+// hashFile berechnet den SHA-256-Hash einer Datei.
+func hashFile(path string) (string, error) {
+ f, err := os.Open(path)
+ if err != nil {
+ return "", err
+ }
+ defer f.Close()
+ h := sha256.New()
+ if _, err := io.Copy(h, f); err != nil {
+ return "", err
+ }
+ return hex.EncodeToString(h.Sum(nil)), nil
+}
+
+// download lädt eine URL herunter und schreibt sie in den Zielpfad.
+// Bei einem nicht-2xx-Status wird ein Fehler zurückgegeben.
+func (m *Manager) download(ctx context.Context, url, target string) error {
+ req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
+ if err != nil {
+ return fmt.Errorf("filepkg: Request für %s: %w", url, err)
+ }
+ resp, err := m.client().Do(req)
+ if err != nil {
+ return fmt.Errorf("filepkg: Download %s: %w", url, err)
+ }
+ defer resp.Body.Close()
+
+ if resp.StatusCode < 200 || resp.StatusCode > 299 {
+ return fmt.Errorf("filepkg: Download %s: HTTP %s", url, resp.Status)
+ }
+
+ if err := os.MkdirAll(filepath.Dir(target), 0o755); err != nil {
+ return fmt.Errorf("filepkg: Verzeichnis für %s anlegen: %w", target, err)
+ }
+
+ out, err := os.Create(target)
+ if err != nil {
+ return fmt.Errorf("filepkg: Datei %s anlegen: %w", target, err)
+ }
+ defer out.Close()
+
+ if _, err := io.Copy(out, resp.Body); err != nil {
+ return fmt.Errorf("filepkg: Datei %s schreiben: %w", target, err)
+ }
+ return nil
+}
+
+// syncOne lädt eine einzelne Datei herunter, verifiziert optional
+// den Hash und gibt den tatsächlichen Hash zurück.
+func (m *Manager) syncOne(ctx context.Context, f File) (string, error) {
+ if err := f.Validate(); err != nil {
+ return "", err
+ }
+ if err := m.ensureDir(); err != nil {
+ return "", err
+ }
+ target, err := m.TargetPath(f)
+ if err != nil {
+ return "", err
+ }
+ if err := m.download(ctx, f.URL, target); err != nil {
+ return "", err
+ }
+ hash, err := hashFile(target)
+ if err != nil {
+ return "", fmt.Errorf("filepkg: Hash von %s: %w", target, err)
+ }
+ if f.SHA256 != "" && !strings.EqualFold(f.SHA256, hash) {
+ _ = os.Remove(target)
+ return "", fmt.Errorf("filepkg: Hash-Mismatch für %s: erwartet %s, erhalten %s", f.Name, f.SHA256, hash)
+ }
+ return hash, nil
+}
+
+// Sync lädt alle Dateien in der Lockfile herunter, verifiziert
+// Hashes und schreibt eine aktualisierte Lockfile zurück (inkl.
+// neu berechneter Hashes). Fehlt die Lockfile, passiert nichts.
+func (m *Manager) Sync(ctx context.Context) (*Lockfile, error) {
+ lf, err := m.LoadLock()
+ if err != nil {
+ return nil, err
+ }
+ if len(lf.Files) == 0 {
+ return lf, nil
+ }
+ if err := m.ensureDir(); err != nil {
+ return nil, err
+ }
+ for i := range lf.Files {
+ f := &lf.Files[i]
+ hash, err := m.syncOne(ctx, *f)
+ if err != nil {
+ return lf, fmt.Errorf("filepkg: Sync %s: %w", f.Name, err)
+ }
+ f.SHA256 = hash
+ }
+ if err := m.SaveLock(lf); err != nil {
+ return lf, err
+ }
+ return lf, nil
+}
+
+// Pull lädt genau eine Datei herunter. Wenn die Datei bereits
+// existiert und der Hash aus der Lockfile stimmt, wird übersprungen.
+// Der berechnete Hash wird in der Lockfile aktualisiert.
+func (m *Manager) Pull(ctx context.Context, name string) (File, error) {
+ lf, err := m.LoadLock()
+ if err != nil {
+ return File{}, err
+ }
+ f, ok := lf.Get(name)
+ if !ok {
+ return File{}, fmt.Errorf("filepkg: %q ist nicht in der Lockfile", name)
+ }
+ target, err := m.TargetPath(f)
+ if err != nil {
+ return File{}, err
+ }
+ if current, err := hashFile(target); err == nil && f.SHA256 != "" && strings.EqualFold(current, f.SHA256) {
+ return f, nil // bereits aktuell
+ }
+ hash, err := m.syncOne(ctx, f)
+ if err != nil {
+ return f, err
+ }
+ if f.SHA256 != hash {
+ f.SHA256 = hash
+ lf.Upsert(f)
+ if err := m.SaveLock(lf); err != nil {
+ return f, err
+ }
+ }
+ return f, nil
+}
diff --git a/pub/filepkg/filepkg.go b/pub/filepkg/filepkg.go
new file mode 100644
index 00000000..72faaea3
--- /dev/null
+++ b/pub/filepkg/filepkg.go
@@ -0,0 +1,205 @@
+// Package filepkg ist eine kleine Library für dateibasiertes
+// Package-Management: einzelne Dateien werden per URL gepullt,
+// per SHA-256 verifiziert und in einer Lockfile nachverfolgt.
+//
+// Im Gegensatz zu klassischen Package-Managern (npm, go modules)
+// arbeitet filepkg nicht mit Verzeichnissen, sondern mit einzelnen
+// Dateien: jede Datei hat eine Quelle (URL) und ein Ziel (localer
+// Name/relativer Pfad). Die Lockfile speichert Quelle, Ziel und
+// Hash, sodass ein deterministisches "Installieren"/"Syncen"
+// möglich ist.
+//
+// Beispiel:
+//
+// m := filepkg.New("vendor", "filepkg.lock.json")
+// m.Add(filepkg.File{Name: "prettier.js", URL: "https://.../prettier.js"})
+// m.Sync(ctx) // lädt alle Dateien aus der Lockfile
+package filepkg
+
+import (
+ "encoding/json"
+ "fmt"
+ "net/http"
+ "os"
+ "path/filepath"
+ "strings"
+ "time"
+)
+
+// LockfileVersion ist die aktuelle Version des Lockfile-Formats.
+const LockfileVersion = 1
+
+// File beschreibt eine einzelne zu verwaltende Datei.
+// Der Name ist der lokale Dateiname (relativ zu Manager.Dir),
+// die URL die Quelle, von der die Datei gepullt wird.
+type File struct {
+ // Name ist der lokale Dateiname bzw. relative Pfad unterhalb von Dir.
+ Name string `json:"name"`
+ // URL ist die Quelle, von der die Datei heruntergeladen wird.
+ URL string `json:"url"`
+ // SHA256 ist der erwartete Hash der Datei. Wenn gesetzt, wird
+ // nach dem Download verifiziert — bei Abweichung wird die Datei
+ // verworfen und ein Fehler zurückgegeben.
+ SHA256 string `json:"sha256,omitempty"`
+ // Version ist eine optionale, freie Versionsangabe.
+ Version string `json:"version,omitempty"`
+ // Tags sind optionale Kategorien.
+ Tags []string `json:"tags,omitempty"`
+}
+
+// Validate prüft, ob die File-Angabe minimal sinnvoll ist.
+func (f File) Validate() error {
+ if strings.TrimSpace(f.Name) == "" {
+ return fmt.Errorf("filepkg: Name darf nicht leer sein")
+ }
+ if strings.Contains(f.Name, "..") {
+ return fmt.Errorf("filepkg: Name %q darf kein '..' enthalten", f.Name)
+ }
+ if strings.TrimSpace(f.URL) == "" {
+ return fmt.Errorf("filepkg: URL für %q darf nicht leer sein", f.Name)
+ }
+ return nil
+}
+
+// Lockfile ist das auf der Platte gespeicherte Abbild aller
+// verwalteten Dateien.
+type Lockfile struct {
+ Version int `json:"version"`
+ Files []File `json:"files"`
+}
+
+// Get liefert das File mit dem Namen name, oder ok=false.
+func (lf *Lockfile) Get(name string) (File, bool) {
+ for _, f := range lf.Files {
+ if f.Name == name {
+ return f, true
+ }
+ }
+ return File{}, false
+}
+
+// Has prüft, ob ein File mit dem Namen name existiert.
+func (lf *Lockfile) Has(name string) bool {
+ _, ok := lf.Get(name)
+ return ok
+}
+
+// Upsert setzt ein File (überschreibt, wenn der Name existiert).
+func (lf *Lockfile) Upsert(f File) {
+ for i := range lf.Files {
+ if lf.Files[i].Name == f.Name {
+ lf.Files[i] = f
+ return
+ }
+ }
+ lf.Files = append(lf.Files, f)
+}
+
+// Remove entfernt ein File anhand des Namens.
+func (lf *Lockfile) Remove(name string) bool {
+ for i := range lf.Files {
+ if lf.Files[i].Name == name {
+ lf.Files = append(lf.Files[:i], lf.Files[i+1:]...)
+ return true
+ }
+ }
+ return false
+}
+
+// Manager ist der zentrale Einstiegspunkt der Library.
+type Manager struct {
+ // Dir ist das Verzeichnis, in das Dateien abgelegt werden.
+ Dir string
+ // LockPath ist der Pfad zur Lockfile.
+ LockPath string
+ // Client ist der HTTP-Client für Downloads. Wenn nil, wird
+ // ein Default-Client mit Timeout verwendet.
+ Client *http.Client
+
+ // Sicherstellen, dass Dir beim ersten Zugriff existiert.
+ ensureDirOnce bool
+}
+
+// New erzeugt einen Manager. Der Ordner für Dir wird bei Bedarf
+// beim ersten Download angelegt.
+func New(dir, lockPath string) *Manager {
+ return &Manager{Dir: dir, LockPath: lockPath}
+}
+
+// DefaultClient liefert einen HTTP-Client mit Timeout.
+func DefaultClient() *http.Client {
+ return &http.Client{Timeout: 5 * time.Minute}
+}
+
+// client liefert den konfigurierten Client oder einen Default.
+func (m *Manager) client() *http.Client {
+ if m.Client != nil {
+ return m.Client
+ }
+ return DefaultClient()
+}
+
+// ensureDir legt das Zielverzeichnis an, falls nötig.
+func (m *Manager) ensureDir() error {
+ if m.Dir == "" {
+ return fmt.Errorf("filepkg: Manager.Dir ist nicht gesetzt")
+ }
+ if m.ensureDirOnce {
+ _, err := os.Stat(m.Dir)
+ if err == nil {
+ return nil
+ }
+ }
+ if err := os.MkdirAll(m.Dir, 0o755); err != nil {
+ return fmt.Errorf("filepkg: Verzeichnis %s anlegen: %w", m.Dir, err)
+ }
+ m.ensureDirOnce = true
+ return nil
+}
+
+// TargetPath liefert den absoluten Zielpfad für eine Datei.
+func (m *Manager) TargetPath(f File) (string, error) {
+ if err := f.Validate(); err != nil {
+ return "", err
+ }
+ return filepath.Join(m.Dir, filepath.FromSlash(f.Name)), nil
+}
+
+// LoadLock liest die Lockfile ein. Fehlt die Datei, wird eine
+// leere Lockfile (Version 1) zurückgegeben.
+func (m *Manager) LoadLock() (*Lockfile, error) {
+ data, err := os.ReadFile(m.LockPath)
+ if os.IsNotExist(err) {
+ return &Lockfile{Version: LockfileVersion}, nil
+ }
+ if err != nil {
+ return nil, fmt.Errorf("filepkg: Lockfile %s lesen: %w", m.LockPath, err)
+ }
+ var lf Lockfile
+ if err := json.Unmarshal(data, &lf); err != nil {
+ return nil, fmt.Errorf("filepkg: Lockfile %s parsen: %w", m.LockPath, err)
+ }
+ if lf.Version == 0 {
+ lf.Version = LockfileVersion
+ }
+ return &lf, nil
+}
+
+// SaveLock schreibt die Lockfile atomar (Temp-Datei + Rename).
+func (m *Manager) SaveLock(lf *Lockfile) error {
+ if lf.Version == 0 {
+ lf.Version = LockfileVersion
+ }
+ data, err := json.MarshalIndent(lf, "", " ")
+ if err != nil {
+ return fmt.Errorf("filepkg: Lockfile serialisieren: %w", err)
+ }
+ tmp := m.LockPath + ".tmp"
+ if err := os.WriteFile(tmp, data, 0o644); err != nil {
+ return fmt.Errorf("filepkg: Lockfile %s schreiben: %w", tmp, err)
+ }
+ if err := os.Rename(tmp, m.LockPath); err != nil {
+ return fmt.Errorf("filepkg: Lockfile %s verschieben: %w", m.LockPath, err)
+ }
+ return nil
+}
diff --git a/pub/filepkg/filepkg_test.go b/pub/filepkg/filepkg_test.go
new file mode 100644
index 00000000..843be1c3
--- /dev/null
+++ b/pub/filepkg/filepkg_test.go
@@ -0,0 +1,297 @@
+package filepkg
+
+import (
+ "context"
+ "net/http"
+ "net/http/httptest"
+ "os"
+ "path/filepath"
+ "strings"
+ "testing"
+)
+
+// newTestServer liefert einen HTTP-Testserver, der für jede URL
+// den Inhalt "hello world\n" ausliefert.
+func newTestServer(t *testing.T) *httptest.Server {
+ t.Helper()
+ return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Write([]byte("hello world\n"))
+ }))
+}
+
+// setup erzeugt ein temporäres Verzeichnis und einen Manager.
+func setup(t *testing.T) (*Manager, string) {
+ t.Helper()
+ dir := t.TempDir()
+ m := New(filepath.Join(dir, "vendor"), filepath.Join(dir, "filepkg.lock.json"))
+ return m, dir
+}
+
+func TestAddAndLock(t *testing.T) {
+ m, _ := setup(t)
+ srv := newTestServer(t)
+ defer srv.Close()
+
+ err := m.Add(File{Name: "hello.txt", URL: srv.URL + "/hello.txt"})
+ if err != nil {
+ t.Fatalf("Add: %v", err)
+ }
+
+ lf, err := m.LoadLock()
+ if err != nil {
+ t.Fatalf("LoadLock: %v", err)
+ }
+ if len(lf.Files) != 1 {
+ t.Fatalf("erwartete 1 Datei, habe %d", len(lf.Files))
+ }
+ if lf.Files[0].Name != "hello.txt" {
+ t.Fatalf("falscher Name: %q", lf.Files[0].Name)
+ }
+}
+
+func TestPullDownloadAndHash(t *testing.T) {
+ m, _ := setup(t)
+ srv := newTestServer(t)
+ defer srv.Close()
+
+ // Zuerst ohne Hash adden und pullen → Hash wird ergänzt.
+ err := m.Add(File{Name: "hello.txt", URL: srv.URL + "/hello.txt"})
+ if err != nil {
+ t.Fatalf("Add: %v", err)
+ }
+ f, err := m.Pull(context.Background(), "hello.txt")
+ if err != nil {
+ t.Fatalf("Pull: %v", err)
+ }
+ if f.SHA256 == "" {
+ t.Fatal("Hash wurde nicht berechnet")
+ }
+
+ target, _ := m.TargetPath(f)
+ data, err := os.ReadFile(target)
+ if err != nil {
+ t.Fatalf("Datei lesen: %v", err)
+ }
+ if string(data) != "hello world\n" {
+ t.Fatalf("Inhalt falsch: %q", string(data))
+ }
+
+ // Hash muss in der Lockfile stehen.
+ lf, _ := m.LoadLock()
+ if lf.Files[0].SHA256 != f.SHA256 {
+ t.Fatalf("Hash nicht gespeichert: %q != %q", lf.Files[0].SHA256, f.SHA256)
+ }
+}
+
+func TestSync(t *testing.T) {
+ m, _ := setup(t)
+ srv := newTestServer(t)
+ defer srv.Close()
+
+ err := m.Add(File{Name: "a.txt", URL: srv.URL + "/a.txt"})
+ if err != nil {
+ t.Fatalf("Add a: %v", err)
+ }
+ err = m.Add(File{Name: "b.txt", URL: srv.URL + "/b.txt"})
+ if err != nil {
+ t.Fatalf("Add b: %v", err)
+ }
+
+ lf, err := m.Sync(context.Background())
+ if err != nil {
+ t.Fatalf("Sync: %v", err)
+ }
+ if len(lf.Files) != 2 {
+ t.Fatalf("erwartete 2 Dateien, habe %d", len(lf.Files))
+ }
+ for _, f := range lf.Files {
+ if f.SHA256 == "" {
+ t.Fatalf("kein Hash für %s", f.Name)
+ }
+ }
+}
+
+func TestPullSkipsWhenCurrent(t *testing.T) {
+ m, _ := setup(t)
+ srv := newTestServer(t)
+ defer srv.Close()
+
+ m.Add(File{Name: "hello.txt", URL: srv.URL + "/hello.txt"})
+ f, err := m.Pull(context.Background(), "hello.txt")
+ if err != nil {
+ t.Fatalf("Pull: %v", err)
+ }
+ if f.SHA256 == "" {
+ t.Fatal("Hash fehlt")
+ }
+
+ // Zweiter Pull ist ein No-Op, da Datei aktuell ist.
+ requests := 0
+ srv.Config.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ requests++
+ t.Error("zweiter Pull sollte nicht herunterladen")
+ })
+ _, err = m.Pull(context.Background(), "hello.txt")
+ if err != nil {
+ t.Fatalf("Pull 2: %v", err)
+ }
+ _ = requests
+}
+
+func TestHashMismatchFailsAndRemoves(t *testing.T) {
+ m, _ := setup(t)
+ srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Write([]byte("other content\n"))
+ }))
+ defer srv.Close()
+
+ err := m.Add(File{Name: "x.txt", URL: srv.URL + "/x.txt", SHA256: strings.Repeat("0", 64)})
+ if err != nil {
+ t.Fatalf("Add: %v", err)
+ }
+
+ _, err = m.Pull(context.Background(), "x.txt")
+ if err == nil {
+ t.Fatal("Hash-Mismatch sollte Fehler liefern")
+ }
+
+ target, _ := m.TargetPath(File{Name: "x.txt"})
+ if _, statErr := os.Stat(target); statErr == nil {
+ t.Fatal("Datei sollte nach Mismatch entfernt sein")
+ }
+}
+
+func TestCheckStatuses(t *testing.T) {
+ m, dir := setup(t)
+ srv := newTestServer(t)
+ defer srv.Close()
+
+ err := m.Add(File{Name: "a.txt", URL: srv.URL + "/a.txt", SHA256: strings.Repeat("a", 64)})
+ if err != nil {
+ t.Fatalf("Add: %v", err)
+ }
+ err = m.Add(File{Name: "b.txt", URL: srv.URL + "/b.txt"})
+ if err != nil {
+ t.Fatalf("Add: %v", err)
+ }
+
+ // a.txt fehlt → missing; b.txt existiert nicht → missing, nohash
+ results, err := m.Check()
+ if err != nil {
+ t.Fatalf("Check: %v", err)
+ }
+ if len(results) != 2 {
+ t.Fatalf("erwartete 2 Ergebnisse, habe %d", len(results))
+ }
+ status := map[string]Status{}
+ for _, res := range results {
+ status[res.File.Name] = res.Status
+ }
+ if status["a.txt"] != StatusMissing {
+ t.Fatalf("a.txt sollte missing sein, ist %s", status["a.txt"])
+ }
+
+ // Jetzt Dateien anlegen: a.txt hat falschen Hash → outdated; b.txt hat keinen Hash → nohash
+ os.MkdirAll(filepath.Join(dir, "vendor"), 0o755)
+ os.WriteFile(filepath.Join(dir, "vendor", "a.txt"), []byte("wrong"), 0o644)
+ os.WriteFile(filepath.Join(dir, "vendor", "b.txt"), []byte("hello world\n"), 0o644)
+ results, err = m.Check()
+ if err != nil {
+ t.Fatalf("Check 2: %v", err)
+ }
+ status = map[string]Status{}
+ for _, res := range results {
+ status[res.File.Name] = res.Status
+ }
+ if status["a.txt"] != StatusOutdated {
+ t.Fatalf("a.txt sollte outdated sein, ist %s", status["a.txt"])
+ }
+ if status["b.txt"] != StatusNoHash {
+ t.Fatalf("b.txt sollte nohash sein, ist %s", status["b.txt"])
+ }
+}
+
+func TestDiff(t *testing.T) {
+ m, dir := setup(t)
+ srv := newTestServer(t)
+ defer srv.Close()
+
+ err := m.Add(File{Name: "a.txt", URL: srv.URL + "/a.txt", SHA256: strings.Repeat("a", 64)})
+ if err != nil {
+ t.Fatalf("Add: %v", err)
+ }
+ err = m.Add(File{Name: "b.txt", URL: srv.URL + "/b.txt", SHA256: "b"})
+ if err != nil {
+ t.Fatalf("Add: %v", err)
+ }
+ os.MkdirAll(filepath.Join(dir, "vendor"), 0o755)
+ os.WriteFile(filepath.Join(dir, "vendor", "a.txt"), []byte("wrong"), 0o644)
+ os.WriteFile(filepath.Join(dir, "vendor", "b.txt"), []byte("hello world\n"), 0o644)
+ os.WriteFile(filepath.Join(dir, "vendor", "orphan.txt"), []byte("x"), 0o644)
+
+ d, err := m.Diff()
+ if err != nil {
+ t.Fatalf("Diff: %v", err)
+ }
+ if len(d.Missing) != 0 {
+ t.Fatalf("Erwartete keine fehlenden, habe %v", d.Missing)
+ }
+ if len(d.Outdated) != 2 {
+ t.Fatalf("Erwartete 2 outdated (%v), habe %d", d.Outdated, len(d.Outdated))
+ }
+ foundOrphan := false
+ for _, o := range d.Orphaned {
+ if o == "orphan.txt" {
+ foundOrphan = true
+ }
+ }
+ if !foundOrphan {
+ t.Fatalf("orphan.txt fehlt in Orphaned: %v", d.Orphaned)
+ }
+}
+
+func TestRemove(t *testing.T) {
+ m, _ := setup(t)
+ srv := newTestServer(t)
+ defer srv.Close()
+
+ m.Add(File{Name: "a.txt", URL: srv.URL + "/a.txt"})
+ ok, err := m.Remove("a.txt")
+ if err != nil || !ok {
+ t.Fatalf("Remove: ok=%v err=%v", ok, err)
+ }
+ ok, err = m.Remove("a.txt")
+ if err != nil || ok {
+ t.Fatalf("Remove 2: ok=%v err=%v", ok, err)
+ }
+}
+
+func TestNameValidation(t *testing.T) {
+ m, _ := setup(t)
+ if err := m.Add(File{Name: "", URL: "https://x"}); err == nil {
+ t.Fatal("leerer Name sollte fehlschlagen")
+ }
+ if err := m.Add(File{Name: "../evil.txt", URL: "https://x"}); err == nil {
+ t.Fatal("'..' im Namen sollte fehlschlagen")
+ }
+ if err := m.Add(File{Name: "ok.txt", URL: ""}); err == nil {
+ t.Fatal("leere URL sollte fehlschlagen")
+ }
+}
+
+func TestHTTPError(t *testing.T) {
+ m, _ := setup(t)
+ srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.WriteHeader(http.StatusNotFound)
+ }))
+ defer srv.Close()
+
+ m.Add(File{Name: "x.txt", URL: srv.URL + "/notfound"})
+ _, err := m.Pull(context.Background(), "x.txt")
+ if err == nil {
+ t.Fatal("404 sollte Fehler liefern")
+ }
+ if !strings.Contains(err.Error(), "404") {
+ t.Fatalf("Fehler sollte Status enthalten: %v", err)
+ }
+}
diff --git a/pub/filepkg/manage.go b/pub/filepkg/manage.go
new file mode 100644
index 00000000..3e202ffa
--- /dev/null
+++ b/pub/filepkg/manage.go
@@ -0,0 +1,210 @@
+package filepkg
+
+import (
+ "context"
+ "fmt"
+ "os"
+ "strings"
+)
+
+// Status beschreibt den Zustand einer verwalteten Datei.
+type Status string
+
+const (
+ // StatusCurrent bedeutet: Datei existiert und Hash stimmt.
+ StatusCurrent Status = "current"
+ // StatusMissing bedeutet: Datei fehlt auf der Platte.
+ StatusMissing Status = "missing"
+ // StatusOutdated bedeutet: Datei existiert, aber der Hash
+ // weicht von der Lockfile ab.
+ StatusOutdated Status = "outdated"
+ // StatusNoHash bedeutet: kein Hash in der Lockfile hinterlegt
+ // (kann nur aus der Lockfile geprüft werden).
+ StatusNoHash Status = "nohash"
+)
+
+// CheckResult ist das Ergebnis einer Prüfung für eine einzelne Datei.
+type CheckResult struct {
+ File File `json:"file"`
+ Status Status `json:"status"`
+ // LocalHash ist der berechnete Hash der Datei auf der Platte
+ // (leer, wenn die Datei fehlt).
+ LocalHash string `json:"localHash,omitempty"`
+ Err error `json:"-"`
+}
+
+// Check prüft alle Dateien der Lockfile gegen die Platte.
+// Es wird nicht heruntergeladen — nur verglichen.
+func (m *Manager) Check() ([]CheckResult, error) {
+ lf, err := m.LoadLock()
+ if err != nil {
+ return nil, err
+ }
+ results := make([]CheckResult, 0, len(lf.Files))
+ for _, f := range lf.Files {
+ var res CheckResult
+ res.File = f
+ target, err := m.TargetPath(f)
+ if err != nil {
+ res.Status = StatusMissing
+ res.Err = err
+ results = append(results, res)
+ continue
+ }
+ hash, err := hashFile(target)
+ if err != nil {
+ res.Status = StatusMissing
+ results = append(results, res)
+ continue
+ }
+ res.LocalHash = hash
+ switch {
+ case f.SHA256 == "":
+ res.Status = StatusNoHash
+ case strings.EqualFold(f.SHA256, hash):
+ res.Status = StatusCurrent
+ default:
+ res.Status = StatusOutdated
+ }
+ results = append(results, res)
+ }
+ return results, nil
+}
+
+// Verify prüft die Lockfile auf Integrität: jeder Eintrag braucht
+// Name und URL; Doppelte Namen werden gemeldet. Außerdem wird
+// geprüft, ob der Hash der Datei auf der Platte zum Eintrag passt.
+func (m *Manager) Verify() error {
+ lf, err := m.LoadLock()
+ if err != nil {
+ return err
+ }
+ seen := make(map[string]bool, len(lf.Files))
+ for _, f := range lf.Files {
+ if err := f.Validate(); err != nil {
+ return err
+ }
+ if seen[f.Name] {
+ return fmt.Errorf("filepkg: doppelter Name %q in Lockfile", f.Name)
+ }
+ seen[f.Name] = true
+ if f.SHA256 != "" {
+ target, err := m.TargetPath(f)
+ if err != nil {
+ return err
+ }
+ hash, err := hashFile(target)
+ if err != nil {
+ // Datei fehlt — das ist beim Verify kein Fehler,
+ // sie wird beim Sync nachgeladen.
+ continue
+ }
+ if !strings.EqualFold(f.SHA256, hash) {
+ return fmt.Errorf("filepkg: %s: Hash-Mismatch (%s != %s)", f.Name, f.SHA256, hash)
+ }
+ }
+ }
+ return nil
+}
+
+// Diff vergleicht Lockfile und Festplatte und liefert Dateien, die
+// fehlen, abweichen oder nur auf der Platte liegen.
+type Diff struct {
+ // Missing sind Dateien aus der Lockfile, die auf der Platte fehlen.
+ Missing []File
+ // Outdated sind Dateien, deren Hash auf der Platte abweicht.
+ Outdated []File
+ // Orphaned sind Dateien im Verzeichnis, die NICHT in der Lockfile stehen.
+ Orphaned []string
+}
+
+// Diff berechnet die Unterschiede zwischen Lockfile und Platte.
+func (m *Manager) Diff() (*Diff, error) {
+ lf, err := m.LoadLock()
+ if err != nil {
+ return nil, err
+ }
+ d := &Diff{}
+ locked := make(map[string]bool, len(lf.Files))
+
+ for _, f := range lf.Files {
+ locked[f.Name] = true
+ target, err := m.TargetPath(f)
+ if err != nil {
+ continue
+ }
+ hash, err := hashFile(target)
+ if err != nil {
+ d.Missing = append(d.Missing, f)
+ continue
+ }
+ if f.SHA256 != "" && !strings.EqualFold(f.SHA256, hash) {
+ d.Outdated = append(d.Outdated, f)
+ }
+ }
+
+ // Nur Dateien im obersten Verzeichnis prüfen (kein rekursiver
+ // Walk), damit Unterverzeichnisse der Lockfile nicht als
+ // orphaned gemeldet werden.
+ entries, err := os.ReadDir(m.Dir)
+ if err != nil {
+ if os.IsNotExist(err) {
+ return d, nil
+ }
+ return nil, err
+ }
+ for _, e := range entries {
+ if e.IsDir() {
+ continue
+ }
+ if !locked[e.Name()] {
+ d.Orphaned = append(d.Orphaned, e.Name())
+ }
+ }
+ return d, nil
+}
+
+// Add fügt eine Datei zur Lockfile hinzu (ohne Download).
+func (m *Manager) Add(f File) error {
+ if err := f.Validate(); err != nil {
+ return err
+ }
+ lf, err := m.LoadLock()
+ if err != nil {
+ return err
+ }
+ lf.Upsert(f)
+ return m.SaveLock(lf)
+}
+
+// Remove entfernt eine Datei aus der Lockfile (ohne die Datei selbst
+// zu löschen). Liefert false, wenn der Name nicht existierte.
+func (m *Manager) Remove(name string) (bool, error) {
+ lf, err := m.LoadLock()
+ if err != nil {
+ return false, err
+ }
+ removed := lf.Remove(name)
+ if !removed {
+ return false, nil
+ }
+ return true, m.SaveLock(lf)
+}
+
+// Install installiert alle Dateien aus der Lockfile, auch wenn die
+// Lockfile leer ist. Dies ist die deterministische "Direkt-Install"
+// Variante: es wird immer ein Sync gemacht, unabhängig von lokalen
+// Dateien.
+func (m *Manager) Install(ctx context.Context) error {
+ _, err := m.Sync(ctx)
+ return err
+}
+
+// IsLocked prüft, ob eine Datei in der Lockfile steht.
+func (m *Manager) IsLocked(name string) (bool, error) {
+ lf, err := m.LoadLock()
+ if err != nil {
+ return false, err
+ }
+ return lf.Has(name), nil
+}
From c77c7925abe93ff131ce89f3d0c5af7d65bbbeee Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 15:47:12 +0200
Subject: [PATCH 23/62] Add template install and discovery flow
Adds `finder install`, `list-installed`, and `uninstall` commands to fetch and manage templates from URLs or the built-in registry. Installed templates are stored under `~/.finder/installed/templates/`, loaded recursively with path-aware names, and included in template discovery and listing while keeping custom templates separated. This also updates template validation output, adds a web test fixture, and refreshes related dependency/package metadata.
---
go.mod | 1 +
go.sum | 3 +
internal/cli/commands.go | 31 +++
internal/cli/handle.go | 55 ++++-
internal/cli/install.go | 215 ++++++++++++++++++
internal/templates/templateloader.go | 96 +++++++-
internal/templates/templateloader_test.go | 19 +-
npm/finder-npm/cli.js | 3 +
npm/finder-npm/package.json | 12 +
npm/site/package.json | 1 +
package.json | 4 +-
pnpm-lock.yaml | 255 ++++++++++++++++++++--
testdata/web/test/template.json5 | 5 +
13 files changed, 653 insertions(+), 47 deletions(-)
create mode 100644 internal/cli/install.go
create mode 100644 npm/finder-npm/cli.js
create mode 100644 npm/finder-npm/package.json
create mode 100644 testdata/web/test/template.json5
diff --git a/go.mod b/go.mod
index 94186003..f6ecfbc5 100644
--- a/go.mod
+++ b/go.mod
@@ -11,6 +11,7 @@ require (
github.com/ncruces/go-strftime v1.0.0 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
golang.org/x/sys v0.47.0 // indirect
+ gopkg.in/yaml.v3 v3.0.1 // indirect
modernc.org/libc v1.75.6 // indirect
modernc.org/mathutil v1.7.1 // indirect
modernc.org/memory v1.12.1 // indirect
diff --git a/go.sum b/go.sum
index 7ad7cda6..0b5c577b 100644
--- a/go.sum
+++ b/go.sum
@@ -20,6 +20,9 @@ golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs=
golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
golang.org/x/tools v0.48.0 h1:3+hClM1aLL5mjMKm5ovokw9epgRXPuu2tILgismM6RE=
golang.org/x/tools v0.48.0/go.mod h1:08xX0orndb/F7jJxGDicx061tyd5pcMto75YMAXr6lk=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
modernc.org/cc/v4 v4.29.2 h1:h6+9ciCnPKutf4I03CvheAvDLX7+IHlqR6Iy6J+cgd8=
modernc.org/cc/v4 v4.29.2/go.mod h1:OnovgIhbbMXMu1aISnJ0wvVD1KnW+cAUJkIrAWh+kVI=
modernc.org/ccgo/v4 v4.35.0 h1:F+TUsmw09QxLzmi3aeYYGxjAXarmZaKgj3mKQHNaA8w=
diff --git a/internal/cli/commands.go b/internal/cli/commands.go
index 08b98dc3..facf726a 100644
--- a/internal/cli/commands.go
+++ b/internal/cli/commands.go
@@ -106,6 +106,15 @@ func HandleCommand(args []string) {
// Cache Size Command
cacheSizeCmd := argparser.NewCommand("cache-size", "Calculates the Size of the Finder Cache and prints it to the console", "", false, "cachesize", "cs")
+ // Install Command
+ installCmd := argparser.NewCommand("install", "Install a template from the web", "", false, "i")
+
+ // List Installed Command
+ listInstalledCmd := argparser.NewCommand("list-installed", "List all installed templates", "", false, "installed", "li")
+
+ // Uninstall Command
+ uninstallCmd := argparser.NewCommand("uninstall", "Uninstall a custom template", "", false, "uni")
+
root.AddSubcommand(versionCmd)
root.AddSubcommand(templateCmd)
root.AddSubcommand(checkCmd)
@@ -116,6 +125,9 @@ func HandleCommand(args []string) {
root.AddSubcommand(binarySearchCmd)
root.AddSubcommand(configpathCmd)
root.AddSubcommand(cacheSizeCmd)
+ root.AddSubcommand(installCmd)
+ root.AddSubcommand(listInstalledCmd)
+ root.AddSubcommand(uninstallCmd)
// Parse the Arguments
cmd := root.Parse(args[1:])
@@ -179,6 +191,25 @@ func HandleCommand(args []string) {
os.Exit(0)
}
+ case installCmd:
+ if len(cmd.Args) <= 0 {
+ root.PrintHelp()
+ return
+ }
+
+ // Install a Template from the Web
+ Install(cmd.Args[0])
+ case listInstalledCmd:
+ // List all installed templates
+ ListInstalled()
+ case uninstallCmd:
+ if len(cmd.Args) <= 0 {
+ root.PrintHelp()
+ return
+ }
+
+ // Uninstall a custom template
+ Uninstall(cmd.Args[0])
case binarySearchCmd:
if len(cmd.Args) > 0 {
binarycheck.CheckAllBinaries(cmd.Args[0])
diff --git a/internal/cli/handle.go b/internal/cli/handle.go
index 219d6b4d..3d7ec491 100644
--- a/internal/cli/handle.go
+++ b/internal/cli/handle.go
@@ -248,6 +248,11 @@ func Check() error {
fmt.Printf("%sWarning: %v%s\n", color.Yellow, err, color.Reset)
}
+ installedTemplates, err := templates.LoadInstalledTemplates()
+ if err != nil {
+ fmt.Printf("%sWarning: %v%s\n", color.Yellow, err, color.Reset)
+ }
+
templatecount := len(templateNames)
fmt.Printf("%sFound %d Templates%s\n", color.Yellow, templatecount, color.Reset)
@@ -283,26 +288,26 @@ func Check() error {
var folder structure.Folder
if err := json.Unmarshal([]byte(normalized), &folder); err != nil {
- fmt.Fprintf(w, "%s%s (ERROR)%s\t%s%s%s\t%s\n",
+ fmt.Fprintf(w, "%s%s (ERROR)%s\t%s%s%s\n",
color.Red, templ, color.Reset,
- "Error parsing", ":", err, color.Reset,
- "---")
+ "Error parsing: ", err, color.Reset)
failed = true
continue
}
if err := folder.Files.Validate(); err != nil {
- fmt.Fprintf(w, "%s%s (ERROR)%s\t%s%s%s\t%s\n",
+ fmt.Fprintf(w, "%s%s (ERROR)%s\t%s%s%s\n",
color.Red, templ, color.Reset,
- "Invalid template", ":", err, color.Reset,
- "---")
+ "Invalid template: ", err, color.Reset)
failed = true
continue
}
- // Determine source (built-in or custom)
+ // Determine source (built-in / installed / custom)
source := goansi.WHITE + "Built-in" + goansi.END
- if _, isCustom := userTemplates[templ]; isCustom {
+ if _, isInstalled := installedTemplates[templ]; isInstalled {
+ source = fmt.Sprintf("%sInstalled%s", color.Magenta, color.Reset)
+ } else if _, isCustom := userTemplates[templ]; isCustom {
source = fmt.Sprintf("%sCustom%s", color.Green, color.Reset)
}
@@ -364,6 +369,11 @@ func Validate(args []string, OutputType string) error {
fmt.Printf("%sWarning: %v%s\n", color.Yellow, err, color.Reset)
}
+ installedTemplates, err := templates.LoadInstalledTemplates()
+ if err != nil {
+ fmt.Printf("%sWarning: %v%s\n", color.Yellow, err, color.Reset)
+ }
+
failed := false
// result of a single template validation
type validateResult struct {
@@ -457,7 +467,9 @@ func Validate(args []string, OutputType string) error {
source := "Built-in"
if fromName {
- if _, isCustom := userTemplates[name]; isCustom {
+ if _, isInstalled := installedTemplates[name]; isInstalled {
+ source = "Installed"
+ } else if _, isCustom := userTemplates[name]; isCustom {
source = "Custom"
}
} else {
@@ -524,6 +536,11 @@ func List() error {
fmt.Printf("%sWarning: Error loading templates: %v%s\n", color.Yellow, err, color.Reset)
}
+ installedTemplates, err := templates.LoadInstalledTemplates()
+ if err != nil {
+ fmt.Printf("%sWarning: Error loading installed templates: %v%s\n", color.Yellow, err, color.Reset)
+ }
+
templatesList, err := templates.LoadAll()
if err != nil {
return fmt.Errorf("error loading templates: %v", err)
@@ -532,11 +549,21 @@ func List() error {
templatecount := len(templatesList)
fmt.Printf("%sFound %d Templates%s\n", color.Yellow, templatecount, color.Reset)
- // Separate built-in from custom templates
+ // Separate built-in / custom / installed templates
builtInTemplates := []string{}
customTemplates := []string{}
+ installedNames := []string{}
+
+ // Installed templates have their own section and are NOT part of
+ // the custom templates shown in `finder list`.
+ for name := range installedTemplates {
+ installedNames = append(installedNames, name)
+ }
for _, templ := range templatesList {
+ if _, ok := installedTemplates[templ]; ok {
+ continue // shown separately below
+ }
if _, isCustom := userTemplates[templ]; isCustom {
customTemplates = append(customTemplates, templ)
} else {
@@ -550,6 +577,14 @@ func List() error {
fmt.Printf(" %s%s%s\n", color.Cyan, templ, color.Reset)
}
+ // Print installed templates (from `finder install`)
+ if len(installedNames) > 0 {
+ fmt.Printf("\n%sInstalled Templates (%d):%s\n", color.Green, len(installedNames), color.Reset)
+ for _, templ := range installedNames {
+ fmt.Printf(" %s%s%s (from ~/.finder/installed/templates/)\n", color.Magenta, templ, color.Reset)
+ }
+ }
+
// Print custom templates if any
if len(customTemplates) > 0 {
fmt.Printf("\n%sCustom Templates (%d):%s\n", color.Green, len(customTemplates), color.Reset)
diff --git a/internal/cli/install.go b/internal/cli/install.go
new file mode 100644
index 00000000..f2cc2ec7
--- /dev/null
+++ b/internal/cli/install.go
@@ -0,0 +1,215 @@
+package cli
+
+import (
+ "context"
+ "fmt"
+ "net/url"
+ "os"
+ "path/filepath"
+ "strings"
+ "time"
+
+ "github.com/shadowdara/finder/internal/templates"
+ "github.com/shadowdara/finder/pub/color"
+ "github.com/shadowdara/finder/pub/filepkg"
+)
+
+// UserLockPath liefert den Pfad zur Lockfile im UserRoot.
+func UserLockPath() (string, error) {
+ path, err := templates.GetCustomPath()
+ if err != nil {
+ return "", err
+ }
+ return filepath.Join(path, "filepkg.lock.json"), nil
+}
+
+// installPathForURL bildet den relativen Zielpfad unterhalb von
+// ~/.finder/templates/ aus einer URL ab. Aus
+//
+// https://shadowdara.github.io/test/template.json5
+//
+// wird
+//
+// shadowdara.github.io/test/template.json5
+//
+// damit der Name dem Pfad entspricht und `finder` ihn über genau
+// diesen Pfad wiederfindet und aufrufbar ist. Ein Port im Host wird
+// durch einen Unterstrich ersetzt (Windows erlaubt kein ':' im
+// Dateinamen):
+//
+// http://localhost:8765/test/template.json5
+// → localhost_8765/test/template.json5
+func installPathForURL(rawURL string) (string, error) {
+ u, err := url.Parse(rawURL)
+ if err != nil {
+ return "", err
+ }
+ if u.Host == "" {
+ return "", fmt.Errorf("keine gültige URL: %s", rawURL)
+ }
+ name := u.Host + u.Path
+ name = strings.TrimSuffix(name, "/")
+ name = strings.TrimPrefix(name, "/")
+ // Windows-kompatibel machen: ':' ist im Dateinamen verboten.
+ name = strings.ReplaceAll(name, ":", "_")
+ return name, nil
+}
+
+// normalizeSourceURL ergänzt eine fehlende http(s)-Kennung und
+// liefert die volle, verwendbare URL zurück.
+func normalizeSourceURL(rawURL string) string {
+ trimmed := strings.TrimSpace(rawURL)
+ if !strings.HasPrefix(trimmed, "http://") && !strings.HasPrefix(trimmed, "https://") {
+ return "http://" + trimmed
+ }
+ return trimmed
+}
+
+// Install lädt ein Template per URL (oder Namen aus der Built-in
+// Registry) über die filepkg-Library in ~/.finder/templates/ ab.
+// Der Zielname entspricht der URL (Host + Pfad), sodass das
+// installierte Template später über genau diesen Namen aufrufbar ist.
+func Install(installTemplate string) error {
+ installTemplate = strings.TrimSpace(installTemplate)
+ if installTemplate == "" {
+ return fmt.Errorf("install: kein Template-Name oder keine URL angegeben")
+ }
+
+ // Bestimme Quelle + Zielname
+ sourceURL := installTemplate
+ relName := strings.TrimSuffix(installTemplate, ".json5")
+ looksLikeURL := strings.Contains(relName, "/") || strings.Contains(relName, ".")
+
+ if !looksLikeURL {
+ // Kein Pfad / keine URL → Built-in Registry-Name
+ sourceURL = fmt.Sprintf("https://raw.githubusercontent.com/shadowdara/finder/main/templates/%s.json5", relName)
+ relName = "shadowdara.github.io/registry/" + relName
+ } else {
+ // Echte URL (auch ohne http://) → Zielname = Host + Pfad
+ name, err := installPathForURL(normalizeSourceURL(installTemplate))
+ if err != nil {
+ return fmt.Errorf("install: %v", err)
+ }
+ relName = name
+ }
+
+ // Quelle normalisieren: immer volle http(s)-URL für die Lockfile
+ sourceURL = normalizeSourceURL(sourceURL)
+
+ // WICHTIG: Der Zielname darf NIE auf .json5 enden — er wird später
+ // mit + ".json5" als Dateiname verwendet. installPathForURL liefert
+ // ggf. den Pfad inkl. .json5 (aus der URL), daher hier bereinigen.
+ relName = strings.TrimSuffix(relName, ".json5")
+
+ // Zielverzeichnis: ~/.finder/installed/templates/
+ customPath, err := templates.GetInstalledTemplatePath()
+ if err != nil {
+ return fmt.Errorf("install: Home-Pfad nicht ermittelbar: %v", err)
+ }
+
+ // Lockfile: ~/.finder/filepkg.lock.json (Ordner muss existieren!)
+ lockPath, err := UserLockPath()
+ if err != nil {
+ return fmt.Errorf("install: Lockfile-Pfad nicht ermittelbar: %v", err)
+ }
+
+ // Ordner sicherstellen (Lockfile liegt in ~/.finder/)
+ if err := os.MkdirAll(filepath.Dir(lockPath), 0o755); err != nil {
+ return fmt.Errorf("install: Ordner %s anlegen: %v", filepath.Dir(lockPath), err)
+ }
+
+ // filepkg-Manager: Dateien landen als Unterpfade in installed/templates/,
+ // die Lockfile liegt im .finder/ Root.
+ m := filepkg.New(customPath, lockPath)
+ m.Client = filepkg.DefaultClient()
+
+ // Existiert die Datei schon (gleicher relName)? Dann überspringen.
+ if exists, _ := m.IsLocked(relName + ".json5"); exists || fileExists(filepath.Join(customPath, filepath.FromSlash(relName)+".json5")) {
+ fmt.Printf("%sTemplate '%s' ist bereits installiert.%s\n", color.Yellow, relName, color.Reset)
+ return nil
+ }
+
+ // Herunterladen + in Lockfile nachverfolgen (filepkg berechnet
+ // den SHA-256-Hash und speichert ihn).
+ ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
+ defer cancel()
+
+ if err := m.Add(filepkg.File{Name: relName + ".json5", URL: sourceURL}); err != nil {
+ return fmt.Errorf("install: %v", err)
+ }
+ if _, err := m.Pull(ctx, relName+".json5"); err != nil {
+ return fmt.Errorf("install: %v", err)
+ }
+
+ fmt.Printf("%sInstalled template '%s'%s\n", color.Green, relName, color.Reset)
+ return nil
+}
+
+// fileExists prüft, ob eine Datei existiert.
+func fileExists(path string) bool {
+ _, err := os.Stat(path)
+ return err == nil
+}
+
+// ListInstalled zeigt alle installierten Templates aus
+// ~/.finder/installed/templates/.
+func ListInstalled() error {
+ installed, err := templates.LoadInstalledTemplates()
+ if err != nil {
+ return fmt.Errorf("list-installed: %v", err)
+ }
+
+ if len(installed) == 0 {
+ fmt.Println("No installed templates.")
+ return nil
+ }
+
+ fmt.Println("Installed templates:")
+ for name := range installed {
+ fmt.Printf(" %s%s%s\n", color.Cyan, name, color.Reset)
+ }
+ return nil
+}
+
+// Uninstall entfernt ein Template (per Name oder URL) aus
+// ~/.finder/installed/templates/ (inkl. Lockfile-Eintrag).
+func Uninstall(templateName string) error {
+ templateName = strings.TrimSpace(templateName)
+ if templateName == "" {
+ return fmt.Errorf("uninstall: kein Template-Name angegeben")
+ }
+
+ relName := strings.TrimSuffix(templateName, ".json5")
+ if strings.Contains(relName, "/") || strings.Contains(relName, ".") {
+ name, err := installPathForURL(normalizeSourceURL(templateName))
+ if err != nil {
+ return fmt.Errorf("uninstall: %v", err)
+ }
+ relName = name
+ }
+
+ customPath, err := templates.GetInstalledTemplatePath()
+ if err != nil {
+ return fmt.Errorf("uninstall: Home-Pfad nicht ermittelbar: %v", err)
+ }
+ lockPath, err := UserLockPath()
+ if err != nil {
+ return fmt.Errorf("uninstall: Lockfile-Pfad nicht ermittelbar: %v", err)
+ }
+
+ m := filepkg.New(customPath, lockPath)
+
+ // Lockfile-Eintrag entfernen
+ removed, _ := m.Remove(relName + ".json5")
+
+ // Datei auf der Platte entfernen
+ filePath := filepath.Join(customPath, filepath.FromSlash(relName)+".json5")
+ osErr := os.Remove(filePath)
+
+ if !removed && osErr != nil {
+ return fmt.Errorf("uninstall: Template '%s' ist kein benutzerdefiniertes Template", relName)
+ }
+
+ fmt.Printf("%sUninstalled template '%s'%s\n", color.Green, relName, color.Reset)
+ return nil
+}
diff --git a/internal/templates/templateloader.go b/internal/templates/templateloader.go
index c48e6ee6..29087bb3 100644
--- a/internal/templates/templateloader.go
+++ b/internal/templates/templateloader.go
@@ -63,8 +63,44 @@ func GetCustomTemplatePath() (string, error) {
return "nil", err
}
-// LoadUserTemplates loads custom templates from user directories and returns
-// a map of template names to their raw bytes. User templates can be placed in:
+// GetInstalledTemplatePath returns the directory where templates
+// installed via `finder install` are stored:
+// ~/.finder/installed/templates/
+func GetInstalledTemplatePath() (string, error) {
+ homeDir, err := os.UserHomeDir()
+ if err == nil {
+ return filepath.Join(homeDir, ".finder", "installed", "templates"), nil
+ }
+ return "nil", err
+}
+
+// LoadInstalledTemplates loads templates that were installed via
+// `finder install` from ~/.finder/installed/templates/ (and the
+// local ./.finder/installed/templates/). The map keys are the
+// relative sub-path names without the .json5 extension.
+func LoadInstalledTemplates() (map[string][]byte, error) {
+ installed := make(map[string][]byte)
+
+ homeInstalled, err := GetInstalledTemplatePath()
+ if err == nil {
+ if err := loadTemplatesFromDir(homeInstalled, installed); err != nil {
+ fmt.Fprintf(os.Stderr, "Warning: could not read installed templates from %s: %v\n", homeInstalled, err)
+ }
+ }
+
+ // Local project dir
+ if err := loadTemplatesFromDir(".finder/installed/templates", installed); err != nil {
+ fmt.Fprintf(os.Stderr, "Warning: could not read installed templates from .finder/installed/templates: %v\n", err)
+ }
+
+ return installed, nil
+}
+
+// LoadUserTemplates loads CUSTOM templates from user directories and returns
+// a map of template names to their raw bytes. Templates installed via
+// `finder install` (in ~/.finder/installed/templates/) are NOT included
+// here — use LoadInstalledTemplates() for those. User templates can be
+// placed in:
// - ~/.finder/templates/
// - ./.finder/templates/ (current directory)
// - X:\.finder\templates/ (on Windows, for each available drive X:)
@@ -78,8 +114,6 @@ func LoadUserTemplates() (map[string][]byte, error) {
if err := loadTemplatesFromDir(homePath, userTemplates); err != nil {
fmt.Fprintf(os.Stderr, "Warning: could not read user templates from %s: %v\n", homePath, err)
}
- } else {
- fmt.Fprintf(os.Stderr, "Warning: could not determine home template path: %v\n", err)
}
// Try to load from current directory (.finder/templates/)
@@ -107,8 +141,21 @@ func LoadUserTemplates() (map[string][]byte, error) {
}
// loadTemplatesFromDir scans a directory for .json5 files and loads them into
-// the provided map. Silently returns if directory doesn't exist.
+// the provided map, recursively descending into subdirectories. Template
+// names are stored relative to the scanned root with forward slashes and
+// without the .json5 extension, so templates installed under sub-paths (e.g.
+// via `finder install https://host/path/template.json5`) become addressable
+// names like "host/path/template". The map keys use the exact name under
+// which they were stored. Directories named "node_modules", ".git" and
+// ".finder" are skipped. Silently returns if directory doesn't exist.
func loadTemplatesFromDir(dirPath string, templates map[string][]byte) error {
+ return loadTemplatesFromDirRoot(dirPath, dirPath, templates)
+}
+
+// loadTemplatesFromDirRoot is the recursive implementation.
+// rootDir is the top-level directory from which relative names are computed;
+// dirPath is the directory currently being scanned.
+func loadTemplatesFromDirRoot(dirPath, rootDir string, templates map[string][]byte) error {
entries, err := os.ReadDir(dirPath)
if err != nil {
// Directory doesn't exist or can't be read - but this is not necessarily an error
@@ -119,7 +166,17 @@ func loadTemplatesFromDir(dirPath string, templates map[string][]byte) error {
}
for _, entry := range entries {
+ relPath := filepath.Join(dirPath, entry.Name())
+
if entry.IsDir() {
+ // Skip hidden/irrelevant dirs
+ switch entry.Name() {
+ case "node_modules", ".git", ".finder":
+ continue
+ }
+ if err := loadTemplatesFromDirRoot(relPath, rootDir, templates); err != nil {
+ fmt.Fprintf(os.Stderr, "Warning: could not read user templates from %s: %v\n", relPath, err)
+ }
continue
}
@@ -129,15 +186,23 @@ func loadTemplatesFromDir(dirPath string, templates map[string][]byte) error {
}
// Read the file
- filePath := filepath.Join(dirPath, name)
+ filePath := relPath
data, err := os.ReadFile(filePath)
if err != nil {
fmt.Fprintf(os.Stderr, "Warning: could not read template %s: %v\n", filePath, err)
continue
}
- // Store with name without .json5 extension
- templateName := name[:len(name)-6]
+ // Store with name relative to the ROOT directory, without the .json5
+ // extension. Use forward slashes so the name is portable.
+ rel, err := filepath.Rel(rootDir, filePath)
+ if err != nil {
+ rel = name
+ }
+ rel = filepath.ToSlash(rel)
+ rel = strings.TrimPrefix(rel, "/")
+
+ templateName := strings.TrimSuffix(rel, ".json5")
templates[templateName] = data
}
@@ -200,13 +265,26 @@ func LoadAll() ([]string, error) {
// LoadAllWithUserTemplates returns both the list of template names and a map
// of user-defined templates. This is more efficient than calling LoadAll() and
-// LoadUserTemplates() separately.
+// LoadUserTemplates() separately. The returned map includes installed
+// templates (from ~/.finder/installed/templates/) so that they can be found
+// by name during a search.
func LoadAllWithUserTemplates() ([]string, map[string][]byte, error) {
userTemplates, err := LoadUserTemplates()
if err != nil {
// Not a fatal error, just log and continue
fmt.Fprintf(os.Stderr, "Warning: could not load user templates: %v\n", err)
}
+ if userTemplates == nil {
+ userTemplates = make(map[string][]byte)
+ }
+
+ // Include installed templates so searches can find them
+ installed, err := LoadInstalledTemplates()
+ if err == nil {
+ for name, data := range installed {
+ userTemplates[name] = data
+ }
+ }
names, err := LoadAll()
if err != nil {
diff --git a/internal/templates/templateloader_test.go b/internal/templates/templateloader_test.go
index ad78960b..58346514 100644
--- a/internal/templates/templateloader_test.go
+++ b/internal/templates/templateloader_test.go
@@ -122,17 +122,22 @@ func TestLoadAll_UniqueNames(t *testing.T) {
}
func TestLoadAll_AllTemplatesLoadable(t *testing.T) {
- templates, err := LoadAll()
-
+ // Only test embedded templates, since LoadAll also includes
+ // user templates from the filesystem that JSONtemplateLoader
+ // (embedded) cannot load.
+ files, err := templates.ReadDir(".")
if err != nil {
- t.Fatalf("LoadAll returned error: %v", err)
+ t.Fatalf("ReadDir failed: %v", err)
}
failedLoads := []string{}
- for _, tmpl := range templates {
- _, err := JSONtemplateLoader(tmpl)
- if err != nil {
- failedLoads = append(failedLoads, tmpl)
+ for _, file := range files {
+ if file.IsDir() || !strings.HasSuffix(file.Name(), ".json5") {
+ continue
+ }
+ name := strings.TrimSuffix(file.Name(), ".json5")
+ if _, err := JSONtemplateLoader(name); err != nil {
+ failedLoads = append(failedLoads, name)
}
}
diff --git a/npm/finder-npm/cli.js b/npm/finder-npm/cli.js
new file mode 100644
index 00000000..9e2890fb
--- /dev/null
+++ b/npm/finder-npm/cli.js
@@ -0,0 +1,3 @@
+#!/usr/bin/env node
+
+console.log("Soon");
diff --git a/npm/finder-npm/package.json b/npm/finder-npm/package.json
new file mode 100644
index 00000000..adc2565d
--- /dev/null
+++ b/npm/finder-npm/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "finder-npm",
+ "version": "0.0.0",
+ "description": "",
+ "keywords": [],
+ "author": "Shadowdara",
+ "license": "GPL-3.0-only",
+ "type": "module",
+ "files": [
+ "cli.js"
+ ]
+}
diff --git a/npm/site/package.json b/npm/site/package.json
index 3f204c1a..f046c630 100644
--- a/npm/site/package.json
+++ b/npm/site/package.json
@@ -47,6 +47,7 @@
"vite-plugin-eslint": "^1.8.1"
},
"dependencies": {
+ "@floating-ui/dom": "^1.8.0",
"@node-steam/vdf": "^2.2.0",
"@shadowdara/dlib": "^0.0.4",
"@shadowdara/finder-lib": "^0.3.17",
diff --git a/package.json b/package.json
index d548c784..3375e82e 100644
--- a/package.json
+++ b/package.json
@@ -9,6 +9,8 @@
"version": "0.3.18",
"devDependencies": {
"@shadowdara/linguist-js": "*",
- "@shadowdara/seg": "0.2.4"
+ "@shadowdara/seg": "0.2.4",
+ "automatic-md-index": "^1.3.7",
+ "http-server": "^14.1.1"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index d8c51f44..17298cce 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -14,6 +14,12 @@ importers:
'@shadowdara/seg':
specifier: 0.2.4
version: 0.2.4
+ automatic-md-index:
+ specifier: ^1.3.7
+ version: 1.3.7
+ http-server:
+ specifier: ^14.1.1
+ version: 14.1.1
npm/finder-lib:
devDependencies:
@@ -24,6 +30,8 @@ importers:
specifier: ^6.0.2
version: 6.0.3
+ npm/finder-npm: {}
+
npm/hub:
dependencies:
'@base-ui/react':
@@ -110,6 +118,9 @@ importers:
npm/site:
dependencies:
+ '@floating-ui/dom':
+ specifier: ^1.8.0
+ version: 1.8.0
'@node-steam/vdf':
specifier: ^2.2.0
version: 2.2.0
@@ -1909,6 +1920,10 @@ packages:
resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
engines: {node: '>=4'}
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
ansi-styles@6.2.3:
resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
engines: {node: '>=12'}
@@ -1927,10 +1942,17 @@ packages:
resolution: {integrity: sha512-FvWoWYfSCM6kRxCSH+MGLHIKKGRL6A6AW7Zek2O32REPQRdg131428uRTKMBYAeRd3XXAaHDS60Wpri7CdKDrA==}
engines: {node: '>=4'}
+ async@3.2.6:
+ resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
+
atomically@1.7.0:
resolution: {integrity: sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==}
engines: {node: '>=10.12.0'}
+ automatic-md-index@1.3.7:
+ resolution: {integrity: sha512-lrIUQtiyCoZLdpw/fGF1O0YHFjaTrIqDZvn51rf3Wbn/fN53h1F4kTAUNYlNnczUtMrKILr0XKc66B0rLw25sA==}
+ hasBin: true
+
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
@@ -1943,6 +1965,10 @@ packages:
engines: {node: '>=6.0.0'}
hasBin: true
+ basic-auth@2.0.1:
+ resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==}
+ engines: {node: '>= 0.8'}
+
better-auth@1.7.4:
resolution: {integrity: sha512-rjL9g8b8UvdwK/ZSdawhqYzOm8YegurB6Fuzqtu/zFJamlFrPa+eEhP8Qj2vFWsMzHOk2mb/L4FRYh9pgaU7OA==}
peerDependencies:
@@ -2084,6 +2110,10 @@ packages:
resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
engines: {node: '>=4'}
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
chalk@5.6.2:
resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==}
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
@@ -2143,9 +2173,16 @@ packages:
color-convert@1.9.3:
resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
color-name@1.1.3:
resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
commander@10.0.1:
resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
engines: {node: '>=14'}
@@ -2208,6 +2245,10 @@ packages:
resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==}
engines: {node: '>= 0.10'}
+ corser@2.0.1:
+ resolution: {integrity: sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==}
+ engines: {node: '>= 0.4.0'}
+
cosmiconfig@9.0.2:
resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==}
engines: {node: '>=14'}
@@ -2490,6 +2531,9 @@ packages:
resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
engines: {node: '>= 0.6'}
+ eventemitter3@4.0.7:
+ resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
+
eventsource-parser@3.1.1:
resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==}
engines: {node: '>=18.0.0'}
@@ -2583,6 +2627,15 @@ packages:
flatted@3.4.4:
resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==}
+ follow-redirects@1.16.0:
+ resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ debug: '*'
+ peerDependenciesMeta:
+ debug:
+ optional: true
+
forwarded@0.2.0:
resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
engines: {node: '>= 0.6'}
@@ -2681,6 +2734,10 @@ packages:
resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
engines: {node: '>=4'}
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
has-symbols@1.1.0:
resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
engines: {node: '>= 0.4'}
@@ -2693,6 +2750,10 @@ packages:
resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==}
engines: {node: '>= 0.4'}
+ he@1.2.0:
+ resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+ hasBin: true
+
highlight.js@11.12.0:
resolution: {integrity: sha512-nbfWpyRMcMrPMmDwJB+dhX/eiaPKtc2RB+0QZskqJ3WjRA/FDS0e9hZrx8EC/lbEv8gXy98FcDbNa/dspAaJMg==}
engines: {node: '>=12.0.0'}
@@ -2710,6 +2771,10 @@ packages:
hosted-git-info@2.8.9:
resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
+ html-encoding-sniffer@3.0.0:
+ resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==}
+ engines: {node: '>=12'}
+
html-minifier-terser@7.2.0:
resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==}
engines: {node: ^14.13.1 || >=16.0.0}
@@ -2719,6 +2784,15 @@ packages:
resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==}
engines: {node: '>= 0.8'}
+ http-proxy@1.18.1:
+ resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==}
+ engines: {node: '>=8.0.0'}
+
+ http-server@14.1.1:
+ resolution: {integrity: sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==}
+ engines: {node: '>=12'}
+ hasBin: true
+
human-signals@2.1.0:
resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
engines: {node: '>=10.17.0'}
@@ -2727,6 +2801,10 @@ packages:
resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==}
engines: {node: '>=18.18.0'}
+ iconv-lite@0.6.3:
+ resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+ engines: {node: '>=0.10.0'}
+
iconv-lite@0.7.3:
resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==}
engines: {node: '>=0.10.0'}
@@ -3079,6 +3157,11 @@ packages:
resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==}
engines: {node: '>=18'}
+ mime@1.6.0:
+ resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
mimic-fn@2.1.0:
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
engines: {node: '>=6'}
@@ -3236,6 +3319,10 @@ packages:
resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
engines: {node: '>=12'}
+ opener@1.5.2:
+ resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==}
+ hasBin: true
+
optionator@0.9.4:
resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
engines: {node: '>= 0.8.0'}
@@ -3361,6 +3448,10 @@ packages:
resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==}
engines: {node: '>=8'}
+ portfinder@1.0.38:
+ resolution: {integrity: sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==}
+ engines: {node: '>= 10.12'}
+
postcss-selector-parser@7.1.6:
resolution: {integrity: sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==}
engines: {node: '>=4'}
@@ -3480,6 +3571,9 @@ packages:
resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
engines: {node: '>=0.10.0'}
+ requires-port@1.0.0:
+ resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
+
reselect@5.3.0:
resolution: {integrity: sha512-XGoLeRAVzUTcJ1qkxPQhDJyIZ5d6zzZD9nT7AEZOaaU9UbWclhycElmhO+VD5bFeLuzhPBaOV2oXC8uG35ZSpg==}
@@ -3543,6 +3637,9 @@ packages:
run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ safe-buffer@5.1.2:
+ resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
@@ -3554,6 +3651,9 @@ packages:
scheduler@0.28.0:
resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==}
+ secure-compare@3.0.1:
+ resolution: {integrity: sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==}
+
semver@5.7.2:
resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
hasBin: true
@@ -3741,6 +3841,10 @@ packages:
resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
engines: {node: '>=4'}
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
supports-preserve-symlinks-flag@1.0.0:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
@@ -3868,6 +3972,10 @@ packages:
resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==}
engines: {node: '>=18'}
+ union@0.5.0:
+ resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==}
+ engines: {node: '>= 0.8.0'}
+
universalify@2.0.1:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
engines: {node: '>= 10.0.0'}
@@ -3892,6 +4000,9 @@ packages:
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ url-join@4.0.1:
+ resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==}
+
use-sync-external-store@1.7.0:
resolution: {integrity: sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==}
peerDependencies:
@@ -3963,6 +4074,11 @@ packages:
webpack-virtual-modules@0.6.2:
resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+ whatwg-encoding@2.0.0:
+ resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==}
+ engines: {node: '>=12'}
+ deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation
+
which@2.0.2:
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
engines: {node: '>= 8'}
@@ -4244,7 +4360,7 @@ snapshots:
optionalDependencies:
'@types/react': 19.3.0
- '@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)':
+ '@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)':
dependencies:
'@better-auth/utils': 0.4.2
'@better-fetch/fetch': 1.3.1
@@ -4256,39 +4372,39 @@ snapshots:
nanostores: 1.5.3
zod: 4.6.2
- '@better-auth/drizzle-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
+ '@better-auth/drizzle-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
- '@better-auth/kysely-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(kysely@0.29.5)':
+ '@better-auth/kysely-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(kysely@0.29.5)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
optionalDependencies:
kysely: 0.29.5
- '@better-auth/memory-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
+ '@better-auth/memory-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
- '@better-auth/mongo-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
+ '@better-auth/mongo-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
- '@better-auth/prisma-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(prisma@6.19.3(typescript@5.7.3))':
+ '@better-auth/prisma-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(prisma@6.19.3(typescript@5.7.3))':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
optionalDependencies:
'@prisma/client': 6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3)
prisma: 6.19.3(typescript@5.7.3)
- '@better-auth/telemetry@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)':
+ '@better-auth/telemetry@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)':
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
'@better-auth/utils': 0.4.2
'@better-fetch/fetch': 1.3.1
@@ -5404,6 +5520,10 @@ snapshots:
dependencies:
color-convert: 1.9.3
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
ansi-styles@6.2.3: {}
argparse@2.0.1: {}
@@ -5416,23 +5536,31 @@ snapshots:
dependencies:
tslib: 2.8.1
+ async@3.2.6: {}
+
atomically@1.7.0: {}
+ automatic-md-index@1.3.7: {}
+
balanced-match@1.0.2: {}
balanced-match@4.0.4: {}
baseline-browser-mapping@2.11.23: {}
+ basic-auth@2.0.1:
+ dependencies:
+ safe-buffer: 5.1.2
+
better-auth@1.7.4(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(next@16.3.3(@babel/core@7.29.7)(@types/node@24.13.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(sass@1.104.1))(prisma@6.19.3(typescript@5.7.3))(react-dom@19.3.0(react@19.3.0))(react@19.3.0):
dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
- '@better-auth/drizzle-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
- '@better-auth/kysely-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(kysely@0.29.5)
- '@better-auth/memory-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
- '@better-auth/mongo-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
- '@better-auth/prisma-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(prisma@6.19.3(typescript@5.7.3))
- '@better-auth/telemetry': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@3.25.76))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)
+ '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
+ '@better-auth/drizzle-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
+ '@better-auth/kysely-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(kysely@0.29.5)
+ '@better-auth/memory-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
+ '@better-auth/mongo-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
+ '@better-auth/prisma-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(prisma@6.19.3(typescript@5.7.3))
+ '@better-auth/telemetry': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)
'@better-auth/utils': 0.4.2
'@better-fetch/fetch': 1.3.1
'@noble/ciphers': 2.4.0
@@ -5557,6 +5685,11 @@ snapshots:
escape-string-regexp: 1.0.5
supports-color: 5.5.0
+ chalk@4.1.2:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
chalk@5.6.2: {}
chalk@6.0.0: {}
@@ -5607,8 +5740,14 @@ snapshots:
dependencies:
color-name: 1.1.3
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
color-name@1.1.3: {}
+ color-name@1.1.4: {}
+
commander@10.0.1: {}
commander@11.1.0: {}
@@ -5657,6 +5796,8 @@ snapshots:
object-assign: 4.1.1
vary: 1.1.2
+ corser@2.0.1: {}
+
cosmiconfig@9.0.2(typescript@5.7.3):
dependencies:
env-paths: 2.2.1
@@ -5951,6 +6092,8 @@ snapshots:
etag@1.8.1: {}
+ eventemitter3@4.0.7: {}
+
eventsource-parser@3.1.1: {}
eventsource@3.0.7:
@@ -6097,6 +6240,8 @@ snapshots:
flatted@3.4.4: {}
+ follow-redirects@1.16.0: {}
+
forwarded@0.2.0: {}
fresh@2.0.0: {}
@@ -6188,6 +6333,8 @@ snapshots:
has-flag@3.0.0: {}
+ has-flag@4.0.0: {}
+
has-symbols@1.1.0: {}
hashery@1.5.1:
@@ -6198,6 +6345,8 @@ snapshots:
dependencies:
function-bind: 1.1.2
+ he@1.2.0: {}
+
highlight.js@11.12.0: {}
hono@4.13.7: {}
@@ -6208,6 +6357,10 @@ snapshots:
hosted-git-info@2.8.9: {}
+ html-encoding-sniffer@3.0.0:
+ dependencies:
+ whatwg-encoding: 2.0.0
+
html-minifier-terser@7.2.0:
dependencies:
camel-case: 4.1.2
@@ -6226,10 +6379,41 @@ snapshots:
statuses: 2.0.2
toidentifier: 1.0.1
+ http-proxy@1.18.1:
+ dependencies:
+ eventemitter3: 4.0.7
+ follow-redirects: 1.16.0
+ requires-port: 1.0.0
+ transitivePeerDependencies:
+ - debug
+
+ http-server@14.1.1:
+ dependencies:
+ basic-auth: 2.0.1
+ chalk: 4.1.2
+ corser: 2.0.1
+ he: 1.2.0
+ html-encoding-sniffer: 3.0.0
+ http-proxy: 1.18.1
+ mime: 1.6.0
+ minimist: 1.2.8
+ opener: 1.5.2
+ portfinder: 1.0.38
+ secure-compare: 3.0.1
+ union: 0.5.0
+ url-join: 4.0.1
+ transitivePeerDependencies:
+ - debug
+ - supports-color
+
human-signals@2.1.0: {}
human-signals@8.0.1: {}
+ iconv-lite@0.6.3:
+ dependencies:
+ safer-buffer: 2.1.2
+
iconv-lite@0.7.3:
dependencies:
safer-buffer: 2.1.2
@@ -6494,6 +6678,8 @@ snapshots:
dependencies:
mime-db: 1.54.0
+ mime@1.6.0: {}
+
mimic-fn@2.1.0: {}
mimic-fn@3.1.0: {}
@@ -6650,6 +6836,8 @@ snapshots:
is-docker: 2.2.1
is-wsl: 2.2.0
+ opener@1.5.2: {}
+
optionator@0.9.4:
dependencies:
deep-is: 0.1.4
@@ -6769,6 +6957,13 @@ snapshots:
dependencies:
find-up: 3.0.0
+ portfinder@1.0.38:
+ dependencies:
+ async: 3.2.6
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
postcss-selector-parser@7.1.6:
dependencies:
cssesc: 3.0.0
@@ -6894,6 +7089,8 @@ snapshots:
require-from-string@2.0.2: {}
+ requires-port@1.0.0: {}
+
reselect@5.3.0: {}
resolve-from@4.0.0: {}
@@ -6983,6 +7180,8 @@ snapshots:
dependencies:
queue-microtask: 1.2.3
+ safe-buffer@5.1.2: {}
+
safer-buffer@2.1.2: {}
sass@1.104.1:
@@ -6995,6 +7194,8 @@ snapshots:
scheduler@0.28.0: {}
+ secure-compare@3.0.1: {}
+
semver@5.7.2: {}
semver@6.3.1: {}
@@ -7243,6 +7444,10 @@ snapshots:
dependencies:
has-flag: 3.0.0
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
supports-preserve-symlinks-flag@1.0.0: {}
systeminformation@5.33.10: {}
@@ -7345,6 +7550,10 @@ snapshots:
unicorn-magic@0.3.0: {}
+ union@0.5.0:
+ dependencies:
+ qs: 6.16.0
+
universalify@2.0.1: {}
unpipe@1.0.0: {}
@@ -7377,6 +7586,8 @@ snapshots:
dependencies:
punycode: 2.3.1
+ url-join@4.0.1: {}
+
use-sync-external-store@1.7.0(react@19.3.0):
dependencies:
react: 19.3.0
@@ -7421,6 +7632,10 @@ snapshots:
webpack-virtual-modules@0.6.2: {}
+ whatwg-encoding@2.0.0:
+ dependencies:
+ iconv-lite: 0.6.3
+
which@2.0.2:
dependencies:
isexe: 2.0.0
diff --git a/testdata/web/test/template.json5 b/testdata/web/test/template.json5
new file mode 100644
index 00000000..a8bf433d
--- /dev/null
+++ b/testdata/web/test/template.json5
@@ -0,0 +1,5 @@
+{
+ "name": "*",
+ "description": "Test template installed from a sub-path URL",
+ "files": ["go.mod"]
+}
\ No newline at end of file
From 06c5e4bdef8c9f19a6eba7887c48fa31b7a82b2f Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 15:58:20 +0200
Subject: [PATCH 24/62] Preserve template names and load installed templates
Validate() now uses the full template lookup name (instead of filepath.Base) and strips a trailing .json5 so installed templates with subpaths (e.g. localhost_8765/test/template) are resolved correctly. LoadAll() was extended to include templates installed via `finder install`, with deduplication against existing builtin/user templates to avoid duplicates.
---
CHANGELOG.md | 1 +
internal/cli/handle.go | 11 +++++++++--
internal/templates/templateloader.go | 16 ++++++++++++++++
3 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fb8cb07f..23406811 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,7 @@ _The whole finder CHANGELOG_
- added Author field to finder templates
- added a subcommand to validate templates
+- install templates from the web
## 0.3.17 - 13.09.2026
diff --git a/internal/cli/handle.go b/internal/cli/handle.go
index 3d7ec491..302286b8 100644
--- a/internal/cli/handle.go
+++ b/internal/cli/handle.go
@@ -5,7 +5,7 @@ import (
"fmt"
"log"
"os"
- "path/filepath"
+ "strings"
"text/tabwriter"
@@ -392,7 +392,14 @@ func Validate(args []string, OutputType string) error {
}
for _, arg := range args {
- name := filepath.Base(arg)
+ // The template name can contain sub-paths like
+ // `localhost_8765/test/template` (installed templates).
+ // `filepath.Base` would truncate that to just `template`,
+ // so keep the full arg as the lookup name (without .json5).
+ name := arg
+ if strings.HasSuffix(name, ".json5") {
+ name = strings.TrimSuffix(name, ".json5")
+ }
displayName := arg
res := validateResult{File: displayName}
diff --git a/internal/templates/templateloader.go b/internal/templates/templateloader.go
index 29087bb3..efe804df 100644
--- a/internal/templates/templateloader.go
+++ b/internal/templates/templateloader.go
@@ -256,6 +256,22 @@ func LoadAll() ([]string, error) {
for name := range userTemplates {
if !builtInSet[name] {
fileNames = append(fileNames, name)
+ builtInSet[name] = true
+ }
+ }
+ }
+
+ // Load installed templates (from `finder install`)
+ installed, err := LoadInstalledTemplates()
+ if err == nil {
+ seen := make(map[string]bool, len(fileNames))
+ for _, name := range fileNames {
+ seen[name] = true
+ }
+ for name := range installed {
+ if !seen[name] {
+ fileNames = append(fileNames, name)
+ seen[name] = true
}
}
}
From a48e5f5e28c1f3e741fa97086348984d39077fa4 Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 16:15:35 +0200
Subject: [PATCH 25/62] Add template aliases and CLI support
Adds support for template aliases stored in ~/.finder/aliases.json, including add/remove/list commands and alias resolution during template lookup and validation. This makes shorthand names work for installed templates while keeping `finder alias`, `finder unalias`, and `finder aliases` available. Also removes obsolete registry and test template fixtures.
---
go.mod | 1 -
go.sum | 3 -
internal/cli/aliases.go | 150 +++++++++++++++++++++++++++++++
internal/cli/commands.go | 35 ++++++++
internal/cli/handle.go | 12 ++-
registry/lol.json5 | 4 -
testdata/web/test/template.json5 | 5 --
7 files changed, 193 insertions(+), 17 deletions(-)
create mode 100644 internal/cli/aliases.go
delete mode 100644 registry/lol.json5
delete mode 100644 testdata/web/test/template.json5
diff --git a/go.mod b/go.mod
index f6ecfbc5..94186003 100644
--- a/go.mod
+++ b/go.mod
@@ -11,7 +11,6 @@ require (
github.com/ncruces/go-strftime v1.0.0 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
golang.org/x/sys v0.47.0 // indirect
- gopkg.in/yaml.v3 v3.0.1 // indirect
modernc.org/libc v1.75.6 // indirect
modernc.org/mathutil v1.7.1 // indirect
modernc.org/memory v1.12.1 // indirect
diff --git a/go.sum b/go.sum
index 0b5c577b..7ad7cda6 100644
--- a/go.sum
+++ b/go.sum
@@ -20,9 +20,6 @@ golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs=
golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
golang.org/x/tools v0.48.0 h1:3+hClM1aLL5mjMKm5ovokw9epgRXPuu2tILgismM6RE=
golang.org/x/tools v0.48.0/go.mod h1:08xX0orndb/F7jJxGDicx061tyd5pcMto75YMAXr6lk=
-gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
-gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
modernc.org/cc/v4 v4.29.2 h1:h6+9ciCnPKutf4I03CvheAvDLX7+IHlqR6Iy6J+cgd8=
modernc.org/cc/v4 v4.29.2/go.mod h1:OnovgIhbbMXMu1aISnJ0wvVD1KnW+cAUJkIrAWh+kVI=
modernc.org/ccgo/v4 v4.35.0 h1:F+TUsmw09QxLzmi3aeYYGxjAXarmZaKgj3mKQHNaA8w=
diff --git a/internal/cli/aliases.go b/internal/cli/aliases.go
new file mode 100644
index 00000000..733bc6f5
--- /dev/null
+++ b/internal/cli/aliases.go
@@ -0,0 +1,150 @@
+package cli
+
+import (
+ "encoding/json"
+ "fmt"
+ "os"
+ "path/filepath"
+ "strings"
+
+ "github.com/shadowdara/finder/internal/templates"
+ "github.com/shadowdara/finder/pub/color"
+)
+
+// AliasPath liefert den Pfad zu ~/.finder/aliases.json
+func AliasPath() (string, error) {
+ base, err := templates.GetCustomPath()
+ if err != nil {
+ return "", err
+ }
+ return filepath.Join(base, "aliases.json"), nil
+}
+
+// LoadAliases liest ~/.finder/aliases.json ein.
+// Fehlt die Datei, wird eine leere Map zurückgegeben.
+func LoadAliases() (map[string]string, error) {
+ path, err := AliasPath()
+ if err != nil {
+ return nil, err
+ }
+ data, err := os.ReadFile(path)
+ if os.IsNotExist(err) {
+ return make(map[string]string), nil
+ }
+ if err != nil {
+ return nil, fmt.Errorf("alias: %s lesen: %w", path, err)
+ }
+ if len(strings.TrimSpace(string(data))) == 0 {
+ return make(map[string]string), nil
+ }
+ var m map[string]string
+ if err := json.Unmarshal(data, &m); err != nil {
+ return nil, fmt.Errorf("alias: %s parsen: %w", path, err)
+ }
+ if m == nil {
+ m = make(map[string]string)
+ }
+ return m, nil
+}
+
+// SaveAliases schreibt die Map atomar nach ~/.finder/aliases.json
+func SaveAliases(m map[string]string) error {
+ path, err := AliasPath()
+ if err != nil {
+ return err
+ }
+ if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
+ return fmt.Errorf("alias: Verzeichnis %s anlegen: %w", filepath.Dir(path), err)
+ }
+ data, err := json.MarshalIndent(m, "", " ")
+ if err != nil {
+ return fmt.Errorf("alias: serialisieren: %w", err)
+ }
+ tmp := path + ".tmp"
+ if err := os.WriteFile(tmp, append(data, '\n'), 0o644); err != nil {
+ return fmt.Errorf("alias: %s schreiben: %w", tmp, err)
+ }
+ if err := os.Rename(tmp, path); err != nil {
+ return fmt.Errorf("alias: %s -> %s: %w", tmp, path, err)
+ }
+ return nil
+}
+
+// ResolveAlias löst einen Namen über aliases.json auf.
+// Ist kein Alias vorhanden, wird der Name unverändert zurückgegeben.
+func ResolveAlias(name string) string {
+ aliases, err := LoadAliases()
+ if err != nil {
+ return name
+ }
+ // einfache Auflösung, eine Ebene (keine Ketten)
+ if target, ok := aliases[name]; ok && strings.TrimSpace(target) != "" {
+ return target
+ }
+ return name
+}
+
+// AddAlias legt einen Alias an: alias -> target
+func AddAlias(alias, target string) error {
+ alias = strings.TrimSpace(alias)
+ target = strings.TrimSpace(target)
+ if alias == "" || target == "" {
+ return fmt.Errorf("alias: Name und Ziel dürfen nicht leer sein (usage: finder alias )")
+ }
+ if strings.Contains(alias, "/") || strings.Contains(alias, "\\") {
+ return fmt.Errorf("alias: Alias-Name darf keinen Pfad enthalten: %q", alias)
+ }
+ if alias == target {
+ return fmt.Errorf("alias: Alias und Ziel dürfen nicht gleich sein")
+ }
+ aliases, err := LoadAliases()
+ if err != nil {
+ return err
+ }
+ // Schutz: Alias darf keinen bestehenden Alias-Namen verdecken
+ // -> überschreiben ist erlaubt (upsert), aber mit Hinweis
+ aliases[alias] = target
+ if err := SaveAliases(aliases); err != nil {
+ return err
+ }
+ fmt.Printf("%sAlias '%s' -> '%s'%s\n", color.Green, alias, target, color.Reset)
+ return nil
+}
+
+// RemoveAlias löscht einen Alias
+func RemoveAlias(alias string) error {
+ alias = strings.TrimSpace(alias)
+ if alias == "" {
+ return fmt.Errorf("alias: kein Alias-Name angegeben (usage: finder unalias )")
+ }
+ aliases, err := LoadAliases()
+ if err != nil {
+ return err
+ }
+ if _, ok := aliases[alias]; !ok {
+ return fmt.Errorf("alias: Alias '%s' existiert nicht", alias)
+ }
+ delete(aliases, alias)
+ if err := SaveAliases(aliases); err != nil {
+ return err
+ }
+ fmt.Printf("%sAlias '%s' entfernt%s\n", color.Green, alias, color.Reset)
+ return nil
+}
+
+// ListAliases zeigt alle Aliase aus ~/.finder/aliases.json
+func ListAliases() error {
+ aliases, err := LoadAliases()
+ if err != nil {
+ return err
+ }
+ if len(aliases) == 0 {
+ fmt.Println("No aliases defined. Create one with: finder alias ")
+ return nil
+ }
+ fmt.Println("Aliases:")
+ for alias, target := range aliases {
+ fmt.Printf(" %s%s%s -> %s%s%s\n", color.Cyan, alias, color.Reset, color.Magenta, target, color.Reset)
+ }
+ return nil
+}
diff --git a/internal/cli/commands.go b/internal/cli/commands.go
index facf726a..7431095c 100644
--- a/internal/cli/commands.go
+++ b/internal/cli/commands.go
@@ -115,6 +115,11 @@ func HandleCommand(args []string) {
// Uninstall Command
uninstallCmd := argparser.NewCommand("uninstall", "Uninstall a custom template", "", false, "uni")
+ // Alias commands (stored in ~/.finder/aliases.json)
+ aliasCmd := argparser.NewCommand("alias", "Create an alias for a template (findable via alias)", "", false)
+ unaliasCmd := argparser.NewCommand("unalias", "Remove an alias created with alias", "", false, "alias-remove")
+ aliasesCmd := argparser.NewCommand("aliases", "List all template aliases", "", false, "alias-list")
+
root.AddSubcommand(versionCmd)
root.AddSubcommand(templateCmd)
root.AddSubcommand(checkCmd)
@@ -128,6 +133,9 @@ func HandleCommand(args []string) {
root.AddSubcommand(installCmd)
root.AddSubcommand(listInstalledCmd)
root.AddSubcommand(uninstallCmd)
+ root.AddSubcommand(aliasCmd)
+ root.AddSubcommand(unaliasCmd)
+ root.AddSubcommand(aliasesCmd)
// Parse the Arguments
cmd := root.Parse(args[1:])
@@ -210,6 +218,33 @@ func HandleCommand(args []string) {
// Uninstall a custom template
Uninstall(cmd.Args[0])
+ case aliasCmd:
+ // `finder alias ` -> create or update alias
+ // Called via PassThrough; cmd.Args contains everything after "alias"
+ if len(cmd.Args) < 2 {
+ fmt.Println("Usage: finder alias ")
+ fmt.Println(" Example: finder alias myvue shadowdara.github.io/test/template")
+ fmt.Println(" Then: finder myvue (resolves to the template)")
+ return
+ }
+ if err := AddAlias(cmd.Args[0], cmd.Args[1]); err != nil {
+ fmt.Println(err)
+ os.Exit(1)
+ }
+ case unaliasCmd:
+ if len(cmd.Args) <= 0 {
+ fmt.Println("Usage: finder unalias ")
+ return
+ }
+ if err := RemoveAlias(cmd.Args[0]); err != nil {
+ fmt.Println(err)
+ os.Exit(1)
+ }
+ case aliasesCmd:
+ if err := ListAliases(); err != nil {
+ fmt.Println(err)
+ os.Exit(1)
+ }
case binarySearchCmd:
if len(cmd.Args) > 0 {
binarycheck.CheckAllBinaries(cmd.Args[0])
diff --git a/internal/cli/handle.go b/internal/cli/handle.go
index 302286b8..d1fceae8 100644
--- a/internal/cli/handle.go
+++ b/internal/cli/handle.go
@@ -39,10 +39,11 @@ func Search(searchTemplate string, OutputType string, Verbose bool, createCache
fmt.Printf("%sStruct Finder %s%s - Buildtime: %s\n", color.Green, finderversion.Version, color.Reset, finderversion.BuildTime)
}
- templateName := searchTemplate
+ searchTemplate = ResolveAlias(searchTemplate)
// Load all templates (built-in + custom)
templateNames, userTemplates, err := templates.LoadAllWithUserTemplates()
+ templateName := searchTemplate
if err != nil {
log.Fatalf("%sCould not load templates: %v%s\n", color.Red, err, color.Reset)
}
@@ -394,13 +395,16 @@ func Validate(args []string, OutputType string) error {
for _, arg := range args {
// The template name can contain sub-paths like
// `localhost_8765/test/template` (installed templates).
- // `filepath.Base` would truncate that to just `template`,
- // so keep the full arg as the lookup name (without .json5).
- name := arg
+ // Resolve an alias before any filesystem/template lookup.
+ resolved := ResolveAlias(arg)
+ name := resolved
if strings.HasSuffix(name, ".json5") {
name = strings.TrimSuffix(name, ".json5")
}
displayName := arg
+ if resolved != arg {
+ displayName = fmt.Sprintf("%s -> %s", arg, resolved)
+ }
res := validateResult{File: displayName}
// Resolve the template contents: prefer a file on disk
diff --git a/registry/lol.json5 b/registry/lol.json5
deleted file mode 100644
index 3ee8e2c1..00000000
--- a/registry/lol.json5
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "name": "*",
- "description": "this is a test"
-}
\ No newline at end of file
diff --git a/testdata/web/test/template.json5 b/testdata/web/test/template.json5
deleted file mode 100644
index a8bf433d..00000000
--- a/testdata/web/test/template.json5
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "name": "*",
- "description": "Test template installed from a sub-path URL",
- "files": ["go.mod"]
-}
\ No newline at end of file
From 6b14f7feb55f14cd8ba8a51185989e62f75d54d2 Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 16:23:49 +0200
Subject: [PATCH 26/62] Add description check and update templates
Enhance check.py to count and report templates missing the "description" field (adds nodesc counter and a dedicated validation loop). Update several template files (internal/templates and templates): cmake, flax, go, and steamlib now include descriptive "description" fields and appropriate "tags"; steamlib.json5 also received minor JSON formatting adjustments.
---
check.py | 24 ++++++++++++++++++++++++
internal/templates/cmake.json5 | 2 +-
internal/templates/flax.json5 | 2 +-
internal/templates/go.json5 | 2 +-
internal/templates/steamlib.json5 | 2 +-
templates/cmake.json5 | 4 +++-
templates/flax.json5 | 5 +++--
templates/go.json5 | 5 +++--
templates/steamlib.json5 | 29 +++++++++++++++++++++--------
9 files changed, 58 insertions(+), 17 deletions(-)
diff --git a/check.py b/check.py
index 3d3792f8..b494e7a6 100644
--- a/check.py
+++ b/check.py
@@ -11,6 +11,7 @@
total = 0
notags = 0
noarraytags = 0
+nodesc = 0
# ─────────────────────────────────────────────
@@ -74,6 +75,28 @@
print(f"Fehler bei {json_file.name}: {e}")
+# ─────────────────────────────────────────────
+# Description
+# ─────────────────────────────────────────────
+
+for json_file in folder.glob("*.json5"):
+ try:
+ with json_file.open("r", encoding="utf-8") as f:
+ data = json.load(f)
+
+ if "description" not in data:
+ print(f"No Description: {json_file.name}")
+ nodesc += 1
+ continue
+
+ except json.JSONDecodeError:
+ # Bereits im ersten Durchlauf gezählt
+ pass
+
+ except Exception as e:
+ print(f"Fehler bei {json_file.name}: {e}")
+
+
# ─────────────────────────────────────────────
# Statistik
# ─────────────────────────────────────────────
@@ -87,3 +110,4 @@
f"Templates where tags is not an array: "
f"{noarraytags} from {working - notags} templates with tags attribute"
)
+print(f"{nodesc} Templates without description from {working}")
diff --git a/internal/templates/cmake.json5 b/internal/templates/cmake.json5
index 31c7923b..e560904e 100644
--- a/internal/templates/cmake.json5
+++ b/internal/templates/cmake.json5
@@ -1 +1 @@
-{"files":["CMakeLists.txt"],"folders":[],"min_version":"0.3.14","name":"*"}
\ No newline at end of file
+{"description":"a project which uses CMake","files":["CMakeLists.txt"],"folders":[],"min_version":"0.3.14","name":"*","tags":["C","C++"]}
\ No newline at end of file
diff --git a/internal/templates/flax.json5 b/internal/templates/flax.json5
index a9033d81..597ee1f1 100644
--- a/internal/templates/flax.json5
+++ b/internal/templates/flax.json5
@@ -1 +1 @@
-{"files":["*.flaxproj"],"folders":[{"name":"Content"}],"min_version":"0.3.14","name":"*","tags":["game-engine"]}
\ No newline at end of file
+{"description":"a project with the flax game engine","files":["*.flaxproj"],"folders":[{"name":"Content"}],"min_version":"0.3.14","name":"*","tags":["game-engine"]}
\ No newline at end of file
diff --git a/internal/templates/go.json5 b/internal/templates/go.json5
index b4e90288..5c56f6cb 100644
--- a/internal/templates/go.json5
+++ b/internal/templates/go.json5
@@ -1 +1 @@
-{"files":["go.mod"],"folders":[],"min_version":"0.3.14","name":"*","tags":["go"]}
\ No newline at end of file
+{"description":"a project with go / golang","files":["go.mod"],"folders":[],"min_version":"0.3.14","name":"*","tags":["go"]}
\ No newline at end of file
diff --git a/internal/templates/steamlib.json5 b/internal/templates/steamlib.json5
index f1cf6669..8c9ab4cb 100644
--- a/internal/templates/steamlib.json5
+++ b/internal/templates/steamlib.json5
@@ -1 +1 @@
-{"folders":[{"name":"common"},{"name":"downloading"},{"name":"shadercache"},{"name":"temp"},{"name":"workshop"}],"min_version":"0.3.14","name":"steamapps","tags":["libary"]}
\ No newline at end of file
+{"description":"the steam libary where the games a saved","folders":[{"name":"common"},{"name":"downloading"},{"name":"shadercache"},{"name":"temp"},{"name":"workshop"}],"min_version":"0.3.14","name":"steamapps","tags":["libary"]}
\ No newline at end of file
diff --git a/templates/cmake.json5 b/templates/cmake.json5
index 5951a978..f7d3abbb 100644
--- a/templates/cmake.json5
+++ b/templates/cmake.json5
@@ -4,5 +4,7 @@
"files": [
"CMakeLists.txt"
],
- "min_version": "0.3.14"
+ "min_version": "0.3.14",
+ "tags": ["C", "C++"],
+ "description": "a project which uses CMake"
}
diff --git a/templates/flax.json5 b/templates/flax.json5
index 1ad34910..ce84dd36 100644
--- a/templates/flax.json5
+++ b/templates/flax.json5
@@ -11,5 +11,6 @@
"tags": [
"game-engine"
],
- "min_version": "0.3.14"
-}
+ "min_version": "0.3.14",
+ "description": "a project with the flax game engine"
+}
\ No newline at end of file
diff --git a/templates/go.json5 b/templates/go.json5
index e826ab16..95602684 100644
--- a/templates/go.json5
+++ b/templates/go.json5
@@ -7,5 +7,6 @@
"tags": [
"go"
],
- "min_version": "0.3.14"
-}
+ "min_version": "0.3.14",
+ "description": "a project with go / golang"
+}
\ No newline at end of file
diff --git a/templates/steamlib.json5 b/templates/steamlib.json5
index c322abfa..00d74192 100644
--- a/templates/steamlib.json5
+++ b/templates/steamlib.json5
@@ -1,12 +1,25 @@
{
"name": "steamapps",
"folders": [
- { "name": "common" },
- { "name": "downloading" },
- { "name": "shadercache" },
- { "name": "temp" },
- { "name": "workshop" }
+ {
+ "name": "common"
+ },
+ {
+ "name": "downloading"
+ },
+ {
+ "name": "shadercache"
+ },
+ {
+ "name": "temp"
+ },
+ {
+ "name": "workshop"
+ }
],
- "tags": ["libary"],
- "min_version": "0.3.14"
-}
+ "tags": [
+ "libary"
+ ],
+ "min_version": "0.3.14",
+ "description": "the steam libary where the games a saved"
+}
\ No newline at end of file
From 9f579120b8973e0cf3e3f8a7c834520351dffb3f Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 16:29:54 +0200
Subject: [PATCH 27/62] Add static template registry service
This change adds a lightweight static template registry behind nginx for serving Finder template JSON5 files over HTTP. It wires a new `registry` service into docker-compose, adds a Dockerfile and nginx configuration to expose only JSON5 templates, and includes documentation plus a sample registry entry to demonstrate usage.
---
docker-compose.yml | 8 ++++++++
docker/registry/Dockerfile | 7 +++++++
docker/registry/README.md | 17 +++++++++++++++++
docker/registry/nginx.conf | 30 ++++++++++++++++++++++++++++++
registry/test.json5 | 4 ++++
5 files changed, 66 insertions(+)
create mode 100644 docker/registry/Dockerfile
create mode 100644 docker/registry/README.md
create mode 100644 docker/registry/nginx.conf
create mode 100644 registry/test.json5
diff --git a/docker-compose.yml b/docker-compose.yml
index 257fdd55..76964359 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -46,6 +46,14 @@ services:
ports:
- "8080:80"
+ registry:
+ build:
+ context: .
+ dockerfile: docker/registry/Dockerfile
+ container_name: finder-registry
+ ports:
+ - "3017:3017"
+
# Local Database for testing
postgres:
image: postgres:18
diff --git a/docker/registry/Dockerfile b/docker/registry/Dockerfile
new file mode 100644
index 00000000..2dde0dcd
--- /dev/null
+++ b/docker/registry/Dockerfile
@@ -0,0 +1,7 @@
+# Static template registry — nginx serves only registry/*.json5 over HTTP
+FROM nginx:alpine
+
+COPY docker/registry/nginx.conf /etc/nginx/conf.d/default.conf
+COPY registry /usr/share/nginx/html
+
+EXPOSE 3017
diff --git a/docker/registry/README.md b/docker/registry/README.md
new file mode 100644
index 00000000..795b16e1
--- /dev/null
+++ b/docker/registry/README.md
@@ -0,0 +1,17 @@
+# Finder Template Registry (static)
+
+Reiner HTTP-Container zum Herunterladen von Templates — kein Upload,
+kein Backend, nur statische `templates/*.json5`.
+
+- Start: `docker compose up -d registry`
+- URL: `http://localhost:3017/.json5`
+- Sub-path (install-Ziel): `http://localhost:3017///template.json5`
+- Build: `docker build -f docker/registry/Dockerfile -t finder-registry .`
+- Healthcheck: `curl -I http://localhost:3017/go.json5`
+
+Beispiel für `finder install`:
+
+```sh
+finder install http://localhost:3017/go.json5
+finder install http://localhost:3017/shadowdara.github.io/test/template.json5
+```
diff --git a/docker/registry/nginx.conf b/docker/registry/nginx.conf
new file mode 100644
index 00000000..5072df4b
--- /dev/null
+++ b/docker/registry/nginx.conf
@@ -0,0 +1,30 @@
+server {
+ listen 3017;
+ server_name _;
+
+ root /usr/share/nginx/html;
+ index off;
+
+ # Do not list directories, but do allow direct file fetches.
+ autoindex off;
+
+ # Serve *.json5 files; 404 for everything else (no uploads, no traversal beyond root).
+ location ~* ^/[^/]+\.json5$ {
+ try_files $uri =404;
+ add_header Content-Type application/json5 always;
+ add_header Cache-Control "public, max-age=300" always;
+ add_header X-Template-Registry "finder" always;
+ }
+
+ # Sub-path templates (host/path/template.json5) used by `finder install `
+ location ~* ^/[A-Za-z0-9._-]+(?:/[A-Za-z0-9._-]+)*/.+\.json5$ {
+ try_files $uri =404;
+ add_header Content-Type application/json5 always;
+ add_header Cache-Control "public, max-age=300" always;
+ add_header X-Template-Registry "finder" always;
+ }
+
+ location / {
+ return 404;
+ }
+}
diff --git a/registry/test.json5 b/registry/test.json5
new file mode 100644
index 00000000..9301125b
--- /dev/null
+++ b/registry/test.json5
@@ -0,0 +1,4 @@
+{
+ "name": "*",
+ "description": "Hallo"
+}
\ No newline at end of file
From a5412693e0ac370ecb46d5dddf8caafd5036a044 Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 16:48:12 +0200
Subject: [PATCH 28/62] Use pnpm workspace in Dockerfiles; add yaml dep
Update Dockerfiles to use pnpm workspace builds and enable corepack for better caching and consistent installs. static-site and template-site now copy workspace manifest and package.jsons, run pnpm install --frozen-lockfile, and run filtered pnpm build tasks; outputs copied from npm/site/dist. uploadpage uses pnpx for prisma generate and pnpm run build. Add yaml dependency to npm/hub package.json and update pnpm lock entries. Add an (initial) template-hub.config.yaml file. These changes standardize builds on pnpm and improve Docker layer caching.
---
docker/static-site/Dockerfile | 20 +-
docker/template-site/Dockerfile | 23 +-
docker/uploadpage/Dockerfile | 4 +-
npm/hub/package.json | 3 +-
npm/hub/pnpm-lock.yaml | 4307 ------------------
npm/hub/pnpm-workspace.yaml | 18 -
npm/hub/template-hub.config.yaml | 0
npm/site/bun.lock | 959 ----
npm/site/package-lock.json | 7124 ------------------------------
pnpm-lock.yaml | 63 +-
10 files changed, 69 insertions(+), 12452 deletions(-)
delete mode 100644 npm/hub/pnpm-lock.yaml
delete mode 100644 npm/hub/pnpm-workspace.yaml
create mode 100644 npm/hub/template-hub.config.yaml
delete mode 100644 npm/site/bun.lock
delete mode 100644 npm/site/package-lock.json
diff --git a/docker/static-site/Dockerfile b/docker/static-site/Dockerfile
index 35965f62..e8502ff3 100644
--- a/docker/static-site/Dockerfile
+++ b/docker/static-site/Dockerfile
@@ -1,26 +1,32 @@
# Dockerfile für die statische Template-Site (npm/site)
-# Reiner Vite/Node-Build ohne Backend — serviert nur statische Dateien auf Port 3016
+# Reiner pnpm-workspace Build — serviert nur statische Dateien auf Port 3016
# ---- Build-Stage ----
FROM node:22-alpine AS builder
+RUN corepack enable
WORKDIR /app
-# package.json und Lockfile zuerst für besseren Docker-Cache
-COPY npm/site/package.json npm/site/package-lock.json ./
+COPY pnpm-workspace.yaml pnpm-lock.yaml package.json ./
+COPY npm/site/package.json ./npm/site/package.json
+COPY npm/finder-lib/package.json ./npm/finder-lib/package.json
+COPY npm/hub/package.json ./npm/hub/package.json
+COPY npm/vfs/package.json ./npm/vfs/package.json
+COPY npm/finder-npm/package.json ./npm/finder-npm/package.json
+COPY npm/pages-plugin/package.json ./npm/pages-plugin/package.json
-RUN npm ci
+RUN pnpm install --frozen-lockfile
-COPY npm/site/ .
+COPY . .
# Statischer Root-Build (base: "./", outDir: "dist")
-RUN npm run build:staticroot
+RUN pnpm --filter finder-template-generator build:staticroot
# ---- Runtime-Stage ----
FROM nginx:alpine
# Vite-Build-Output nach nginx kopieren (nur statische Dateien, kein Proxy)
-COPY --from=builder /app/dist /usr/share/nginx/html
+COPY --from=builder /app/npm/site/dist /usr/share/nginx/html
COPY docker/static-site/nginx.conf /etc/nginx/conf.d/default.conf
diff --git a/docker/template-site/Dockerfile b/docker/template-site/Dockerfile
index a0f0a854..98bfcadd 100644
--- a/docker/template-site/Dockerfile
+++ b/docker/template-site/Dockerfile
@@ -1,26 +1,33 @@
# Dockerfile für die Template-Site (npm/site)
-# Vite/Node-Build, serviert statische Dateien auf Port 3014
+# pnpm-workspace Build, serviert statische Dateien auf Port 3014
# ---- Build-Stage ----
FROM node:22-alpine AS builder
+RUN corepack enable
WORKDIR /app
-# package.json und Lockfile zuerst für besseren Docker-Cache
-COPY npm/site/package.json npm/site/package-lock.json ./
+# Workspace-Root zuerst für besseren Docker-Cache (pnpm!)
+COPY pnpm-workspace.yaml pnpm-lock.yaml package.json ./
+COPY npm/site/package.json ./npm/site/package.json
+COPY npm/finder-lib/package.json ./npm/finder-lib/package.json
+COPY npm/hub/package.json ./npm/hub/package.json
+COPY npm/vfs/package.json ./npm/vfs/package.json
+COPY npm/finder-npm/package.json ./npm/finder-npm/package.json
+COPY npm/pages-plugin/package.json ./npm/pages-plugin/package.json
-RUN npm ci
+RUN pnpm install --frozen-lockfile
-COPY npm/site/ .
+# Restlichen Quellcode kopieren (nach install für besseren Cache)
+COPY . .
-RUN npm run docker:build
+RUN pnpm --filter finder-template-generator docker:build
# ---- Runtime-Stage ----
FROM nginx:alpine
# Vite-Build-Output nach nginx kopieren
-COPY --from=builder /app/dist /usr/share/nginx/html
-
+COPY --from=builder /app/npm/site/dist /usr/share/nginx/html
COPY docker/template-site/nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 3014
diff --git a/docker/uploadpage/Dockerfile b/docker/uploadpage/Dockerfile
index ede57e71..86746981 100644
--- a/docker/uploadpage/Dockerfile
+++ b/docker/uploadpage/Dockerfile
@@ -23,11 +23,11 @@ COPY --from=deps /app/node_modules ./node_modules
COPY . .
# Prisma-Client für den Linux-Build generieren
-RUN npx prisma generate
+RUN pnpx prisma generate
ENV NEXT_TELEMETRY_DISABLED=1
-RUN npm run build
+RUN pnpm run build
# ---- Runtime ----
FROM node:22-alpine AS runner
diff --git a/npm/hub/package.json b/npm/hub/package.json
index 4a4df930..0166a1cf 100644
--- a/npm/hub/package.json
+++ b/npm/hub/package.json
@@ -27,7 +27,8 @@
"react-dom": "^19",
"shadcn": "^4.11.0",
"tailwind-merge": "^3.3.1",
- "tw-animate-css": "^1.4.0"
+ "tw-animate-css": "^1.4.0",
+ "yaml": "^2.9.1"
},
"devDependencies": {
"@tailwindcss/postcss": "^4.3.3",
diff --git a/npm/hub/pnpm-lock.yaml b/npm/hub/pnpm-lock.yaml
deleted file mode 100644
index baa5f682..00000000
--- a/npm/hub/pnpm-lock.yaml
+++ /dev/null
@@ -1,4307 +0,0 @@
-lockfileVersion: '9.0'
-
-settings:
- autoInstallPeers: true
- excludeLinksFromLockfile: false
-
-importers:
-
- .:
- dependencies:
- '@base-ui/react':
- specifier: ^1.5.0
- version: 1.8.0(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@monaco-editor/react':
- specifier: ^4.7.0
- version: 4.7.0(monaco-editor@0.56.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@prisma/client':
- specifier: ^6.19.3
- version: 6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3)
- '@shadowdara/dlib':
- specifier: ^0.0.4
- version: 0.0.4
- '@shadowdara/finder-lib':
- specifier: 0.3.17
- version: 0.3.17
- '@vercel/analytics':
- specifier: 1.6.1
- version: 1.6.1(next@16.3.3(@babel/core@7.29.7)(@types/node@24.13.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)
- better-auth:
- specifier: ^1.7.4
- version: 1.7.4(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(next@16.3.3(@babel/core@7.29.7)(@types/node@24.13.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(prisma@6.19.3(typescript@5.7.3))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- class-variance-authority:
- specifier: ^0.7.1
- version: 0.7.1
- clsx:
- specifier: ^2.1.1
- version: 2.1.1
- highlight.js:
- specifier: ^11.12.0
- version: 11.12.0
- lucide-react:
- specifier: ^1.16.0
- version: 1.45.0(react@19.3.0)
- next:
- specifier: 16.3.3
- version: 16.3.3(@babel/core@7.29.7)(@types/node@24.13.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- react:
- specifier: ^19
- version: 19.3.0
- react-dom:
- specifier: ^19
- version: 19.3.0(react@19.3.0)
- shadcn:
- specifier: ^4.11.0
- version: 4.21.0(typescript@5.7.3)
- tailwind-merge:
- specifier: ^3.3.1
- version: 3.6.0
- tw-animate-css:
- specifier: ^1.4.0
- version: 1.4.0
- devDependencies:
- '@tailwindcss/postcss':
- specifier: ^4.3.3
- version: 4.3.3
- '@types/highlight.js':
- specifier: ^10.1.0
- version: 10.1.0
- '@types/node':
- specifier: ^24
- version: 24.13.4
- '@types/react':
- specifier: ^19
- version: 19.3.0
- '@types/react-dom':
- specifier: ^19
- version: 19.3.0(@types/react@19.3.0)
- postcss:
- specifier: ^8.5
- version: 8.5.28
- prisma:
- specifier: 6.19.3
- version: 6.19.3(typescript@5.7.3)
- tailwindcss:
- specifier: ^4.3.3
- version: 4.3.3
- typescript:
- specifier: 5.7.3
- version: 5.7.3
-
-packages:
-
- '@alloc/quick-lru@5.3.0':
- resolution: {integrity: sha512-U4+70Pc5ZS9osnCBCE5Jha/ciHM+Yp+CNMNC/7HvYbNRk1Ldd+f7qO65W5qfhu/TCv+/ozljlXXe9Nj8419DMA==}
- engines: {node: '>=10'}
-
- '@babel/code-frame@7.29.7':
- resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/compat-data@7.29.7':
- resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/core@7.29.7':
- resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==}
- engines: {node: '>=6.9.0'}
-
- '@babel/generator@7.29.8':
- resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-annotate-as-pure@7.29.7':
- resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-compilation-targets@7.29.7':
- resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-create-class-features-plugin@7.29.7':
- resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
-
- '@babel/helper-globals@7.29.7':
- resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-member-expression-to-functions@7.29.7':
- resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-module-imports@7.29.7':
- resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-module-transforms@7.29.7':
- resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
-
- '@babel/helper-optimise-call-expression@7.29.7':
- resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-plugin-utils@7.29.7':
- resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-replace-supers@7.29.7':
- resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
-
- '@babel/helper-skip-transparent-expression-wrappers@7.29.7':
- resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-string-parser@7.29.7':
- resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-validator-identifier@7.29.7':
- resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-validator-option@7.29.7':
- resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helpers@7.29.7':
- resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/parser@7.29.8':
- resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==}
- engines: {node: '>=6.0.0'}
- hasBin: true
-
- '@babel/plugin-syntax-jsx@7.29.7':
- resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-typescript@7.29.7':
- resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-modules-commonjs@7.29.7':
- resolution: {integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-typescript@7.29.7':
- resolution: {integrity: sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/preset-typescript@7.29.7':
- resolution: {integrity: sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/runtime@7.29.7':
- resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/template@7.29.7':
- resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/traverse@7.29.8':
- resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/types@7.29.8':
- resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==}
- engines: {node: '>=6.9.0'}
-
- '@base-ui/react@1.8.0':
- resolution: {integrity: sha512-P0/1sxo6SBVZOklKMIedvTWqw2s2IQzi9x5bIVsXu980cuSOD4NeuRSs+/L7LZQfDkZP/uRZyGPyfFl/B1oH+Q==}
- engines: {node: '>=14.0.0'}
- peerDependencies:
- '@date-fns/tz': ^1.2.0
- '@types/react': ^17 || ^18 || ^19
- date-fns: ^4.0.0
- react: ^17 || ^18 || ^19
- react-dom: ^17 || ^18 || ^19
- peerDependenciesMeta:
- '@date-fns/tz':
- optional: true
- '@types/react':
- optional: true
- date-fns:
- optional: true
-
- '@base-ui/utils@0.4.0':
- resolution: {integrity: sha512-bO9fz25kKtPf+aZVyfQrC0PDmJdmVni31W2hCS5/Owb+inwdIL3XU26pCPRPlt4LSxZrBgLwubXQXQlKaFEZzw==}
- peerDependencies:
- '@types/react': ^17 || ^18 || ^19
- react: ^17 || ^18 || ^19
- react-dom: ^17 || ^18 || ^19
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@better-auth/core@1.7.4':
- resolution: {integrity: sha512-g66dKOMB5PLxoujkxkZeYb6dh5wLhfAx/D+w9XtcO669Dslnyen2naBYqnD1r5ZwnxFKcr6aSrUPaH952V89Lg==}
- peerDependencies:
- '@better-auth/utils': 0.4.2
- '@better-fetch/fetch': 1.3.1
- '@cloudflare/workers-types': '>=4'
- '@opentelemetry/api': ^1.9.0
- better-call: 1.4.0
- jose: ^6.1.0
- kysely: ^0.28.5 || ^0.29.0
- nanostores: ^1.0.1
- peerDependenciesMeta:
- '@cloudflare/workers-types':
- optional: true
- '@opentelemetry/api':
- optional: true
-
- '@better-auth/drizzle-adapter@1.7.4':
- resolution: {integrity: sha512-J9JMl0DGYNYwtDj5nq/fzycU9dzPUDEtTNn89KmToUrwPDGfByDgfmiQ9jGK+LN3EnfsG1Pt/dDmRocbnfihlA==}
- peerDependencies:
- '@better-auth/core': ^1.7.4
- '@better-auth/utils': 0.4.2
- drizzle-orm: ^0.45.2 || >=1.0.0-rc.1 <2.0.0
- peerDependenciesMeta:
- drizzle-orm:
- optional: true
-
- '@better-auth/kysely-adapter@1.7.4':
- resolution: {integrity: sha512-WHLsTs4ZwTKorifdK6Whol6Zy+0gIzOJEXzWsvzmLtlT1uIZFpd7IPBlDZTrXvIZnxPWJHPIv8/uHqS9QFPZOA==}
- peerDependencies:
- '@better-auth/core': ^1.7.4
- '@better-auth/utils': 0.4.2
- kysely: ^0.28.17 || ^0.29.0
- peerDependenciesMeta:
- kysely:
- optional: true
-
- '@better-auth/memory-adapter@1.7.4':
- resolution: {integrity: sha512-xAihOPh4mFjvKLzmu2XNzj7RchDmytA/d/xjrGyps1oHVGCTGDGghlSt/rIT5fagtTn2R9+TBLh5QrZnTvYu9g==}
- peerDependencies:
- '@better-auth/core': ^1.7.4
- '@better-auth/utils': 0.4.2
-
- '@better-auth/mongo-adapter@1.7.4':
- resolution: {integrity: sha512-sIdIc8vONXgQxKPfzL4bbk6gO3gdFEDzC5VG8rD18xSFB6j7blBKcuzOofbswbwwbyuspnshoViGRqSoqp2PnA==}
- peerDependencies:
- '@better-auth/core': ^1.7.4
- '@better-auth/utils': 0.4.2
- mongodb: ^6.0.0 || ^7.0.0
- peerDependenciesMeta:
- mongodb:
- optional: true
-
- '@better-auth/prisma-adapter@1.7.4':
- resolution: {integrity: sha512-cvsMNaXLcwQiAIxQCx5Gq2VA1reW4RjkC5oLNXNJR4IhgeiqcvYF6qKF6UEC0vV2x3euKz5V/SDY/hblHWwx+w==}
- peerDependencies:
- '@better-auth/core': ^1.7.4
- '@better-auth/utils': 0.4.2
- '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0
- prisma: ^5.0.0 || ^6.0.0 || ^7.0.0
- peerDependenciesMeta:
- '@prisma/client':
- optional: true
- prisma:
- optional: true
-
- '@better-auth/telemetry@1.7.4':
- resolution: {integrity: sha512-FycnvWXP1gZ8BlSN1lW9L/YYFVqxi7+n6A9i66gJKdoJqREDdmhxBKOaVCbNhNC2UNDAo9PbBm/6J3gv6WmAEA==}
- peerDependencies:
- '@better-auth/core': ^1.7.4
- '@better-auth/utils': 0.4.2
- '@better-fetch/fetch': 1.3.1
-
- '@better-auth/utils@0.4.2':
- resolution: {integrity: sha512-AUxrvu+HaaODsUyzDxFgwd/8RZ1yZaYo42LXKSrU2oGgR38pS1ij8nqQKNgtTWoYGpNevNXtCfgTy6loHveW9A==}
-
- '@better-auth/utils@0.5.0':
- resolution: {integrity: sha512-BL8W4EfIZFwlu0r54m3v1ztjDhu6dDe/amLTm0xybmbZaNgYUqhD3SjpAsnq0q8YD6/ki4iwIgxJNLP/N3TxiA==}
-
- '@better-fetch/fetch@1.3.1':
- resolution: {integrity: sha512-ABkD1WhyfPZprKRQI3bhATjeiFuNWC9PXhfGWqL+sg/gKrM977oFrYkdb4msM3hgUGonr7KlOsOFT5TU2rht9g==}
-
- '@dotenvx/dotenvx@1.75.1':
- resolution: {integrity: sha512-/BITOC9dmS/edY2zQwZNicQ059O6RKabtQfyEafV0nGtfYRNHYy1DIPiYVcov40+tob9hfmBnbR963dS+EQ1DQ==}
- hasBin: true
-
- '@dotenvx/primitives@0.8.0':
- resolution: {integrity: sha512-VYJy0uhFm9zTJ1TxBaW/pA8bjbOM/OttaNMwZ1RHG4JKyRG7DhSdiqD1ipQoAyoD22olUtxbP78W9xY3Wd11bg==}
-
- '@emnapi/runtime@1.11.3':
- resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==}
-
- '@floating-ui/core@1.8.0':
- resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==}
-
- '@floating-ui/dom@1.8.0':
- resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==}
-
- '@floating-ui/react-dom@2.1.9':
- resolution: {integrity: sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==}
- peerDependencies:
- react: '>=16.8.0'
- react-dom: '>=16.8.0'
-
- '@floating-ui/utils@0.2.12':
- resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==}
-
- '@hono/node-server@2.1.1':
- resolution: {integrity: sha512-ELuehkj5VCBdgEw9zs+ivkKwyzzUCSQuE96YmiPvn1ECBoZCczbFXJLeEGMTYjphP6gydh4pHMqEYPVMYUVgQg==}
- engines: {node: '>=20'}
- peerDependencies:
- hono: ^4
-
- '@img/colour@1.1.0':
- resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==}
- engines: {node: '>=18'}
-
- '@img/sharp-darwin-arm64@0.35.4':
- resolution: {integrity: sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==}
- engines: {node: '>=20.9.0'}
- cpu: [arm64]
- os: [darwin]
-
- '@img/sharp-darwin-x64@0.35.4':
- resolution: {integrity: sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==}
- engines: {node: '>=20.9.0'}
- cpu: [x64]
- os: [darwin]
-
- '@img/sharp-freebsd-wasm32@0.35.4':
- resolution: {integrity: sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==}
- engines: {node: '>=20.9.0'}
- os: [freebsd]
-
- '@img/sharp-libvips-darwin-arm64@1.3.3':
- resolution: {integrity: sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==}
- cpu: [arm64]
- os: [darwin]
-
- '@img/sharp-libvips-darwin-x64@1.3.3':
- resolution: {integrity: sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==}
- cpu: [x64]
- os: [darwin]
-
- '@img/sharp-libvips-linux-arm64@1.3.3':
- resolution: {integrity: sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==}
- cpu: [arm64]
- os: [linux]
- libc: [glibc]
-
- '@img/sharp-libvips-linux-arm@1.3.3':
- resolution: {integrity: sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==}
- cpu: [arm]
- os: [linux]
- libc: [glibc]
-
- '@img/sharp-libvips-linux-ppc64@1.3.3':
- resolution: {integrity: sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==}
- cpu: [ppc64]
- os: [linux]
- libc: [glibc]
-
- '@img/sharp-libvips-linux-riscv64@1.3.3':
- resolution: {integrity: sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==}
- cpu: [riscv64]
- os: [linux]
- libc: [glibc]
-
- '@img/sharp-libvips-linux-s390x@1.3.3':
- resolution: {integrity: sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==}
- cpu: [s390x]
- os: [linux]
- libc: [glibc]
-
- '@img/sharp-libvips-linux-x64@1.3.3':
- resolution: {integrity: sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==}
- cpu: [x64]
- os: [linux]
- libc: [glibc]
-
- '@img/sharp-libvips-linuxmusl-arm64@1.3.3':
- resolution: {integrity: sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==}
- cpu: [arm64]
- os: [linux]
- libc: [musl]
-
- '@img/sharp-libvips-linuxmusl-x64@1.3.3':
- resolution: {integrity: sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==}
- cpu: [x64]
- os: [linux]
- libc: [musl]
-
- '@img/sharp-linux-arm64@0.35.4':
- resolution: {integrity: sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==}
- engines: {node: '>=20.9.0'}
- cpu: [arm64]
- os: [linux]
- libc: [glibc]
-
- '@img/sharp-linux-arm@0.35.4':
- resolution: {integrity: sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==}
- engines: {node: '>=20.9.0'}
- cpu: [arm]
- os: [linux]
- libc: [glibc]
-
- '@img/sharp-linux-ppc64@0.35.4':
- resolution: {integrity: sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==}
- engines: {node: '>=20.9.0'}
- cpu: [ppc64]
- os: [linux]
- libc: [glibc]
-
- '@img/sharp-linux-riscv64@0.35.4':
- resolution: {integrity: sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==}
- engines: {node: '>=20.9.0'}
- cpu: [riscv64]
- os: [linux]
- libc: [glibc]
-
- '@img/sharp-linux-s390x@0.35.4':
- resolution: {integrity: sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==}
- engines: {node: '>=20.9.0'}
- cpu: [s390x]
- os: [linux]
- libc: [glibc]
-
- '@img/sharp-linux-x64@0.35.4':
- resolution: {integrity: sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==}
- engines: {node: '>=20.9.0'}
- cpu: [x64]
- os: [linux]
- libc: [glibc]
-
- '@img/sharp-linuxmusl-arm64@0.35.4':
- resolution: {integrity: sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==}
- engines: {node: '>=20.9.0'}
- cpu: [arm64]
- os: [linux]
- libc: [musl]
-
- '@img/sharp-linuxmusl-x64@0.35.4':
- resolution: {integrity: sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==}
- engines: {node: '>=20.9.0'}
- cpu: [x64]
- os: [linux]
- libc: [musl]
-
- '@img/sharp-wasm32@0.35.4':
- resolution: {integrity: sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==}
- engines: {node: '>=20.9.0'}
-
- '@img/sharp-webcontainers-wasm32@0.35.4':
- resolution: {integrity: sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==}
- engines: {node: '>=20.9.0'}
- cpu: [wasm32]
-
- '@img/sharp-win32-arm64@0.35.4':
- resolution: {integrity: sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==}
- engines: {node: '>=20.9.0'}
- cpu: [arm64]
- os: [win32]
-
- '@img/sharp-win32-ia32@0.35.4':
- resolution: {integrity: sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==}
- engines: {node: ^20.9.0}
- cpu: [ia32]
- os: [win32]
-
- '@img/sharp-win32-x64@0.35.4':
- resolution: {integrity: sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==}
- engines: {node: '>=20.9.0'}
- cpu: [x64]
- os: [win32]
-
- '@jridgewell/gen-mapping@0.3.13':
- resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
-
- '@jridgewell/remapping@2.3.5':
- resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
-
- '@jridgewell/resolve-uri@3.1.2':
- resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
- engines: {node: '>=6.0.0'}
-
- '@jridgewell/sourcemap-codec@1.6.0':
- resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==}
-
- '@jridgewell/trace-mapping@0.3.31':
- resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
-
- '@modelcontextprotocol/sdk@1.30.0':
- resolution: {integrity: sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==}
- engines: {node: '>=18'}
- peerDependencies:
- '@cfworker/json-schema': ^4.1.1
- zod: ^3.25 || ^4.0
- peerDependenciesMeta:
- '@cfworker/json-schema':
- optional: true
-
- '@monaco-editor/loader@1.7.0':
- resolution: {integrity: sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==}
-
- '@monaco-editor/react@4.7.0':
- resolution: {integrity: sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==}
- peerDependencies:
- monaco-editor: '>= 0.25.0 < 1'
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
- react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
-
- '@next/env@16.3.3':
- resolution: {integrity: sha512-U2eYQRwXj+dsqxV79zFqExDdatnNY/ZWc2nsJU1p/OgT7fd3dXwlF6OjYaFQCfMoeTA19PWq+wVmYgimVA+V+g==}
-
- '@next/swc-darwin-arm64@16.3.3':
- resolution: {integrity: sha512-8Hiv32QJPwdV6KYJ8meR9SBA061tQqnIKTJDocvOXlEQqib0xMFpzArosuffFUUc0sslbh7QQ8a3Yey1QV8EIw==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [darwin]
-
- '@next/swc-darwin-x64@16.3.3':
- resolution: {integrity: sha512-A1lgKgwVchRYmSe467zdwhxT9040dd8lH+o65sL5Jet8fjB4kegw/rDyPIpYVRb6jAqwXFOJpjIXJLxQKLiE3A==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [darwin]
-
- '@next/swc-linux-arm64-gnu@16.3.3':
- resolution: {integrity: sha512-bf0FIssMFueU2dm7vQEWWxk0c8UjKTdW0yzuh0sQsD8pf1+KCLDdaqhYZNMYGmXwEOiHAUzgBKudovIlcvvBjg==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [linux]
- libc: [glibc]
-
- '@next/swc-linux-arm64-musl@16.3.3':
- resolution: {integrity: sha512-W7viwCk9JY/cAkdz/A273rd5bb3RgT/IHwR7Upv90tunjBWNtAAhGhoecHh+teRNRSinuAFmE+l7fwZ4YKkrXg==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [linux]
- libc: [musl]
-
- '@next/swc-linux-x64-gnu@16.3.3':
- resolution: {integrity: sha512-0W46zw1N3ODpI6n0GeivHvvob1pooozgZVqy65k0mh4/7vr+FbY9+WpHzNVXjHipJf/A3FDheBG19H1s5A25rA==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [linux]
- libc: [glibc]
-
- '@next/swc-linux-x64-musl@16.3.3':
- resolution: {integrity: sha512-H4mBso8ZTMBPtdT0PN0pBx2ayTvQuTuvS6qT13d77yVFJXAPCxkyIhLTmdMaGTJs0krQYI/qpzdHijCeihXhbg==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [linux]
- libc: [musl]
-
- '@next/swc-win32-arm64-msvc@16.3.3':
- resolution: {integrity: sha512-cTMUJpcEGmeywofCUfhR+rSsoE33+rVPnPEYNTNdLNlsOeEg/vktOsKUSTb28vUGqD2jkm4Zaskcwn7OCI6FQg==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [win32]
-
- '@next/swc-win32-x64-msvc@16.3.3':
- resolution: {integrity: sha512-2VR4cTBzHXaBjnGsuH6GyJjENzQOmHeAh11uY1iUhjm3j5dEUrVJuUj+VL78jaGi/Dik8xS76zEj18BsFhlVZQ==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [win32]
-
- '@noble/ciphers@2.4.0':
- resolution: {integrity: sha512-AnjFn0Jv92laAkvMrghlFZq4qQCIN/4DxFV/eooqtC2YTjB7kBeLMS2T9KJX4Dn+ZVXLOwK0lSgqDtx9gvxtiw==}
- engines: {node: '>= 20.19.0'}
-
- '@noble/hashes@2.4.0':
- resolution: {integrity: sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==}
- engines: {node: '>= 20.19.0'}
-
- '@nodelib/fs.scandir@2.1.5':
- resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
- engines: {node: '>= 8'}
-
- '@nodelib/fs.stat@2.0.5':
- resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
- engines: {node: '>= 8'}
-
- '@nodelib/fs.walk@1.2.8':
- resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
- engines: {node: '>= 8'}
-
- '@opentelemetry/semantic-conventions@1.43.0':
- resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==}
- engines: {node: '>=14'}
-
- '@prisma/client@6.19.3':
- resolution: {integrity: sha512-mKq3jQFhjvko5LTJFHGilsuQs+W+T3Gm451NzuTDGQxwCzwXHYnIu2zGkRoW+Exq3Rob7yp2MfzSrdIiZVhrBg==}
- engines: {node: '>=18.18'}
- peerDependencies:
- prisma: '*'
- typescript: '>=5.1.0'
- peerDependenciesMeta:
- prisma:
- optional: true
- typescript:
- optional: true
-
- '@prisma/config@6.19.3':
- resolution: {integrity: sha512-CBPT44BjlQxEt8kiMEauji2WHTDoVBOKl7UlewXmUgBPnr/oPRZC3psci5chJnYmH0ivEIog2OU9PGWoki3DLQ==}
-
- '@prisma/debug@6.19.3':
- resolution: {integrity: sha512-ljkJ+SgpXNktLG0Q/n4JGYCkKf0f8oYLyjImS2I8e2q2WCfdRRtWER062ZV/ixaNP2M2VKlWXVJiGzZaUgbKZw==}
-
- '@prisma/engines-version@7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7':
- resolution: {integrity: sha512-03bgb1VD5gvuumNf+7fVGBzfpJPjmqV423l/WxsWk2cNQ42JD0/SsFBPhN6z8iAvdHs07/7ei77SKu7aZfq8bA==}
-
- '@prisma/engines@6.19.3':
- resolution: {integrity: sha512-RSYxtlYFl5pJ8ZePgMv0lZ9IzVCOdTPOegrs2qcbAEFrBI1G33h6wyC9kjQvo0DnYEhEVY0X4LsuFHXLKQk88g==}
-
- '@prisma/fetch-engine@6.19.3':
- resolution: {integrity: sha512-tKtl/qco9Nt7LU5iKhpultD8O4vMCZcU2CHjNTnRrL1QvSUr5W/GcyFPjNL87GtRrwBc7ubXXD9xy4EvLvt8JA==}
-
- '@prisma/get-platform@6.19.3':
- resolution: {integrity: sha512-xFj1VcJ1N3MKooOQAGO0W5tsd0W2QzIvW7DD7c/8H14Zmp4jseeWAITm+w2LLoLrlhoHdPPh0NMZ8mfL6puoHA==}
-
- '@sec-ant/readable-stream@0.4.1':
- resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==}
-
- '@shadowdara/dlib@0.0.4':
- resolution: {integrity: sha512-eYvqbE0uhTCufVd5NjhYQEIZwJg2qu1DyHu9gVMJQUei0UZyYxe5F+hZYO7Hdr+yD2sm3dWvzZ+fBzVDeySnFg==}
-
- '@shadowdara/finder-lib@0.3.17':
- resolution: {integrity: sha512-8aOCR273G8vBtp/migYdQHAgD9Uu2ymtX49wfAPA3rfFs+2PooujmvMrRss1O+uJvce3ti0NY13if2UHqv080g==}
-
- '@sindresorhus/merge-streams@4.0.0':
- resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
- engines: {node: '>=18'}
-
- '@standard-schema/spec@1.1.0':
- resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
-
- '@swc/helpers@0.5.23':
- resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==}
-
- '@tailwindcss/node@4.3.3':
- resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==}
-
- '@tailwindcss/oxide-android-arm64@4.3.3':
- resolution: {integrity: sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==}
- engines: {node: '>= 20'}
- cpu: [arm64]
- os: [android]
-
- '@tailwindcss/oxide-darwin-arm64@4.3.3':
- resolution: {integrity: sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==}
- engines: {node: '>= 20'}
- cpu: [arm64]
- os: [darwin]
-
- '@tailwindcss/oxide-darwin-x64@4.3.3':
- resolution: {integrity: sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==}
- engines: {node: '>= 20'}
- cpu: [x64]
- os: [darwin]
-
- '@tailwindcss/oxide-freebsd-x64@4.3.3':
- resolution: {integrity: sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==}
- engines: {node: '>= 20'}
- cpu: [x64]
- os: [freebsd]
-
- '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3':
- resolution: {integrity: sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==}
- engines: {node: '>= 20'}
- cpu: [arm]
- os: [linux]
-
- '@tailwindcss/oxide-linux-arm64-gnu@4.3.3':
- resolution: {integrity: sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==}
- engines: {node: '>= 20'}
- cpu: [arm64]
- os: [linux]
- libc: [glibc]
-
- '@tailwindcss/oxide-linux-arm64-musl@4.3.3':
- resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==}
- engines: {node: '>= 20'}
- cpu: [arm64]
- os: [linux]
- libc: [musl]
-
- '@tailwindcss/oxide-linux-x64-gnu@4.3.3':
- resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==}
- engines: {node: '>= 20'}
- cpu: [x64]
- os: [linux]
- libc: [glibc]
-
- '@tailwindcss/oxide-linux-x64-musl@4.3.3':
- resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==}
- engines: {node: '>= 20'}
- cpu: [x64]
- os: [linux]
- libc: [musl]
-
- '@tailwindcss/oxide-wasm32-wasi@4.3.3':
- resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==}
- engines: {node: '>=14.0.0'}
- cpu: [wasm32]
- bundledDependencies:
- - '@napi-rs/wasm-runtime'
- - '@emnapi/core'
- - '@emnapi/runtime'
- - '@tybys/wasm-util'
- - '@emnapi/wasi-threads'
- - tslib
-
- '@tailwindcss/oxide-win32-arm64-msvc@4.3.3':
- resolution: {integrity: sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==}
- engines: {node: '>= 20'}
- cpu: [arm64]
- os: [win32]
-
- '@tailwindcss/oxide-win32-x64-msvc@4.3.3':
- resolution: {integrity: sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==}
- engines: {node: '>= 20'}
- cpu: [x64]
- os: [win32]
-
- '@tailwindcss/oxide@4.3.3':
- resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==}
- engines: {node: '>= 20'}
-
- '@tailwindcss/postcss@4.3.3':
- resolution: {integrity: sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg==}
-
- '@ts-morph/common@0.27.0':
- resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==}
-
- '@types/highlight.js@10.1.0':
- resolution: {integrity: sha512-77hF2dGBsOgnvZll1vymYiNUtqJ8cJfXPD6GG/2M0aLRc29PkvB7Au6sIDjIEFcSICBhCh2+Pyq6WSRS7LUm6A==}
- deprecated: This is a stub types definition. highlight.js provides its own type definitions, so you do not need this installed.
-
- '@types/node@24.13.4':
- resolution: {integrity: sha512-YJ7EqCstVTzIr0fMr7qul/977en+pQHrfmuKIo6Zr9i75Be21dr3MovcfvGtyvi2HAUrRerWps5sMO9I7WaxDw==}
-
- '@types/react-dom@19.3.0':
- resolution: {integrity: sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==}
- peerDependencies:
- '@types/react': ^19.3.0
-
- '@types/react@19.3.0':
- resolution: {integrity: sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==}
-
- '@types/trusted-types@2.0.7':
- resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
-
- '@types/validate-npm-package-name@4.0.2':
- resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==}
-
- '@vercel/analytics@1.6.1':
- resolution: {integrity: sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg==}
- peerDependencies:
- '@remix-run/react': ^2
- '@sveltejs/kit': ^1 || ^2
- next: '>= 13'
- react: ^18 || ^19 || ^19.0.0-rc
- svelte: '>= 4'
- vue: ^3
- vue-router: ^4
- peerDependenciesMeta:
- '@remix-run/react':
- optional: true
- '@sveltejs/kit':
- optional: true
- next:
- optional: true
- react:
- optional: true
- svelte:
- optional: true
- vue:
- optional: true
- vue-router:
- optional: true
-
- accepts@2.0.0:
- resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==}
- engines: {node: '>= 0.6'}
-
- ajv-formats@2.1.1:
- resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
- peerDependencies:
- ajv: ^8.0.0
- peerDependenciesMeta:
- ajv:
- optional: true
-
- ajv-formats@3.0.1:
- resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==}
- peerDependencies:
- ajv: ^8.0.0
- peerDependenciesMeta:
- ajv:
- optional: true
-
- ajv@8.20.0:
- resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==}
-
- ansi-colors@4.1.3:
- resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
- engines: {node: '>=6'}
-
- ansi-regex@5.0.1:
- resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
- engines: {node: '>=8'}
-
- ansi-regex@6.3.0:
- resolution: {integrity: sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==}
- engines: {node: '>=12'}
-
- argparse@2.0.1:
- resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
-
- ast-types@0.16.3:
- resolution: {integrity: sha512-FvWoWYfSCM6kRxCSH+MGLHIKKGRL6A6AW7Zek2O32REPQRdg131428uRTKMBYAeRd3XXAaHDS60Wpri7CdKDrA==}
- engines: {node: '>=4'}
-
- atomically@1.7.0:
- resolution: {integrity: sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==}
- engines: {node: '>=10.12.0'}
-
- balanced-match@4.0.4:
- resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
- engines: {node: 18 || 20 || >=22}
-
- baseline-browser-mapping@2.11.22:
- resolution: {integrity: sha512-pWc4w51fBFd7mav43/zKRC+RI6f4yfzQoVlfvE8dECePyfkn1bzLp01Fj0QACcyCZyFhiEMyD2qScfKRWgWibA==}
- engines: {node: '>=6.0.0'}
- hasBin: true
-
- better-auth@1.7.4:
- resolution: {integrity: sha512-rjL9g8b8UvdwK/ZSdawhqYzOm8YegurB6Fuzqtu/zFJamlFrPa+eEhP8Qj2vFWsMzHOk2mb/L4FRYh9pgaU7OA==}
- peerDependencies:
- '@lynx-js/react': '*'
- '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0
- '@sveltejs/kit': ^2.0.0
- '@tanstack/react-start': ^1.0.0
- '@tanstack/solid-start': ^1.0.0
- better-sqlite3: ^12.0.0
- drizzle-kit: '>=0.31.4 || >=1.0.0-beta.1'
- drizzle-orm: ^0.45.2 || >=1.0.0-rc.1 <2.0.0
- mongodb: ^6.0.0 || ^7.0.0
- mysql2: ^3.0.0
- next: ^14.0.0 || ^15.0.0 || ^16.0.0
- pg: ^8.0.0
- prisma: ^5.0.0 || ^6.0.0 || ^7.0.0
- react: ^18.0.0 || ^19.0.0
- react-dom: ^18.0.0 || ^19.0.0
- solid-js: ^1.0.0
- svelte: ^4.0.0 || ^5.0.0
- vitest: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0
- vue: ^3.0.0
- peerDependenciesMeta:
- '@lynx-js/react':
- optional: true
- '@prisma/client':
- optional: true
- '@sveltejs/kit':
- optional: true
- '@tanstack/react-start':
- optional: true
- '@tanstack/solid-start':
- optional: true
- better-sqlite3:
- optional: true
- drizzle-kit:
- optional: true
- drizzle-orm:
- optional: true
- mongodb:
- optional: true
- mysql2:
- optional: true
- next:
- optional: true
- pg:
- optional: true
- prisma:
- optional: true
- react:
- optional: true
- react-dom:
- optional: true
- solid-js:
- optional: true
- svelte:
- optional: true
- vitest:
- optional: true
- vue:
- optional: true
-
- better-call@1.4.0:
- resolution: {integrity: sha512-bBKOT4vv1kZLDgxVePdilk/Jwkn+dtRRsmi3DzHcDP+WnswyVl6dR59l2HEeP/0cB+bDoopASAesWDPIdd/zZA==}
- peerDependencies:
- zod: ^4.0.0
- peerDependenciesMeta:
- zod:
- optional: true
-
- body-parser@2.3.0:
- resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==}
- engines: {node: '>=18'}
-
- brace-expansion@5.0.9:
- resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==}
- engines: {node: 20 || >=22}
-
- braces@3.0.3:
- resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
- engines: {node: '>=8'}
-
- browserslist@4.28.9:
- resolution: {integrity: sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg==}
- engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
- hasBin: true
-
- bundle-name@4.1.0:
- resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==}
- engines: {node: '>=18'}
-
- bytes@3.1.2:
- resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
- engines: {node: '>= 0.8'}
-
- c12@3.1.0:
- resolution: {integrity: sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==}
- peerDependencies:
- magicast: ^0.3.5
- peerDependenciesMeta:
- magicast:
- optional: true
-
- call-bind-apply-helpers@1.0.2:
- resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
- engines: {node: '>= 0.4'}
-
- call-bound@1.0.4:
- resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
- engines: {node: '>= 0.4'}
-
- callsites@3.1.0:
- resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
- engines: {node: '>=6'}
-
- caniuse-lite@1.0.30001810:
- resolution: {integrity: sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==}
-
- chalk@5.6.2:
- resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==}
- engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
-
- chokidar@4.0.3:
- resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
- engines: {node: '>= 14.16.0'}
-
- citty@0.1.6:
- resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==}
-
- citty@0.2.2:
- resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==}
-
- class-variance-authority@0.7.1:
- resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==}
-
- cli-cursor@5.0.0:
- resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==}
- engines: {node: '>=18'}
-
- cli-spinners@2.9.2:
- resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
- engines: {node: '>=6'}
-
- client-only@0.0.1:
- resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
-
- clsx@2.1.1:
- resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
- engines: {node: '>=6'}
-
- cn@0.2.6:
- resolution: {integrity: sha512-+i4L0zUGgRcEnhsxueVrP7iBGxBx5iD0WOTYg1MwFEu2ZyCmH5Ov2V1cul2Ht5UchRQQgftCf4be/RxspuW6QQ==}
- engines: {node: '>=20'}
- hasBin: true
-
- code-block-writer@13.0.3:
- resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==}
-
- commander@11.1.0:
- resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==}
- engines: {node: '>=16'}
-
- commander@14.0.3:
- resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==}
- engines: {node: '>=20'}
-
- conf@10.2.0:
- resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==}
- engines: {node: '>=12'}
-
- confbox@0.2.4:
- resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==}
-
- confbox@0.3.1:
- resolution: {integrity: sha512-cKUSoKa8YxFZZSmraVi7onONx3amu77ngK3kGpsYHDH7drPwCRkQE1RYMPlLRrMtnciRj274XNRxcHxnKmDSnA==}
-
- consola@3.4.2:
- resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==}
- engines: {node: ^14.18.0 || >=16.10.0}
-
- content-disposition@1.1.0:
- resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==}
- engines: {node: '>=18'}
-
- content-type@1.0.5:
- resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
- engines: {node: '>= 0.6'}
-
- content-type@2.1.0:
- resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==}
- engines: {node: '>=18'}
-
- convert-source-map@2.0.0:
- resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
-
- cookie-signature@1.2.2:
- resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==}
- engines: {node: '>=6.6.0'}
-
- cookie@0.7.2:
- resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
- engines: {node: '>= 0.6'}
-
- cors@2.8.6:
- resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==}
- engines: {node: '>= 0.10'}
-
- cosmiconfig@9.0.2:
- resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==}
- engines: {node: '>=14'}
- peerDependencies:
- typescript: '>=4.9.5'
- peerDependenciesMeta:
- typescript:
- optional: true
-
- cross-spawn@7.0.6:
- resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
- engines: {node: '>= 8'}
-
- cssesc@3.0.0:
- resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
- engines: {node: '>=4'}
- hasBin: true
-
- csstype@3.2.3:
- resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
-
- debounce-fn@4.0.0:
- resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==}
- engines: {node: '>=10'}
-
- debug@4.4.3:
- resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
- engines: {node: '>=6.0'}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
-
- dedent@1.7.2:
- resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==}
- peerDependencies:
- babel-plugin-macros: ^3.1.0
- peerDependenciesMeta:
- babel-plugin-macros:
- optional: true
-
- deepmerge-ts@7.1.5:
- resolution: {integrity: sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==}
- engines: {node: '>=16.0.0'}
-
- deepmerge@4.3.1:
- resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
- engines: {node: '>=0.10.0'}
-
- default-browser-id@5.0.1:
- resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==}
- engines: {node: '>=18'}
-
- default-browser@5.5.1:
- resolution: {integrity: sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==}
- engines: {node: '>=18'}
-
- define-lazy-prop@2.0.0:
- resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
- engines: {node: '>=8'}
-
- define-lazy-prop@3.0.0:
- resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
- engines: {node: '>=12'}
-
- defu@6.1.7:
- resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==}
-
- depd@2.0.0:
- resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
- engines: {node: '>= 0.8'}
-
- destr@2.0.5:
- resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==}
-
- detect-libc@2.1.2:
- resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
- engines: {node: '>=8'}
-
- diff@8.0.4:
- resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==}
- engines: {node: '>=0.3.1'}
-
- dompurify@3.4.8:
- resolution: {integrity: sha512-yb1cEmaOum7wFvOCSQxyfgVlv5D47Rc30iZWoMpbDIWTnJ6grDDQyu2KFJzB2k7u0pMuJcQ1zphH//fFnw2tjQ==}
-
- dot-prop@6.0.1:
- resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==}
- engines: {node: '>=10'}
-
- dotenv@16.6.1:
- resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==}
- engines: {node: '>=12'}
-
- dotenv@17.4.2:
- resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==}
- engines: {node: '>=12'}
-
- dunder-proto@1.0.1:
- resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
- engines: {node: '>= 0.4'}
-
- ee-first@1.1.1:
- resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
-
- effect@3.21.0:
- resolution: {integrity: sha512-PPN80qRokCd1f015IANNhrwOnLO7GrrMQfk4/lnZRE/8j7UPWrNNjPV0uBrZutI/nHzernbW+J0hdqQysHiSnQ==}
-
- electron-to-chromium@1.5.427:
- resolution: {integrity: sha512-n14zb3FdsChZ2BNobqNHAJMcP3ifFv4paox2LvCrfVAQcqGiSURgbJl+PfMpHVCNFkStnNc+RRVtPBTVW5PDgw==}
-
- emoji-regex@10.6.0:
- resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
-
- empathic@2.0.0:
- resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==}
- engines: {node: '>=14'}
-
- encodeurl@2.0.0:
- resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
- engines: {node: '>= 0.8'}
-
- enhanced-resolve@5.24.5:
- resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==}
- engines: {node: '>=10.13.0'}
-
- enquirer@2.4.1:
- resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==}
- engines: {node: '>=8.6'}
-
- env-paths@2.2.1:
- resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
- engines: {node: '>=6'}
-
- error-ex@1.3.4:
- resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==}
-
- es-define-property@1.0.1:
- resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
- engines: {node: '>= 0.4'}
-
- es-errors@1.3.0:
- resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
- engines: {node: '>= 0.4'}
-
- es-object-atoms@1.1.2:
- resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==}
- engines: {node: '>= 0.4'}
-
- escalade@3.2.0:
- resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
- engines: {node: '>=6'}
-
- escape-html@1.0.3:
- resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
-
- esprima@4.0.1:
- resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
- engines: {node: '>=4'}
- hasBin: true
-
- etag@1.8.1:
- resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
- engines: {node: '>= 0.6'}
-
- eventsource-parser@3.1.1:
- resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==}
- engines: {node: '>=18.0.0'}
-
- eventsource@3.0.7:
- resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==}
- engines: {node: '>=18.0.0'}
-
- execa@5.1.1:
- resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
- engines: {node: '>=10'}
-
- execa@9.6.1:
- resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==}
- engines: {node: ^18.19.0 || >=20.5.0}
-
- express-rate-limit@8.7.0:
- resolution: {integrity: sha512-hOwV7WOxXfjRpAM1DSJWZDXx3GhplwD8IfwuwvogD8i1Qnkgosw/H45s4ZnFAUHDAhPjlY9hLBvJhKmGMyY26g==}
- engines: {node: '>= 16'}
- peerDependencies:
- express: '>= 4.11'
-
- express@5.2.1:
- resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==}
- engines: {node: '>= 18'}
-
- exsolve@1.1.1:
- resolution: {integrity: sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==}
-
- fast-check@3.23.2:
- resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==}
- engines: {node: '>=8.0.0'}
-
- fast-deep-equal@3.1.3:
- resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
-
- fast-glob@3.3.3:
- resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
- engines: {node: '>=8.6.0'}
-
- fast-uri@3.1.7:
- resolution: {integrity: sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==}
-
- fastq@1.20.3:
- resolution: {integrity: sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==}
-
- fdir@6.5.0:
- resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
- engines: {node: '>=12.0.0'}
- peerDependencies:
- picomatch: ^3 || ^4
- peerDependenciesMeta:
- picomatch:
- optional: true
-
- figures@6.1.0:
- resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==}
- engines: {node: '>=18'}
-
- fill-range@7.1.1:
- resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
- engines: {node: '>=8'}
-
- finalhandler@2.1.1:
- resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==}
- engines: {node: '>= 18.0.0'}
-
- find-up@3.0.0:
- resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==}
- engines: {node: '>=6'}
-
- forwarded@0.2.0:
- resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
- engines: {node: '>= 0.6'}
-
- fresh@2.0.0:
- resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
- engines: {node: '>= 0.8'}
-
- fs-extra@11.4.0:
- resolution: {integrity: sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==}
- engines: {node: '>=14.14'}
-
- function-bind@1.1.2:
- resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
-
- fuzzysort@3.1.0:
- resolution: {integrity: sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==}
-
- gensync@1.0.0-beta.2:
- resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
- engines: {node: '>=6.9.0'}
-
- get-east-asian-width@1.6.0:
- resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==}
- engines: {node: '>=18'}
-
- get-intrinsic@1.3.0:
- resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
- engines: {node: '>= 0.4'}
-
- get-own-enumerable-keys@1.0.0:
- resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==}
- engines: {node: '>=14.16'}
-
- get-proto@1.0.1:
- resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
- engines: {node: '>= 0.4'}
-
- get-stream@6.0.1:
- resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
- engines: {node: '>=10'}
-
- get-stream@9.0.1:
- resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==}
- engines: {node: '>=18'}
-
- giget@2.0.0:
- resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==}
- hasBin: true
-
- glob-parent@5.1.2:
- resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
- engines: {node: '>= 6'}
-
- gopd@1.2.0:
- resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
- engines: {node: '>= 0.4'}
-
- graceful-fs@4.2.11:
- resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
-
- has-symbols@1.1.0:
- resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
- engines: {node: '>= 0.4'}
-
- hasown@2.0.4:
- resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==}
- engines: {node: '>= 0.4'}
-
- highlight.js@11.12.0:
- resolution: {integrity: sha512-nbfWpyRMcMrPMmDwJB+dhX/eiaPKtc2RB+0QZskqJ3WjRA/FDS0e9hZrx8EC/lbEv8gXy98FcDbNa/dspAaJMg==}
- engines: {node: '>=12.0.0'}
-
- hono@4.13.7:
- resolution: {integrity: sha512-c8/gF9ac8Y78/agExVocyLevgR+JlpNB444Py0FSX8pJoPdYUfUzRcXtYEYGwt6l19qIlVZPN5Mfsw9jFShmQQ==}
- engines: {node: '>=16.9.0'}
-
- http-errors@2.0.1:
- resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==}
- engines: {node: '>= 0.8'}
-
- human-signals@2.1.0:
- resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
- engines: {node: '>=10.17.0'}
-
- human-signals@8.0.1:
- resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==}
- engines: {node: '>=18.18.0'}
-
- iconv-lite@0.7.3:
- resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==}
- engines: {node: '>=0.10.0'}
-
- ignore@5.3.2:
- resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
- engines: {node: '>= 4'}
-
- import-fresh@3.3.1:
- resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
- engines: {node: '>=6'}
-
- inherits@2.0.4:
- resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
-
- ip-address@10.7.0:
- resolution: {integrity: sha512-BGFsyJd5mpXp3rK6jIdADLNgpJUK1jnjzvYF8lK+VyDab9JAmqN0YOKDdP17HlgKb2+ehPgDc8EtnRLbGCAMhA==}
- engines: {node: '>= 12'}
-
- ipaddr.js@1.9.1:
- resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
- engines: {node: '>= 0.10'}
-
- is-arrayish@0.2.1:
- resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
-
- is-docker@2.2.1:
- resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
- engines: {node: '>=8'}
- hasBin: true
-
- is-docker@3.0.0:
- resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- hasBin: true
-
- is-extglob@2.1.1:
- resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
- engines: {node: '>=0.10.0'}
-
- is-glob@4.0.3:
- resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
- engines: {node: '>=0.10.0'}
-
- is-in-ssh@1.0.0:
- resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==}
- engines: {node: '>=20'}
-
- is-inside-container@1.0.0:
- resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
- engines: {node: '>=14.16'}
- hasBin: true
-
- is-interactive@2.0.0:
- resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==}
- engines: {node: '>=12'}
-
- is-number@7.0.0:
- resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
- engines: {node: '>=0.12.0'}
-
- is-obj@2.0.0:
- resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
- engines: {node: '>=8'}
-
- is-obj@3.0.0:
- resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==}
- engines: {node: '>=12'}
-
- is-plain-obj@4.1.0:
- resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
- engines: {node: '>=12'}
-
- is-promise@4.0.0:
- resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
-
- is-regexp@3.1.0:
- resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==}
- engines: {node: '>=12'}
-
- is-stream@2.0.1:
- resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
- engines: {node: '>=8'}
-
- is-stream@4.0.1:
- resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==}
- engines: {node: '>=18'}
-
- is-unicode-supported@1.3.0:
- resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==}
- engines: {node: '>=12'}
-
- is-unicode-supported@2.1.0:
- resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==}
- engines: {node: '>=18'}
-
- is-wsl@2.2.0:
- resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
- engines: {node: '>=8'}
-
- is-wsl@3.1.1:
- resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==}
- engines: {node: '>=16'}
-
- isexe@2.0.0:
- resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
-
- isexe@3.1.5:
- resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==}
- engines: {node: '>=18'}
-
- jiti@2.7.0:
- resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==}
- hasBin: true
-
- jose@6.2.12:
- resolution: {integrity: sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==}
-
- js-tokens@4.0.0:
- resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
-
- js-yaml@4.3.2:
- resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==}
- hasBin: true
-
- jsesc@3.1.0:
- resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
- engines: {node: '>=6'}
- hasBin: true
-
- json-parse-even-better-errors@2.3.1:
- resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
-
- json-schema-traverse@1.0.0:
- resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
-
- json-schema-typed@7.0.3:
- resolution: {integrity: sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==}
-
- json-schema-typed@8.0.2:
- resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==}
-
- json5@2.2.3:
- resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
- engines: {node: '>=6'}
- hasBin: true
-
- jsonfile@6.2.1:
- resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==}
-
- kleur@3.0.3:
- resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
- engines: {node: '>=6'}
-
- kleur@4.1.5:
- resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
- engines: {node: '>=6'}
-
- kysely@0.29.5:
- resolution: {integrity: sha512-ooa+eSbBNPTo3MycPEuW5jdrxQdQwdtB3LC3h43FiXQbIry5tR0C5lDG7eealK0E4D7XjrnOP5DIUg/LyjRMYQ==}
- engines: {node: '>=22.0.0'}
-
- lightningcss-android-arm64@1.32.0:
- resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==}
- engines: {node: '>= 12.0.0'}
- cpu: [arm64]
- os: [android]
-
- lightningcss-darwin-arm64@1.32.0:
- resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==}
- engines: {node: '>= 12.0.0'}
- cpu: [arm64]
- os: [darwin]
-
- lightningcss-darwin-x64@1.32.0:
- resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==}
- engines: {node: '>= 12.0.0'}
- cpu: [x64]
- os: [darwin]
-
- lightningcss-freebsd-x64@1.32.0:
- resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==}
- engines: {node: '>= 12.0.0'}
- cpu: [x64]
- os: [freebsd]
-
- lightningcss-linux-arm-gnueabihf@1.32.0:
- resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==}
- engines: {node: '>= 12.0.0'}
- cpu: [arm]
- os: [linux]
-
- lightningcss-linux-arm64-gnu@1.32.0:
- resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==}
- engines: {node: '>= 12.0.0'}
- cpu: [arm64]
- os: [linux]
- libc: [glibc]
-
- lightningcss-linux-arm64-musl@1.32.0:
- resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==}
- engines: {node: '>= 12.0.0'}
- cpu: [arm64]
- os: [linux]
- libc: [musl]
-
- lightningcss-linux-x64-gnu@1.32.0:
- resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==}
- engines: {node: '>= 12.0.0'}
- cpu: [x64]
- os: [linux]
- libc: [glibc]
-
- lightningcss-linux-x64-musl@1.32.0:
- resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==}
- engines: {node: '>= 12.0.0'}
- cpu: [x64]
- os: [linux]
- libc: [musl]
-
- lightningcss-win32-arm64-msvc@1.32.0:
- resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==}
- engines: {node: '>= 12.0.0'}
- cpu: [arm64]
- os: [win32]
-
- lightningcss-win32-x64-msvc@1.32.0:
- resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==}
- engines: {node: '>= 12.0.0'}
- cpu: [x64]
- os: [win32]
-
- lightningcss@1.32.0:
- resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==}
- engines: {node: '>= 12.0.0'}
-
- lines-and-columns@1.2.4:
- resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
-
- locate-path@3.0.0:
- resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==}
- engines: {node: '>=6'}
-
- log-symbols@6.0.0:
- resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==}
- engines: {node: '>=18'}
-
- lru-cache@5.1.1:
- resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
-
- lucide-react@1.45.0:
- resolution: {integrity: sha512-yH1ubCAduho9UR7oJhRXIQXogksRILBiTuZC4/bQIGeB9JOkxMlSuEHyyZpo1Z3S0yWJO2KTSUZbjiNvVxeOUw==}
- peerDependencies:
- react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
-
- magic-string@0.30.21:
- resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
-
- marked@14.0.0:
- resolution: {integrity: sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==}
- engines: {node: '>= 18'}
- hasBin: true
-
- math-intrinsics@1.1.0:
- resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
- engines: {node: '>= 0.4'}
-
- media-typer@1.1.1:
- resolution: {integrity: sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==}
- engines: {node: '>= 0.8'}
-
- merge-descriptors@2.0.0:
- resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==}
- engines: {node: '>=18'}
-
- merge-stream@2.0.0:
- resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
-
- merge2@1.4.1:
- resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
- engines: {node: '>= 8'}
-
- micromatch@4.0.8:
- resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
- engines: {node: '>=8.6'}
-
- mime-db@1.54.0:
- resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
- engines: {node: '>= 0.6'}
-
- mime-types@3.0.2:
- resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==}
- engines: {node: '>=18'}
-
- mimic-fn@2.1.0:
- resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
- engines: {node: '>=6'}
-
- mimic-fn@3.1.0:
- resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==}
- engines: {node: '>=8'}
-
- mimic-function@5.0.1:
- resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
- engines: {node: '>=18'}
-
- minimatch@10.2.6:
- resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==}
- engines: {node: 18 || 20 || >=22}
-
- minimist@1.2.8:
- resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
-
- monaco-editor@0.56.0:
- resolution: {integrity: sha512-sXboRm3BeBeLm938eaiyLMe0OxzfXIlZvbv4ir/jVgQy1zDhWjgmny0WoN45fuDKhCCQsYMbBJrv/A6jd8aCUg==}
-
- ms@2.1.3:
- resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
-
- nanoid@3.3.19:
- resolution: {integrity: sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==}
- engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
- hasBin: true
-
- nanostores@1.5.3:
- resolution: {integrity: sha512-rQLB6eV4f2AW/n3L0JmwCROpaisYy9EDEADvEFSd1C/qG8hB6O5TPlh9A791JRbJr4CnMQBzptDcvD9OR1+6WA==}
- engines: {node: ^20.0.0 || >=22.0.0}
-
- negotiator@1.1.0:
- resolution: {integrity: sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==}
- engines: {node: '>=18'}
-
- next@16.3.3:
- resolution: {integrity: sha512-tuRTx1nQ/yVw83cwJBo9F+njGUgMn3UHQycreWHB8XsStvvAh1AthbI8/4IpKnFaF58F+iSiHejYOlMQ/eq83g==}
- engines: {node: '>=20.9.0'}
- hasBin: true
- peerDependencies:
- '@opentelemetry/api': ^1.1.0
- '@playwright/test': ^1.51.1
- babel-plugin-react-compiler: '*'
- react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
- react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
- sass: ^1.3.0
- peerDependenciesMeta:
- '@opentelemetry/api':
- optional: true
- '@playwright/test':
- optional: true
- babel-plugin-react-compiler:
- optional: true
- sass:
- optional: true
-
- node-fetch-native@1.6.7:
- resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==}
-
- node-releases@2.0.55:
- resolution: {integrity: sha512-mIrE/Cw9y+9Au6dS5vDKDhQza9YvG6w+ZrS6X+ZzA7yFW/soAeaups4Qzn1bL6g5FVy8WtP79+0j82oPIbqRjQ==}
- engines: {node: '>=18'}
-
- npm-run-path@4.0.1:
- resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
- engines: {node: '>=8'}
-
- npm-run-path@6.0.0:
- resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==}
- engines: {node: '>=18'}
-
- nypm@0.6.10:
- resolution: {integrity: sha512-W72Hrj1petq+b3Hk2aAC+9zswetlIFTnDW4s5djseZh2nYqBbyQLOtj472HwcbcWykPBUW1WpWpjOd4nK6gMRw==}
- engines: {node: '>=18'}
- hasBin: true
-
- object-assign@4.1.1:
- resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
- engines: {node: '>=0.10.0'}
-
- object-inspect@1.13.4:
- resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
- engines: {node: '>= 0.4'}
-
- object-treeify@1.1.33:
- resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==}
- engines: {node: '>= 10'}
-
- ohash@2.0.12:
- resolution: {integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==}
-
- on-finished@2.4.1:
- resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
- engines: {node: '>= 0.8'}
-
- once@1.4.0:
- resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
-
- onetime@5.1.2:
- resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
- engines: {node: '>=6'}
-
- onetime@7.0.0:
- resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
- engines: {node: '>=18'}
-
- open@11.0.3:
- resolution: {integrity: sha512-b3souUgU0VaAvMmzA4+9cRgrOgMdE0vc9H9VhQ0FYnjjcyZ8R/f9DiwMU9V8rl+vjf05On9UJhbgb06fsTs87Q==}
- engines: {node: '>=20'}
-
- open@8.4.2:
- resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
- engines: {node: '>=12'}
-
- ora@8.2.0:
- resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==}
- engines: {node: '>=18'}
-
- p-limit@2.3.0:
- resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
- engines: {node: '>=6'}
-
- p-locate@3.0.0:
- resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==}
- engines: {node: '>=6'}
-
- p-try@2.2.0:
- resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
- engines: {node: '>=6'}
-
- parent-module@1.0.1:
- resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
- engines: {node: '>=6'}
-
- parse-json@5.2.0:
- resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
- engines: {node: '>=8'}
-
- parse-ms@4.0.0:
- resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==}
- engines: {node: '>=18'}
-
- parseurl@1.3.3:
- resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
- engines: {node: '>= 0.8'}
-
- path-browserify@1.0.1:
- resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
-
- path-exists@3.0.0:
- resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==}
- engines: {node: '>=4'}
-
- path-key@3.1.1:
- resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
- engines: {node: '>=8'}
-
- path-key@4.0.0:
- resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
- engines: {node: '>=12'}
-
- path-to-regexp@8.4.2:
- resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==}
-
- pathe@2.0.3:
- resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
-
- perfect-debounce@1.0.0:
- resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
-
- picocolors@1.1.1:
- resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
-
- picomatch@2.3.2:
- resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==}
- engines: {node: '>=8.6'}
-
- picomatch@4.0.7:
- resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==}
- engines: {node: '>=12'}
-
- pkce-challenge@5.0.1:
- resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==}
- engines: {node: '>=16.20.0'}
-
- pkg-types@2.3.3:
- resolution: {integrity: sha512-j/lCFdcppV0JxWpCEITdbDltBxPP6cHT+yNJ6Go2OgoSA9518X847X9z0p6LtA4Nc16+eQzCZjRrWanTGvHJ5w==}
-
- pkg-up@3.1.0:
- resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==}
- engines: {node: '>=8'}
-
- postcss-selector-parser@7.1.6:
- resolution: {integrity: sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==}
- engines: {node: '>=4'}
-
- postcss@8.5.23:
- resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==}
- engines: {node: ^10 || ^12 || >=14}
-
- postcss@8.5.28:
- resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==}
- engines: {node: ^10 || ^12 || >=14}
-
- powershell-utils@0.1.0:
- resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==}
- engines: {node: '>=20'}
-
- powershell-utils@0.2.1:
- resolution: {integrity: sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A==}
- engines: {node: '>=20'}
-
- pretty-ms@9.3.1:
- resolution: {integrity: sha512-HzMy3Geq23nVALD/M2LliU+F+M+gVNsvkQWWqeBZ8HDiCgzo6YPJ/Omrmtq24EFrIsk0a3EkQGEd7bDOo+IhGA==}
- engines: {node: '>=18'}
-
- prisma@6.19.3:
- resolution: {integrity: sha512-++ZJ0ijLrDJF6hNB4t4uxg2br3fC4H9Yc9tcbjr2fcNFP3rh/SBNrAgjhsqBU4Ght8JPrVofG/ZkXfnSfnYsFg==}
- engines: {node: '>=18.18'}
- hasBin: true
- peerDependencies:
- typescript: '>=5.1.0'
- peerDependenciesMeta:
- typescript:
- optional: true
-
- prompts@2.4.2:
- resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
- engines: {node: '>= 6'}
-
- proxy-addr@2.0.7:
- resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
- engines: {node: '>= 0.10'}
-
- pure-rand@6.1.0:
- resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==}
-
- qs@6.16.0:
- resolution: {integrity: sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==}
- engines: {node: '>=0.6'}
-
- queue-microtask@1.2.3:
- resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
-
- range-parser@1.3.0:
- resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==}
- engines: {node: '>= 0.6'}
-
- raw-body@3.0.2:
- resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==}
- engines: {node: '>= 0.10'}
-
- rc9@2.1.2:
- resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==}
-
- react-dom@19.3.0:
- resolution: {integrity: sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==}
- peerDependencies:
- react: ^19.3.0
-
- react@19.3.0:
- resolution: {integrity: sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==}
- engines: {node: '>=0.10.0'}
-
- readdirp@4.1.2:
- resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
- engines: {node: '>= 14.18.0'}
-
- recast@0.23.21:
- resolution: {integrity: sha512-mFAyJq9vUbSTARLZUvAEf1z3YxlvAwswbmxMx2mPA/MSm4KmpwvwvhsH/NIrZhyOuwD60Lzyw2qh83uCbgTPYw==}
- engines: {node: '>= 4'}
-
- require-from-string@2.0.2:
- resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
- engines: {node: '>=0.10.0'}
-
- reselect@5.3.0:
- resolution: {integrity: sha512-XGoLeRAVzUTcJ1qkxPQhDJyIZ5d6zzZD9nT7AEZOaaU9UbWclhycElmhO+VD5bFeLuzhPBaOV2oXC8uG35ZSpg==}
-
- resolve-from@4.0.0:
- resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
- engines: {node: '>=4'}
-
- restore-cursor@5.1.0:
- resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==}
- engines: {node: '>=18'}
-
- reusify@1.1.0:
- resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
- engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
-
- rou3@0.9.2:
- resolution: {integrity: sha512-3SOzvaAg8rkHrXtRjpCvCvbyO5to9oOO27Z/XqHEYXfMRVSw/qMIVdmaOk9W2lcRLtR6dlqTjo9hDeJk70QBYQ==}
-
- router@2.2.0:
- resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==}
- engines: {node: '>= 18'}
-
- run-applescript@7.1.0:
- resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==}
- engines: {node: '>=18'}
-
- run-parallel@1.2.0:
- resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
-
- safer-buffer@2.1.2:
- resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
-
- scheduler@0.28.0:
- resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==}
-
- semver@6.3.1:
- resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
- hasBin: true
-
- semver@7.8.5:
- resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==}
- engines: {node: '>=10'}
- hasBin: true
-
- send@1.2.1:
- resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==}
- engines: {node: '>= 18'}
-
- serve-static@2.2.1:
- resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==}
- engines: {node: '>= 18'}
-
- set-cookie-parser@3.1.2:
- resolution: {integrity: sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw==}
-
- setprototypeof@1.2.0:
- resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
-
- shadcn@4.21.0:
- resolution: {integrity: sha512-UU2mFNusW8C5rvadKdH69vERYZqUlOOlXBcf0MYhYLdTGP6DPti7X4qovCu+RTfCqsAgq/T+YfE0Vnttxh9aiw==}
- engines: {node: '>=20.18.1'}
- hasBin: true
-
- sharp@0.35.4:
- resolution: {integrity: sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==}
- engines: {node: '>=20.9.0'}
- peerDependencies:
- '@types/node': '*'
- peerDependenciesMeta:
- '@types/node':
- optional: true
-
- shebang-command@2.0.0:
- resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
- engines: {node: '>=8'}
-
- shebang-regex@3.0.0:
- resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
- engines: {node: '>=8'}
-
- side-channel-list@1.0.1:
- resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==}
- engines: {node: '>= 0.4'}
-
- side-channel-map@1.0.1:
- resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
- engines: {node: '>= 0.4'}
-
- side-channel-weakmap@1.0.2:
- resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
- engines: {node: '>= 0.4'}
-
- side-channel@1.1.1:
- resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==}
- engines: {node: '>= 0.4'}
-
- signal-exit@3.0.7:
- resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
-
- signal-exit@4.1.0:
- resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
- engines: {node: '>=14'}
-
- sisteransi@1.0.5:
- resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
-
- smart-buffer@4.2.0:
- resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==}
- engines: {node: '>= 6.0.0', npm: '>= 3.0.0'}
-
- socks@2.8.10:
- resolution: {integrity: sha512-e0VyvkVTwVYViNovRkZ9aodhxVlyoMn7eJhVUPxZ+eK9P/7CBkxvvsBOHqFPEH416726W8tLXXXjKwqgTErrCQ==}
- engines: {node: '>= 10.0.0', npm: '>= 3.0.0'}
-
- source-map-js@1.2.1:
- resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
- engines: {node: '>=0.10.0'}
-
- source-map@0.6.1:
- resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
- engines: {node: '>=0.10.0'}
-
- state-local@1.0.7:
- resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==}
-
- statuses@2.0.2:
- resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==}
- engines: {node: '>= 0.8'}
-
- stdin-discarder@0.2.2:
- resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==}
- engines: {node: '>=18'}
-
- string-width@7.2.0:
- resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
- engines: {node: '>=18'}
-
- stringify-object@5.0.0:
- resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==}
- engines: {node: '>=14.16'}
-
- strip-ansi@6.0.1:
- resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
- engines: {node: '>=8'}
-
- strip-ansi@7.2.0:
- resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==}
- engines: {node: '>=12'}
-
- strip-bom@3.0.0:
- resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
- engines: {node: '>=4'}
-
- strip-final-newline@2.0.0:
- resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
- engines: {node: '>=6'}
-
- strip-final-newline@4.0.0:
- resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==}
- engines: {node: '>=18'}
-
- styled-jsx@5.1.6:
- resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==}
- engines: {node: '>= 12.0.0'}
- peerDependencies:
- '@babel/core': '*'
- babel-plugin-macros: '*'
- react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0'
- peerDependenciesMeta:
- '@babel/core':
- optional: true
- babel-plugin-macros:
- optional: true
-
- systeminformation@5.33.10:
- resolution: {integrity: sha512-/NXbMVASt2UbSVgmWto4aBTIAeuYY7zOELpZybmNxqpsrbo5uYHpuEPf5nkyrPng0uG5YOb+Yv6s0FyKY4mDQg==}
- engines: {node: '>=10.0.0'}
- os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android]
- hasBin: true
-
- tailwind-merge@3.6.0:
- resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==}
-
- tailwindcss@4.3.3:
- resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==}
-
- tapable@2.3.3:
- resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
- engines: {node: '>=6'}
-
- tiny-invariant@1.3.3:
- resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
-
- tinyexec@1.3.1:
- resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==}
- engines: {node: '>=18'}
-
- to-regex-range@5.0.1:
- resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
- engines: {node: '>=8.0'}
-
- toidentifier@1.0.1:
- resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
- engines: {node: '>=0.6'}
-
- ts-morph@26.0.0:
- resolution: {integrity: sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==}
-
- tsconfig-paths@4.2.0:
- resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==}
- engines: {node: '>=6'}
-
- tslib@2.8.1:
- resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
-
- tw-animate-css@1.4.0:
- resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==}
-
- type-is@2.1.0:
- resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==}
- engines: {node: '>= 18'}
-
- typescript@5.7.3:
- resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
- engines: {node: '>=14.17'}
- hasBin: true
-
- undici-types@7.18.2:
- resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==}
-
- undici@7.29.1:
- resolution: {integrity: sha512-RYONW2MeafgYlkVOKYKkA/Ag7BmXqgIWCa8t1m0JcxrQg9pI9lEqRhAOruOBCbAohOa/gkCF+iPi9hrgvTzu6Q==}
- engines: {node: '>=20.18.1'}
-
- unicorn-magic@0.3.0:
- resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==}
- engines: {node: '>=18'}
-
- universalify@2.0.1:
- resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
- engines: {node: '>= 10.0.0'}
-
- unpipe@1.0.0:
- resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
- engines: {node: '>= 0.8'}
-
- update-browserslist-db@1.3.3:
- resolution: {integrity: sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==}
- hasBin: true
- peerDependencies:
- browserslist: '>= 4.21.0'
-
- use-sync-external-store@1.7.0:
- resolution: {integrity: sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==}
- peerDependencies:
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
-
- util-deprecate@1.0.2:
- resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
-
- validate-npm-package-name@7.0.2:
- resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==}
- engines: {node: ^20.17.0 || >=22.9.0}
-
- vary@1.1.2:
- resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
- engines: {node: '>= 0.8'}
-
- which@2.0.2:
- resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
- engines: {node: '>= 8'}
- hasBin: true
-
- which@4.0.0:
- resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==}
- engines: {node: ^16.13.0 || >=18.0.0}
- hasBin: true
-
- wrappy@1.0.2:
- resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
-
- wsl-utils@1.0.0:
- resolution: {integrity: sha512-Hl0ZOAs672vg+06kfujwRhoS6/jehvULrlFkuF2dRu6pHgA8U06h3xqNIqNNU1LTXPcedxByAR4GS6pwQK0mgA==}
- engines: {node: '>=20'}
-
- yallist@3.1.1:
- resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
-
- yocto-spinner@1.2.2:
- resolution: {integrity: sha512-DODGl1wJjA/s5pnJFKau9lIYHT81lnhob1i3e1TjxZRxEhWRKl74nTbWE6H5KlkViQQTo/Z29YFdxzTZAMY3ng==}
- engines: {node: '>=18.19'}
-
- yoctocolors@2.2.0:
- resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==}
- engines: {node: '>=18'}
-
- zod-to-json-schema@3.25.2:
- resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==}
- peerDependencies:
- zod: ^3.25.28 || ^4
-
- zod@3.25.76:
- resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
-
- zod@4.6.2:
- resolution: {integrity: sha512-lh5RCAGFa1Cm2hjtNwLQhSs/AsqdWnTQaBER9fEwN/88pSh7KOtJavtBx/0VlkN/uFd61SwYmljLMDAsHlvzBQ==}
-
-snapshots:
-
- '@alloc/quick-lru@5.3.0': {}
-
- '@babel/code-frame@7.29.7':
- dependencies:
- '@babel/helper-validator-identifier': 7.29.7
- js-tokens: 4.0.0
- picocolors: 1.1.1
-
- '@babel/compat-data@7.29.7': {}
-
- '@babel/core@7.29.7':
- dependencies:
- '@babel/code-frame': 7.29.7
- '@babel/generator': 7.29.8
- '@babel/helper-compilation-targets': 7.29.7
- '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7)
- '@babel/helpers': 7.29.7
- '@babel/parser': 7.29.8
- '@babel/template': 7.29.7
- '@babel/traverse': 7.29.8
- '@babel/types': 7.29.8
- '@jridgewell/remapping': 2.3.5
- convert-source-map: 2.0.0
- debug: 4.4.3
- gensync: 1.0.0-beta.2
- json5: 2.2.3
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
-
- '@babel/generator@7.29.8':
- dependencies:
- '@babel/parser': 7.29.8
- '@babel/types': 7.29.8
- '@jridgewell/gen-mapping': 0.3.13
- '@jridgewell/trace-mapping': 0.3.31
- jsesc: 3.1.0
-
- '@babel/helper-annotate-as-pure@7.29.7':
- dependencies:
- '@babel/types': 7.29.8
-
- '@babel/helper-compilation-targets@7.29.7':
- dependencies:
- '@babel/compat-data': 7.29.7
- '@babel/helper-validator-option': 7.29.7
- browserslist: 4.28.9
- lru-cache: 5.1.1
- semver: 6.3.1
-
- '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)':
- dependencies:
- '@babel/core': 7.29.7
- '@babel/helper-annotate-as-pure': 7.29.7
- '@babel/helper-member-expression-to-functions': 7.29.7
- '@babel/helper-optimise-call-expression': 7.29.7
- '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7)
- '@babel/helper-skip-transparent-expression-wrappers': 7.29.7
- '@babel/traverse': 7.29.8
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
-
- '@babel/helper-globals@7.29.7': {}
-
- '@babel/helper-member-expression-to-functions@7.29.7':
- dependencies:
- '@babel/traverse': 7.29.8
- '@babel/types': 7.29.8
- transitivePeerDependencies:
- - supports-color
-
- '@babel/helper-module-imports@7.29.7':
- dependencies:
- '@babel/traverse': 7.29.8
- '@babel/types': 7.29.8
- transitivePeerDependencies:
- - supports-color
-
- '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)':
- dependencies:
- '@babel/core': 7.29.7
- '@babel/helper-module-imports': 7.29.7
- '@babel/helper-validator-identifier': 7.29.7
- '@babel/traverse': 7.29.8
- transitivePeerDependencies:
- - supports-color
-
- '@babel/helper-optimise-call-expression@7.29.7':
- dependencies:
- '@babel/types': 7.29.8
-
- '@babel/helper-plugin-utils@7.29.7': {}
-
- '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)':
- dependencies:
- '@babel/core': 7.29.7
- '@babel/helper-member-expression-to-functions': 7.29.7
- '@babel/helper-optimise-call-expression': 7.29.7
- '@babel/traverse': 7.29.8
- transitivePeerDependencies:
- - supports-color
-
- '@babel/helper-skip-transparent-expression-wrappers@7.29.7':
- dependencies:
- '@babel/traverse': 7.29.8
- '@babel/types': 7.29.8
- transitivePeerDependencies:
- - supports-color
-
- '@babel/helper-string-parser@7.29.7': {}
-
- '@babel/helper-validator-identifier@7.29.7': {}
-
- '@babel/helper-validator-option@7.29.7': {}
-
- '@babel/helpers@7.29.7':
- dependencies:
- '@babel/template': 7.29.7
- '@babel/types': 7.29.8
-
- '@babel/parser@7.29.8':
- dependencies:
- '@babel/types': 7.29.8
-
- '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)':
- dependencies:
- '@babel/core': 7.29.7
- '@babel/helper-plugin-utils': 7.29.7
-
- '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)':
- dependencies:
- '@babel/core': 7.29.7
- '@babel/helper-plugin-utils': 7.29.7
-
- '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7)':
- dependencies:
- '@babel/core': 7.29.7
- '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7)
- '@babel/helper-plugin-utils': 7.29.7
- transitivePeerDependencies:
- - supports-color
-
- '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7)':
- dependencies:
- '@babel/core': 7.29.7
- '@babel/helper-annotate-as-pure': 7.29.7
- '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7)
- '@babel/helper-plugin-utils': 7.29.7
- '@babel/helper-skip-transparent-expression-wrappers': 7.29.7
- '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7)
- transitivePeerDependencies:
- - supports-color
-
- '@babel/preset-typescript@7.29.7(@babel/core@7.29.7)':
- dependencies:
- '@babel/core': 7.29.7
- '@babel/helper-plugin-utils': 7.29.7
- '@babel/helper-validator-option': 7.29.7
- '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7)
- '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7)
- '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7)
- transitivePeerDependencies:
- - supports-color
-
- '@babel/runtime@7.29.7': {}
-
- '@babel/template@7.29.7':
- dependencies:
- '@babel/code-frame': 7.29.7
- '@babel/parser': 7.29.8
- '@babel/types': 7.29.8
-
- '@babel/traverse@7.29.8':
- dependencies:
- '@babel/code-frame': 7.29.7
- '@babel/generator': 7.29.8
- '@babel/helper-globals': 7.29.7
- '@babel/parser': 7.29.8
- '@babel/template': 7.29.7
- '@babel/types': 7.29.8
- debug: 4.4.3
- transitivePeerDependencies:
- - supports-color
-
- '@babel/types@7.29.8':
- dependencies:
- '@babel/helper-string-parser': 7.29.7
- '@babel/helper-validator-identifier': 7.29.7
-
- '@base-ui/react@1.8.0(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
- dependencies:
- '@babel/runtime': 7.29.7
- '@base-ui/utils': 0.4.0(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@floating-ui/react-dom': 2.1.9(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- '@floating-ui/utils': 0.2.12
- react: 19.3.0
- react-dom: 19.3.0(react@19.3.0)
- use-sync-external-store: 1.7.0(react@19.3.0)
- optionalDependencies:
- '@types/react': 19.3.0
-
- '@base-ui/utils@0.4.0(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
- dependencies:
- '@babel/runtime': 7.29.7
- '@floating-ui/utils': 0.2.12
- react: 19.3.0
- react-dom: 19.3.0(react@19.3.0)
- reselect: 5.3.0
- use-sync-external-store: 1.7.0(react@19.3.0)
- optionalDependencies:
- '@types/react': 19.3.0
-
- '@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)':
- dependencies:
- '@better-auth/utils': 0.4.2
- '@better-fetch/fetch': 1.3.1
- '@opentelemetry/semantic-conventions': 1.43.0
- '@standard-schema/spec': 1.1.0
- better-call: 1.4.0(zod@4.6.2)
- jose: 6.2.12
- kysely: 0.29.5
- nanostores: 1.5.3
- zod: 4.6.2
-
- '@better-auth/drizzle-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
- dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
- '@better-auth/utils': 0.4.2
-
- '@better-auth/kysely-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(kysely@0.29.5)':
- dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
- '@better-auth/utils': 0.4.2
- optionalDependencies:
- kysely: 0.29.5
-
- '@better-auth/memory-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
- dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
- '@better-auth/utils': 0.4.2
-
- '@better-auth/mongo-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)':
- dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
- '@better-auth/utils': 0.4.2
-
- '@better-auth/prisma-adapter@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(prisma@6.19.3(typescript@5.7.3))':
- dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
- '@better-auth/utils': 0.4.2
- optionalDependencies:
- '@prisma/client': 6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3)
- prisma: 6.19.3(typescript@5.7.3)
-
- '@better-auth/telemetry@1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)':
- dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
- '@better-auth/utils': 0.4.2
- '@better-fetch/fetch': 1.3.1
-
- '@better-auth/utils@0.4.2':
- dependencies:
- '@noble/hashes': 2.4.0
-
- '@better-auth/utils@0.5.0':
- dependencies:
- '@noble/hashes': 2.4.0
-
- '@better-fetch/fetch@1.3.1': {}
-
- '@dotenvx/dotenvx@1.75.1':
- dependencies:
- '@dotenvx/primitives': 0.8.0
- commander: 11.1.0
- conf: 10.2.0
- dotenv: 17.4.2
- enquirer: 2.4.1
- env-paths: 2.2.1
- execa: 5.1.1
- fdir: 6.5.0(picomatch@4.0.7)
- ignore: 5.3.2
- object-treeify: 1.1.33
- open: 8.4.2
- picomatch: 4.0.7
- systeminformation: 5.33.10
- undici: 7.29.1
- which: 4.0.0
- yocto-spinner: 1.2.2
-
- '@dotenvx/primitives@0.8.0': {}
-
- '@emnapi/runtime@1.11.3':
- dependencies:
- tslib: 2.8.1
- optional: true
-
- '@floating-ui/core@1.8.0':
- dependencies:
- '@floating-ui/utils': 0.2.12
-
- '@floating-ui/dom@1.8.0':
- dependencies:
- '@floating-ui/core': 1.8.0
- '@floating-ui/utils': 0.2.12
-
- '@floating-ui/react-dom@2.1.9(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
- dependencies:
- '@floating-ui/dom': 1.8.0
- react: 19.3.0
- react-dom: 19.3.0(react@19.3.0)
-
- '@floating-ui/utils@0.2.12': {}
-
- '@hono/node-server@2.1.1(hono@4.13.7)':
- dependencies:
- hono: 4.13.7
-
- '@img/colour@1.1.0':
- optional: true
-
- '@img/sharp-darwin-arm64@0.35.4':
- optionalDependencies:
- '@img/sharp-libvips-darwin-arm64': 1.3.3
- optional: true
-
- '@img/sharp-darwin-x64@0.35.4':
- optionalDependencies:
- '@img/sharp-libvips-darwin-x64': 1.3.3
- optional: true
-
- '@img/sharp-freebsd-wasm32@0.35.4':
- dependencies:
- '@img/sharp-wasm32': 0.35.4
- optional: true
-
- '@img/sharp-libvips-darwin-arm64@1.3.3':
- optional: true
-
- '@img/sharp-libvips-darwin-x64@1.3.3':
- optional: true
-
- '@img/sharp-libvips-linux-arm64@1.3.3':
- optional: true
-
- '@img/sharp-libvips-linux-arm@1.3.3':
- optional: true
-
- '@img/sharp-libvips-linux-ppc64@1.3.3':
- optional: true
-
- '@img/sharp-libvips-linux-riscv64@1.3.3':
- optional: true
-
- '@img/sharp-libvips-linux-s390x@1.3.3':
- optional: true
-
- '@img/sharp-libvips-linux-x64@1.3.3':
- optional: true
-
- '@img/sharp-libvips-linuxmusl-arm64@1.3.3':
- optional: true
-
- '@img/sharp-libvips-linuxmusl-x64@1.3.3':
- optional: true
-
- '@img/sharp-linux-arm64@0.35.4':
- optionalDependencies:
- '@img/sharp-libvips-linux-arm64': 1.3.3
- optional: true
-
- '@img/sharp-linux-arm@0.35.4':
- optionalDependencies:
- '@img/sharp-libvips-linux-arm': 1.3.3
- optional: true
-
- '@img/sharp-linux-ppc64@0.35.4':
- optionalDependencies:
- '@img/sharp-libvips-linux-ppc64': 1.3.3
- optional: true
-
- '@img/sharp-linux-riscv64@0.35.4':
- optionalDependencies:
- '@img/sharp-libvips-linux-riscv64': 1.3.3
- optional: true
-
- '@img/sharp-linux-s390x@0.35.4':
- optionalDependencies:
- '@img/sharp-libvips-linux-s390x': 1.3.3
- optional: true
-
- '@img/sharp-linux-x64@0.35.4':
- optionalDependencies:
- '@img/sharp-libvips-linux-x64': 1.3.3
- optional: true
-
- '@img/sharp-linuxmusl-arm64@0.35.4':
- optionalDependencies:
- '@img/sharp-libvips-linuxmusl-arm64': 1.3.3
- optional: true
-
- '@img/sharp-linuxmusl-x64@0.35.4':
- optionalDependencies:
- '@img/sharp-libvips-linuxmusl-x64': 1.3.3
- optional: true
-
- '@img/sharp-wasm32@0.35.4':
- dependencies:
- '@emnapi/runtime': 1.11.3
- optional: true
-
- '@img/sharp-webcontainers-wasm32@0.35.4':
- dependencies:
- '@img/sharp-wasm32': 0.35.4
- optional: true
-
- '@img/sharp-win32-arm64@0.35.4':
- optional: true
-
- '@img/sharp-win32-ia32@0.35.4':
- optional: true
-
- '@img/sharp-win32-x64@0.35.4':
- optional: true
-
- '@jridgewell/gen-mapping@0.3.13':
- dependencies:
- '@jridgewell/sourcemap-codec': 1.6.0
- '@jridgewell/trace-mapping': 0.3.31
-
- '@jridgewell/remapping@2.3.5':
- dependencies:
- '@jridgewell/gen-mapping': 0.3.13
- '@jridgewell/trace-mapping': 0.3.31
-
- '@jridgewell/resolve-uri@3.1.2': {}
-
- '@jridgewell/sourcemap-codec@1.6.0': {}
-
- '@jridgewell/trace-mapping@0.3.31':
- dependencies:
- '@jridgewell/resolve-uri': 3.1.2
- '@jridgewell/sourcemap-codec': 1.6.0
-
- '@modelcontextprotocol/sdk@1.30.0(zod@3.25.76)':
- dependencies:
- '@hono/node-server': 2.1.1(hono@4.13.7)
- ajv: 8.20.0
- ajv-formats: 3.0.1(ajv@8.20.0)
- content-type: 1.0.5
- cors: 2.8.6
- cross-spawn: 7.0.6
- eventsource: 3.0.7
- eventsource-parser: 3.1.1
- express: 5.2.1
- express-rate-limit: 8.7.0(express@5.2.1)
- hono: 4.13.7
- jose: 6.2.12
- json-schema-typed: 8.0.2
- pkce-challenge: 5.0.1
- raw-body: 3.0.2
- zod: 3.25.76
- zod-to-json-schema: 3.25.2(zod@3.25.76)
- transitivePeerDependencies:
- - supports-color
-
- '@monaco-editor/loader@1.7.0':
- dependencies:
- state-local: 1.0.7
-
- '@monaco-editor/react@4.7.0(monaco-editor@0.56.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
- dependencies:
- '@monaco-editor/loader': 1.7.0
- monaco-editor: 0.56.0
- react: 19.3.0
- react-dom: 19.3.0(react@19.3.0)
-
- '@next/env@16.3.3': {}
-
- '@next/swc-darwin-arm64@16.3.3':
- optional: true
-
- '@next/swc-darwin-x64@16.3.3':
- optional: true
-
- '@next/swc-linux-arm64-gnu@16.3.3':
- optional: true
-
- '@next/swc-linux-arm64-musl@16.3.3':
- optional: true
-
- '@next/swc-linux-x64-gnu@16.3.3':
- optional: true
-
- '@next/swc-linux-x64-musl@16.3.3':
- optional: true
-
- '@next/swc-win32-arm64-msvc@16.3.3':
- optional: true
-
- '@next/swc-win32-x64-msvc@16.3.3':
- optional: true
-
- '@noble/ciphers@2.4.0': {}
-
- '@noble/hashes@2.4.0': {}
-
- '@nodelib/fs.scandir@2.1.5':
- dependencies:
- '@nodelib/fs.stat': 2.0.5
- run-parallel: 1.2.0
-
- '@nodelib/fs.stat@2.0.5': {}
-
- '@nodelib/fs.walk@1.2.8':
- dependencies:
- '@nodelib/fs.scandir': 2.1.5
- fastq: 1.20.3
-
- '@opentelemetry/semantic-conventions@1.43.0': {}
-
- '@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3)':
- optionalDependencies:
- prisma: 6.19.3(typescript@5.7.3)
- typescript: 5.7.3
-
- '@prisma/config@6.19.3':
- dependencies:
- c12: 3.1.0
- deepmerge-ts: 7.1.5
- effect: 3.21.0
- empathic: 2.0.0
- transitivePeerDependencies:
- - magicast
-
- '@prisma/debug@6.19.3': {}
-
- '@prisma/engines-version@7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7': {}
-
- '@prisma/engines@6.19.3':
- dependencies:
- '@prisma/debug': 6.19.3
- '@prisma/engines-version': 7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7
- '@prisma/fetch-engine': 6.19.3
- '@prisma/get-platform': 6.19.3
-
- '@prisma/fetch-engine@6.19.3':
- dependencies:
- '@prisma/debug': 6.19.3
- '@prisma/engines-version': 7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7
- '@prisma/get-platform': 6.19.3
-
- '@prisma/get-platform@6.19.3':
- dependencies:
- '@prisma/debug': 6.19.3
-
- '@sec-ant/readable-stream@0.4.1': {}
-
- '@shadowdara/dlib@0.0.4': {}
-
- '@shadowdara/finder-lib@0.3.17': {}
-
- '@sindresorhus/merge-streams@4.0.0': {}
-
- '@standard-schema/spec@1.1.0': {}
-
- '@swc/helpers@0.5.23':
- dependencies:
- tslib: 2.8.1
-
- '@tailwindcss/node@4.3.3':
- dependencies:
- '@jridgewell/remapping': 2.3.5
- enhanced-resolve: 5.24.5
- jiti: 2.7.0
- lightningcss: 1.32.0
- magic-string: 0.30.21
- source-map-js: 1.2.1
- tailwindcss: 4.3.3
-
- '@tailwindcss/oxide-android-arm64@4.3.3':
- optional: true
-
- '@tailwindcss/oxide-darwin-arm64@4.3.3':
- optional: true
-
- '@tailwindcss/oxide-darwin-x64@4.3.3':
- optional: true
-
- '@tailwindcss/oxide-freebsd-x64@4.3.3':
- optional: true
-
- '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3':
- optional: true
-
- '@tailwindcss/oxide-linux-arm64-gnu@4.3.3':
- optional: true
-
- '@tailwindcss/oxide-linux-arm64-musl@4.3.3':
- optional: true
-
- '@tailwindcss/oxide-linux-x64-gnu@4.3.3':
- optional: true
-
- '@tailwindcss/oxide-linux-x64-musl@4.3.3':
- optional: true
-
- '@tailwindcss/oxide-wasm32-wasi@4.3.3':
- optional: true
-
- '@tailwindcss/oxide-win32-arm64-msvc@4.3.3':
- optional: true
-
- '@tailwindcss/oxide-win32-x64-msvc@4.3.3':
- optional: true
-
- '@tailwindcss/oxide@4.3.3':
- optionalDependencies:
- '@tailwindcss/oxide-android-arm64': 4.3.3
- '@tailwindcss/oxide-darwin-arm64': 4.3.3
- '@tailwindcss/oxide-darwin-x64': 4.3.3
- '@tailwindcss/oxide-freebsd-x64': 4.3.3
- '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.3
- '@tailwindcss/oxide-linux-arm64-gnu': 4.3.3
- '@tailwindcss/oxide-linux-arm64-musl': 4.3.3
- '@tailwindcss/oxide-linux-x64-gnu': 4.3.3
- '@tailwindcss/oxide-linux-x64-musl': 4.3.3
- '@tailwindcss/oxide-wasm32-wasi': 4.3.3
- '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3
- '@tailwindcss/oxide-win32-x64-msvc': 4.3.3
-
- '@tailwindcss/postcss@4.3.3':
- dependencies:
- '@alloc/quick-lru': 5.3.0
- '@tailwindcss/node': 4.3.3
- '@tailwindcss/oxide': 4.3.3
- postcss: 8.5.28
- tailwindcss: 4.3.3
-
- '@ts-morph/common@0.27.0':
- dependencies:
- fast-glob: 3.3.3
- minimatch: 10.2.6
- path-browserify: 1.0.1
-
- '@types/highlight.js@10.1.0':
- dependencies:
- highlight.js: 11.12.0
-
- '@types/node@24.13.4':
- dependencies:
- undici-types: 7.18.2
-
- '@types/react-dom@19.3.0(@types/react@19.3.0)':
- dependencies:
- '@types/react': 19.3.0
-
- '@types/react@19.3.0':
- dependencies:
- csstype: 3.2.3
-
- '@types/trusted-types@2.0.7':
- optional: true
-
- '@types/validate-npm-package-name@4.0.2': {}
-
- '@vercel/analytics@1.6.1(next@16.3.3(@babel/core@7.29.7)(@types/node@24.13.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(react@19.3.0)':
- optionalDependencies:
- next: 16.3.3(@babel/core@7.29.7)(@types/node@24.13.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- react: 19.3.0
-
- accepts@2.0.0:
- dependencies:
- mime-types: 3.0.2
- negotiator: 1.1.0
-
- ajv-formats@2.1.1(ajv@8.20.0):
- optionalDependencies:
- ajv: 8.20.0
-
- ajv-formats@3.0.1(ajv@8.20.0):
- optionalDependencies:
- ajv: 8.20.0
-
- ajv@8.20.0:
- dependencies:
- fast-deep-equal: 3.1.3
- fast-uri: 3.1.7
- json-schema-traverse: 1.0.0
- require-from-string: 2.0.2
-
- ansi-colors@4.1.3: {}
-
- ansi-regex@5.0.1: {}
-
- ansi-regex@6.3.0: {}
-
- argparse@2.0.1: {}
-
- ast-types@0.16.3:
- dependencies:
- tslib: 2.8.1
-
- atomically@1.7.0: {}
-
- balanced-match@4.0.4: {}
-
- baseline-browser-mapping@2.11.22: {}
-
- better-auth@1.7.4(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(next@16.3.3(@babel/core@7.29.7)(@types/node@24.13.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(prisma@6.19.3(typescript@5.7.3))(react-dom@19.3.0(react@19.3.0))(react@19.3.0):
- dependencies:
- '@better-auth/core': 1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)
- '@better-auth/drizzle-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
- '@better-auth/kysely-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(kysely@0.29.5)
- '@better-auth/memory-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
- '@better-auth/mongo-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)
- '@better-auth/prisma-adapter': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@prisma/client@6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3))(prisma@6.19.3(typescript@5.7.3))
- '@better-auth/telemetry': 1.7.4(@better-auth/core@1.7.4(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.2))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)
- '@better-auth/utils': 0.4.2
- '@better-fetch/fetch': 1.3.1
- '@noble/ciphers': 2.4.0
- '@noble/hashes': 2.4.0
- better-call: 1.4.0(zod@4.6.2)
- defu: 6.1.7
- jose: 6.2.12
- kysely: 0.29.5
- nanostores: 1.5.3
- zod: 4.6.2
- optionalDependencies:
- '@prisma/client': 6.19.3(prisma@6.19.3(typescript@5.7.3))(typescript@5.7.3)
- next: 16.3.3(@babel/core@7.29.7)(@types/node@24.13.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
- prisma: 6.19.3(typescript@5.7.3)
- react: 19.3.0
- react-dom: 19.3.0(react@19.3.0)
- transitivePeerDependencies:
- - '@cloudflare/workers-types'
- - '@opentelemetry/api'
-
- better-call@1.4.0(zod@4.6.2):
- dependencies:
- '@better-auth/utils': 0.5.0
- '@better-fetch/fetch': 1.3.1
- rou3: 0.9.2
- set-cookie-parser: 3.1.2
- optionalDependencies:
- zod: 4.6.2
-
- body-parser@2.3.0:
- dependencies:
- bytes: 3.1.2
- content-type: 2.1.0
- debug: 4.4.3
- http-errors: 2.0.1
- iconv-lite: 0.7.3
- on-finished: 2.4.1
- qs: 6.16.0
- raw-body: 3.0.2
- type-is: 2.1.0
- transitivePeerDependencies:
- - supports-color
-
- brace-expansion@5.0.9:
- dependencies:
- balanced-match: 4.0.4
-
- braces@3.0.3:
- dependencies:
- fill-range: 7.1.1
-
- browserslist@4.28.9:
- dependencies:
- baseline-browser-mapping: 2.11.22
- caniuse-lite: 1.0.30001810
- electron-to-chromium: 1.5.427
- node-releases: 2.0.55
- update-browserslist-db: 1.3.3(browserslist@4.28.9)
-
- bundle-name@4.1.0:
- dependencies:
- run-applescript: 7.1.0
-
- bytes@3.1.2: {}
-
- c12@3.1.0:
- dependencies:
- chokidar: 4.0.3
- confbox: 0.2.4
- defu: 6.1.7
- dotenv: 16.6.1
- exsolve: 1.1.1
- giget: 2.0.0
- jiti: 2.7.0
- ohash: 2.0.12
- pathe: 2.0.3
- perfect-debounce: 1.0.0
- pkg-types: 2.3.3
- rc9: 2.1.2
-
- call-bind-apply-helpers@1.0.2:
- dependencies:
- es-errors: 1.3.0
- function-bind: 1.1.2
-
- call-bound@1.0.4:
- dependencies:
- call-bind-apply-helpers: 1.0.2
- get-intrinsic: 1.3.0
-
- callsites@3.1.0: {}
-
- caniuse-lite@1.0.30001810: {}
-
- chalk@5.6.2: {}
-
- chokidar@4.0.3:
- dependencies:
- readdirp: 4.1.2
-
- citty@0.1.6:
- dependencies:
- consola: 3.4.2
-
- citty@0.2.2: {}
-
- class-variance-authority@0.7.1:
- dependencies:
- clsx: 2.1.1
-
- cli-cursor@5.0.0:
- dependencies:
- restore-cursor: 5.1.0
-
- cli-spinners@2.9.2: {}
-
- client-only@0.0.1: {}
-
- clsx@2.1.1: {}
-
- cn@0.2.6: {}
-
- code-block-writer@13.0.3: {}
-
- commander@11.1.0: {}
-
- commander@14.0.3: {}
-
- conf@10.2.0:
- dependencies:
- ajv: 8.20.0
- ajv-formats: 2.1.1(ajv@8.20.0)
- atomically: 1.7.0
- debounce-fn: 4.0.0
- dot-prop: 6.0.1
- env-paths: 2.2.1
- json-schema-typed: 7.0.3
- onetime: 5.1.2
- pkg-up: 3.1.0
- semver: 7.8.5
-
- confbox@0.2.4: {}
-
- confbox@0.3.1: {}
-
- consola@3.4.2: {}
-
- content-disposition@1.1.0: {}
-
- content-type@1.0.5: {}
-
- content-type@2.1.0: {}
-
- convert-source-map@2.0.0: {}
-
- cookie-signature@1.2.2: {}
-
- cookie@0.7.2: {}
-
- cors@2.8.6:
- dependencies:
- object-assign: 4.1.1
- vary: 1.1.2
-
- cosmiconfig@9.0.2(typescript@5.7.3):
- dependencies:
- env-paths: 2.2.1
- import-fresh: 3.3.1
- js-yaml: 4.3.2
- parse-json: 5.2.0
- optionalDependencies:
- typescript: 5.7.3
-
- cross-spawn@7.0.6:
- dependencies:
- path-key: 3.1.1
- shebang-command: 2.0.0
- which: 2.0.2
-
- cssesc@3.0.0: {}
-
- csstype@3.2.3: {}
-
- debounce-fn@4.0.0:
- dependencies:
- mimic-fn: 3.1.0
-
- debug@4.4.3:
- dependencies:
- ms: 2.1.3
-
- dedent@1.7.2: {}
-
- deepmerge-ts@7.1.5: {}
-
- deepmerge@4.3.1: {}
-
- default-browser-id@5.0.1: {}
-
- default-browser@5.5.1:
- dependencies:
- bundle-name: 4.1.0
- default-browser-id: 5.0.1
-
- define-lazy-prop@2.0.0: {}
-
- define-lazy-prop@3.0.0: {}
-
- defu@6.1.7: {}
-
- depd@2.0.0: {}
-
- destr@2.0.5: {}
-
- detect-libc@2.1.2: {}
-
- diff@8.0.4: {}
-
- dompurify@3.4.8:
- optionalDependencies:
- '@types/trusted-types': 2.0.7
-
- dot-prop@6.0.1:
- dependencies:
- is-obj: 2.0.0
-
- dotenv@16.6.1: {}
-
- dotenv@17.4.2: {}
-
- dunder-proto@1.0.1:
- dependencies:
- call-bind-apply-helpers: 1.0.2
- es-errors: 1.3.0
- gopd: 1.2.0
-
- ee-first@1.1.1: {}
-
- effect@3.21.0:
- dependencies:
- '@standard-schema/spec': 1.1.0
- fast-check: 3.23.2
-
- electron-to-chromium@1.5.427: {}
-
- emoji-regex@10.6.0: {}
-
- empathic@2.0.0: {}
-
- encodeurl@2.0.0: {}
-
- enhanced-resolve@5.24.5:
- dependencies:
- graceful-fs: 4.2.11
- tapable: 2.3.3
-
- enquirer@2.4.1:
- dependencies:
- ansi-colors: 4.1.3
- strip-ansi: 6.0.1
-
- env-paths@2.2.1: {}
-
- error-ex@1.3.4:
- dependencies:
- is-arrayish: 0.2.1
-
- es-define-property@1.0.1: {}
-
- es-errors@1.3.0: {}
-
- es-object-atoms@1.1.2:
- dependencies:
- es-errors: 1.3.0
-
- escalade@3.2.0: {}
-
- escape-html@1.0.3: {}
-
- esprima@4.0.1: {}
-
- etag@1.8.1: {}
-
- eventsource-parser@3.1.1: {}
-
- eventsource@3.0.7:
- dependencies:
- eventsource-parser: 3.1.1
-
- execa@5.1.1:
- dependencies:
- cross-spawn: 7.0.6
- get-stream: 6.0.1
- human-signals: 2.1.0
- is-stream: 2.0.1
- merge-stream: 2.0.0
- npm-run-path: 4.0.1
- onetime: 5.1.2
- signal-exit: 3.0.7
- strip-final-newline: 2.0.0
-
- execa@9.6.1:
- dependencies:
- '@sindresorhus/merge-streams': 4.0.0
- cross-spawn: 7.0.6
- figures: 6.1.0
- get-stream: 9.0.1
- human-signals: 8.0.1
- is-plain-obj: 4.1.0
- is-stream: 4.0.1
- npm-run-path: 6.0.0
- pretty-ms: 9.3.1
- signal-exit: 4.1.0
- strip-final-newline: 4.0.0
- yoctocolors: 2.2.0
-
- express-rate-limit@8.7.0(express@5.2.1):
- dependencies:
- debug: 4.4.3
- express: 5.2.1
- ip-address: 10.7.0
- transitivePeerDependencies:
- - supports-color
-
- express@5.2.1:
- dependencies:
- accepts: 2.0.0
- body-parser: 2.3.0
- content-disposition: 1.1.0
- content-type: 1.0.5
- cookie: 0.7.2
- cookie-signature: 1.2.2
- debug: 4.4.3
- depd: 2.0.0
- encodeurl: 2.0.0
- escape-html: 1.0.3
- etag: 1.8.1
- finalhandler: 2.1.1
- fresh: 2.0.0
- http-errors: 2.0.1
- merge-descriptors: 2.0.0
- mime-types: 3.0.2
- on-finished: 2.4.1
- once: 1.4.0
- parseurl: 1.3.3
- proxy-addr: 2.0.7
- qs: 6.16.0
- range-parser: 1.3.0
- router: 2.2.0
- send: 1.2.1
- serve-static: 2.2.1
- statuses: 2.0.2
- type-is: 2.1.0
- vary: 1.1.2
- transitivePeerDependencies:
- - supports-color
-
- exsolve@1.1.1: {}
-
- fast-check@3.23.2:
- dependencies:
- pure-rand: 6.1.0
-
- fast-deep-equal@3.1.3: {}
-
- fast-glob@3.3.3:
- dependencies:
- '@nodelib/fs.stat': 2.0.5
- '@nodelib/fs.walk': 1.2.8
- glob-parent: 5.1.2
- merge2: 1.4.1
- micromatch: 4.0.8
-
- fast-uri@3.1.7: {}
-
- fastq@1.20.3:
- dependencies:
- reusify: 1.1.0
-
- fdir@6.5.0(picomatch@4.0.7):
- optionalDependencies:
- picomatch: 4.0.7
-
- figures@6.1.0:
- dependencies:
- is-unicode-supported: 2.1.0
-
- fill-range@7.1.1:
- dependencies:
- to-regex-range: 5.0.1
-
- finalhandler@2.1.1:
- dependencies:
- debug: 4.4.3
- encodeurl: 2.0.0
- escape-html: 1.0.3
- on-finished: 2.4.1
- parseurl: 1.3.3
- statuses: 2.0.2
- transitivePeerDependencies:
- - supports-color
-
- find-up@3.0.0:
- dependencies:
- locate-path: 3.0.0
-
- forwarded@0.2.0: {}
-
- fresh@2.0.0: {}
-
- fs-extra@11.4.0:
- dependencies:
- graceful-fs: 4.2.11
- jsonfile: 6.2.1
- universalify: 2.0.1
-
- function-bind@1.1.2: {}
-
- fuzzysort@3.1.0: {}
-
- gensync@1.0.0-beta.2: {}
-
- get-east-asian-width@1.6.0: {}
-
- get-intrinsic@1.3.0:
- dependencies:
- call-bind-apply-helpers: 1.0.2
- es-define-property: 1.0.1
- es-errors: 1.3.0
- es-object-atoms: 1.1.2
- function-bind: 1.1.2
- get-proto: 1.0.1
- gopd: 1.2.0
- has-symbols: 1.1.0
- hasown: 2.0.4
- math-intrinsics: 1.1.0
-
- get-own-enumerable-keys@1.0.0: {}
-
- get-proto@1.0.1:
- dependencies:
- dunder-proto: 1.0.1
- es-object-atoms: 1.1.2
-
- get-stream@6.0.1: {}
-
- get-stream@9.0.1:
- dependencies:
- '@sec-ant/readable-stream': 0.4.1
- is-stream: 4.0.1
-
- giget@2.0.0:
- dependencies:
- citty: 0.1.6
- consola: 3.4.2
- defu: 6.1.7
- node-fetch-native: 1.6.7
- nypm: 0.6.10
- pathe: 2.0.3
-
- glob-parent@5.1.2:
- dependencies:
- is-glob: 4.0.3
-
- gopd@1.2.0: {}
-
- graceful-fs@4.2.11: {}
-
- has-symbols@1.1.0: {}
-
- hasown@2.0.4:
- dependencies:
- function-bind: 1.1.2
-
- highlight.js@11.12.0: {}
-
- hono@4.13.7: {}
-
- http-errors@2.0.1:
- dependencies:
- depd: 2.0.0
- inherits: 2.0.4
- setprototypeof: 1.2.0
- statuses: 2.0.2
- toidentifier: 1.0.1
-
- human-signals@2.1.0: {}
-
- human-signals@8.0.1: {}
-
- iconv-lite@0.7.3:
- dependencies:
- safer-buffer: 2.1.2
-
- ignore@5.3.2: {}
-
- import-fresh@3.3.1:
- dependencies:
- parent-module: 1.0.1
- resolve-from: 4.0.0
-
- inherits@2.0.4: {}
-
- ip-address@10.7.0: {}
-
- ipaddr.js@1.9.1: {}
-
- is-arrayish@0.2.1: {}
-
- is-docker@2.2.1: {}
-
- is-docker@3.0.0: {}
-
- is-extglob@2.1.1: {}
-
- is-glob@4.0.3:
- dependencies:
- is-extglob: 2.1.1
-
- is-in-ssh@1.0.0: {}
-
- is-inside-container@1.0.0:
- dependencies:
- is-docker: 3.0.0
-
- is-interactive@2.0.0: {}
-
- is-number@7.0.0: {}
-
- is-obj@2.0.0: {}
-
- is-obj@3.0.0: {}
-
- is-plain-obj@4.1.0: {}
-
- is-promise@4.0.0: {}
-
- is-regexp@3.1.0: {}
-
- is-stream@2.0.1: {}
-
- is-stream@4.0.1: {}
-
- is-unicode-supported@1.3.0: {}
-
- is-unicode-supported@2.1.0: {}
-
- is-wsl@2.2.0:
- dependencies:
- is-docker: 2.2.1
-
- is-wsl@3.1.1:
- dependencies:
- is-inside-container: 1.0.0
-
- isexe@2.0.0: {}
-
- isexe@3.1.5: {}
-
- jiti@2.7.0: {}
-
- jose@6.2.12: {}
-
- js-tokens@4.0.0: {}
-
- js-yaml@4.3.2:
- dependencies:
- argparse: 2.0.1
-
- jsesc@3.1.0: {}
-
- json-parse-even-better-errors@2.3.1: {}
-
- json-schema-traverse@1.0.0: {}
-
- json-schema-typed@7.0.3: {}
-
- json-schema-typed@8.0.2: {}
-
- json5@2.2.3: {}
-
- jsonfile@6.2.1:
- dependencies:
- universalify: 2.0.1
- optionalDependencies:
- graceful-fs: 4.2.11
-
- kleur@3.0.3: {}
-
- kleur@4.1.5: {}
-
- kysely@0.29.5: {}
-
- lightningcss-android-arm64@1.32.0:
- optional: true
-
- lightningcss-darwin-arm64@1.32.0:
- optional: true
-
- lightningcss-darwin-x64@1.32.0:
- optional: true
-
- lightningcss-freebsd-x64@1.32.0:
- optional: true
-
- lightningcss-linux-arm-gnueabihf@1.32.0:
- optional: true
-
- lightningcss-linux-arm64-gnu@1.32.0:
- optional: true
-
- lightningcss-linux-arm64-musl@1.32.0:
- optional: true
-
- lightningcss-linux-x64-gnu@1.32.0:
- optional: true
-
- lightningcss-linux-x64-musl@1.32.0:
- optional: true
-
- lightningcss-win32-arm64-msvc@1.32.0:
- optional: true
-
- lightningcss-win32-x64-msvc@1.32.0:
- optional: true
-
- lightningcss@1.32.0:
- dependencies:
- detect-libc: 2.1.2
- optionalDependencies:
- lightningcss-android-arm64: 1.32.0
- lightningcss-darwin-arm64: 1.32.0
- lightningcss-darwin-x64: 1.32.0
- lightningcss-freebsd-x64: 1.32.0
- lightningcss-linux-arm-gnueabihf: 1.32.0
- lightningcss-linux-arm64-gnu: 1.32.0
- lightningcss-linux-arm64-musl: 1.32.0
- lightningcss-linux-x64-gnu: 1.32.0
- lightningcss-linux-x64-musl: 1.32.0
- lightningcss-win32-arm64-msvc: 1.32.0
- lightningcss-win32-x64-msvc: 1.32.0
-
- lines-and-columns@1.2.4: {}
-
- locate-path@3.0.0:
- dependencies:
- p-locate: 3.0.0
- path-exists: 3.0.0
-
- log-symbols@6.0.0:
- dependencies:
- chalk: 5.6.2
- is-unicode-supported: 1.3.0
-
- lru-cache@5.1.1:
- dependencies:
- yallist: 3.1.1
-
- lucide-react@1.45.0(react@19.3.0):
- dependencies:
- react: 19.3.0
-
- magic-string@0.30.21:
- dependencies:
- '@jridgewell/sourcemap-codec': 1.6.0
-
- marked@14.0.0: {}
-
- math-intrinsics@1.1.0: {}
-
- media-typer@1.1.1: {}
-
- merge-descriptors@2.0.0: {}
-
- merge-stream@2.0.0: {}
-
- merge2@1.4.1: {}
-
- micromatch@4.0.8:
- dependencies:
- braces: 3.0.3
- picomatch: 2.3.2
-
- mime-db@1.54.0: {}
-
- mime-types@3.0.2:
- dependencies:
- mime-db: 1.54.0
-
- mimic-fn@2.1.0: {}
-
- mimic-fn@3.1.0: {}
-
- mimic-function@5.0.1: {}
-
- minimatch@10.2.6:
- dependencies:
- brace-expansion: 5.0.9
-
- minimist@1.2.8: {}
-
- monaco-editor@0.56.0:
- dependencies:
- dompurify: 3.4.8
- marked: 14.0.0
-
- ms@2.1.3: {}
-
- nanoid@3.3.19: {}
-
- nanostores@1.5.3: {}
-
- negotiator@1.1.0:
- dependencies:
- content-type: 2.1.0
-
- next@16.3.3(@babel/core@7.29.7)(@types/node@24.13.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0):
- dependencies:
- '@next/env': 16.3.3
- '@swc/helpers': 0.5.23
- baseline-browser-mapping: 2.11.22
- caniuse-lite: 1.0.30001810
- postcss: 8.5.23
- react: 19.3.0
- react-dom: 19.3.0(react@19.3.0)
- styled-jsx: 5.1.6(@babel/core@7.29.7)(react@19.3.0)
- optionalDependencies:
- '@next/swc-darwin-arm64': 16.3.3
- '@next/swc-darwin-x64': 16.3.3
- '@next/swc-linux-arm64-gnu': 16.3.3
- '@next/swc-linux-arm64-musl': 16.3.3
- '@next/swc-linux-x64-gnu': 16.3.3
- '@next/swc-linux-x64-musl': 16.3.3
- '@next/swc-win32-arm64-msvc': 16.3.3
- '@next/swc-win32-x64-msvc': 16.3.3
- sharp: 0.35.4(@types/node@24.13.4)
- transitivePeerDependencies:
- - '@babel/core'
- - '@types/node'
- - babel-plugin-macros
-
- node-fetch-native@1.6.7: {}
-
- node-releases@2.0.55: {}
-
- npm-run-path@4.0.1:
- dependencies:
- path-key: 3.1.1
-
- npm-run-path@6.0.0:
- dependencies:
- path-key: 4.0.0
- unicorn-magic: 0.3.0
-
- nypm@0.6.10:
- dependencies:
- citty: 0.2.2
- pathe: 2.0.3
- tinyexec: 1.3.1
-
- object-assign@4.1.1: {}
-
- object-inspect@1.13.4: {}
-
- object-treeify@1.1.33: {}
-
- ohash@2.0.12: {}
-
- on-finished@2.4.1:
- dependencies:
- ee-first: 1.1.1
-
- once@1.4.0:
- dependencies:
- wrappy: 1.0.2
-
- onetime@5.1.2:
- dependencies:
- mimic-fn: 2.1.0
-
- onetime@7.0.0:
- dependencies:
- mimic-function: 5.0.1
-
- open@11.0.3:
- dependencies:
- default-browser: 5.5.1
- define-lazy-prop: 3.0.0
- is-in-ssh: 1.0.0
- is-inside-container: 1.0.0
- powershell-utils: 0.2.1
- wsl-utils: 1.0.0
-
- open@8.4.2:
- dependencies:
- define-lazy-prop: 2.0.0
- is-docker: 2.2.1
- is-wsl: 2.2.0
-
- ora@8.2.0:
- dependencies:
- chalk: 5.6.2
- cli-cursor: 5.0.0
- cli-spinners: 2.9.2
- is-interactive: 2.0.0
- is-unicode-supported: 2.1.0
- log-symbols: 6.0.0
- stdin-discarder: 0.2.2
- string-width: 7.2.0
- strip-ansi: 7.2.0
-
- p-limit@2.3.0:
- dependencies:
- p-try: 2.2.0
-
- p-locate@3.0.0:
- dependencies:
- p-limit: 2.3.0
-
- p-try@2.2.0: {}
-
- parent-module@1.0.1:
- dependencies:
- callsites: 3.1.0
-
- parse-json@5.2.0:
- dependencies:
- '@babel/code-frame': 7.29.7
- error-ex: 1.3.4
- json-parse-even-better-errors: 2.3.1
- lines-and-columns: 1.2.4
-
- parse-ms@4.0.0: {}
-
- parseurl@1.3.3: {}
-
- path-browserify@1.0.1: {}
-
- path-exists@3.0.0: {}
-
- path-key@3.1.1: {}
-
- path-key@4.0.0: {}
-
- path-to-regexp@8.4.2: {}
-
- pathe@2.0.3: {}
-
- perfect-debounce@1.0.0: {}
-
- picocolors@1.1.1: {}
-
- picomatch@2.3.2: {}
-
- picomatch@4.0.7: {}
-
- pkce-challenge@5.0.1: {}
-
- pkg-types@2.3.3:
- dependencies:
- confbox: 0.3.1
- exsolve: 1.1.1
- pathe: 2.0.3
-
- pkg-up@3.1.0:
- dependencies:
- find-up: 3.0.0
-
- postcss-selector-parser@7.1.6:
- dependencies:
- cssesc: 3.0.0
- util-deprecate: 1.0.2
-
- postcss@8.5.23:
- dependencies:
- nanoid: 3.3.19
- picocolors: 1.1.1
- source-map-js: 1.2.1
-
- postcss@8.5.28:
- dependencies:
- nanoid: 3.3.19
- picocolors: 1.1.1
- source-map-js: 1.2.1
-
- powershell-utils@0.1.0: {}
-
- powershell-utils@0.2.1: {}
-
- pretty-ms@9.3.1:
- dependencies:
- parse-ms: 4.0.0
-
- prisma@6.19.3(typescript@5.7.3):
- dependencies:
- '@prisma/config': 6.19.3
- '@prisma/engines': 6.19.3
- optionalDependencies:
- typescript: 5.7.3
- transitivePeerDependencies:
- - magicast
-
- prompts@2.4.2:
- dependencies:
- kleur: 3.0.3
- sisteransi: 1.0.5
-
- proxy-addr@2.0.7:
- dependencies:
- forwarded: 0.2.0
- ipaddr.js: 1.9.1
-
- pure-rand@6.1.0: {}
-
- qs@6.16.0:
- dependencies:
- es-define-property: 1.0.1
- side-channel: 1.1.1
-
- queue-microtask@1.2.3: {}
-
- range-parser@1.3.0: {}
-
- raw-body@3.0.2:
- dependencies:
- bytes: 3.1.2
- http-errors: 2.0.1
- iconv-lite: 0.7.3
- unpipe: 1.0.0
-
- rc9@2.1.2:
- dependencies:
- defu: 6.1.7
- destr: 2.0.5
-
- react-dom@19.3.0(react@19.3.0):
- dependencies:
- react: 19.3.0
- scheduler: 0.28.0
-
- react@19.3.0: {}
-
- readdirp@4.1.2: {}
-
- recast@0.23.21:
- dependencies:
- ast-types: 0.16.3
- esprima: 4.0.1
- source-map: 0.6.1
- tiny-invariant: 1.3.3
- tslib: 2.8.1
-
- require-from-string@2.0.2: {}
-
- reselect@5.3.0: {}
-
- resolve-from@4.0.0: {}
-
- restore-cursor@5.1.0:
- dependencies:
- onetime: 7.0.0
- signal-exit: 4.1.0
-
- reusify@1.1.0: {}
-
- rou3@0.9.2: {}
-
- router@2.2.0:
- dependencies:
- debug: 4.4.3
- depd: 2.0.0
- is-promise: 4.0.0
- parseurl: 1.3.3
- path-to-regexp: 8.4.2
- transitivePeerDependencies:
- - supports-color
-
- run-applescript@7.1.0: {}
-
- run-parallel@1.2.0:
- dependencies:
- queue-microtask: 1.2.3
-
- safer-buffer@2.1.2: {}
-
- scheduler@0.28.0: {}
-
- semver@6.3.1: {}
-
- semver@7.8.5: {}
-
- send@1.2.1:
- dependencies:
- debug: 4.4.3
- encodeurl: 2.0.0
- escape-html: 1.0.3
- etag: 1.8.1
- fresh: 2.0.0
- http-errors: 2.0.1
- mime-types: 3.0.2
- ms: 2.1.3
- on-finished: 2.4.1
- range-parser: 1.3.0
- statuses: 2.0.2
- transitivePeerDependencies:
- - supports-color
-
- serve-static@2.2.1:
- dependencies:
- encodeurl: 2.0.0
- escape-html: 1.0.3
- parseurl: 1.3.3
- send: 1.2.1
- transitivePeerDependencies:
- - supports-color
-
- set-cookie-parser@3.1.2: {}
-
- setprototypeof@1.2.0: {}
-
- shadcn@4.21.0(typescript@5.7.3):
- dependencies:
- '@babel/core': 7.29.7
- '@babel/parser': 7.29.8
- '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7)
- '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7)
- '@dotenvx/dotenvx': 1.75.1
- '@modelcontextprotocol/sdk': 1.30.0(zod@3.25.76)
- '@types/validate-npm-package-name': 4.0.2
- browserslist: 4.28.9
- cn: 0.2.6
- commander: 14.0.3
- cosmiconfig: 9.0.2(typescript@5.7.3)
- dedent: 1.7.2
- deepmerge: 4.3.1
- diff: 8.0.4
- execa: 9.6.1
- fast-glob: 3.3.3
- fs-extra: 11.4.0
- fuzzysort: 3.1.0
- kleur: 4.1.5
- open: 11.0.3
- ora: 8.2.0
- postcss: 8.5.28
- postcss-selector-parser: 7.1.6
- prompts: 2.4.2
- recast: 0.23.21
- socks: 2.8.10
- stringify-object: 5.0.0
- ts-morph: 26.0.0
- tsconfig-paths: 4.2.0
- undici: 7.29.1
- validate-npm-package-name: 7.0.2
- zod: 3.25.76
- zod-to-json-schema: 3.25.2(zod@3.25.76)
- transitivePeerDependencies:
- - '@cfworker/json-schema'
- - babel-plugin-macros
- - supports-color
- - typescript
-
- sharp@0.35.4(@types/node@24.13.4):
- dependencies:
- '@img/colour': 1.1.0
- detect-libc: 2.1.2
- semver: 7.8.5
- optionalDependencies:
- '@img/sharp-darwin-arm64': 0.35.4
- '@img/sharp-darwin-x64': 0.35.4
- '@img/sharp-freebsd-wasm32': 0.35.4
- '@img/sharp-libvips-darwin-arm64': 1.3.3
- '@img/sharp-libvips-darwin-x64': 1.3.3
- '@img/sharp-libvips-linux-arm': 1.3.3
- '@img/sharp-libvips-linux-arm64': 1.3.3
- '@img/sharp-libvips-linux-ppc64': 1.3.3
- '@img/sharp-libvips-linux-riscv64': 1.3.3
- '@img/sharp-libvips-linux-s390x': 1.3.3
- '@img/sharp-libvips-linux-x64': 1.3.3
- '@img/sharp-libvips-linuxmusl-arm64': 1.3.3
- '@img/sharp-libvips-linuxmusl-x64': 1.3.3
- '@img/sharp-linux-arm': 0.35.4
- '@img/sharp-linux-arm64': 0.35.4
- '@img/sharp-linux-ppc64': 0.35.4
- '@img/sharp-linux-riscv64': 0.35.4
- '@img/sharp-linux-s390x': 0.35.4
- '@img/sharp-linux-x64': 0.35.4
- '@img/sharp-linuxmusl-arm64': 0.35.4
- '@img/sharp-linuxmusl-x64': 0.35.4
- '@img/sharp-webcontainers-wasm32': 0.35.4
- '@img/sharp-win32-arm64': 0.35.4
- '@img/sharp-win32-ia32': 0.35.4
- '@img/sharp-win32-x64': 0.35.4
- '@types/node': 24.13.4
- optional: true
-
- shebang-command@2.0.0:
- dependencies:
- shebang-regex: 3.0.0
-
- shebang-regex@3.0.0: {}
-
- side-channel-list@1.0.1:
- dependencies:
- es-errors: 1.3.0
- object-inspect: 1.13.4
-
- side-channel-map@1.0.1:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- get-intrinsic: 1.3.0
- object-inspect: 1.13.4
-
- side-channel-weakmap@1.0.2:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- get-intrinsic: 1.3.0
- object-inspect: 1.13.4
- side-channel-map: 1.0.1
-
- side-channel@1.1.1:
- dependencies:
- es-errors: 1.3.0
- object-inspect: 1.13.4
- side-channel-list: 1.0.1
- side-channel-map: 1.0.1
- side-channel-weakmap: 1.0.2
-
- signal-exit@3.0.7: {}
-
- signal-exit@4.1.0: {}
-
- sisteransi@1.0.5: {}
-
- smart-buffer@4.2.0: {}
-
- socks@2.8.10:
- dependencies:
- ip-address: 10.7.0
- smart-buffer: 4.2.0
-
- source-map-js@1.2.1: {}
-
- source-map@0.6.1: {}
-
- state-local@1.0.7: {}
-
- statuses@2.0.2: {}
-
- stdin-discarder@0.2.2: {}
-
- string-width@7.2.0:
- dependencies:
- emoji-regex: 10.6.0
- get-east-asian-width: 1.6.0
- strip-ansi: 7.2.0
-
- stringify-object@5.0.0:
- dependencies:
- get-own-enumerable-keys: 1.0.0
- is-obj: 3.0.0
- is-regexp: 3.1.0
-
- strip-ansi@6.0.1:
- dependencies:
- ansi-regex: 5.0.1
-
- strip-ansi@7.2.0:
- dependencies:
- ansi-regex: 6.3.0
-
- strip-bom@3.0.0: {}
-
- strip-final-newline@2.0.0: {}
-
- strip-final-newline@4.0.0: {}
-
- styled-jsx@5.1.6(@babel/core@7.29.7)(react@19.3.0):
- dependencies:
- client-only: 0.0.1
- react: 19.3.0
- optionalDependencies:
- '@babel/core': 7.29.7
-
- systeminformation@5.33.10: {}
-
- tailwind-merge@3.6.0: {}
-
- tailwindcss@4.3.3: {}
-
- tapable@2.3.3: {}
-
- tiny-invariant@1.3.3: {}
-
- tinyexec@1.3.1: {}
-
- to-regex-range@5.0.1:
- dependencies:
- is-number: 7.0.0
-
- toidentifier@1.0.1: {}
-
- ts-morph@26.0.0:
- dependencies:
- '@ts-morph/common': 0.27.0
- code-block-writer: 13.0.3
-
- tsconfig-paths@4.2.0:
- dependencies:
- json5: 2.2.3
- minimist: 1.2.8
- strip-bom: 3.0.0
-
- tslib@2.8.1: {}
-
- tw-animate-css@1.4.0: {}
-
- type-is@2.1.0:
- dependencies:
- content-type: 2.1.0
- media-typer: 1.1.1
- mime-types: 3.0.2
-
- typescript@5.7.3: {}
-
- undici-types@7.18.2: {}
-
- undici@7.29.1: {}
-
- unicorn-magic@0.3.0: {}
-
- universalify@2.0.1: {}
-
- unpipe@1.0.0: {}
-
- update-browserslist-db@1.3.3(browserslist@4.28.9):
- dependencies:
- browserslist: 4.28.9
- escalade: 3.2.0
- picocolors: 1.1.1
-
- use-sync-external-store@1.7.0(react@19.3.0):
- dependencies:
- react: 19.3.0
-
- util-deprecate@1.0.2: {}
-
- validate-npm-package-name@7.0.2: {}
-
- vary@1.1.2: {}
-
- which@2.0.2:
- dependencies:
- isexe: 2.0.0
-
- which@4.0.0:
- dependencies:
- isexe: 3.1.5
-
- wrappy@1.0.2: {}
-
- wsl-utils@1.0.0:
- dependencies:
- is-wsl: 3.1.1
- powershell-utils: 0.1.0
-
- yallist@3.1.1: {}
-
- yocto-spinner@1.2.2:
- dependencies:
- yoctocolors: 2.2.0
-
- yoctocolors@2.2.0: {}
-
- zod-to-json-schema@3.25.2(zod@3.25.76):
- dependencies:
- zod: 3.25.76
-
- zod@3.25.76: {}
-
- zod@4.6.2: {}
diff --git a/npm/hub/pnpm-workspace.yaml b/npm/hub/pnpm-workspace.yaml
deleted file mode 100644
index 3d58b808..00000000
--- a/npm/hub/pnpm-workspace.yaml
+++ /dev/null
@@ -1,18 +0,0 @@
-allowBuilds:
- '@prisma/client': true
- '@prisma/engines': true
- esbuild: true
- prisma: true
-
-minimumReleaseAgeExclude:
- - "@next/*"
- - next
- - nanoid
- - zod
- - "@shadowdara/finder-lib"
-
-onlyBuiltDependencies:
- - "@prisma/client"
- - "@prisma/engines"
- - esbuild
- - prisma
diff --git a/npm/hub/template-hub.config.yaml b/npm/hub/template-hub.config.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/npm/site/bun.lock b/npm/site/bun.lock
deleted file mode 100644
index 25f28673..00000000
--- a/npm/site/bun.lock
+++ /dev/null
@@ -1,959 +0,0 @@
-{
- "lockfileVersion": 1,
- "configVersion": 0,
- "workspaces": {
- "": {
- "name": "finder-template-generator",
- "dependencies": {
- "@shadowdara/dlib": "^0.0.4",
- "@shadowdara/finder-lib": "^0.3.17",
- "highlight.js": "^11.12.0",
- "jquery": "^4.0.0",
- "tellraw-parser": "^1.0.2",
- },
- "devDependencies": {
- "@eslint/js": "^10.0.1",
- "@rollup/plugin-yaml": "^5.0.0",
- "@tailwindcss/vite": "^4.3.3",
- "@types/html-minifier-terser": "^7.0.2",
- "@types/jquery": "^4.0.1",
- "@types/license-checker": "^25.0.6",
- "@types/node": "^26.5.0",
- "@vitejs/devtools": "^0.7.2",
- "chalk": "^6.0.0",
- "esbuild": ">=0.25.0",
- "eslint": "^10.9.1",
- "html-minifier-terser": "^7.2.0",
- "license-checker": "^25.0.1",
- "rollup-plugin-string": "^3.0.0",
- "rollup-plugin-visualizer": "^7.1.1",
- "sass": "^1.104.0",
- "tailwindcss": "^4.3.3",
- "tinyglobby": "^0.2.17",
- "tsx": "^4.23.13",
- "typescript": "^5.5.0",
- "typescript-eslint": "^8.69.0",
- "unplugin-remove": "^1.0.3",
- "vite": "6.4.3",
- "vite-plugin-eslint": "^1.8.1",
- },
- },
- },
- "packages": {
- "@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="],
-
- "@babel/compat-data": ["@babel/compat-data@7.29.7", "", {}, "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg=="],
-
- "@babel/core": ["@babel/core@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", "@babel/helper-compilation-targets": "^7.29.7", "@babel/helper-module-transforms": "^7.29.7", "@babel/helpers": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA=="],
-
- "@babel/generator": ["@babel/generator@7.29.8", "", { "dependencies": { "@babel/parser": "^7.29.8", "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg=="],
-
- "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.29.7", "", { "dependencies": { "@babel/compat-data": "^7.29.7", "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g=="],
-
- "@babel/helper-globals": ["@babel/helper-globals@7.29.7", "", {}, "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA=="],
-
- "@babel/helper-module-imports": ["@babel/helper-module-imports@7.29.7", "", { "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g=="],
-
- "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.29.7", "", { "dependencies": { "@babel/helper-module-imports": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7", "@babel/traverse": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg=="],
-
- "@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="],
-
- "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="],
-
- "@babel/helper-validator-option": ["@babel/helper-validator-option@7.29.7", "", {}, "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw=="],
-
- "@babel/helpers": ["@babel/helpers@7.29.7", "", { "dependencies": { "@babel/template": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg=="],
-
- "@babel/parser": ["@babel/parser@7.29.8", "", { "dependencies": { "@babel/types": "^7.29.8" }, "bin": { "parser": "bin/babel-parser.js" } }, "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA=="],
-
- "@babel/template": ["@babel/template@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg=="],
-
- "@babel/traverse": ["@babel/traverse@7.29.8", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.8", "@babel/helper-globals": "^7.29.7", "@babel/parser": "^7.29.8", "@babel/template": "^7.29.7", "@babel/types": "^7.29.8", "debug": "^4.3.1" } }, "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg=="],
-
- "@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="],
-
- "@devframes/hub": ["@devframes/hub@0.9.12", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "destr": "^2.0.5", "h3": "^2.0.1-rc.29", "pathe": "^2.0.3", "perfect-debounce": "^2.1.0", "tinyexec": "^1.3.0", "ufo": "^1.6.4", "zigpty": "^0.2.1" }, "peerDependencies": { "devframe": "0.9.12" } }, "sha512-4QTBpH0PWQEl7GJKpDHF/uA4S3pFGisfzJJucY7BKytHYRoeLi8Cu16Jz+mEngu84ODgONDzS6Ax0ZiurnoZSA=="],
-
- "@devframes/hub-ui": ["@devframes/hub-ui@0.9.12", "", { "peerDependencies": { "@devframes/hub": "0.9.12", "@devframes/json-render": "0.9.12", "devframe": "0.9.12" } }, "sha512-FIDtve50JAUYNgJsPAG+hNHKMSEsYMqlmm0kHmsw9wuqRDgY/ydshBjj7eKqc/XzxL3zy8EnETP751M4y6TH4g=="],
-
- "@devframes/json-render": ["@devframes/json-render@0.9.12", "", { "dependencies": { "@json-render/core": "^0.20.0", "@standard-schema/spec": "^1.1.0", "zod": "^4.5.4" }, "peerDependencies": { "@devframes/hub": "0.9.12", "devframe": "0.9.12" } }, "sha512-9JU6ug8AIoHGs0rpS174caJlg5LQmYa3fYvxyihPtuQfmrvpaVqepMiJmxmVVaNLuX0VjQNy/gsxD4Ns4S1mpA=="],
-
- "@devframes/json-render-ui": ["@devframes/json-render-ui@0.9.12", "", { "peerDependencies": { "@devframes/hub": "0.9.12", "devframe": "0.9.12" } }, "sha512-9p63mIsBIS0q5sPFpQcA1mXdUsb85VKydCq320GUQzuzHg7UvwI5qxd1O+Tfd8u+nazmdB7yyobzlp2ocSvt7w=="],
-
- "@devframes/plugin-inspect": ["@devframes/plugin-inspect@0.9.12", "", { "dependencies": { "cac": "^7.0.0" }, "peerDependencies": { "@devframes/plugin-inspect--assets": "0.9.12", "devframe": "0.9.12", "vite": "^7.0.0 || ^8.0.0" }, "optionalPeers": ["@devframes/plugin-inspect--assets"], "bin": { "devframe-inspect": "bin.mjs" } }, "sha512-kdbqVVFycEpSLAR7dJQhLnQoZ4yTo1nrlXbctJwkZVkAMuwAf18PBnjUTO2WoXwjIFQIq0g5XQq6uFeN+Uya2A=="],
-
- "@devframes/plugin-messages": ["@devframes/plugin-messages@0.9.12", "", { "dependencies": { "@devframes/service-open": "0.9.12", "cac": "^7.0.0" }, "peerDependencies": { "@devframes/hub": "0.9.12", "@devframes/plugin-messages--assets": "0.9.12", "devframe": "0.9.12", "vite": "^7.0.0 || ^8.0.0" }, "optionalPeers": ["@devframes/plugin-messages--assets"], "bin": { "devframe-messages": "bin.mjs" } }, "sha512-IStDziP+qSP8YG+gIIUfdoF8I7xJp2X653WCNPmJ170JgiFVksgWPY4ZND9yNlVSgCaqeFng/4rY9Y0DDMsQwQ=="],
-
- "@devframes/plugin-terminals": ["@devframes/plugin-terminals@0.9.12", "", { "dependencies": { "@devframes/vite": "0.9.12", "cac": "^7.0.0", "zigpty": "^0.2.1" }, "peerDependencies": { "@devframes/plugin-terminals--assets": "0.9.12", "devframe": "0.9.12", "vite": "^8.0.0" }, "optionalPeers": ["@devframes/plugin-terminals--assets"], "bin": { "devframe-terminals": "bin.mjs" } }, "sha512-UuaJ1U0Hwq4Tlry7F/KRizNhS+XFNcP/I5DFRxXK8pKrt53wUfFJ5Kc5mi+tZrbCDeeu9u/mTQEZWbQfs+W5Ow=="],
-
- "@devframes/service-open": ["@devframes/service-open@0.9.12", "", { "dependencies": { "pathe": "^2.0.3" }, "peerDependencies": { "devframe": "0.9.12" } }, "sha512-VsuDzcMU/tUXIPcoEy+rzzCRqO8pD2Apq+RzV2XmQoHWNHBQ6mQhWxuO8ETMhLBruUksTVtEyexP5jmpbYtVIA=="],
-
- "@devframes/vite": ["@devframes/vite@0.9.12", "", { "dependencies": { "pathe": "^2.0.3" }, "peerDependencies": { "@devframes/hub": "0.9.12", "@devframes/hub-ui": "0.9.12", "devframe": "0.9.12", "vite": "^7.0.0 || ^8.0.0" } }, "sha512-qciobX39NyIw58r9G250k/7F8rQAKC7zyqgok+beBPTELQkSO401LwSyTjRwzRV/5hagRb1dlElTWlplh0DKgg=="],
-
- "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ=="],
-
- "@esbuild/android-arm": ["@esbuild/android-arm@0.28.2", "", { "os": "android", "cpu": "arm" }, "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg=="],
-
- "@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.2", "", { "os": "android", "cpu": "arm64" }, "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A=="],
-
- "@esbuild/android-x64": ["@esbuild/android-x64@0.28.2", "", { "os": "android", "cpu": "x64" }, "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q=="],
-
- "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw=="],
-
- "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw=="],
-
- "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw=="],
-
- "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg=="],
-
- "@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.2", "", { "os": "linux", "cpu": "arm" }, "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w=="],
-
- "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug=="],
-
- "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ=="],
-
- "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.2", "", { "os": "linux", "cpu": "none" }, "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ=="],
-
- "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.2", "", { "os": "linux", "cpu": "none" }, "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA=="],
-
- "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ=="],
-
- "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.2", "", { "os": "linux", "cpu": "none" }, "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA=="],
-
- "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg=="],
-
- "@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.2", "", { "os": "linux", "cpu": "x64" }, "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ=="],
-
- "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.2", "", { "os": "none", "cpu": "arm64" }, "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw=="],
-
- "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.2", "", { "os": "none", "cpu": "x64" }, "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw=="],
-
- "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ=="],
-
- "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw=="],
-
- "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.2", "", { "os": "none", "cpu": "arm64" }, "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q=="],
-
- "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g=="],
-
- "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ=="],
-
- "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA=="],
-
- "@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.2", "", { "os": "win32", "cpu": "x64" }, "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g=="],
-
- "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.10.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg=="],
-
- "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="],
-
- "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="],
-
- "@eslint/config-helpers": ["@eslint/config-helpers@0.7.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw=="],
-
- "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="],
-
- "@eslint/js": ["@eslint/js@10.0.1", "", { "peerDependencies": { "eslint": "^10.0.0" } }, "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA=="],
-
- "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="],
-
- "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="],
-
- "@humanfs/core": ["@humanfs/core@0.19.2", "", { "dependencies": { "@humanfs/types": "^0.15.0" } }, "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA=="],
-
- "@humanfs/node": ["@humanfs/node@0.16.8", "", { "dependencies": { "@humanfs/core": "^0.19.2", "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ=="],
-
- "@humanfs/types": ["@humanfs/types@0.15.0", "", {}, "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q=="],
-
- "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="],
-
- "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="],
-
- "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
-
- "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="],
-
- "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
-
- "@jridgewell/source-map": ["@jridgewell/source-map@0.3.11", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA=="],
-
- "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.6.0", "", {}, "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw=="],
-
- "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
-
- "@json-render/core": ["@json-render/core@0.20.0", "", { "dependencies": { "zod": "^4.3.6" }, "peerDependencies": { "zod": "^4.0.0" } }, "sha512-cXAXn7h3QaylefQgh85AEGPuVq4C8SJ3k9JqigWLJhaBSozF1Fmsrm43DP16RmkqNiVgj5pBRdmB48lEO5qlow=="],
-
- "@modelcontextprotocol/core": ["@modelcontextprotocol/core@2.0.0", "", { "dependencies": { "zod": "^4.2.0" } }, "sha512-pJCEwGG7Lfr/+PQp9ZTwKXNeO5wzbfKL7H3MYpCorM4oFBoQrdjnBgEoqG+RjhsvS1FKrDbKux+M1HhlnGWqcA=="],
-
- "@modelcontextprotocol/server": ["@modelcontextprotocol/server@2.0.0", "", { "dependencies": { "@modelcontextprotocol/core": "2.0.0", "zod": "^4.2.0" } }, "sha512-YhHWdHfpFMQfd0prsEnxKeS3Qz3ytIGmsS0sth4KDjnacIT7hxk6hXHkJ9KysxlkvTM+WZAtQbbcUhdoP4Hvtw=="],
-
- "@napi-rs/lzma-linux-x64-gnu": ["@napi-rs/lzma-linux-x64-gnu@1.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ=="],
-
- "@oxc-project/types": ["@oxc-project/types@0.148.0", "", {}, "sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A=="],
-
- "@parcel/watcher": ["@parcel/watcher@2.6.0", "", { "dependencies": { "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", "picomatch": "^4.0.4" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.6.0", "@parcel/watcher-darwin-arm64": "2.6.0", "@parcel/watcher-darwin-x64": "2.6.0", "@parcel/watcher-freebsd-x64": "2.6.0", "@parcel/watcher-linux-arm-glibc": "2.6.0", "@parcel/watcher-linux-arm-musl": "2.6.0", "@parcel/watcher-linux-arm64-glibc": "2.6.0", "@parcel/watcher-linux-arm64-musl": "2.6.0", "@parcel/watcher-linux-x64-glibc": "2.6.0", "@parcel/watcher-linux-x64-musl": "2.6.0", "@parcel/watcher-win32-arm64": "2.6.0", "@parcel/watcher-win32-x64": "2.6.0" } }, "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w=="],
-
- "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.6.0", "", { "os": "android", "cpu": "arm64" }, "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA=="],
-
- "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.6.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw=="],
-
- "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.6.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw=="],
-
- "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.6.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ=="],
-
- "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.6.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg=="],
-
- "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.6.0", "", { "os": "linux", "cpu": "arm" }, "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw=="],
-
- "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.6.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g=="],
-
- "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.6.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA=="],
-
- "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.6.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A=="],
-
- "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.6.0", "", { "os": "linux", "cpu": "x64" }, "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw=="],
-
- "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.6.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ=="],
-
- "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.6.0", "", { "os": "win32", "cpu": "x64" }, "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A=="],
-
- "@rolldown/binding-android-arm-eabi": ["@rolldown/binding-android-arm-eabi@1.2.7", "", { "os": "android", "cpu": "arm" }, "sha512-EypzgnYCwyVY4NDHKzGmNJT5b+XaQEBniHxsMdeIQLB/tcCzZnhqrzHpZFbX9iaxx+5RiB8caATBtfvZP7zVxQ=="],
-
- "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.2.7", "", { "os": "android", "cpu": "arm64" }, "sha512-l17HE9EweWaqJZhuUuNBN/FzM62xw+DECVnJyvMsxn8vJFAGLy5QfLDoYAcronkAN8VxKZHezDpulHDPx95vFw=="],
-
- "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.2.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-8ED8ELFvHXc6OCETIn4gXObPiaR6bckM/ipXtbzlPVDRMBfEGjCKgO90F9YtfdpDatVx/ZQw7aZ1vUMf/+T3Mw=="],
-
- "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.2.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-/WPripjtiAIZ2tWY7ddijORT0Ujg87wxWW/qcoFVCKAWVDPhtY0xr7Dj0M3GyNGz60jGwTElhro/mkF9dT7dDQ=="],
-
- "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.2.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-14DI4NcqpvbICxSnGLx3PmtDaWqRP/KGSGb6C+JLLVPeZRl6dKdHba3pGsqT3vpdTqhEYIPG0MMQ8c0xYqoJxA=="],
-
- "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.2.7", "", { "os": "linux", "cpu": "arm" }, "sha512-bxrWIRvHWQvbJwi+VIie/kDJmQxcNE6xxWwZdqF/ExVAigtHkv54WTLQPb+QsZdnFy18fg7JPfWGL0RH6vwIlQ=="],
-
- "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.2.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-toOY2BChBZyuxU7OYX6Tn389di4IzAqPTycVcci0O7FSfBqzRB3RZn+K5Is6ANf4tmgRd/K1yZTsNTXbkXsnLg=="],
-
- "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.2.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-lAIXTH/aiLRLxsTgQvfhjo4K1ydWIp00+V0voOr9beb/9ZmkUFrSIb03dXNFRgMNvkE6oGsF10ioQ6UsI+vS5Q=="],
-
- "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.2.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-kdnwS28Pkenp/mZMRwjXXXwxQ7pIsm+bF919LUK93BOyhcLsrVKdP2p9fxpiPNPAbNuch8ypQt0pm2P2LYCAGg=="],
-
- "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.2.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-516OdsyLdr5E65paF3yBF55t8mfm9+gmtCsK3xI7XKXIT7EfRlHhxL8K/NR6Hu8BWSgF5+1w74lTL0+nxcc8Qw=="],
-
- "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.2.7", "", { "os": "linux", "cpu": "x64" }, "sha512-r8/z8n7GFaYRln3xmP1Cxy0HH/HLM0uBUPkEuSVEfKGDA89M0FsZRZJRSwe/tJjRx+fpH/gjorfhB8tmEbSFLA=="],
-
- "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.2.7", "", { "os": "linux", "cpu": "x64" }, "sha512-pAsE8iiDxUg1xBqdhrTfg45AVDVpirjz00sblEYClGNNcMnDb+e8beQgqIAw6LvauX/APvgxUnwrgun/YYGBhw=="],
-
- "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.2.7", "", { "os": "none", "cpu": "arm64" }, "sha512-lTcIYmmnQQA8Or/2DatS6oSqcdLHvendjS+zLu+FwgToynWMRSmQdpM65fTANJgIS4mjbMOo5KT2lnT9SAb96w=="],
-
- "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.2.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-e3Gu3WxbNk/UqQhxqU7YIYO+9ZBvWNz3U+h/qRFosscMFzdRPbXYSaSWgSnklv2fz1TgzBTcti2z35c/7irsHw=="],
-
- "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.2.7", "", { "os": "win32", "cpu": "x64" }, "sha512-W/jg5qoRSqjsEv0+dZi4e687mcHqmVuU0P4fK6qS/xjetW2Gmc1W8j//z5nAeNcC8Ttm0hV46IjcYeuVwYhuiw=="],
-
- "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="],
-
- "@rollup/plugin-yaml": ["@rollup/plugin-yaml@5.0.0", "", { "dependencies": { "@rollup/pluginutils": "^5.3.0", "js-yaml": "^4.1.0", "tosource": "^2.0.0-alpha.3" }, "peerDependencies": { "rollup": "^2.78.0||^3.0.0||^4.0.0" } }, "sha512-9XOiRGYJjDwmEwR15kuxw+RytZFKtEWshoXuITrtS6+57BVMQMzDfhmSO/xfQOAY5psQv1IrxhQTUqPNppe4lQ=="],
-
- "@rollup/pluginutils": ["@rollup/pluginutils@5.4.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" } }, "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg=="],
-
- "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.63.1", "", { "os": "android", "cpu": "arm" }, "sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ=="],
-
- "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.63.1", "", { "os": "android", "cpu": "arm64" }, "sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ=="],
-
- "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.63.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q=="],
-
- "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.63.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg=="],
-
- "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.63.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw=="],
-
- "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.63.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q=="],
-
- "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.63.1", "", { "os": "linux", "cpu": "arm" }, "sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw=="],
-
- "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.63.1", "", { "os": "linux", "cpu": "arm" }, "sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw=="],
-
- "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.63.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg=="],
-
- "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.63.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw=="],
-
- "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.63.1", "", { "os": "linux", "cpu": "none" }, "sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ=="],
-
- "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.63.1", "", { "os": "linux", "cpu": "none" }, "sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA=="],
-
- "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.63.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA=="],
-
- "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.63.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA=="],
-
- "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.63.1", "", { "os": "linux", "cpu": "none" }, "sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w=="],
-
- "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.63.1", "", { "os": "linux", "cpu": "none" }, "sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ=="],
-
- "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.63.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A=="],
-
- "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.63.1", "", { "os": "linux", "cpu": "x64" }, "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w=="],
-
- "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.63.1", "", { "os": "linux", "cpu": "x64" }, "sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow=="],
-
- "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.63.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA=="],
-
- "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.63.1", "", { "os": "none", "cpu": "arm64" }, "sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw=="],
-
- "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.63.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg=="],
-
- "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.63.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg=="],
-
- "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.63.1", "", { "os": "win32", "cpu": "x64" }, "sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg=="],
-
- "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.63.1", "", { "os": "win32", "cpu": "x64" }, "sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w=="],
-
- "@shadowdara/dlib": ["@shadowdara/dlib@0.0.4", "", {}, "sha512-eYvqbE0uhTCufVd5NjhYQEIZwJg2qu1DyHu9gVMJQUei0UZyYxe5F+hZYO7Hdr+yD2sm3dWvzZ+fBzVDeySnFg=="],
-
- "@shadowdara/finder-lib": ["@shadowdara/finder-lib@0.3.17", "", {}, "sha512-8aOCR273G8vBtp/migYdQHAgD9Uu2ymtX49wfAPA3rfFs+2PooujmvMrRss1O+uJvce3ti0NY13if2UHqv080g=="],
-
- "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
-
- "@tailwindcss/node": ["@tailwindcss/node@4.3.3", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.24.1", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.3" } }, "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg=="],
-
- "@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.3", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.3", "@tailwindcss/oxide-darwin-arm64": "4.3.3", "@tailwindcss/oxide-darwin-x64": "4.3.3", "@tailwindcss/oxide-freebsd-x64": "4.3.3", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", "@tailwindcss/oxide-linux-x64-musl": "4.3.3", "@tailwindcss/oxide-wasm32-wasi": "4.3.3", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" } }, "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA=="],
-
- "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.3.3", "", { "os": "android", "cpu": "arm64" }, "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw=="],
-
- "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.3.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw=="],
-
- "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.3.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw=="],
-
- "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.3.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw=="],
-
- "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3", "", { "os": "linux", "cpu": "arm" }, "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ=="],
-
- "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.3.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w=="],
-
- "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.3.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA=="],
-
- "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.3.3", "", { "os": "linux", "cpu": "x64" }, "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w=="],
-
- "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.3.3", "", { "os": "linux", "cpu": "x64" }, "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img=="],
-
- "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.3.3", "", { "cpu": "none" }, "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ=="],
-
- "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.3.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ=="],
-
- "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.3.3", "", { "os": "win32", "cpu": "x64" }, "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw=="],
-
- "@tailwindcss/vite": ["@tailwindcss/vite@4.3.3", "", { "dependencies": { "@tailwindcss/node": "4.3.3", "@tailwindcss/oxide": "4.3.3", "tailwindcss": "4.3.3" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw=="],
-
- "@types/eslint": ["@types/eslint@8.56.12", "", { "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g=="],
-
- "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="],
-
- "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="],
-
- "@types/html-minifier-terser": ["@types/html-minifier-terser@7.0.2", "", {}, "sha512-mm2HqV22l8lFQh4r2oSsOEVea+m0qqxEmwpc9kC1p/XzmjLWrReR9D/GRs8Pex2NX/imyEH9c5IU/7tMBQCHOA=="],
-
- "@types/jquery": ["@types/jquery@4.0.1", "", {}, "sha512-9a59A/tycXgYuPABcp6/3spSShn0NT2UOM4EfHvMumjYi4lJWTsK5SZWjhx3yRm9IHGCeWXdV2YfNsrWrft/CA=="],
-
- "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
-
- "@types/license-checker": ["@types/license-checker@25.0.6", "", {}, "sha512-ju/75+YPkNE5vX1iPer+qtI1eI/LqJVYZgOsmSHI1iiEM1bQL5Gh1lEvyjR9T7ZXVE1FwJa2doWJEEmPNwbZkw=="],
-
- "@types/node": ["@types/node@26.5.0", "", { "dependencies": { "undici-types": "~8.9.0" } }, "sha512-dVSGpriSoCgz8WnDNTuSSuSv1PC/ALXihO4ulRZt7Md8k9mlbdin3lGOcDE8SnWOgf513ByWlXd7BK4azmyg/A=="],
-
- "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.69.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.69.0", "@typescript-eslint/type-utils": "8.69.0", "@typescript-eslint/utils": "8.69.0", "@typescript-eslint/visitor-keys": "8.69.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.69.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-t5jQTKPIgVW1PE6dR6H6Qz5gm8zjMlX5/2gRaOGd9eO6V7J+tQc6iWKukEe7dY8u9HyYasQ0yfF0/FSSTEO2gA=="],
-
- "@typescript-eslint/parser": ["@typescript-eslint/parser@8.69.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.69.0", "@typescript-eslint/types": "8.69.0", "@typescript-eslint/typescript-estree": "8.69.0", "@typescript-eslint/visitor-keys": "8.69.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-l4b0DhWioGg6Gt2ebGlvfkFMOjRsauxtsnDRwUSRX1qHq3HdTfQHV8wW9zEXeciai6HfeaKOedQn2Zoofx3WBw=="],
-
- "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.69.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.69.0", "@typescript-eslint/types": "^8.69.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-yi4obFrHMmnsesWehHbkg9zMA7Jt8cXT+mKM08G999pH1yT6nqgsHx7MYm0uY1wAj8CqiBXYRJ7WAT0QdQHQXg=="],
-
- "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.69.0", "", { "dependencies": { "@typescript-eslint/types": "8.69.0", "@typescript-eslint/visitor-keys": "8.69.0" } }, "sha512-ewfspqWvSxKSOaplqAUNbaSFO0eB6w1EtQ+esfYFRm3614Ty4uNtExkcbgd6nWsXphbqKyf9ZYdbZdv2xEoWEQ=="],
-
- "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.69.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-xNqK7YTDZsLniQMV/4rpFR8Z5JlqeRvVjuG1YgF/mdPVH84HSD19L8CczMA0qg2RfwEV231GHH3VnToJDo4MfQ=="],
-
- "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.69.0", "", { "dependencies": { "@typescript-eslint/types": "8.69.0", "@typescript-eslint/typescript-estree": "8.69.0", "@typescript-eslint/utils": "8.69.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-ZfoJAVg3JZndQEpEl9petVlxau3lRuElc4HRMuAlLCf8to04/iHz692RUSNmXKDjEuJmIL+KZ2/BsOcBc16dsA=="],
-
- "@typescript-eslint/types": ["@typescript-eslint/types@8.69.0", "", {}, "sha512-K3VrubUPhlo9VDBS6QdI8YB5j7ClpqLRdefcz6PFrhnwicehBweqQ9Evhl4l+FYz0HdDmMqIiSX0aldGRYtDCA=="],
-
- "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.69.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.69.0", "@typescript-eslint/tsconfig-utils": "8.69.0", "@typescript-eslint/types": "8.69.0", "@typescript-eslint/visitor-keys": "8.69.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-AdFkgqck3Vudb/kWnxlyafU/4aBhHrbQ9locP2N4psXTy5mOBg0SHJumnLvx7r6g1gV4DKvUFwV2nJZBoqOD8w=="],
-
- "@typescript-eslint/utils": ["@typescript-eslint/utils@8.69.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.69.0", "@typescript-eslint/types": "8.69.0", "@typescript-eslint/typescript-estree": "8.69.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-tUbx60BBqQa31kXF5MCsOOLL5E/WzUuxIn7YpAvq+eaUlqvk8/NXnXMBNAdLCr0icjkzem7iUA5QqWHe/hJ1aw=="],
-
- "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.69.0", "", { "dependencies": { "@typescript-eslint/types": "8.69.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-+rmdgPA+EXkNgKYvHvFfhrs35utXbwaC5PGpDquSXcoXQDKUA5UjV0LmTucG/4JXkM31BTu4TilHtrN8IVBe8w=="],
-
- "@vitejs/devtools": ["@vitejs/devtools@0.7.2", "", { "dependencies": { "@devframes/hub": "^0.9.12", "@devframes/hub-ui": "^0.9.12", "@devframes/json-render-ui": "^0.9.12", "@devframes/plugin-inspect": "^0.9.12", "@devframes/plugin-messages": "^0.9.12", "@devframes/plugin-terminals": "^0.9.12", "@vitejs/devtools-kit": "0.7.2", "cac": "^7.0.0", "devframe": "^0.9.12", "h3": "^2.0.1-rc.29", "local-pkg": "^1.2.1", "nostics": "^1.2.0", "obug": "^2.1.4", "pathe": "^2.0.3" }, "peerDependencies": { "@vitejs/devtools-oxc": "^0.7.2", "@vitejs/devtools-rolldown": "^0.7.2", "@vitejs/devtools-vite": "^0.7.2", "@vitejs/devtools-vitest": "^0.7.2", "vite": "*" }, "optionalPeers": ["@vitejs/devtools-oxc", "@vitejs/devtools-rolldown", "@vitejs/devtools-vite", "@vitejs/devtools-vitest"], "bin": { "vite-devtools": "bin.js" } }, "sha512-tyfRglEzpg/eMX3GaLu5htz2PkoKqnULHJDzmVhK9uzIIRAg2DMZjc2e1Jg9YyMhW4iPz0zXc8tv9XYevvKOhg=="],
-
- "@vitejs/devtools-kit": ["@vitejs/devtools-kit@0.7.2", "", { "dependencies": { "@devframes/hub": "^0.9.12", "@devframes/json-render": "^0.9.12", "devframe": "^0.9.12", "local-pkg": "^1.2.1", "mlly": "^1.8.2", "nostics": "^1.2.0", "nypm": "^0.6.9" }, "peerDependencies": { "vite": "*" } }, "sha512-MAdPSQjjBmXou+3P27rnRXYbkrrSmifeidNZchZkHbOBa082Duv/Edbm/tA4Sh+dA9X/sEm5OWABCPBrb1emoA=="],
-
- "abbrev": ["abbrev@1.1.1", "", {}, "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="],
-
- "acorn": ["acorn@8.18.0", "", { "bin": "bin/acorn" }, "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ=="],
-
- "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
-
- "ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="],
-
- "ansi-regex": ["ansi-regex@6.3.0", "", {}, "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ=="],
-
- "ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="],
-
- "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
-
- "array-find-index": ["array-find-index@1.0.2", "", {}, "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw=="],
-
- "asap": ["asap@2.0.6", "", {}, "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="],
-
- "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
-
- "baseline-browser-mapping": ["baseline-browser-mapping@2.11.21", "", { "bin": "dist/cli.cjs" }, "sha512-uh8vpY/1/YyFkunIDFH/12p7/7VdPKA1hejMVEbdkEaWnUz0Hesvx5EbiU6XxjyHZIOju+ZMbQJkRh+es3/spQ=="],
-
- "birpc": ["birpc@4.2.0", "", {}, "sha512-KxgKcZPfrtzJDDALHPguGpGJUrzdgpymyiQQgzFjWreHMOpWrnFNVREr5J48x2DBh8ZVioscrV1SBkDipGiX+Q=="],
-
- "brace-expansion": ["brace-expansion@5.0.9", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg=="],
-
- "browserslist": ["browserslist@4.28.9", "", { "dependencies": { "baseline-browser-mapping": "^2.11.20", "caniuse-lite": "^1.0.30001810", "electron-to-chromium": "^1.5.420", "node-releases": "^2.0.54", "update-browserslist-db": "^1.3.2" }, "bin": "cli.js" }, "sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg=="],
-
- "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="],
-
- "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="],
-
- "cac": ["cac@7.0.0", "", {}, "sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ=="],
-
- "camel-case": ["camel-case@4.1.2", "", { "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" } }, "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw=="],
-
- "caniuse-lite": ["caniuse-lite@1.0.30001810", "", {}, "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg=="],
-
- "chalk": ["chalk@6.0.0", "", {}, "sha512-2uNTXIuTTxk7ciZgAU1BQcgnchcG0xXnrs6jzkQfj9SsRa9M2s5zE8WT96hS6KmG4MzWHSrvH43DF1m4XRkrFg=="],
-
- "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="],
-
- "citty": ["citty@0.2.2", "", {}, "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w=="],
-
- "clean-css": ["clean-css@5.3.3", "", { "dependencies": { "source-map": "~0.6.0" } }, "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg=="],
-
- "cliui": ["cliui@9.0.1", "", { "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w=="],
-
- "color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="],
-
- "color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="],
-
- "commander": ["commander@10.0.1", "", {}, "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="],
-
- "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
-
- "confbox": ["confbox@0.3.1", "", {}, "sha512-cKUSoKa8YxFZZSmraVi7onONx3amu77ngK3kGpsYHDH7drPwCRkQE1RYMPlLRrMtnciRj274XNRxcHxnKmDSnA=="],
-
- "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="],
-
- "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
-
- "crossws": ["crossws@0.4.12", "", { "peerDependencies": { "srvx": ">=0.11.5" } }, "sha512-aypfsr6t0uNvkqaZc6zvBfXzC6pLI0/sIulpkV6RwCVtZqG5ebBzv4weImKK0VNCj91Wl9F5j7p5WU4MNrybng=="],
-
- "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
-
- "debuglog": ["debuglog@1.0.1", "", {}, "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw=="],
-
- "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="],
-
- "default-browser": ["default-browser@5.5.1", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw=="],
-
- "default-browser-id": ["default-browser-id@5.0.1", "", {}, "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="],
-
- "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="],
-
- "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="],
-
- "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
-
- "devframe": ["devframe@0.9.12", "", { "dependencies": { "@modelcontextprotocol/server": "^2.0.0", "@standard-schema/spec": "^1.1.0", "birpc": "^4.2.0", "crossws": "^0.4.12", "h3": "^2.0.1-rc.29", "mrmime": "^2.0.1", "nostics": "^1.2.0", "pathe": "^2.0.3", "ufo": "^1.6.4" }, "peerDependencies": { "@modelcontextprotocol/client": "^2.0.0", "cac": "^7.0.0" }, "optionalPeers": ["@modelcontextprotocol/client"], "bin": "bin/devframe.mjs" }, "sha512-WXwohwmTPVesEQYDAIh41rZYry6BRsufEyr8f5EAPXKi3SYchAYVJJV5qjBv4jRtouyRh7Z96zfZiSE0YEfQaA=="],
-
- "dezalgo": ["dezalgo@1.0.4", "", { "dependencies": { "asap": "^2.0.0", "wrappy": "1" } }, "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig=="],
-
- "dot-case": ["dot-case@3.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w=="],
-
- "electron-to-chromium": ["electron-to-chromium@1.5.422", "", {}, "sha512-UvA/32XqrLDdZSn7Jllo1AYNcWji/G0d5M0GTViE7KoGBiMunw3a34Sb2KO4ZZyrSEhqsxFoVhWWJshdyfKqJA=="],
-
- "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
-
- "enhanced-resolve": ["enhanced-resolve@5.24.5", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A=="],
-
- "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
-
- "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
-
- "esbuild": ["esbuild@0.28.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.2", "@esbuild/android-arm": "0.28.2", "@esbuild/android-arm64": "0.28.2", "@esbuild/android-x64": "0.28.2", "@esbuild/darwin-arm64": "0.28.2", "@esbuild/darwin-x64": "0.28.2", "@esbuild/freebsd-arm64": "0.28.2", "@esbuild/freebsd-x64": "0.28.2", "@esbuild/linux-arm": "0.28.2", "@esbuild/linux-arm64": "0.28.2", "@esbuild/linux-ia32": "0.28.2", "@esbuild/linux-loong64": "0.28.2", "@esbuild/linux-mips64el": "0.28.2", "@esbuild/linux-ppc64": "0.28.2", "@esbuild/linux-riscv64": "0.28.2", "@esbuild/linux-s390x": "0.28.2", "@esbuild/linux-x64": "0.28.2", "@esbuild/netbsd-arm64": "0.28.2", "@esbuild/netbsd-x64": "0.28.2", "@esbuild/openbsd-arm64": "0.28.2", "@esbuild/openbsd-x64": "0.28.2", "@esbuild/openharmony-arm64": "0.28.2", "@esbuild/sunos-x64": "0.28.2", "@esbuild/win32-arm64": "0.28.2", "@esbuild/win32-ia32": "0.28.2", "@esbuild/win32-x64": "0.28.2" }, "bin": "bin/esbuild" }, "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA=="],
-
- "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
-
- "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
-
- "eslint": ["eslint@10.9.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.7.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "bin": "bin/eslint.js" }, "sha512-9VaAkDURekixUQJy0oJYl2DcN6oKMfxay7XzaGYAWQwsb6qfKf+x76R2k1L8kb1boc+FyCAaTA9GmiKaaiaF+A=="],
-
- "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="],
-
- "eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="],
-
- "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="],
-
- "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="],
-
- "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="],
-
- "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
-
- "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
-
- "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
-
- "exsolve": ["exsolve@1.1.1", "", {}, "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g=="],
-
- "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
-
- "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
-
- "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="],
-
- "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" } }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
-
- "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="],
-
- "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
-
- "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="],
-
- "flatted": ["flatted@3.4.4", "", {}, "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q=="],
-
- "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="],
-
- "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
-
- "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
-
- "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
-
- "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],
-
- "get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="],
-
- "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="],
-
- "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
-
- "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
-
- "h3": ["h3@2.0.1-rc.31", "", { "dependencies": { "rou3": "^0.9.2", "srvx": "^1.0.2" }, "peerDependencies": { "crossws": "^0.4.12", "ocache": ">=0.3.0" }, "optionalPeers": ["ocache"], "bin": "bin/h3.mjs" }, "sha512-AG7qZzF99a0BSYoXT3evJgIhwSIUKow7R+hwkLRZS06WJ9nbSb7QXUDgs1ByBjp6svTvl++N/GKA7I9YPz9cQQ=="],
-
- "has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="],
-
- "hasown": ["hasown@2.0.4", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="],
-
- "highlight.js": ["highlight.js@11.12.0", "", {}, "sha512-nbfWpyRMcMrPMmDwJB+dhX/eiaPKtc2RB+0QZskqJ3WjRA/FDS0e9hZrx8EC/lbEv8gXy98FcDbNa/dspAaJMg=="],
-
- "hosted-git-info": ["hosted-git-info@2.8.9", "", {}, "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="],
-
- "html-minifier-terser": ["html-minifier-terser@7.2.0", "", { "dependencies": { "camel-case": "^4.1.2", "clean-css": "~5.3.2", "commander": "^10.0.0", "entities": "^4.4.0", "param-case": "^3.0.4", "relateurl": "^0.2.7", "terser": "^5.15.1" }, "bin": "cli.js" }, "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA=="],
-
- "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
-
- "immutable": ["immutable@5.1.9", "", {}, "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg=="],
-
- "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
-
- "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="],
-
- "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
-
- "is-core-module": ["is-core-module@2.16.2", "", { "dependencies": { "hasown": "^2.0.3" } }, "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA=="],
-
- "is-docker": ["is-docker@3.0.0", "", { "bin": "cli.js" }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="],
-
- "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
-
- "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
-
- "is-in-ssh": ["is-in-ssh@1.0.0", "", {}, "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw=="],
-
- "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": "cli.js" }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="],
-
- "is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="],
-
- "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
-
- "jiti": ["jiti@2.7.0", "", { "bin": "lib/jiti-cli.mjs" }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="],
-
- "jquery": ["jquery@4.0.0", "", {}, "sha512-TXCHVR3Lb6TZdtw1l3RTLf8RBWVGexdxL6AC8/e0xZKEpBflBsjh9/8LXw+dkNFuOyW9B7iB3O1sP7hS0Kiacg=="],
-
- "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
-
- "js-yaml": ["js-yaml@4.3.2", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": "bin/js-yaml.js" }, "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA=="],
-
- "jsesc": ["jsesc@3.1.0", "", { "bin": "bin/jsesc" }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
-
- "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="],
-
- "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="],
-
- "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
-
- "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
-
- "json5": ["json5@2.2.3", "", { "bin": "lib/cli.js" }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
-
- "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="],
-
- "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="],
-
- "license-checker": ["license-checker@25.0.1", "", { "dependencies": { "chalk": "^2.4.1", "debug": "^3.1.0", "mkdirp": "^0.5.1", "nopt": "^4.0.1", "read-installed": "~4.0.3", "semver": "^5.5.0", "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0", "spdx-satisfies": "^4.0.0", "treeify": "^1.1.0" }, "bin": "bin/license-checker" }, "sha512-mET5AIwl7MR2IAKYYoVBBpV0OnkKQ1xGj2IMMeEFIs42QAkEVjRtFZGWmQ28WeU7MP779iAgOaOy93Mn44mn6g=="],
-
- "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="],
-
- "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="],
-
- "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="],
-
- "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="],
-
- "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="],
-
- "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="],
-
- "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="],
-
- "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="],
-
- "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="],
-
- "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="],
-
- "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="],
-
- "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="],
-
- "local-pkg": ["local-pkg@1.2.1", "", { "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.3.0", "quansync": "^0.2.11" } }, "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q=="],
-
- "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
-
- "lower-case": ["lower-case@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg=="],
-
- "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
-
- "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
-
- "minimatch": ["minimatch@10.2.6", "", { "dependencies": { "brace-expansion": "^5.0.8" } }, "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A=="],
-
- "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
-
- "mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": "bin/cmd.js" }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="],
-
- "mlly": ["mlly@1.8.2", "", { "dependencies": { "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.3" } }, "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA=="],
-
- "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="],
-
- "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
-
- "nanoid": ["nanoid@3.3.18", "", { "bin": "bin/nanoid.cjs" }, "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w=="],
-
- "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="],
-
- "no-case": ["no-case@3.0.4", "", { "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg=="],
-
- "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="],
-
- "node-releases": ["node-releases@2.0.54", "", {}, "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ=="],
-
- "nopt": ["nopt@4.0.3", "", { "dependencies": { "abbrev": "1", "osenv": "^0.1.4" }, "bin": "bin/nopt.js" }, "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg=="],
-
- "normalize-package-data": ["normalize-package-data@2.5.0", "", { "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA=="],
-
- "nostics": ["nostics@1.2.0", "", {}, "sha512-FGqEfhQjrvo1lL8KFifdTQiNwwQHJxC1jtYE1Rc54qF/jxONUNL+kC9gS1krX8Q65PgrQ5fCqH/I4NhWBvdSqg=="],
-
- "npm-normalize-package-bin": ["npm-normalize-package-bin@1.0.1", "", {}, "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA=="],
-
- "nypm": ["nypm@0.6.9", "", { "dependencies": { "citty": "^0.2.2", "pathe": "^2.0.3", "tinyexec": "^1.2.4" }, "bin": "dist/cli.mjs" }, "sha512-zxlE2yvSWZWmHcNdT3+5zV2lrCogeE9YOklHrR3dFjqutq5wO7GFDYLFDRXLsYnJzwvy/im9fYoxePvS0VTW0w=="],
-
- "obug": ["obug@2.1.4", "", {}, "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA=="],
-
- "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="],
-
- "open": ["open@11.0.2", "", { "dependencies": { "default-browser": "^5.5.1", "define-lazy-prop": "^3.0.0", "is-in-ssh": "^1.0.0", "is-inside-container": "^1.0.0", "powershell-utils": "^0.2.1", "wsl-utils": "^1.0.0" } }, "sha512-RWqF+pBSkqecEvCKOn8QYhaNdRMJDZRIrlS/7rTDdLHaPcfXGCZ/h8zb413NfvdeAV0MR7T1yJcA34/q+CSm1Q=="],
-
- "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="],
-
- "os-homedir": ["os-homedir@1.0.2", "", {}, "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ=="],
-
- "os-tmpdir": ["os-tmpdir@1.0.2", "", {}, "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="],
-
- "osenv": ["osenv@0.1.5", "", { "dependencies": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.0" } }, "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g=="],
-
- "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
-
- "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
-
- "param-case": ["param-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A=="],
-
- "pascal-case": ["pascal-case@3.1.2", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g=="],
-
- "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
-
- "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="],
-
- "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
-
- "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],
-
- "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
-
- "perfect-debounce": ["perfect-debounce@2.1.0", "", {}, "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g=="],
-
- "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
-
- "picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="],
-
- "pkg-types": ["pkg-types@2.3.3", "", { "dependencies": { "confbox": "^0.3.1", "exsolve": "^1.1.1", "pathe": "^2.0.3" } }, "sha512-j/lCFdcppV0JxWpCEITdbDltBxPP6cHT+yNJ6Go2OgoSA9518X847X9z0p6LtA4Nc16+eQzCZjRrWanTGvHJ5w=="],
-
- "postcss": ["postcss@8.5.26", "", { "dependencies": { "nanoid": "^3.3.17", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ=="],
-
- "powershell-utils": ["powershell-utils@0.2.1", "", {}, "sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A=="],
-
- "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
-
- "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
-
- "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="],
-
- "read-installed": ["read-installed@4.0.3", "", { "dependencies": { "debuglog": "^1.0.1", "read-package-json": "^2.0.0", "readdir-scoped-modules": "^1.0.0", "semver": "2 || 3 || 4 || 5", "slide": "~1.1.3", "util-extend": "^1.0.1" }, "optionalDependencies": { "graceful-fs": "^4.1.2" } }, "sha512-O03wg/IYuV/VtnK2h/KXEt9VIbMUFbk3ERG0Iu4FhLZw0EP0T9znqrYDGn6ncbEsXUFaUjiVAWXHzxwt3lhRPQ=="],
-
- "read-package-json": ["read-package-json@2.1.2", "", { "dependencies": { "glob": "^7.1.1", "json-parse-even-better-errors": "^2.3.0", "normalize-package-data": "^2.0.0", "npm-normalize-package-bin": "^1.0.0" } }, "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA=="],
-
- "readdir-scoped-modules": ["readdir-scoped-modules@1.1.0", "", { "dependencies": { "debuglog": "^1.0.1", "dezalgo": "^1.0.0", "graceful-fs": "^4.1.2", "once": "^1.3.0" } }, "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw=="],
-
- "readdirp": ["readdirp@5.1.1", "", {}, "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA=="],
-
- "relateurl": ["relateurl@0.2.7", "", {}, "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog=="],
-
- "resolve": ["resolve@1.22.12", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": "bin/resolve" }, "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA=="],
-
- "rolldown": ["rolldown@1.2.7", "", { "dependencies": { "@oxc-project/types": "=0.148.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm-eabi": "1.2.7", "@rolldown/binding-android-arm64": "1.2.7", "@rolldown/binding-darwin-arm64": "1.2.7", "@rolldown/binding-darwin-x64": "1.2.7", "@rolldown/binding-freebsd-x64": "1.2.7", "@rolldown/binding-linux-arm-gnueabihf": "1.2.7", "@rolldown/binding-linux-arm64-gnu": "1.2.7", "@rolldown/binding-linux-arm64-musl": "1.2.7", "@rolldown/binding-linux-ppc64-gnu": "1.2.7", "@rolldown/binding-linux-s390x-gnu": "1.2.7", "@rolldown/binding-linux-x64-gnu": "1.2.7", "@rolldown/binding-linux-x64-musl": "1.2.7", "@rolldown/binding-openharmony-arm64": "1.2.7", "@rolldown/binding-win32-arm64-msvc": "1.2.7", "@rolldown/binding-win32-x64-msvc": "1.2.7" }, "bin": "bin/cli.mjs" }, "sha512-g0EtLvBjTUB7jhyV0S/TCup3v/XSVl45vUIGbOGU4QPiyjTenCe4mKuFvW9fEgYmS2Fo42AUssRmNuMziXdrig=="],
-
- "rollup": ["rollup@4.63.1", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@napi-rs/lzma-linux-x64-gnu": "1.5.1", "@rollup/rollup-android-arm-eabi": "4.63.1", "@rollup/rollup-android-arm64": "4.63.1", "@rollup/rollup-darwin-arm64": "4.63.1", "@rollup/rollup-darwin-x64": "4.63.1", "@rollup/rollup-freebsd-arm64": "4.63.1", "@rollup/rollup-freebsd-x64": "4.63.1", "@rollup/rollup-linux-arm-gnueabihf": "4.63.1", "@rollup/rollup-linux-arm-musleabihf": "4.63.1", "@rollup/rollup-linux-arm64-gnu": "4.63.1", "@rollup/rollup-linux-arm64-musl": "4.63.1", "@rollup/rollup-linux-loong64-gnu": "4.63.1", "@rollup/rollup-linux-loong64-musl": "4.63.1", "@rollup/rollup-linux-ppc64-gnu": "4.63.1", "@rollup/rollup-linux-ppc64-musl": "4.63.1", "@rollup/rollup-linux-riscv64-gnu": "4.63.1", "@rollup/rollup-linux-riscv64-musl": "4.63.1", "@rollup/rollup-linux-s390x-gnu": "4.63.1", "@rollup/rollup-linux-x64-gnu": "4.63.1", "@rollup/rollup-linux-x64-musl": "4.63.1", "@rollup/rollup-openbsd-x64": "4.63.1", "@rollup/rollup-openharmony-arm64": "4.63.1", "@rollup/rollup-win32-arm64-msvc": "4.63.1", "@rollup/rollup-win32-ia32-msvc": "4.63.1", "@rollup/rollup-win32-x64-gnu": "4.63.1", "@rollup/rollup-win32-x64-msvc": "4.63.1", "fsevents": "~2.3.2" }, "bin": "dist/bin/rollup" }, "sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg=="],
-
- "rollup-plugin-string": ["rollup-plugin-string@3.0.0", "", { "dependencies": { "rollup-pluginutils": "^2.4.1" } }, "sha512-vqyzgn9QefAgeKi+Y4A7jETeIAU1zQmS6VotH6bzm/zmUQEnYkpIGRaOBPY41oiWYV4JyBoGAaBjYMYuv+6wVw=="],
-
- "rollup-plugin-visualizer": ["rollup-plugin-visualizer@7.1.1", "", { "dependencies": { "open": "^11.0.0", "picomatch": "^4.0.5", "source-map": "^0.8.0", "yargs": "^18.1.0" }, "peerDependencies": { "rolldown": "1.x || ^1.0.0-beta || ^1.0.0-rc", "rollup": "2.x || 3.x || 4.x" }, "bin": "dist/bin/cli.js" }, "sha512-ThaGiHTU8XW02OkK80TrTHATraJmM9OAduU4otal+7gyXLpYEtmGBLfx5kW+EHvvLwn03YGW2NnwKUIqsYlJAA=="],
-
- "rollup-pluginutils": ["rollup-pluginutils@2.8.2", "", { "dependencies": { "estree-walker": "^0.6.1" } }, "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ=="],
-
- "rou3": ["rou3@0.9.2", "", {}, "sha512-3SOzvaAg8rkHrXtRjpCvCvbyO5to9oOO27Z/XqHEYXfMRVSw/qMIVdmaOk9W2lcRLtR6dlqTjo9hDeJk70QBYQ=="],
-
- "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="],
-
- "sass": ["sass@1.104.0", "", { "dependencies": { "chokidar": "^5.0.0", "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": "sass.js" }, "sha512-btHMApW2bgolvClhRW8AlQJzgI9lUB3pPSofBQQT+E46GWvf9o0TVQ13SYv5riWZVFyPN+JNz3TKW9XhBlc10w=="],
-
- "semver": ["semver@5.7.2", "", { "bin": "bin/semver" }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="],
-
- "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
-
- "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
-
- "slide": ["slide@1.1.6", "", {}, "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw=="],
-
- "source-map": ["source-map@0.8.0", "", {}, "sha512-d8EqvL+k/SOXCreS/SUzg2ciyHqBBLcN/yuRjFsbvVhHTE2pgei7oAhmPM7kWFbkX6OSMQfUq4KbkF3au9lhYQ=="],
-
- "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
-
- "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="],
-
- "spdx-compare": ["spdx-compare@1.0.0", "", { "dependencies": { "array-find-index": "^1.0.2", "spdx-expression-parse": "^3.0.0", "spdx-ranges": "^2.0.0" } }, "sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A=="],
-
- "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="],
-
- "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="],
-
- "spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="],
-
- "spdx-license-ids": ["spdx-license-ids@3.0.23", "", {}, "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw=="],
-
- "spdx-ranges": ["spdx-ranges@2.1.1", "", {}, "sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA=="],
-
- "spdx-satisfies": ["spdx-satisfies@4.0.1", "", { "dependencies": { "spdx-compare": "^1.0.0", "spdx-expression-parse": "^3.0.0", "spdx-ranges": "^2.0.0" } }, "sha512-WVzZ/cXAzoNmjCWiEluEA3BjHp5tiUmmhn9MK+X0tBbR9sOqtC6UQwmgCNrAIZvNlMuBUYAaHYfb2oqlF9SwKA=="],
-
- "srvx": ["srvx@1.0.4", "", { "bin": "bin/srvx.mjs" }, "sha512-eZmYaxUfZSo7/8m8UdsHRJNmTLSCTPPom9d7a60vMmuVeZvwhbvflRR+00/CxTCjMOFa5+H8tgBeNDVZ+w7AAQ=="],
-
- "string-width": ["string-width@8.2.2", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg=="],
-
- "strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="],
-
- "supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="],
-
- "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
-
- "tailwindcss": ["tailwindcss@4.3.3", "", {}, "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ=="],
-
- "tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="],
-
- "tellraw-parser": ["tellraw-parser@1.0.2", "", {}, "sha512-vIEuTAutJGXI6Xks5OoMdELbmDa6GC7Jty074lVgUWn+Ff/puks5DChmeIvNG7cnHzSPyftCB4rVSPG7Xl01kg=="],
-
- "terser": ["terser@5.51.2", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": "bin/terser" }, "sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q=="],
-
- "tinyexec": ["tinyexec@1.3.1", "", {}, "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA=="],
-
- "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="],
-
- "tosource": ["tosource@2.0.0-alpha.3", "", {}, "sha512-KAB2lrSS48y91MzFPFuDg4hLbvDiyTjOVgaK7Erw+5AmZXNq4sFRVn8r6yxSLuNs15PaokrDRpS61ERY9uZOug=="],
-
- "treeify": ["treeify@1.1.0", "", {}, "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A=="],
-
- "ts-api-utils": ["ts-api-utils@2.5.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA=="],
-
- "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
-
- "tsx": ["tsx@4.23.13", "", { "dependencies": { "esbuild": "~0.28.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": "dist/cli.mjs" }, "sha512-BL5MGkRln6aDYhb0xbQlEAGw743BaZYWdbWtdJOBriYJboKgUUYCadFp2/FpBBZquBC/ezNBn7wMMPx7FDZUDw=="],
-
- "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
-
- "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
-
- "typescript-eslint": ["typescript-eslint@8.69.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.69.0", "@typescript-eslint/parser": "8.69.0", "@typescript-eslint/typescript-estree": "8.69.0", "@typescript-eslint/utils": "8.69.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-B3MltX0VqjUBNEe3b3sSuiRbfa6XrfHFtBiPamjT5AsW/dfq+y+bc0wyuS9DxAS1LyzCxRp2+rxzpLUvqM2BvA=="],
-
- "ufo": ["ufo@1.6.4", "", {}, "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA=="],
-
- "undici-types": ["undici-types@8.9.0", "", {}, "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg=="],
-
- "unplugin": ["unplugin@1.16.1", "", { "dependencies": { "acorn": "^8.14.0", "webpack-virtual-modules": "^0.6.2" } }, "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w=="],
-
- "unplugin-remove": ["unplugin-remove@1.0.3", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", "@babel/parser": "^7.25.3", "@babel/traverse": "^7.25.3", "@rollup/pluginutils": "^5.1.0", "magic-string": "^0.30.11", "unplugin": "^1.12.0" } }, "sha512-BZMt9v8Y/Z27cY7YQv+DpcW928znjP1cqplBXOirbANiFQtM2YCdiyNAJhHCvjppT0lScNn1aDrQnXqnRp32pQ=="],
-
- "update-browserslist-db": ["update-browserslist-db@1.3.2", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": "cli.js" }, "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw=="],
-
- "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
-
- "util-extend": ["util-extend@1.0.3", "", {}, "sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA=="],
-
- "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="],
-
- "vite": ["vite@6.4.3", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A=="],
-
- "vite-plugin-eslint": ["vite-plugin-eslint@1.8.1", "", { "dependencies": { "@rollup/pluginutils": "^4.2.1", "@types/eslint": "^8.4.5", "rollup": "^2.77.2" }, "peerDependencies": { "eslint": ">=7", "vite": ">=2" } }, "sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang=="],
-
- "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="],
-
- "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
-
- "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="],
-
- "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="],
-
- "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
-
- "wsl-utils": ["wsl-utils@1.0.0", "", { "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" } }, "sha512-Hl0ZOAs672vg+06kfujwRhoS6/jehvULrlFkuF2dRu6pHgA8U06h3xqNIqNNU1LTXPcedxByAR4GS6pwQK0mgA=="],
-
- "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="],
-
- "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
-
- "yargs": ["yargs@18.1.0", "", { "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "string-width": "^8.2.1", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" } }, "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg=="],
-
- "yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="],
-
- "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
-
- "zigpty": ["zigpty@0.2.1", "", {}, "sha512-MR9JqJx2wf5f4wz8zpx050AlqrmWeIW+1h0SO5iEyhG3HFRjY5luC3szS2ux2EGuPjE5OU9ZAuiCBeMWBTrqZw=="],
-
- "zod": ["zod@4.5.4", "", {}, "sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA=="],
-
- "@babel/core/semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
-
- "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
-
- "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
-
- "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.8", "", {}, "sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q=="],
-
- "@typescript-eslint/typescript-estree/semver": ["semver@7.8.5", "", { "bin": "bin/semver.js" }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="],
-
- "clean-css/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
-
- "cliui/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
-
- "glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="],
-
- "license-checker/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="],
-
- "license-checker/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],
-
- "mlly/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="],
-
- "rollup-pluginutils/estree-walker": ["estree-walker@0.6.1", "", {}, "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w=="],
-
- "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
-
- "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="],
-
- "vite/esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="],
-
- "vite-plugin-eslint/@rollup/pluginutils": ["@rollup/pluginutils@4.2.1", "", { "dependencies": { "estree-walker": "^2.0.1", "picomatch": "^2.2.2" } }, "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ=="],
-
- "vite-plugin-eslint/rollup": ["rollup@2.80.0", "", { "optionalDependencies": { "fsevents": "~2.3.2" }, "bin": "dist/bin/rollup" }, "sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ=="],
-
- "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
-
- "wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
-
- "wsl-utils/powershell-utils": ["powershell-utils@0.1.0", "", {}, "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A=="],
-
- "glob/minimatch/brace-expansion": ["brace-expansion@1.1.18", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw=="],
-
- "license-checker/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="],
-
- "mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="],
-
- "vite-plugin-eslint/@rollup/pluginutils/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
-
- "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="],
-
- "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="],
-
- "vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="],
-
- "vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="],
-
- "vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="],
-
- "vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="],
-
- "vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="],
-
- "vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="],
-
- "vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="],
-
- "vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="],
-
- "vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="],
-
- "vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="],
-
- "vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="],
-
- "vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="],
-
- "vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="],
-
- "vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="],
-
- "vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="],
-
- "vite/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="],
-
- "vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="],
-
- "vite/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="],
-
- "vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="],
-
- "vite/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="],
-
- "vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="],
-
- "vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="],
-
- "vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="],
-
- "vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="],
-
- "glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
- }
-}
diff --git a/npm/site/package-lock.json b/npm/site/package-lock.json
deleted file mode 100644
index c6fd304c..00000000
--- a/npm/site/package-lock.json
+++ /dev/null
@@ -1,7124 +0,0 @@
-{
- "name": "finder-template-generator",
- "version": "0.3.17",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "finder-template-generator",
- "version": "0.3.17",
- "license": "arr for now, i'll change it later when i decide it",
- "dependencies": {
- "@shadowdara/dlib": "^0.0.4",
- "@shadowdara/finder-lib": "^0.3.17",
- "highlight.js": "^11.12.0",
- "jquery": "^4.0.0",
- "tellraw-parser": "^1.0.2"
- },
- "devDependencies": {
- "@eslint/js": "^10.0.1",
- "@rollup/plugin-yaml": "^5.0.0",
- "@tailwindcss/vite": "^4.3.3",
- "@types/html-minifier-terser": "^7.0.2",
- "@types/jquery": "^4.0.1",
- "@types/license-checker": "^25.0.6",
- "@types/node": "^26.5.0",
- "@vitejs/devtools": "^0.7.2",
- "chalk": "^6.0.0",
- "esbuild": ">=0.25.0",
- "eslint": "^10.9.1",
- "html-minifier-terser": "^7.2.0",
- "license-checker": "^25.0.1",
- "rollup-plugin-string": "^3.0.0",
- "rollup-plugin-visualizer": "^7.1.1",
- "sass": "^1.104.0",
- "tailwindcss": "^4.3.3",
- "tinyglobby": "^0.2.17",
- "tsx": "^4.23.13",
- "typescript": "^5.5.0",
- "typescript-eslint": "^8.69.0",
- "unplugin-remove": "^1.0.3",
- "vite": "6.4.3",
- "vite-plugin-eslint": "^1.8.1"
- }
- },
- "node_modules/@babel/code-frame": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
- "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.29.7",
- "js-tokens": "^4.0.0",
- "picocolors": "^1.1.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/compat-data": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz",
- "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/core": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz",
- "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.29.7",
- "@babel/generator": "^7.29.7",
- "@babel/helper-compilation-targets": "^7.29.7",
- "@babel/helper-module-transforms": "^7.29.7",
- "@babel/helpers": "^7.29.7",
- "@babel/parser": "^7.29.7",
- "@babel/template": "^7.29.7",
- "@babel/traverse": "^7.29.7",
- "@babel/types": "^7.29.7",
- "@jridgewell/remapping": "^2.3.5",
- "convert-source-map": "^2.0.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.2",
- "json5": "^2.2.3",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/babel"
- }
- },
- "node_modules/@babel/core/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/generator": {
- "version": "7.29.8",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz",
- "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.29.8",
- "@babel/types": "^7.29.8",
- "@jridgewell/gen-mapping": "^0.3.12",
- "@jridgewell/trace-mapping": "^0.3.28",
- "jsesc": "^3.0.2"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-compilation-targets": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz",
- "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/compat-data": "^7.29.7",
- "@babel/helper-validator-option": "^7.29.7",
- "browserslist": "^4.24.0",
- "lru-cache": "^5.1.1",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/helper-globals": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz",
- "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-imports": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz",
- "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/traverse": "^7.29.7",
- "@babel/types": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-transforms": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz",
- "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-imports": "^7.29.7",
- "@babel/helper-validator-identifier": "^7.29.7",
- "@babel/traverse": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-string-parser": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
- "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
- "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-option": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz",
- "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helpers": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz",
- "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/template": "^7.29.7",
- "@babel/types": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/parser": {
- "version": "7.29.8",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz",
- "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.29.8"
- },
- "bin": {
- "parser": "bin/babel-parser.js"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/template": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz",
- "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.29.7",
- "@babel/parser": "^7.29.7",
- "@babel/types": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse": {
- "version": "7.29.8",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz",
- "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.29.7",
- "@babel/generator": "^7.29.8",
- "@babel/helper-globals": "^7.29.7",
- "@babel/parser": "^7.29.8",
- "@babel/template": "^7.29.7",
- "@babel/types": "^7.29.8",
- "debug": "^4.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/types": {
- "version": "7.29.8",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
- "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-string-parser": "^7.29.7",
- "@babel/helper-validator-identifier": "^7.29.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@devframes/hub": {
- "version": "0.9.12",
- "resolved": "https://registry.npmjs.org/@devframes/hub/-/hub-0.9.12.tgz",
- "integrity": "sha512-4QTBpH0PWQEl7GJKpDHF/uA4S3pFGisfzJJucY7BKytHYRoeLi8Cu16Jz+mEngu84ODgONDzS6Ax0ZiurnoZSA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@standard-schema/spec": "^1.1.0",
- "destr": "^2.0.5",
- "h3": "^2.0.1-rc.29",
- "pathe": "^2.0.3",
- "perfect-debounce": "^2.1.0",
- "tinyexec": "^1.3.0",
- "ufo": "^1.6.4",
- "zigpty": "^0.2.1"
- },
- "peerDependencies": {
- "devframe": "0.9.12"
- }
- },
- "node_modules/@devframes/hub-ui": {
- "version": "0.9.12",
- "resolved": "https://registry.npmjs.org/@devframes/hub-ui/-/hub-ui-0.9.12.tgz",
- "integrity": "sha512-FIDtve50JAUYNgJsPAG+hNHKMSEsYMqlmm0kHmsw9wuqRDgY/ydshBjj7eKqc/XzxL3zy8EnETP751M4y6TH4g==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "@devframes/hub": "0.9.12",
- "@devframes/json-render": "0.9.12",
- "devframe": "0.9.12"
- },
- "peerDependenciesMeta": {
- "@devframes/json-render": {
- "optional": true
- }
- }
- },
- "node_modules/@devframes/json-render": {
- "version": "0.9.12",
- "resolved": "https://registry.npmjs.org/@devframes/json-render/-/json-render-0.9.12.tgz",
- "integrity": "sha512-9JU6ug8AIoHGs0rpS174caJlg5LQmYa3fYvxyihPtuQfmrvpaVqepMiJmxmVVaNLuX0VjQNy/gsxD4Ns4S1mpA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@json-render/core": "^0.20.0",
- "@standard-schema/spec": "^1.1.0",
- "zod": "^4.5.4"
- },
- "peerDependencies": {
- "@devframes/hub": "0.9.12",
- "devframe": "0.9.12"
- },
- "peerDependenciesMeta": {
- "@devframes/hub": {
- "optional": true
- }
- }
- },
- "node_modules/@devframes/json-render-ui": {
- "version": "0.9.12",
- "resolved": "https://registry.npmjs.org/@devframes/json-render-ui/-/json-render-ui-0.9.12.tgz",
- "integrity": "sha512-9p63mIsBIS0q5sPFpQcA1mXdUsb85VKydCq320GUQzuzHg7UvwI5qxd1O+Tfd8u+nazmdB7yyobzlp2ocSvt7w==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "@devframes/hub": "0.9.12",
- "devframe": "0.9.12"
- },
- "peerDependenciesMeta": {
- "@devframes/hub": {
- "optional": true
- },
- "devframe": {
- "optional": true
- }
- }
- },
- "node_modules/@devframes/service-open": {
- "version": "0.9.12",
- "resolved": "https://registry.npmjs.org/@devframes/service-open/-/service-open-0.9.12.tgz",
- "integrity": "sha512-VsuDzcMU/tUXIPcoEy+rzzCRqO8pD2Apq+RzV2XmQoHWNHBQ6mQhWxuO8ETMhLBruUksTVtEyexP5jmpbYtVIA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "pathe": "^2.0.3"
- },
- "peerDependencies": {
- "devframe": "0.9.12"
- }
- },
- "node_modules/@esbuild/aix-ppc64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz",
- "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "aix"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-arm": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz",
- "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-arm64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz",
- "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-x64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz",
- "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz",
- "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/darwin-x64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz",
- "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/freebsd-arm64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz",
- "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/freebsd-x64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz",
- "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-arm": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz",
- "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-arm64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz",
- "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-ia32": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz",
- "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz",
- "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-mips64el": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz",
- "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==",
- "cpu": [
- "mips64el"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-ppc64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz",
- "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-riscv64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz",
- "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-s390x": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz",
- "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-x64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz",
- "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/netbsd-arm64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz",
- "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz",
- "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openbsd-arm64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz",
- "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz",
- "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openharmony-arm64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz",
- "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openharmony"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz",
- "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-arm64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz",
- "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-ia32": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz",
- "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-x64": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz",
- "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@eslint-community/eslint-utils": {
- "version": "4.10.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz",
- "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "eslint-visitor-keys": "^3.4.3"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- },
- "peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
- }
- },
- "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/@eslint-community/regexpp": {
- "version": "4.12.2",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
- "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
- }
- },
- "node_modules/@eslint/config-array": {
- "version": "0.23.5",
- "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz",
- "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/object-schema": "^3.0.5",
- "debug": "^4.3.1",
- "minimatch": "^10.2.4"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- }
- },
- "node_modules/@eslint/config-helpers": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz",
- "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/core": "^1.2.1"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- }
- },
- "node_modules/@eslint/core": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz",
- "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@types/json-schema": "^7.0.15"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- }
- },
- "node_modules/@eslint/js": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz",
- "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- },
- "funding": {
- "url": "https://eslint.org/donate"
- },
- "peerDependencies": {
- "eslint": "^10.0.0"
- },
- "peerDependenciesMeta": {
- "eslint": {
- "optional": true
- }
- }
- },
- "node_modules/@eslint/object-schema": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz",
- "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- }
- },
- "node_modules/@eslint/plugin-kit": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz",
- "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/core": "^1.2.1",
- "levn": "^0.4.1"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- }
- },
- "node_modules/@humanfs/core": {
- "version": "0.19.2",
- "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
- "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@humanfs/types": "^0.15.0"
- },
- "engines": {
- "node": ">=18.18.0"
- }
- },
- "node_modules/@humanfs/node": {
- "version": "0.16.8",
- "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz",
- "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@humanfs/core": "^0.19.2",
- "@humanfs/types": "^0.15.0",
- "@humanwhocodes/retry": "^0.4.0"
- },
- "engines": {
- "node": ">=18.18.0"
- }
- },
- "node_modules/@humanfs/types": {
- "version": "0.15.0",
- "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz",
- "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18.18.0"
- }
- },
- "node_modules/@humanwhocodes/module-importer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
- "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=12.22"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@humanwhocodes/retry": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
- "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18.18"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.13",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
- "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.0",
- "@jridgewell/trace-mapping": "^0.3.24"
- }
- },
- "node_modules/@jridgewell/remapping": {
- "version": "2.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
- "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.24"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/source-map": {
- "version": "0.3.11",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz",
- "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.25"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz",
- "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.31",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
- "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "node_modules/@json-render/core": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@json-render/core/-/core-0.20.0.tgz",
- "integrity": "sha512-cXAXn7h3QaylefQgh85AEGPuVq4C8SJ3k9JqigWLJhaBSozF1Fmsrm43DP16RmkqNiVgj5pBRdmB48lEO5qlow==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "zod": "^4.3.6"
- },
- "peerDependencies": {
- "zod": "^4.0.0"
- }
- },
- "node_modules/@modelcontextprotocol/core": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@modelcontextprotocol/core/-/core-2.0.0.tgz",
- "integrity": "sha512-pJCEwGG7Lfr/+PQp9ZTwKXNeO5wzbfKL7H3MYpCorM4oFBoQrdjnBgEoqG+RjhsvS1FKrDbKux+M1HhlnGWqcA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "zod": "^4.2.0"
- },
- "engines": {
- "node": ">=20"
- }
- },
- "node_modules/@modelcontextprotocol/server": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@modelcontextprotocol/server/-/server-2.0.0.tgz",
- "integrity": "sha512-YhHWdHfpFMQfd0prsEnxKeS3Qz3ytIGmsS0sth4KDjnacIT7hxk6hXHkJ9KysxlkvTM+WZAtQbbcUhdoP4Hvtw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@modelcontextprotocol/core": "2.0.0",
- "zod": "^4.2.0"
- },
- "engines": {
- "node": ">=20"
- }
- },
- "node_modules/@napi-rs/lzma-linux-x64-gnu": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz",
- "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^22.20 || ^24.12 || >=25"
- }
- },
- "node_modules/@oxc-project/types": {
- "version": "0.148.0",
- "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.148.0.tgz",
- "integrity": "sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "peer": true,
- "funding": {
- "url": "https://github.com/sponsors/oxc-project"
- }
- },
- "node_modules/@parcel/watcher": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz",
- "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "detect-libc": "^2.0.3",
- "is-glob": "^4.0.3",
- "node-addon-api": "^7.0.0",
- "picomatch": "^4.0.4"
- },
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- },
- "optionalDependencies": {
- "@parcel/watcher-android-arm64": "2.6.0",
- "@parcel/watcher-darwin-arm64": "2.6.0",
- "@parcel/watcher-darwin-x64": "2.6.0",
- "@parcel/watcher-freebsd-x64": "2.6.0",
- "@parcel/watcher-linux-arm-glibc": "2.6.0",
- "@parcel/watcher-linux-arm-musl": "2.6.0",
- "@parcel/watcher-linux-arm64-glibc": "2.6.0",
- "@parcel/watcher-linux-arm64-musl": "2.6.0",
- "@parcel/watcher-linux-x64-glibc": "2.6.0",
- "@parcel/watcher-linux-x64-musl": "2.6.0",
- "@parcel/watcher-win32-arm64": "2.6.0",
- "@parcel/watcher-win32-x64": "2.6.0"
- }
- },
- "node_modules/@parcel/watcher-android-arm64": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz",
- "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/watcher-darwin-arm64": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz",
- "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/watcher-darwin-x64": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz",
- "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/watcher-freebsd-x64": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz",
- "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/watcher-linux-arm-glibc": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz",
- "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/watcher-linux-arm-musl": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz",
- "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/watcher-linux-arm64-glibc": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz",
- "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/watcher-linux-arm64-musl": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz",
- "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/watcher-linux-x64-glibc": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz",
- "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/watcher-linux-x64-musl": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz",
- "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/watcher-win32-arm64": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz",
- "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@parcel/watcher-win32-x64": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz",
- "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@rolldown/binding-android-arm-eabi": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.7.tgz",
- "integrity": "sha512-EypzgnYCwyVY4NDHKzGmNJT5b+XaQEBniHxsMdeIQLB/tcCzZnhqrzHpZFbX9iaxx+5RiB8caATBtfvZP7zVxQ==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-android-arm64": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.7.tgz",
- "integrity": "sha512-l17HE9EweWaqJZhuUuNBN/FzM62xw+DECVnJyvMsxn8vJFAGLy5QfLDoYAcronkAN8VxKZHezDpulHDPx95vFw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-darwin-arm64": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.7.tgz",
- "integrity": "sha512-8ED8ELFvHXc6OCETIn4gXObPiaR6bckM/ipXtbzlPVDRMBfEGjCKgO90F9YtfdpDatVx/ZQw7aZ1vUMf/+T3Mw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-darwin-x64": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.7.tgz",
- "integrity": "sha512-/WPripjtiAIZ2tWY7ddijORT0Ujg87wxWW/qcoFVCKAWVDPhtY0xr7Dj0M3GyNGz60jGwTElhro/mkF9dT7dDQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-freebsd-x64": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.7.tgz",
- "integrity": "sha512-14DI4NcqpvbICxSnGLx3PmtDaWqRP/KGSGb6C+JLLVPeZRl6dKdHba3pGsqT3vpdTqhEYIPG0MMQ8c0xYqoJxA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.7.tgz",
- "integrity": "sha512-bxrWIRvHWQvbJwi+VIie/kDJmQxcNE6xxWwZdqF/ExVAigtHkv54WTLQPb+QsZdnFy18fg7JPfWGL0RH6vwIlQ==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-arm64-gnu": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.7.tgz",
- "integrity": "sha512-toOY2BChBZyuxU7OYX6Tn389di4IzAqPTycVcci0O7FSfBqzRB3RZn+K5Is6ANf4tmgRd/K1yZTsNTXbkXsnLg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-arm64-musl": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.7.tgz",
- "integrity": "sha512-lAIXTH/aiLRLxsTgQvfhjo4K1ydWIp00+V0voOr9beb/9ZmkUFrSIb03dXNFRgMNvkE6oGsF10ioQ6UsI+vS5Q==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-ppc64-gnu": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.7.tgz",
- "integrity": "sha512-kdnwS28Pkenp/mZMRwjXXXwxQ7pIsm+bF919LUK93BOyhcLsrVKdP2p9fxpiPNPAbNuch8ypQt0pm2P2LYCAGg==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-s390x-gnu": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.7.tgz",
- "integrity": "sha512-516OdsyLdr5E65paF3yBF55t8mfm9+gmtCsK3xI7XKXIT7EfRlHhxL8K/NR6Hu8BWSgF5+1w74lTL0+nxcc8Qw==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-x64-gnu": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.7.tgz",
- "integrity": "sha512-r8/z8n7GFaYRln3xmP1Cxy0HH/HLM0uBUPkEuSVEfKGDA89M0FsZRZJRSwe/tJjRx+fpH/gjorfhB8tmEbSFLA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-x64-musl": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.7.tgz",
- "integrity": "sha512-pAsE8iiDxUg1xBqdhrTfg45AVDVpirjz00sblEYClGNNcMnDb+e8beQgqIAw6LvauX/APvgxUnwrgun/YYGBhw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-openharmony-arm64": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.7.tgz",
- "integrity": "sha512-lTcIYmmnQQA8Or/2DatS6oSqcdLHvendjS+zLu+FwgToynWMRSmQdpM65fTANJgIS4mjbMOo5KT2lnT9SAb96w==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openharmony"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-win32-arm64-msvc": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.7.tgz",
- "integrity": "sha512-e3Gu3WxbNk/UqQhxqU7YIYO+9ZBvWNz3U+h/qRFosscMFzdRPbXYSaSWgSnklv2fz1TgzBTcti2z35c/7irsHw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-win32-x64-msvc": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.7.tgz",
- "integrity": "sha512-W/jg5qoRSqjsEv0+dZi4e687mcHqmVuU0P4fK6qS/xjetW2Gmc1W8j//z5nAeNcC8Ttm0hV46IjcYeuVwYhuiw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/pluginutils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
- "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "peer": true
- },
- "node_modules/@rollup/plugin-yaml": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-yaml/-/plugin-yaml-5.0.0.tgz",
- "integrity": "sha512-9XOiRGYJjDwmEwR15kuxw+RytZFKtEWshoXuITrtS6+57BVMQMzDfhmSO/xfQOAY5psQv1IrxhQTUqPNppe4lQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@rollup/pluginutils": "^5.3.0",
- "js-yaml": "^4.1.0",
- "tosource": "^2.0.0-alpha.3"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "rollup": "^2.78.0||^3.0.0||^4.0.0"
- },
- "peerDependenciesMeta": {
- "rollup": {
- "optional": true
- }
- }
- },
- "node_modules/@rollup/pluginutils": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz",
- "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/estree": "^1.0.0",
- "estree-walker": "^2.0.2",
- "picomatch": "^4.0.2"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
- },
- "peerDependenciesMeta": {
- "rollup": {
- "optional": true
- }
- }
- },
- "node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.1.tgz",
- "integrity": "sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-android-arm64": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.1.tgz",
- "integrity": "sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.1.tgz",
- "integrity": "sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.1.tgz",
- "integrity": "sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.1.tgz",
- "integrity": "sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
- },
- "node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.1.tgz",
- "integrity": "sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.1.tgz",
- "integrity": "sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.1.tgz",
- "integrity": "sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.1.tgz",
- "integrity": "sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.1.tgz",
- "integrity": "sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-loong64-gnu": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.1.tgz",
- "integrity": "sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-loong64-musl": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.1.tgz",
- "integrity": "sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-ppc64-gnu": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.1.tgz",
- "integrity": "sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-ppc64-musl": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.1.tgz",
- "integrity": "sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.1.tgz",
- "integrity": "sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-musl": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.1.tgz",
- "integrity": "sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.1.tgz",
- "integrity": "sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.1.tgz",
- "integrity": "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.1.tgz",
- "integrity": "sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-openbsd-x64": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.1.tgz",
- "integrity": "sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ]
- },
- "node_modules/@rollup/rollup-openharmony-arm64": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.1.tgz",
- "integrity": "sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openharmony"
- ]
- },
- "node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.1.tgz",
- "integrity": "sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.1.tgz",
- "integrity": "sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-x64-gnu": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.1.tgz",
- "integrity": "sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.1.tgz",
- "integrity": "sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@shadowdara/dlib": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/@shadowdara/dlib/-/dlib-0.0.4.tgz",
- "integrity": "sha512-eYvqbE0uhTCufVd5NjhYQEIZwJg2qu1DyHu9gVMJQUei0UZyYxe5F+hZYO7Hdr+yD2sm3dWvzZ+fBzVDeySnFg==",
- "license": "MIT"
- },
- "node_modules/@shadowdara/finder-lib": {
- "version": "0.3.17",
- "resolved": "https://registry.npmjs.org/@shadowdara/finder-lib/-/finder-lib-0.3.17.tgz",
- "integrity": "sha512-8aOCR273G8vBtp/migYdQHAgD9Uu2ymtX49wfAPA3rfFs+2PooujmvMrRss1O+uJvce3ti0NY13if2UHqv080g==",
- "license": "Apache-2.0"
- },
- "node_modules/@standard-schema/spec": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
- "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@tailwindcss/node": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz",
- "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/remapping": "^2.3.5",
- "enhanced-resolve": "^5.24.1",
- "jiti": "^2.7.0",
- "lightningcss": "1.32.0",
- "magic-string": "^0.30.21",
- "source-map-js": "^1.2.1",
- "tailwindcss": "4.3.3"
- }
- },
- "node_modules/@tailwindcss/node/node_modules/lightningcss": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
- "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "detect-libc": "^2.0.3"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- },
- "optionalDependencies": {
- "lightningcss-android-arm64": "1.32.0",
- "lightningcss-darwin-arm64": "1.32.0",
- "lightningcss-darwin-x64": "1.32.0",
- "lightningcss-freebsd-x64": "1.32.0",
- "lightningcss-linux-arm-gnueabihf": "1.32.0",
- "lightningcss-linux-arm64-gnu": "1.32.0",
- "lightningcss-linux-arm64-musl": "1.32.0",
- "lightningcss-linux-x64-gnu": "1.32.0",
- "lightningcss-linux-x64-musl": "1.32.0",
- "lightningcss-win32-arm64-msvc": "1.32.0",
- "lightningcss-win32-x64-msvc": "1.32.0"
- }
- },
- "node_modules/@tailwindcss/node/node_modules/lightningcss-android-arm64": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
- "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@tailwindcss/node/node_modules/lightningcss-darwin-arm64": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
- "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@tailwindcss/node/node_modules/lightningcss-darwin-x64": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
- "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@tailwindcss/node/node_modules/lightningcss-freebsd-x64": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
- "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm-gnueabihf": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
- "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm64-gnu": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
- "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm64-musl": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
- "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-x64-gnu": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
- "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-x64-musl": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
- "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@tailwindcss/node/node_modules/lightningcss-win32-arm64-msvc": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
- "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@tailwindcss/node/node_modules/lightningcss-win32-x64-msvc": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
- "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/@tailwindcss/oxide": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz",
- "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 20"
- },
- "optionalDependencies": {
- "@tailwindcss/oxide-android-arm64": "4.3.3",
- "@tailwindcss/oxide-darwin-arm64": "4.3.3",
- "@tailwindcss/oxide-darwin-x64": "4.3.3",
- "@tailwindcss/oxide-freebsd-x64": "4.3.3",
- "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3",
- "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3",
- "@tailwindcss/oxide-linux-arm64-musl": "4.3.3",
- "@tailwindcss/oxide-linux-x64-gnu": "4.3.3",
- "@tailwindcss/oxide-linux-x64-musl": "4.3.3",
- "@tailwindcss/oxide-wasm32-wasi": "4.3.3",
- "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3",
- "@tailwindcss/oxide-win32-x64-msvc": "4.3.3"
- }
- },
- "node_modules/@tailwindcss/oxide-android-arm64": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz",
- "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-darwin-arm64": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz",
- "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-darwin-x64": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz",
- "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-freebsd-x64": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz",
- "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz",
- "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz",
- "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz",
- "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz",
- "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-x64-musl": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz",
- "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz",
- "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==",
- "bundleDependencies": [
- "@napi-rs/wasm-runtime",
- "@emnapi/core",
- "@emnapi/runtime",
- "@tybys/wasm-util",
- "@emnapi/wasi-threads",
- "tslib"
- ],
- "cpu": [
- "wasm32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@emnapi/core": "^1.11.1",
- "@emnapi/runtime": "^1.11.1",
- "@emnapi/wasi-threads": "^1.2.2",
- "@napi-rs/wasm-runtime": "^1.1.4",
- "@tybys/wasm-util": "^0.10.2",
- "tslib": "^2.8.1"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz",
- "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz",
- "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/vite": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz",
- "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@tailwindcss/node": "4.3.3",
- "@tailwindcss/oxide": "4.3.3",
- "tailwindcss": "4.3.3"
- },
- "peerDependencies": {
- "vite": "^5.2.0 || ^6 || ^7 || ^8"
- }
- },
- "node_modules/@types/eslint": {
- "version": "8.56.12",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz",
- "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/estree": "*",
- "@types/json-schema": "*"
- }
- },
- "node_modules/@types/esrecurse": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz",
- "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/estree": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
- "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/html-minifier-terser": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-7.0.2.tgz",
- "integrity": "sha512-mm2HqV22l8lFQh4r2oSsOEVea+m0qqxEmwpc9kC1p/XzmjLWrReR9D/GRs8Pex2NX/imyEH9c5IU/7tMBQCHOA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/jquery": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-4.0.1.tgz",
- "integrity": "sha512-9a59A/tycXgYuPABcp6/3spSShn0NT2UOM4EfHvMumjYi4lJWTsK5SZWjhx3yRm9IHGCeWXdV2YfNsrWrft/CA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/json-schema": {
- "version": "7.0.15",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
- "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/license-checker": {
- "version": "25.0.6",
- "resolved": "https://registry.npmjs.org/@types/license-checker/-/license-checker-25.0.6.tgz",
- "integrity": "sha512-ju/75+YPkNE5vX1iPer+qtI1eI/LqJVYZgOsmSHI1iiEM1bQL5Gh1lEvyjR9T7ZXVE1FwJa2doWJEEmPNwbZkw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/node": {
- "version": "26.5.0",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-26.5.0.tgz",
- "integrity": "sha512-dVSGpriSoCgz8WnDNTuSSuSv1PC/ALXihO4ulRZt7Md8k9mlbdin3lGOcDE8SnWOgf513ByWlXd7BK4azmyg/A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "undici-types": "~8.9.0"
- }
- },
- "node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.69.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.69.0.tgz",
- "integrity": "sha512-t5jQTKPIgVW1PE6dR6H6Qz5gm8zjMlX5/2gRaOGd9eO6V7J+tQc6iWKukEe7dY8u9HyYasQ0yfF0/FSSTEO2gA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/regexpp": "^4.12.2",
- "@typescript-eslint/scope-manager": "8.69.0",
- "@typescript-eslint/type-utils": "8.69.0",
- "@typescript-eslint/utils": "8.69.0",
- "@typescript-eslint/visitor-keys": "8.69.0",
- "ignore": "^7.0.5",
- "natural-compare": "^1.4.0",
- "ts-api-utils": "^2.5.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "@typescript-eslint/parser": "^8.69.0",
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
- "version": "7.0.8",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.8.tgz",
- "integrity": "sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/@typescript-eslint/parser": {
- "version": "8.69.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.69.0.tgz",
- "integrity": "sha512-l4b0DhWioGg6Gt2ebGlvfkFMOjRsauxtsnDRwUSRX1qHq3HdTfQHV8wW9zEXeciai6HfeaKOedQn2Zoofx3WBw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/scope-manager": "8.69.0",
- "@typescript-eslint/types": "8.69.0",
- "@typescript-eslint/typescript-estree": "8.69.0",
- "@typescript-eslint/visitor-keys": "8.69.0",
- "debug": "^4.4.3"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/project-service": {
- "version": "8.69.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.69.0.tgz",
- "integrity": "sha512-yi4obFrHMmnsesWehHbkg9zMA7Jt8cXT+mKM08G999pH1yT6nqgsHx7MYm0uY1wAj8CqiBXYRJ7WAT0QdQHQXg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.69.0",
- "@typescript-eslint/types": "^8.69.0",
- "debug": "^4.4.3"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/scope-manager": {
- "version": "8.69.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.69.0.tgz",
- "integrity": "sha512-ewfspqWvSxKSOaplqAUNbaSFO0eB6w1EtQ+esfYFRm3614Ty4uNtExkcbgd6nWsXphbqKyf9ZYdbZdv2xEoWEQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.69.0",
- "@typescript-eslint/visitor-keys": "8.69.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.69.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.69.0.tgz",
- "integrity": "sha512-xNqK7YTDZsLniQMV/4rpFR8Z5JlqeRvVjuG1YgF/mdPVH84HSD19L8CczMA0qg2RfwEV231GHH3VnToJDo4MfQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/type-utils": {
- "version": "8.69.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.69.0.tgz",
- "integrity": "sha512-ZfoJAVg3JZndQEpEl9petVlxau3lRuElc4HRMuAlLCf8to04/iHz692RUSNmXKDjEuJmIL+KZ2/BsOcBc16dsA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.69.0",
- "@typescript-eslint/typescript-estree": "8.69.0",
- "@typescript-eslint/utils": "8.69.0",
- "debug": "^4.4.3",
- "ts-api-utils": "^2.5.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/types": {
- "version": "8.69.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.69.0.tgz",
- "integrity": "sha512-K3VrubUPhlo9VDBS6QdI8YB5j7ClpqLRdefcz6PFrhnwicehBweqQ9Evhl4l+FYz0HdDmMqIiSX0aldGRYtDCA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.69.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.69.0.tgz",
- "integrity": "sha512-AdFkgqck3Vudb/kWnxlyafU/4aBhHrbQ9locP2N4psXTy5mOBg0SHJumnLvx7r6g1gV4DKvUFwV2nJZBoqOD8w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/project-service": "8.69.0",
- "@typescript-eslint/tsconfig-utils": "8.69.0",
- "@typescript-eslint/types": "8.69.0",
- "@typescript-eslint/visitor-keys": "8.69.0",
- "debug": "^4.4.3",
- "minimatch": "^10.2.2",
- "semver": "^7.7.3",
- "tinyglobby": "^0.2.15",
- "ts-api-utils": "^2.5.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/utils": {
- "version": "8.69.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.69.0.tgz",
- "integrity": "sha512-tUbx60BBqQa31kXF5MCsOOLL5E/WzUuxIn7YpAvq+eaUlqvk8/NXnXMBNAdLCr0icjkzem7iUA5QqWHe/hJ1aw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.9.1",
- "@typescript-eslint/scope-manager": "8.69.0",
- "@typescript-eslint/types": "8.69.0",
- "@typescript-eslint/typescript-estree": "8.69.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.69.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.69.0.tgz",
- "integrity": "sha512-+rmdgPA+EXkNgKYvHvFfhrs35utXbwaC5PGpDquSXcoXQDKUA5UjV0LmTucG/4JXkM31BTu4TilHtrN8IVBe8w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.69.0",
- "eslint-visitor-keys": "^5.0.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@vitejs/devtools": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/@vitejs/devtools/-/devtools-0.7.2.tgz",
- "integrity": "sha512-tyfRglEzpg/eMX3GaLu5htz2PkoKqnULHJDzmVhK9uzIIRAg2DMZjc2e1Jg9YyMhW4iPz0zXc8tv9XYevvKOhg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@devframes/hub": "^0.9.12",
- "@devframes/hub-ui": "^0.9.12",
- "@devframes/json-render-ui": "^0.9.12",
- "@devframes/plugin-inspect": "^0.9.12",
- "@devframes/plugin-messages": "^0.9.12",
- "@devframes/plugin-terminals": "^0.9.12",
- "@vitejs/devtools-kit": "0.7.2",
- "cac": "^7.0.0",
- "devframe": "^0.9.12",
- "h3": "^2.0.1-rc.29",
- "local-pkg": "^1.2.1",
- "nostics": "^1.2.0",
- "obug": "^2.1.4",
- "pathe": "^2.0.3"
- },
- "bin": {
- "vite-devtools": "bin.js"
- },
- "peerDependencies": {
- "@vitejs/devtools-oxc": "^0.7.2",
- "@vitejs/devtools-rolldown": "^0.7.2",
- "@vitejs/devtools-vite": "^0.7.2",
- "@vitejs/devtools-vitest": "^0.7.2",
- "vite": "*"
- },
- "peerDependenciesMeta": {
- "@vitejs/devtools-oxc": {
- "optional": true
- },
- "@vitejs/devtools-rolldown": {
- "optional": true
- },
- "@vitejs/devtools-vite": {
- "optional": true
- },
- "@vitejs/devtools-vitest": {
- "optional": true
- }
- }
- },
- "node_modules/@vitejs/devtools-kit": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/@vitejs/devtools-kit/-/devtools-kit-0.7.2.tgz",
- "integrity": "sha512-MAdPSQjjBmXou+3P27rnRXYbkrrSmifeidNZchZkHbOBa082Duv/Edbm/tA4Sh+dA9X/sEm5OWABCPBrb1emoA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@devframes/hub": "^0.9.12",
- "@devframes/json-render": "^0.9.12",
- "devframe": "^0.9.12",
- "local-pkg": "^1.2.1",
- "mlly": "^1.8.2",
- "nostics": "^1.2.0",
- "nypm": "^0.6.9"
- },
- "peerDependencies": {
- "vite": "*"
- }
- },
- "node_modules/@vitejs/devtools/node_modules/@devframes/plugin-inspect": {
- "version": "0.9.12",
- "resolved": "https://registry.npmjs.org/@devframes/plugin-inspect/-/plugin-inspect-0.9.12.tgz",
- "integrity": "sha512-kdbqVVFycEpSLAR7dJQhLnQoZ4yTo1nrlXbctJwkZVkAMuwAf18PBnjUTO2WoXwjIFQIq0g5XQq6uFeN+Uya2A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cac": "^7.0.0"
- },
- "bin": {
- "devframe-inspect": "bin.mjs"
- },
- "peerDependencies": {
- "@devframes/plugin-inspect--assets": "0.9.12",
- "devframe": "0.9.12",
- "vite": "^7.0.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "@devframes/plugin-inspect--assets": {
- "optional": true
- },
- "vite": {
- "optional": true
- }
- }
- },
- "node_modules/@vitejs/devtools/node_modules/@devframes/plugin-messages": {
- "version": "0.9.12",
- "resolved": "https://registry.npmjs.org/@devframes/plugin-messages/-/plugin-messages-0.9.12.tgz",
- "integrity": "sha512-IStDziP+qSP8YG+gIIUfdoF8I7xJp2X653WCNPmJ170JgiFVksgWPY4ZND9yNlVSgCaqeFng/4rY9Y0DDMsQwQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@devframes/service-open": "0.9.12",
- "cac": "^7.0.0"
- },
- "bin": {
- "devframe-messages": "bin.mjs"
- },
- "peerDependencies": {
- "@devframes/hub": "0.9.12",
- "@devframes/plugin-messages--assets": "0.9.12",
- "devframe": "0.9.12",
- "vite": "^7.0.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "@devframes/plugin-messages--assets": {
- "optional": true
- },
- "vite": {
- "optional": true
- }
- }
- },
- "node_modules/@vitejs/devtools/node_modules/@devframes/plugin-terminals": {
- "version": "0.9.12",
- "resolved": "https://registry.npmjs.org/@devframes/plugin-terminals/-/plugin-terminals-0.9.12.tgz",
- "integrity": "sha512-UuaJ1U0Hwq4Tlry7F/KRizNhS+XFNcP/I5DFRxXK8pKrt53wUfFJ5Kc5mi+tZrbCDeeu9u/mTQEZWbQfs+W5Ow==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@devframes/vite": "0.9.12",
- "cac": "^7.0.0",
- "zigpty": "^0.2.1"
- },
- "bin": {
- "devframe-terminals": "bin.mjs"
- },
- "peerDependencies": {
- "@devframes/plugin-terminals--assets": "0.9.12",
- "devframe": "0.9.12",
- "vite": "^8.0.0"
- },
- "peerDependenciesMeta": {
- "@devframes/plugin-terminals--assets": {
- "optional": true
- },
- "vite": {
- "optional": true
- }
- }
- },
- "node_modules/@vitejs/devtools/node_modules/@devframes/plugin-terminals/node_modules/@devframes/vite": {
- "version": "0.9.12",
- "resolved": "https://registry.npmjs.org/@devframes/vite/-/vite-0.9.12.tgz",
- "integrity": "sha512-qciobX39NyIw58r9G250k/7F8rQAKC7zyqgok+beBPTELQkSO401LwSyTjRwzRV/5hagRb1dlElTWlplh0DKgg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "pathe": "^2.0.3"
- },
- "peerDependencies": {
- "@devframes/hub": "0.9.12",
- "@devframes/hub-ui": "0.9.12",
- "devframe": "0.9.12",
- "vite": "^7.0.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "@devframes/hub": {
- "optional": true
- },
- "@devframes/hub-ui": {
- "optional": true
- },
- "vite": {
- "optional": true
- }
- }
- },
- "node_modules/abbrev": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/acorn": {
- "version": "8.18.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz",
- "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/ajv": {
- "version": "6.15.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
- "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ansi-regex": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz",
- "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
- }
- },
- "node_modules/ansi-styles": {
- "version": "6.2.3",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
- "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true,
- "license": "Python-2.0"
- },
- "node_modules/array-find-index": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
- "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/asap": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/balanced-match": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
- "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "18 || 20 || >=22"
- }
- },
- "node_modules/baseline-browser-mapping": {
- "version": "2.11.21",
- "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.21.tgz",
- "integrity": "sha512-uh8vpY/1/YyFkunIDFH/12p7/7VdPKA1hejMVEbdkEaWnUz0Hesvx5EbiU6XxjyHZIOju+ZMbQJkRh+es3/spQ==",
- "dev": true,
- "license": "Apache-2.0",
- "bin": {
- "baseline-browser-mapping": "dist/cli.cjs"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/birpc": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/birpc/-/birpc-4.2.0.tgz",
- "integrity": "sha512-KxgKcZPfrtzJDDALHPguGpGJUrzdgpymyiQQgzFjWreHMOpWrnFNVREr5J48x2DBh8ZVioscrV1SBkDipGiX+Q==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/brace-expansion": {
- "version": "5.0.9",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz",
- "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^4.0.2"
- },
- "engines": {
- "node": "20 || >=22"
- }
- },
- "node_modules/browserslist": {
- "version": "4.28.9",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.9.tgz",
- "integrity": "sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "baseline-browser-mapping": "^2.11.20",
- "caniuse-lite": "^1.0.30001810",
- "electron-to-chromium": "^1.5.420",
- "node-releases": "^2.0.54",
- "update-browserslist-db": "^1.3.2"
- },
- "bin": {
- "browserslist": "cli.js"
- },
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- }
- },
- "node_modules/buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/bundle-name": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
- "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "run-applescript": "^7.0.0"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/cac": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/cac/-/cac-7.0.0.tgz",
- "integrity": "sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=20.19.0"
- }
- },
- "node_modules/camel-case": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
- "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "pascal-case": "^3.1.2",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001810",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz",
- "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "CC-BY-4.0"
- },
- "node_modules/chalk": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-6.0.0.tgz",
- "integrity": "sha512-2uNTXIuTTxk7ciZgAU1BQcgnchcG0xXnrs6jzkQfj9SsRa9M2s5zE8WT96hS6KmG4MzWHSrvH43DF1m4XRkrFg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=22"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/chokidar": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
- "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "readdirp": "^5.0.0"
- },
- "engines": {
- "node": ">= 20.19.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/citty": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.2.tgz",
- "integrity": "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/clean-css": {
- "version": "5.3.3",
- "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
- "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "source-map": "~0.6.0"
- },
- "engines": {
- "node": ">= 10.0"
- }
- },
- "node_modules/cliui": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz",
- "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "string-width": "^7.2.0",
- "strip-ansi": "^7.1.0",
- "wrap-ansi": "^9.0.0"
- },
- "engines": {
- "node": ">=20"
- }
- },
- "node_modules/cliui/node_modules/string-width": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
- "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "emoji-regex": "^10.3.0",
- "get-east-asian-width": "^1.0.0",
- "strip-ansi": "^7.1.0"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/commander": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
- "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/confbox": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.3.1.tgz",
- "integrity": "sha512-cKUSoKa8YxFZZSmraVi7onONx3amu77ngK3kGpsYHDH7drPwCRkQE1RYMPlLRrMtnciRj274XNRxcHxnKmDSnA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/convert-source-map": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/cross-spawn": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
- "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/crossws": {
- "version": "0.4.12",
- "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.4.12.tgz",
- "integrity": "sha512-aypfsr6t0uNvkqaZc6zvBfXzC6pLI0/sIulpkV6RwCVtZqG5ebBzv4weImKK0VNCj91Wl9F5j7p5WU4MNrybng==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "srvx": ">=0.11.5"
- },
- "peerDependenciesMeta": {
- "srvx": {
- "optional": true
- }
- }
- },
- "node_modules/debug": {
- "version": "4.4.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
- "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/debuglog": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz",
- "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==",
- "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/default-browser": {
- "version": "5.5.1",
- "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.1.tgz",
- "integrity": "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "bundle-name": "^4.1.0",
- "default-browser-id": "^5.0.0"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/default-browser-id": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz",
- "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/define-lazy-prop": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
- "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/destr": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz",
- "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/detect-libc": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
- "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/devframe": {
- "version": "0.9.12",
- "resolved": "https://registry.npmjs.org/devframe/-/devframe-0.9.12.tgz",
- "integrity": "sha512-WXwohwmTPVesEQYDAIh41rZYry6BRsufEyr8f5EAPXKi3SYchAYVJJV5qjBv4jRtouyRh7Z96zfZiSE0YEfQaA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@modelcontextprotocol/server": "^2.0.0",
- "@standard-schema/spec": "^1.1.0",
- "birpc": "^4.2.0",
- "crossws": "^0.4.12",
- "h3": "^2.0.1-rc.29",
- "mrmime": "^2.0.1",
- "nostics": "^1.2.0",
- "pathe": "^2.0.3",
- "ufo": "^1.6.4"
- },
- "bin": {
- "devframe": "bin/devframe.mjs"
- },
- "peerDependencies": {
- "@modelcontextprotocol/client": "^2.0.0",
- "cac": "^7.0.0"
- },
- "peerDependenciesMeta": {
- "@modelcontextprotocol/client": {
- "optional": true
- },
- "cac": {
- "optional": true
- }
- }
- },
- "node_modules/dezalgo": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz",
- "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "asap": "^2.0.0",
- "wrappy": "1"
- }
- },
- "node_modules/dot-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
- "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/electron-to-chromium": {
- "version": "1.5.422",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.422.tgz",
- "integrity": "sha512-UvA/32XqrLDdZSn7Jllo1AYNcWji/G0d5M0GTViE7KoGBiMunw3a34Sb2KO4ZZyrSEhqsxFoVhWWJshdyfKqJA==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/emoji-regex": {
- "version": "10.6.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
- "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/enhanced-resolve": {
- "version": "5.24.5",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz",
- "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "graceful-fs": "^4.2.4",
- "tapable": "^2.3.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/entities": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
- "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=0.12"
- },
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
- "node_modules/es-errors": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/esbuild": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz",
- "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=18"
- },
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.28.2",
- "@esbuild/android-arm": "0.28.2",
- "@esbuild/android-arm64": "0.28.2",
- "@esbuild/android-x64": "0.28.2",
- "@esbuild/darwin-arm64": "0.28.2",
- "@esbuild/darwin-x64": "0.28.2",
- "@esbuild/freebsd-arm64": "0.28.2",
- "@esbuild/freebsd-x64": "0.28.2",
- "@esbuild/linux-arm": "0.28.2",
- "@esbuild/linux-arm64": "0.28.2",
- "@esbuild/linux-ia32": "0.28.2",
- "@esbuild/linux-loong64": "0.28.2",
- "@esbuild/linux-mips64el": "0.28.2",
- "@esbuild/linux-ppc64": "0.28.2",
- "@esbuild/linux-riscv64": "0.28.2",
- "@esbuild/linux-s390x": "0.28.2",
- "@esbuild/linux-x64": "0.28.2",
- "@esbuild/netbsd-arm64": "0.28.2",
- "@esbuild/netbsd-x64": "0.28.2",
- "@esbuild/openbsd-arm64": "0.28.2",
- "@esbuild/openbsd-x64": "0.28.2",
- "@esbuild/openharmony-arm64": "0.28.2",
- "@esbuild/sunos-x64": "0.28.2",
- "@esbuild/win32-arm64": "0.28.2",
- "@esbuild/win32-ia32": "0.28.2",
- "@esbuild/win32-x64": "0.28.2"
- }
- },
- "node_modules/escalade": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
- "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint": {
- "version": "10.9.1",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.9.1.tgz",
- "integrity": "sha512-9VaAkDURekixUQJy0oJYl2DcN6oKMfxay7XzaGYAWQwsb6qfKf+x76R2k1L8kb1boc+FyCAaTA9GmiKaaiaF+A==",
- "dev": true,
- "license": "MIT",
- "workspaces": [
- "packages/*"
- ],
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.8.0",
- "@eslint-community/regexpp": "^4.12.2",
- "@eslint/config-array": "^0.23.5",
- "@eslint/config-helpers": "^0.7.0",
- "@eslint/core": "^1.2.1",
- "@eslint/plugin-kit": "^0.7.2",
- "@humanfs/node": "^0.16.6",
- "@humanwhocodes/module-importer": "^1.0.1",
- "@humanwhocodes/retry": "^0.4.2",
- "@types/estree": "^1.0.6",
- "ajv": "^6.14.0",
- "cross-spawn": "^7.0.6",
- "debug": "^4.3.2",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^9.1.2",
- "eslint-visitor-keys": "^5.0.1",
- "espree": "^11.2.0",
- "esquery": "^1.7.0",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^8.0.0",
- "find-up": "^5.0.0",
- "glob-parent": "^6.0.2",
- "ignore": "^5.2.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "minimatch": "^10.2.5",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.3"
- },
- "bin": {
- "eslint": "bin/eslint.js"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- },
- "funding": {
- "url": "https://eslint.org/donate"
- },
- "peerDependencies": {
- "jiti": "*"
- },
- "peerDependenciesMeta": {
- "jiti": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-scope": {
- "version": "9.1.2",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz",
- "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "@types/esrecurse": "^4.3.1",
- "@types/estree": "^1.0.8",
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-visitor-keys": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
- "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/espree": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz",
- "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "acorn": "^8.16.0",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^5.0.1"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/esquery": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
- "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "estraverse": "^5.1.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estree-walker": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
- "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/exsolve": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.1.tgz",
- "integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fdir": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
- "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "picomatch": "^3 || ^4"
- },
- "peerDependenciesMeta": {
- "picomatch": {
- "optional": true
- }
- }
- },
- "node_modules/file-entry-cache": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
- "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "flat-cache": "^4.0.0"
- },
- "engines": {
- "node": ">=16.0.0"
- }
- },
- "node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/flat-cache": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
- "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "flatted": "^3.2.9",
- "keyv": "^4.5.4"
- },
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/flatted": {
- "version": "3.4.4",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz",
- "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "6.* || 8.* || >= 10.*"
- }
- },
- "node_modules/get-east-asian-width": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz",
- "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/glob/node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/glob/node_modules/brace-expansion": {
- "version": "1.1.18",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz",
- "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/glob/node_modules/minimatch": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
- "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/graceful-fs": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/h3": {
- "version": "2.0.1-rc.31",
- "resolved": "https://registry.npmjs.org/h3/-/h3-2.0.1-rc.31.tgz",
- "integrity": "sha512-AG7qZzF99a0BSYoXT3evJgIhwSIUKow7R+hwkLRZS06WJ9nbSb7QXUDgs1ByBjp6svTvl++N/GKA7I9YPz9cQQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "rou3": "^0.9.2",
- "srvx": "^1.0.2"
- },
- "bin": {
- "h3": "bin/h3.mjs"
- },
- "engines": {
- "node": ">=20.11.1"
- },
- "peerDependencies": {
- "crossws": "^0.4.12",
- "ocache": ">=0.3.0"
- },
- "peerDependenciesMeta": {
- "crossws": {
- "optional": true
- },
- "ocache": {
- "optional": true
- }
- }
- },
- "node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/hasown": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
- "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/highlight.js": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.12.0.tgz",
- "integrity": "sha512-nbfWpyRMcMrPMmDwJB+dhX/eiaPKtc2RB+0QZskqJ3WjRA/FDS0e9hZrx8EC/lbEv8gXy98FcDbNa/dspAaJMg==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/hosted-git-info": {
- "version": "2.8.9",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
- "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/html-minifier-terser": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz",
- "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "camel-case": "^4.1.2",
- "clean-css": "~5.3.2",
- "commander": "^10.0.0",
- "entities": "^4.4.0",
- "param-case": "^3.0.4",
- "relateurl": "^0.2.7",
- "terser": "^5.15.1"
- },
- "bin": {
- "html-minifier-terser": "cli.js"
- },
- "engines": {
- "node": "^14.13.1 || >=16.0.0"
- }
- },
- "node_modules/ignore": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
- "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/immutable": {
- "version": "5.1.9",
- "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz",
- "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/is-core-module": {
- "version": "2.16.2",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz",
- "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "hasown": "^2.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-docker": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
- "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "is-docker": "cli.js"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-in-ssh": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz",
- "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=20"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-inside-container": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
- "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-docker": "^3.0.0"
- },
- "bin": {
- "is-inside-container": "cli.js"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-wsl": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz",
- "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-inside-container": "^1.0.0"
- },
- "engines": {
- "node": ">=16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/jiti": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz",
- "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "jiti": "lib/jiti-cli.mjs"
- }
- },
- "node_modules/jquery": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jquery/-/jquery-4.0.0.tgz",
- "integrity": "sha512-TXCHVR3Lb6TZdtw1l3RTLf8RBWVGexdxL6AC8/e0xZKEpBflBsjh9/8LXw+dkNFuOyW9B7iB3O1sP7hS0Kiacg==",
- "license": "MIT"
- },
- "node_modules/js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/js-yaml": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz",
- "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/puzrin"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/nodeca"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/jsesc": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
- "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "jsesc": "bin/jsesc"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "json5": "lib/cli.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/keyv": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
- "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "json-buffer": "3.0.1"
- }
- },
- "node_modules/levn": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/license-checker": {
- "version": "25.0.1",
- "resolved": "https://registry.npmjs.org/license-checker/-/license-checker-25.0.1.tgz",
- "integrity": "sha512-mET5AIwl7MR2IAKYYoVBBpV0OnkKQ1xGj2IMMeEFIs42QAkEVjRtFZGWmQ28WeU7MP779iAgOaOy93Mn44mn6g==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "chalk": "^2.4.1",
- "debug": "^3.1.0",
- "mkdirp": "^0.5.1",
- "nopt": "^4.0.1",
- "read-installed": "~4.0.3",
- "semver": "^5.5.0",
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0",
- "spdx-satisfies": "^4.0.0",
- "treeify": "^1.1.0"
- },
- "bin": {
- "license-checker": "bin/license-checker"
- }
- },
- "node_modules/license-checker/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/license-checker/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/license-checker/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/license-checker/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/license-checker/node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/license-checker/node_modules/spdx-satisfies": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/spdx-satisfies/-/spdx-satisfies-4.0.1.tgz",
- "integrity": "sha512-WVzZ/cXAzoNmjCWiEluEA3BjHp5tiUmmhn9MK+X0tBbR9sOqtC6UQwmgCNrAIZvNlMuBUYAaHYfb2oqlF9SwKA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "spdx-compare": "^1.0.0",
- "spdx-expression-parse": "^3.0.0",
- "spdx-ranges": "^2.0.0"
- }
- },
- "node_modules/lightningcss": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz",
- "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==",
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "peer": true,
- "dependencies": {
- "detect-libc": "^2.0.3"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- },
- "optionalDependencies": {
- "lightningcss-android-arm64": "1.33.0",
- "lightningcss-darwin-arm64": "1.33.0",
- "lightningcss-darwin-x64": "1.33.0",
- "lightningcss-freebsd-x64": "1.33.0",
- "lightningcss-linux-arm-gnueabihf": "1.33.0",
- "lightningcss-linux-arm64-gnu": "1.33.0",
- "lightningcss-linux-arm64-musl": "1.33.0",
- "lightningcss-linux-x64-gnu": "1.33.0",
- "lightningcss-linux-x64-musl": "1.33.0",
- "lightningcss-win32-arm64-msvc": "1.33.0",
- "lightningcss-win32-x64-msvc": "1.33.0"
- }
- },
- "node_modules/lightningcss-android-arm64": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz",
- "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "android"
- ],
- "peer": true,
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-darwin-arm64": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz",
- "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "darwin"
- ],
- "peer": true,
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-darwin-x64": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz",
- "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "darwin"
- ],
- "peer": true,
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-freebsd-x64": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz",
- "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "peer": true,
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-arm-gnueabihf": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz",
- "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "peer": true,
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-arm64-gnu": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz",
- "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "peer": true,
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-arm64-musl": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz",
- "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "peer": true,
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-x64-gnu": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz",
- "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "peer": true,
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-x64-musl": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz",
- "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "peer": true,
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-win32-arm64-msvc": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz",
- "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "win32"
- ],
- "peer": true,
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-win32-x64-msvc": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz",
- "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "win32"
- ],
- "peer": true,
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/local-pkg": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.2.1.tgz",
- "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mlly": "^1.7.4",
- "pkg-types": "^2.3.0",
- "quansync": "^0.2.11"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/lower-case": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
- "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.0.3"
- }
- },
- "node_modules/lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "yallist": "^3.0.2"
- }
- },
- "node_modules/magic-string": {
- "version": "0.30.21",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
- "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.5"
- }
- },
- "node_modules/minimatch": {
- "version": "10.2.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
- "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "brace-expansion": "^5.0.8"
- },
- "engines": {
- "node": "18 || 20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/minimist": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
- "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/mkdirp": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "minimist": "^1.2.6"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
- }
- },
- "node_modules/mlly": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz",
- "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "acorn": "^8.16.0",
- "pathe": "^2.0.3",
- "pkg-types": "^1.3.1",
- "ufo": "^1.6.3"
- }
- },
- "node_modules/mlly/node_modules/confbox": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
- "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/mlly/node_modules/pkg-types": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
- "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "confbox": "^0.1.8",
- "mlly": "^1.7.4",
- "pathe": "^2.0.1"
- }
- },
- "node_modules/mrmime": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
- "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/nanoid": {
- "version": "3.3.18",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz",
- "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/no-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
- "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "lower-case": "^2.0.2",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/node-addon-api": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
- "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/node-releases": {
- "version": "2.0.54",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz",
- "integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/nopt": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
- "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "abbrev": "1",
- "osenv": "^0.1.4"
- },
- "bin": {
- "nopt": "bin/nopt.js"
- }
- },
- "node_modules/normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- }
- },
- "node_modules/normalize-package-data/node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/nostics": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/nostics/-/nostics-1.2.0.tgz",
- "integrity": "sha512-FGqEfhQjrvo1lL8KFifdTQiNwwQHJxC1jtYE1Rc54qF/jxONUNL+kC9gS1krX8Q65PgrQ5fCqH/I4NhWBvdSqg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/npm-normalize-package-bin": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
- "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/nypm": {
- "version": "0.6.9",
- "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.9.tgz",
- "integrity": "sha512-zxlE2yvSWZWmHcNdT3+5zV2lrCogeE9YOklHrR3dFjqutq5wO7GFDYLFDRXLsYnJzwvy/im9fYoxePvS0VTW0w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "citty": "^0.2.2",
- "pathe": "^2.0.3",
- "tinyexec": "^1.2.4"
- },
- "bin": {
- "nypm": "dist/cli.mjs"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/obug": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz",
- "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==",
- "dev": true,
- "funding": [
- "https://github.com/sponsors/sxzz",
- "https://opencollective.com/debug"
- ],
- "license": "MIT",
- "engines": {
- "node": ">=12.20.0"
- }
- },
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/open": {
- "version": "11.0.2",
- "resolved": "https://registry.npmjs.org/open/-/open-11.0.2.tgz",
- "integrity": "sha512-RWqF+pBSkqecEvCKOn8QYhaNdRMJDZRIrlS/7rTDdLHaPcfXGCZ/h8zb413NfvdeAV0MR7T1yJcA34/q+CSm1Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "default-browser": "^5.5.1",
- "define-lazy-prop": "^3.0.0",
- "is-in-ssh": "^1.0.0",
- "is-inside-container": "^1.0.0",
- "powershell-utils": "^0.2.1",
- "wsl-utils": "^1.0.0"
- },
- "engines": {
- "node": ">=20"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/optionator": {
- "version": "0.9.4",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
- "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0",
- "word-wrap": "^1.2.5"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/os-homedir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/osenv": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
- "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
- "deprecated": "This package is no longer supported.",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.0"
- }
- },
- "node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-limit": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/param-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
- "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "dot-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/pascal-case": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
- "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/pathe": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
- "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/perfect-debounce": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz",
- "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/picocolors": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
- "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/picomatch": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz",
- "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pkg-types": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.3.tgz",
- "integrity": "sha512-j/lCFdcppV0JxWpCEITdbDltBxPP6cHT+yNJ6Go2OgoSA9518X847X9z0p6LtA4Nc16+eQzCZjRrWanTGvHJ5w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "confbox": "^0.3.1",
- "exsolve": "^1.1.1",
- "pathe": "^2.0.3"
- }
- },
- "node_modules/postcss": {
- "version": "8.5.26",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz",
- "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "nanoid": "^3.3.17",
- "picocolors": "^1.1.1",
- "source-map-js": "^1.2.1"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/powershell-utils": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.2.1.tgz",
- "integrity": "sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=20"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/prelude-ls": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/quansync": {
- "version": "0.2.11",
- "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz",
- "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/antfu"
- },
- {
- "type": "individual",
- "url": "https://github.com/sponsors/sxzz"
- }
- ],
- "license": "MIT"
- },
- "node_modules/read-installed": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/read-installed/-/read-installed-4.0.3.tgz",
- "integrity": "sha512-O03wg/IYuV/VtnK2h/KXEt9VIbMUFbk3ERG0Iu4FhLZw0EP0T9znqrYDGn6ncbEsXUFaUjiVAWXHzxwt3lhRPQ==",
- "deprecated": "This package is no longer supported.",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "debuglog": "^1.0.1",
- "read-package-json": "^2.0.0",
- "readdir-scoped-modules": "^1.0.0",
- "semver": "2 || 3 || 4 || 5",
- "slide": "~1.1.3",
- "util-extend": "^1.0.1"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.2"
- }
- },
- "node_modules/read-installed/node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/read-package-json": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz",
- "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==",
- "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "glob": "^7.1.1",
- "json-parse-even-better-errors": "^2.3.0",
- "normalize-package-data": "^2.0.0",
- "npm-normalize-package-bin": "^1.0.0"
- }
- },
- "node_modules/readdir-scoped-modules": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz",
- "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==",
- "deprecated": "This functionality has been moved to @npmcli/fs",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "debuglog": "^1.0.1",
- "dezalgo": "^1.0.0",
- "graceful-fs": "^4.1.2",
- "once": "^1.3.0"
- }
- },
- "node_modules/readdirp": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz",
- "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 20.19.0"
- },
- "funding": {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/relateurl": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
- "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/resolve": {
- "version": "1.22.12",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
- "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "is-core-module": "^2.16.1",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/rolldown": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.7.tgz",
- "integrity": "sha512-g0EtLvBjTUB7jhyV0S/TCup3v/XSVl45vUIGbOGU4QPiyjTenCe4mKuFvW9fEgYmS2Fo42AUssRmNuMziXdrig==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "peer": true,
- "dependencies": {
- "@oxc-project/types": "=0.148.0",
- "@rolldown/pluginutils": "^1.0.0"
- },
- "bin": {
- "rolldown": "bin/cli.mjs"
- },
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- },
- "optionalDependencies": {
- "@rolldown/binding-android-arm-eabi": "1.2.7",
- "@rolldown/binding-android-arm64": "1.2.7",
- "@rolldown/binding-darwin-arm64": "1.2.7",
- "@rolldown/binding-darwin-x64": "1.2.7",
- "@rolldown/binding-freebsd-x64": "1.2.7",
- "@rolldown/binding-linux-arm-gnueabihf": "1.2.7",
- "@rolldown/binding-linux-arm64-gnu": "1.2.7",
- "@rolldown/binding-linux-arm64-musl": "1.2.7",
- "@rolldown/binding-linux-ppc64-gnu": "1.2.7",
- "@rolldown/binding-linux-s390x-gnu": "1.2.7",
- "@rolldown/binding-linux-x64-gnu": "1.2.7",
- "@rolldown/binding-linux-x64-musl": "1.2.7",
- "@rolldown/binding-openharmony-arm64": "1.2.7",
- "@rolldown/binding-win32-arm64-msvc": "1.2.7",
- "@rolldown/binding-win32-x64-msvc": "1.2.7"
- }
- },
- "node_modules/rollup": {
- "version": "4.63.1",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.1.tgz",
- "integrity": "sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/estree": "1.0.9"
- },
- "bin": {
- "rollup": "dist/bin/rollup"
- },
- "engines": {
- "node": ">=18.0.0",
- "npm": ">=8.0.0"
- },
- "optionalDependencies": {
- "@napi-rs/lzma-linux-x64-gnu": "1.5.1",
- "@rollup/rollup-android-arm-eabi": "4.63.1",
- "@rollup/rollup-android-arm64": "4.63.1",
- "@rollup/rollup-darwin-arm64": "4.63.1",
- "@rollup/rollup-darwin-x64": "4.63.1",
- "@rollup/rollup-freebsd-arm64": "4.63.1",
- "@rollup/rollup-freebsd-x64": "4.63.1",
- "@rollup/rollup-linux-arm-gnueabihf": "4.63.1",
- "@rollup/rollup-linux-arm-musleabihf": "4.63.1",
- "@rollup/rollup-linux-arm64-gnu": "4.63.1",
- "@rollup/rollup-linux-arm64-musl": "4.63.1",
- "@rollup/rollup-linux-loong64-gnu": "4.63.1",
- "@rollup/rollup-linux-loong64-musl": "4.63.1",
- "@rollup/rollup-linux-ppc64-gnu": "4.63.1",
- "@rollup/rollup-linux-ppc64-musl": "4.63.1",
- "@rollup/rollup-linux-riscv64-gnu": "4.63.1",
- "@rollup/rollup-linux-riscv64-musl": "4.63.1",
- "@rollup/rollup-linux-s390x-gnu": "4.63.1",
- "@rollup/rollup-linux-x64-gnu": "4.63.1",
- "@rollup/rollup-linux-x64-musl": "4.63.1",
- "@rollup/rollup-openbsd-x64": "4.63.1",
- "@rollup/rollup-openharmony-arm64": "4.63.1",
- "@rollup/rollup-win32-arm64-msvc": "4.63.1",
- "@rollup/rollup-win32-ia32-msvc": "4.63.1",
- "@rollup/rollup-win32-x64-gnu": "4.63.1",
- "@rollup/rollup-win32-x64-msvc": "4.63.1",
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/rollup-plugin-string": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/rollup-plugin-string/-/rollup-plugin-string-3.0.0.tgz",
- "integrity": "sha512-vqyzgn9QefAgeKi+Y4A7jETeIAU1zQmS6VotH6bzm/zmUQEnYkpIGRaOBPY41oiWYV4JyBoGAaBjYMYuv+6wVw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "rollup-pluginutils": "^2.4.1"
- }
- },
- "node_modules/rollup-plugin-visualizer": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-7.1.1.tgz",
- "integrity": "sha512-ThaGiHTU8XW02OkK80TrTHATraJmM9OAduU4otal+7gyXLpYEtmGBLfx5kW+EHvvLwn03YGW2NnwKUIqsYlJAA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "open": "^11.0.0",
- "picomatch": "^4.0.5",
- "source-map": "^0.8.0",
- "yargs": "^18.1.0"
- },
- "bin": {
- "rollup-plugin-visualizer": "dist/bin/cli.js"
- },
- "engines": {
- "node": ">=22"
- },
- "peerDependencies": {
- "rolldown": "1.x || ^1.0.0-beta || ^1.0.0-rc",
- "rollup": "2.x || 3.x || 4.x"
- },
- "peerDependenciesMeta": {
- "rolldown": {
- "optional": true
- },
- "rollup": {
- "optional": true
- }
- }
- },
- "node_modules/rollup-plugin-visualizer/node_modules/source-map": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0.tgz",
- "integrity": "sha512-d8EqvL+k/SOXCreS/SUzg2ciyHqBBLcN/yuRjFsbvVhHTE2pgei7oAhmPM7kWFbkX6OSMQfUq4KbkF3au9lhYQ==",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">= 12"
- }
- },
- "node_modules/rollup-pluginutils": {
- "version": "2.8.2",
- "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
- "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "estree-walker": "^0.6.1"
- }
- },
- "node_modules/rollup-pluginutils/node_modules/estree-walker": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
- "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/rou3": {
- "version": "0.9.2",
- "resolved": "https://registry.npmjs.org/rou3/-/rou3-0.9.2.tgz",
- "integrity": "sha512-3SOzvaAg8rkHrXtRjpCvCvbyO5to9oOO27Z/XqHEYXfMRVSw/qMIVdmaOk9W2lcRLtR6dlqTjo9hDeJk70QBYQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/run-applescript": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz",
- "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/sass": {
- "version": "1.104.0",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.104.0.tgz",
- "integrity": "sha512-btHMApW2bgolvClhRW8AlQJzgI9lUB3pPSofBQQT+E46GWvf9o0TVQ13SYv5riWZVFyPN+JNz3TKW9XhBlc10w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "chokidar": "^5.0.0",
- "immutable": "^5.1.5",
- "source-map-js": ">=0.6.2 <2.0.0"
- },
- "bin": {
- "sass": "sass.js"
- },
- "engines": {
- "node": ">=20.19.0"
- },
- "optionalDependencies": {
- "@parcel/watcher": "^2.4.1"
- }
- },
- "node_modules/semver": {
- "version": "7.8.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
- "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/slide": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
- "integrity": "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-js": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
- "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "node_modules/spdx-compare": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/spdx-compare/-/spdx-compare-1.0.0.tgz",
- "integrity": "sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "array-find-index": "^1.0.2",
- "spdx-expression-parse": "^3.0.0",
- "spdx-ranges": "^2.0.0"
- }
- },
- "node_modules/spdx-correct": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
- "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "node_modules/spdx-exceptions": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
- "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
- "dev": true,
- "license": "CC-BY-3.0"
- },
- "node_modules/spdx-expression-parse": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
- "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "node_modules/spdx-license-ids": {
- "version": "3.0.23",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz",
- "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==",
- "dev": true,
- "license": "CC0-1.0"
- },
- "node_modules/spdx-ranges": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/spdx-ranges/-/spdx-ranges-2.1.1.tgz",
- "integrity": "sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==",
- "dev": true,
- "license": "(MIT AND CC-BY-3.0)"
- },
- "node_modules/srvx": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/srvx/-/srvx-1.0.4.tgz",
- "integrity": "sha512-eZmYaxUfZSo7/8m8UdsHRJNmTLSCTPPom9d7a60vMmuVeZvwhbvflRR+00/CxTCjMOFa5+H8tgBeNDVZ+w7AAQ==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "srvx": "bin/srvx.mjs"
- },
- "engines": {
- "node": ">=20.16.0"
- }
- },
- "node_modules/string-width": {
- "version": "8.2.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz",
- "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "get-east-asian-width": "^1.5.0",
- "strip-ansi": "^7.1.2"
- },
- "engines": {
- "node": ">=20"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/strip-ansi": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
- "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^6.2.2"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
- }
- },
- "node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/tailwindcss": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz",
- "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/tapable": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
- "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/tellraw-parser": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/tellraw-parser/-/tellraw-parser-1.0.2.tgz",
- "integrity": "sha512-vIEuTAutJGXI6Xks5OoMdELbmDa6GC7Jty074lVgUWn+Ff/puks5DChmeIvNG7cnHzSPyftCB4rVSPG7Xl01kg=="
- },
- "node_modules/terser": {
- "version": "5.51.2",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.51.2.tgz",
- "integrity": "sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "@jridgewell/source-map": "^0.3.3",
- "acorn": "^8.15.0",
- "commander": "^2.20.0",
- "source-map-support": "~0.5.20"
- },
- "bin": {
- "terser": "bin/terser"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/terser/node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/tinyexec": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.1.tgz",
- "integrity": "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/tinyglobby": {
- "version": "0.2.17",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
- "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fdir": "^6.5.0",
- "picomatch": "^4.0.4"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/SuperchupuDev"
- }
- },
- "node_modules/tosource": {
- "version": "2.0.0-alpha.3",
- "resolved": "https://registry.npmjs.org/tosource/-/tosource-2.0.0-alpha.3.tgz",
- "integrity": "sha512-KAB2lrSS48y91MzFPFuDg4hLbvDiyTjOVgaK7Erw+5AmZXNq4sFRVn8r6yxSLuNs15PaokrDRpS61ERY9uZOug==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/treeify": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz",
- "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/ts-api-utils": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
- "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18.12"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4"
- }
- },
- "node_modules/tslib": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
- "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
- "dev": true,
- "license": "0BSD"
- },
- "node_modules/tsx": {
- "version": "4.23.13",
- "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.13.tgz",
- "integrity": "sha512-BL5MGkRln6aDYhb0xbQlEAGw743BaZYWdbWtdJOBriYJboKgUUYCadFp2/FpBBZquBC/ezNBn7wMMPx7FDZUDw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "esbuild": "~0.28.0"
- },
- "bin": {
- "tsx": "dist/cli.mjs"
- },
- "engines": {
- "node": ">=18.0.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.3"
- }
- },
- "node_modules/type-check": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
- "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "prelude-ls": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/typescript": {
- "version": "5.9.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
- "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
- "dev": true,
- "license": "Apache-2.0",
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=14.17"
- }
- },
- "node_modules/typescript-eslint": {
- "version": "8.69.0",
- "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.69.0.tgz",
- "integrity": "sha512-B3MltX0VqjUBNEe3b3sSuiRbfa6XrfHFtBiPamjT5AsW/dfq+y+bc0wyuS9DxAS1LyzCxRp2+rxzpLUvqM2BvA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/eslint-plugin": "8.69.0",
- "@typescript-eslint/parser": "8.69.0",
- "@typescript-eslint/typescript-estree": "8.69.0",
- "@typescript-eslint/utils": "8.69.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/ufo": {
- "version": "1.6.4",
- "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz",
- "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/undici-types": {
- "version": "8.9.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.9.0.tgz",
- "integrity": "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/unplugin": {
- "version": "1.16.1",
- "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.1.tgz",
- "integrity": "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "acorn": "^8.14.0",
- "webpack-virtual-modules": "^0.6.2"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/unplugin-remove": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/unplugin-remove/-/unplugin-remove-1.0.3.tgz",
- "integrity": "sha512-BZMt9v8Y/Z27cY7YQv+DpcW928znjP1cqplBXOirbANiFQtM2YCdiyNAJhHCvjppT0lScNn1aDrQnXqnRp32pQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.25.2",
- "@babel/generator": "^7.25.0",
- "@babel/parser": "^7.25.3",
- "@babel/traverse": "^7.25.3",
- "@rollup/pluginutils": "^5.1.0",
- "magic-string": "^0.30.11",
- "unplugin": "^1.12.0"
- }
- },
- "node_modules/update-browserslist-db": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz",
- "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "escalade": "^3.2.0",
- "picocolors": "^1.1.1"
- },
- "bin": {
- "update-browserslist-db": "cli.js"
- },
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
- }
- },
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/util-extend": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz",
- "integrity": "sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/validate-npm-package-license": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
- "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
- }
- },
- "node_modules/vite": {
- "version": "6.4.3",
- "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz",
- "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "esbuild": "^0.25.0",
- "fdir": "^6.4.4",
- "picomatch": "^4.0.2",
- "postcss": "^8.5.3",
- "rollup": "^4.34.9",
- "tinyglobby": "^0.2.13"
- },
- "bin": {
- "vite": "bin/vite.js"
- },
- "engines": {
- "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
- },
- "funding": {
- "url": "https://github.com/vitejs/vite?sponsor=1"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.3"
- },
- "peerDependencies": {
- "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
- "jiti": ">=1.21.0",
- "less": "*",
- "lightningcss": "^1.21.0",
- "sass": "*",
- "sass-embedded": "*",
- "stylus": "*",
- "sugarss": "*",
- "terser": "^5.16.0",
- "tsx": "^4.8.1",
- "yaml": "^2.4.2"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- },
- "jiti": {
- "optional": true
- },
- "less": {
- "optional": true
- },
- "lightningcss": {
- "optional": true
- },
- "sass": {
- "optional": true
- },
- "sass-embedded": {
- "optional": true
- },
- "stylus": {
- "optional": true
- },
- "sugarss": {
- "optional": true
- },
- "terser": {
- "optional": true
- },
- "tsx": {
- "optional": true
- },
- "yaml": {
- "optional": true
- }
- }
- },
- "node_modules/vite-plugin-eslint": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/vite-plugin-eslint/-/vite-plugin-eslint-1.8.1.tgz",
- "integrity": "sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@rollup/pluginutils": "^4.2.1",
- "@types/eslint": "^8.4.5",
- "rollup": "^2.77.2"
- },
- "peerDependencies": {
- "eslint": ">=7",
- "vite": ">=2"
- }
- },
- "node_modules/vite-plugin-eslint/node_modules/@rollup/pluginutils": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz",
- "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "estree-walker": "^2.0.1",
- "picomatch": "^2.2.2"
- },
- "engines": {
- "node": ">= 8.0.0"
- }
- },
- "node_modules/vite-plugin-eslint/node_modules/picomatch": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
- "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/vite-plugin-eslint/node_modules/rollup": {
- "version": "2.80.0",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.80.0.tgz",
- "integrity": "sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "rollup": "dist/bin/rollup"
- },
- "engines": {
- "node": ">=10.0.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/vite/node_modules/@esbuild/aix-ppc64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
- "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "aix"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/android-arm": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz",
- "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/android-arm64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz",
- "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/android-x64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz",
- "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/darwin-arm64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz",
- "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/darwin-x64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz",
- "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/freebsd-arm64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz",
- "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/freebsd-x64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz",
- "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/linux-arm": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz",
- "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/linux-arm64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz",
- "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/linux-ia32": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz",
- "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/linux-loong64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz",
- "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/linux-mips64el": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz",
- "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==",
- "cpu": [
- "mips64el"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/linux-ppc64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz",
- "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/linux-riscv64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz",
- "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/linux-s390x": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz",
- "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/linux-x64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz",
- "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/netbsd-arm64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz",
- "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/netbsd-x64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz",
- "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/openbsd-arm64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz",
- "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/openbsd-x64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz",
- "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/openharmony-arm64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz",
- "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openharmony"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/sunos-x64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz",
- "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/win32-arm64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz",
- "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/win32-ia32": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz",
- "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/@esbuild/win32-x64": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
- "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/vite/node_modules/esbuild": {
- "version": "0.25.12",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
- "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=18"
- },
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.25.12",
- "@esbuild/android-arm": "0.25.12",
- "@esbuild/android-arm64": "0.25.12",
- "@esbuild/android-x64": "0.25.12",
- "@esbuild/darwin-arm64": "0.25.12",
- "@esbuild/darwin-x64": "0.25.12",
- "@esbuild/freebsd-arm64": "0.25.12",
- "@esbuild/freebsd-x64": "0.25.12",
- "@esbuild/linux-arm": "0.25.12",
- "@esbuild/linux-arm64": "0.25.12",
- "@esbuild/linux-ia32": "0.25.12",
- "@esbuild/linux-loong64": "0.25.12",
- "@esbuild/linux-mips64el": "0.25.12",
- "@esbuild/linux-ppc64": "0.25.12",
- "@esbuild/linux-riscv64": "0.25.12",
- "@esbuild/linux-s390x": "0.25.12",
- "@esbuild/linux-x64": "0.25.12",
- "@esbuild/netbsd-arm64": "0.25.12",
- "@esbuild/netbsd-x64": "0.25.12",
- "@esbuild/openbsd-arm64": "0.25.12",
- "@esbuild/openbsd-x64": "0.25.12",
- "@esbuild/openharmony-arm64": "0.25.12",
- "@esbuild/sunos-x64": "0.25.12",
- "@esbuild/win32-arm64": "0.25.12",
- "@esbuild/win32-ia32": "0.25.12",
- "@esbuild/win32-x64": "0.25.12"
- }
- },
- "node_modules/webpack-virtual-modules": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
- "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/word-wrap": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
- "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/wrap-ansi": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz",
- "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^6.2.1",
- "string-width": "^7.0.0",
- "strip-ansi": "^7.1.0"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/wrap-ansi/node_modules/string-width": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
- "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "emoji-regex": "^10.3.0",
- "get-east-asian-width": "^1.0.0",
- "strip-ansi": "^7.1.0"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/wsl-utils": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-1.0.0.tgz",
- "integrity": "sha512-Hl0ZOAs672vg+06kfujwRhoS6/jehvULrlFkuF2dRu6pHgA8U06h3xqNIqNNU1LTXPcedxByAR4GS6pwQK0mgA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-wsl": "^3.1.0",
- "powershell-utils": "^0.1.0"
- },
- "engines": {
- "node": ">=20"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/wsl-utils/node_modules/powershell-utils": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz",
- "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=20"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/yargs": {
- "version": "18.1.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz",
- "integrity": "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cliui": "^9.0.1",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "string-width": "^8.2.1",
- "y18n": "^5.0.5",
- "yargs-parser": "^22.0.0"
- },
- "engines": {
- "node": "^20.19.0 || ^22.12.0 || >=23"
- }
- },
- "node_modules/yargs-parser": {
- "version": "22.0.0",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz",
- "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^20.19.0 || ^22.12.0 || >=23"
- }
- },
- "node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/zigpty": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/zigpty/-/zigpty-0.2.1.tgz",
- "integrity": "sha512-MR9JqJx2wf5f4wz8zpx050AlqrmWeIW+1h0SO5iEyhG3HFRjY5luC3szS2ux2EGuPjE5OU9ZAuiCBeMWBTrqZw==",
- "dev": true,
- "workspaces": [
- "playground"
- ]
- },
- "node_modules/zod": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/zod/-/zod-4.5.4.tgz",
- "integrity": "sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/colinhacks"
- }
- }
- }
-}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 17298cce..2c38b982 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -85,6 +85,9 @@ importers:
tw-animate-css:
specifier: ^1.4.0
version: 1.4.0
+ yaml:
+ specifier: ^2.9.1
+ version: 2.9.1
devDependencies:
'@tailwindcss/postcss':
specifier: ^4.3.3
@@ -157,7 +160,7 @@ importers:
version: 5.0.0(rollup@4.63.2)
'@tailwindcss/vite':
specifier: ^4.3.3
- version: 4.3.3(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))
+ version: 4.3.3(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1))
'@types/ejs':
specifier: ^3.1.5
version: 3.1.5
@@ -175,7 +178,7 @@ importers:
version: 26.5.1
'@vitejs/devtools':
specifier: ^0.7.2
- version: 0.7.3(@devframes/json-render@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(crossws@0.4.12(srvx@1.0.4))(srvx@1.0.4)(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))
+ version: 0.7.3(@devframes/json-render@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(crossws@0.4.12(srvx@1.0.4))(srvx@1.0.4)(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1))
chalk:
specifier: ^6.0.0
version: 6.0.0
@@ -220,10 +223,10 @@ importers:
version: 1.0.3(rollup@4.63.2)
vite:
specifier: 6.4.3
- version: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)
+ version: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1)
vite-plugin-eslint:
specifier: ^1.8.1
- version: 1.8.1(eslint@10.10.0(jiti@2.7.0))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))
+ version: 1.8.1(eslint@10.10.0(jiti@2.7.0))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1))
npm/vfs:
dependencies:
@@ -4111,6 +4114,11 @@ packages:
yallist@3.1.1:
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+ yaml@2.9.1:
+ resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==}
+ engines: {node: '>= 14.6'}
+ hasBin: true
+
yargs-parser@22.0.0:
resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==}
engines: {node: ^20.19.0 || ^22.12.0 || >=23}
@@ -4466,30 +4474,30 @@ snapshots:
optionalDependencies:
'@devframes/hub': 0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))
- '@devframes/plugin-inspect@0.9.18(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))':
+ '@devframes/plugin-inspect@0.9.18(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1))':
dependencies:
cac: 7.0.0
devframe: 0.9.18(cac@7.0.0)(srvx@1.0.4)
optionalDependencies:
- vite: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)
+ vite: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1)
- '@devframes/plugin-messages@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))':
+ '@devframes/plugin-messages@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1))':
dependencies:
'@devframes/hub': 0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))
'@devframes/service-open': 0.9.18(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))
cac: 7.0.0
devframe: 0.9.18(cac@7.0.0)(srvx@1.0.4)
optionalDependencies:
- vite: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)
+ vite: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1)
- '@devframes/plugin-terminals@0.9.18(@devframes/hub-ui@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/json-render@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))':
+ '@devframes/plugin-terminals@0.9.18(@devframes/hub-ui@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/json-render@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1))':
dependencies:
- '@devframes/vite': 0.9.18(@devframes/hub-ui@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/json-render@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))
+ '@devframes/vite': 0.9.18(@devframes/hub-ui@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/json-render@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1))
cac: 7.0.0
devframe: 0.9.18(cac@7.0.0)(srvx@1.0.4)
zigpty: 0.2.1
optionalDependencies:
- vite: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)
+ vite: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1)
transitivePeerDependencies:
- '@devframes/hub'
- '@devframes/hub-ui'
@@ -4499,14 +4507,14 @@ snapshots:
devframe: 0.9.18(cac@7.0.0)(srvx@1.0.4)
pathe: 2.0.3
- '@devframes/vite@0.9.18(@devframes/hub-ui@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/json-render@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))':
+ '@devframes/vite@0.9.18(@devframes/hub-ui@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/json-render@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1))':
dependencies:
devframe: 0.9.18(cac@7.0.0)(srvx@1.0.4)
pathe: 2.0.3
optionalDependencies:
'@devframes/hub': 0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))
'@devframes/hub-ui': 0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/json-render@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))
- vite: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)
+ vite: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1)
'@dotenvx/dotenvx@1.75.1':
dependencies:
@@ -5270,12 +5278,12 @@ snapshots:
postcss: 8.5.28
tailwindcss: 4.3.3
- '@tailwindcss/vite@4.3.3(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))':
+ '@tailwindcss/vite@4.3.3(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1))':
dependencies:
'@tailwindcss/node': 4.3.3
'@tailwindcss/oxide': 4.3.3
tailwindcss: 4.3.3
- vite: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)
+ vite: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1)
'@ts-morph/common@0.27.0':
dependencies:
@@ -5431,7 +5439,7 @@ snapshots:
next: 16.3.3(@babel/core@7.29.7)(@types/node@24.13.4)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(sass@1.104.1)
react: 19.3.0
- '@vitejs/devtools-kit@0.7.3(cac@7.0.0)(crossws@0.4.12(srvx@1.0.4))(srvx@1.0.4)(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))':
+ '@vitejs/devtools-kit@0.7.3(cac@7.0.0)(crossws@0.4.12(srvx@1.0.4))(srvx@1.0.4)(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1))':
dependencies:
'@devframes/hub': 0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))
'@devframes/json-render': 0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))
@@ -5440,7 +5448,7 @@ snapshots:
mlly: 1.8.2
nostics: 1.2.0
nypm: 0.6.10
- vite: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)
+ vite: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1)
transitivePeerDependencies:
- '@modelcontextprotocol/client'
- cac
@@ -5448,15 +5456,15 @@ snapshots:
- ocache
- srvx
- '@vitejs/devtools@0.7.3(@devframes/json-render@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(crossws@0.4.12(srvx@1.0.4))(srvx@1.0.4)(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))':
+ '@vitejs/devtools@0.7.3(@devframes/json-render@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(crossws@0.4.12(srvx@1.0.4))(srvx@1.0.4)(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1))':
dependencies:
'@devframes/hub': 0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))
'@devframes/hub-ui': 0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/json-render@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))
'@devframes/json-render-ui': 0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))
- '@devframes/plugin-inspect': 0.9.18(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))
- '@devframes/plugin-messages': 0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))
- '@devframes/plugin-terminals': 0.9.18(@devframes/hub-ui@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/json-render@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))
- '@vitejs/devtools-kit': 0.7.3(cac@7.0.0)(crossws@0.4.12(srvx@1.0.4))(srvx@1.0.4)(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13))
+ '@devframes/plugin-inspect': 0.9.18(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1))
+ '@devframes/plugin-messages': 0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1))
+ '@devframes/plugin-terminals': 0.9.18(@devframes/hub-ui@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/json-render@0.9.18(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(@devframes/hub@0.9.18(crossws@0.4.12(srvx@1.0.4))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4)))(devframe@0.9.18(cac@7.0.0)(srvx@1.0.4))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1))
+ '@vitejs/devtools-kit': 0.7.3(cac@7.0.0)(crossws@0.4.12(srvx@1.0.4))(srvx@1.0.4)(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1))
cac: 7.0.0
devframe: 0.9.18(cac@7.0.0)(srvx@1.0.4)
h3: 2.0.1-rc.31(crossws@0.4.12(srvx@1.0.4))
@@ -5464,7 +5472,7 @@ snapshots:
nostics: 1.2.0
obug: 2.2.1
pathe: 2.0.3
- vite: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)
+ vite: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1)
transitivePeerDependencies:
- '@devframes/json-render'
- '@devframes/plugin-inspect--assets'
@@ -7605,15 +7613,15 @@ snapshots:
vary@1.1.2: {}
- vite-plugin-eslint@1.8.1(eslint@10.10.0(jiti@2.7.0))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)):
+ vite-plugin-eslint@1.8.1(eslint@10.10.0(jiti@2.7.0))(vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1)):
dependencies:
'@rollup/pluginutils': 4.2.1
'@types/eslint': 8.56.12
eslint: 10.10.0(jiti@2.7.0)
rollup: 2.80.0
- vite: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)
+ vite: 6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1)
- vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13):
+ vite@6.4.3(@types/node@26.5.1)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.104.1)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.1):
dependencies:
esbuild: 0.25.12
fdir: 6.5.0(picomatch@4.0.7)
@@ -7629,6 +7637,7 @@ snapshots:
sass: 1.104.1
terser: 5.51.2
tsx: 4.23.13
+ yaml: 2.9.1
webpack-virtual-modules@0.6.2: {}
@@ -7663,6 +7672,8 @@ snapshots:
yallist@3.1.1: {}
+ yaml@2.9.1: {}
+
yargs-parser@22.0.0: {}
yargs@18.1.0:
From 2ed9657d9568346b87c575d2723e33187290fa7a Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 17:18:56 +0200
Subject: [PATCH 29/62] Fix Docker builds for uploadpage & templates
Adjust docker-compose and Dockerfiles so images build reliably: set uploadpage build context to repo root and use docker/uploadpage/Dockerfile; disable package postinstall scripts in static/template images (pnpm install --ignore-scripts) to avoid prisma generate where schema is absent; make uploadpage Dockerfile handle pnpm workspace files and copy hub prisma schema into a temporary prisma dir so postinstall can run, switch prisma generate and build to pnpm --filter my-project invocations, and update runtime COPY paths to use npm/hub output. These changes prevent build-time prisma failures and fix workspace handling.
---
docker-compose.yml | 4 ++--
docker/static-site/Dockerfile | 2 +-
docker/template-site/Dockerfile | 4 +++-
docker/uploadpage/Dockerfile | 27 +++++++++++++++++++--------
package.json | 2 +-
5 files changed, 26 insertions(+), 13 deletions(-)
diff --git a/docker-compose.yml b/docker-compose.yml
index 76964359..1bd529dc 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -28,8 +28,8 @@ services:
uploadpage:
build:
- context: ./npm/hub
- dockerfile: ../../docker/uploadpage/Dockerfile
+ context: .
+ dockerfile: docker/uploadpage/Dockerfile
container_name: uploadpage
depends_on:
- postgres
diff --git a/docker/static-site/Dockerfile b/docker/static-site/Dockerfile
index e8502ff3..9f4080c9 100644
--- a/docker/static-site/Dockerfile
+++ b/docker/static-site/Dockerfile
@@ -15,7 +15,7 @@ COPY npm/vfs/package.json ./npm/vfs/package.json
COPY npm/finder-npm/package.json ./npm/finder-npm/package.json
COPY npm/pages-plugin/package.json ./npm/pages-plugin/package.json
-RUN pnpm install --frozen-lockfile
+RUN pnpm install --frozen-lockfile --ignore-scripts
COPY . .
diff --git a/docker/template-site/Dockerfile b/docker/template-site/Dockerfile
index 98bfcadd..b1417cb0 100644
--- a/docker/template-site/Dockerfile
+++ b/docker/template-site/Dockerfile
@@ -16,7 +16,9 @@ COPY npm/vfs/package.json ./npm/vfs/package.json
COPY npm/finder-npm/package.json ./npm/finder-npm/package.json
COPY npm/pages-plugin/package.json ./npm/pages-plugin/package.json
-RUN pnpm install --frozen-lockfile
+# --ignore-scripts: hub's postinstall `prisma generate` would fail here
+# (no prisma/schema.prisma in this image); uploadpage handles that separately.
+RUN pnpm install --frozen-lockfile --ignore-scripts
# Restlichen Quellcode kopieren (nach install für besseren Cache)
COPY . .
diff --git a/docker/uploadpage/Dockerfile b/docker/uploadpage/Dockerfile
index 86746981..1ca9a8ba 100644
--- a/docker/uploadpage/Dockerfile
+++ b/docker/uploadpage/Dockerfile
@@ -1,33 +1,44 @@
# Dockerfile für die Uploadpage (Next.js)
# Next.js-Build, Standalone-Server auf Port 3015
+# Context ist . (Root), daher muss npm/hub als Pfad angegeben werden.
# ---- Abhängigkeiten ----
FROM node:22-alpine AS deps
WORKDIR /app
+# Workspace-Dateien
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
+COPY npm/hub/package.json ./npm/hub/package.json
+COPY npm/finder-lib/package.json ./npm/finder-lib/package.json
+COPY npm/vfs/package.json ./npm/vfs/package.json
+COPY npm/finder-npm/package.json ./npm/finder-npm/package.json
+COPY npm/site/package.json ./npm/site/package.json
+COPY npm/pages-plugin/package.json ./npm/pages-plugin/package.json
+COPY npm/hub/prisma ./npm/hub/prisma
-# Prisma-Schema vorab kopieren, damit der postinstall (prisma generate)
-# im deps-Stage funktioniert
-COPY prisma ./prisma
+# Symlink-Struktur einrichten, damit npm/hub postinstall sein Schema findet
+RUN mkdir -p prisma && cp -r npm/hub/prisma/* prisma/
RUN corepack enable && pnpm install --frozen-lockfile
# ---- Build ----
FROM node:22-alpine AS builder
+RUN corepack enable
WORKDIR /app
+# Sowohl Root- als auch hub-Symlinks kopieren (pnpm Workspace)
COPY --from=deps /app/node_modules ./node_modules
+COPY --from=deps /app/npm/hub/node_modules ./npm/hub/node_modules
COPY . .
# Prisma-Client für den Linux-Build generieren
-RUN pnpx prisma generate
+RUN pnpm --filter my-project exec prisma generate
ENV NEXT_TELEMETRY_DISABLED=1
-RUN pnpm run build
+RUN pnpm --filter my-project build
# ---- Runtime ----
FROM node:22-alpine AS runner
@@ -40,9 +51,9 @@ ENV NEXT_TELEMETRY_DISABLED=1
RUN addgroup --system --gid 1001 nodejs \
&& adduser --system --uid 1001 nextjs
-COPY --from=builder /app/public ./public
-COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
-COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
+COPY --from=builder /app/npm/hub/public ./public
+COPY --from=builder --chown=nextjs:nodejs /app/npm/hub/.next/standalone ./
+COPY --from=builder --chown=nextjs:nodejs /app/npm/hub/.next/static ./.next/static
# Hinweis: Der Prisma-Client (inkl. libquery_engine) wird von Next.js
# (output: "standalone" + outputFileTracing) bereits vollständig in
diff --git a/package.json b/package.json
index 3375e82e..6c2f8c1a 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,7 @@
"scripts": {
"dev": "pnpm --filter web dev",
"build": "pnpm --filter web build",
- "stats": "pnpx linguist-js"
+ "stats": "pnpm linguist-js"
},
"version": "0.3.18",
"devDependencies": {
From d5f26283e1a477ad0815227086514138bcb49a9b Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 18:14:15 +0200
Subject: [PATCH 30/62] Fix uploadpage standalone Docker paths
Adjust the uploadpage runtime image to match Next.js standalone output layout. The build now copies public and static assets under npm/hub, keeps the server in the standalone bundle, and starts the app from npm/hub/server.js so the container boots correctly.
---
docker/uploadpage/Dockerfile | 15 ++++++---------
1 file changed, 6 insertions(+), 9 deletions(-)
diff --git a/docker/uploadpage/Dockerfile b/docker/uploadpage/Dockerfile
index 1ca9a8ba..ea9676a2 100644
--- a/docker/uploadpage/Dockerfile
+++ b/docker/uploadpage/Dockerfile
@@ -51,14 +51,11 @@ ENV NEXT_TELEMETRY_DISABLED=1
RUN addgroup --system --gid 1001 nodejs \
&& adduser --system --uid 1001 nextjs
-COPY --from=builder /app/npm/hub/public ./public
-COPY --from=builder --chown=nextjs:nodejs /app/npm/hub/.next/standalone ./
-COPY --from=builder --chown=nextjs:nodejs /app/npm/hub/.next/static ./.next/static
-
-# Hinweis: Der Prisma-Client (inkl. libquery_engine) wird von Next.js
-# (output: "standalone" + outputFileTracing) bereits vollständig in
-# .next/standalone eingebettet — eine separate Kopie ist nicht nötig
-# (unter pnpm existiert node_modules/.prisma nicht als flacher Pfad).
+# Standalone enthält bereits die pruned node_modules + app unter npm/hub/
+COPY --from=builder /app/npm/hub/.next/standalone ./
+# public + static werden von Next nicht in standalone kopiert -> extra
+COPY --from=builder /app/npm/hub/public ./npm/hub/public
+COPY --from=builder --chown=nextjs:nodejs /app/npm/hub/.next/static ./npm/hub/.next/static
USER nextjs
@@ -67,4 +64,4 @@ EXPOSE 3015
ENV PORT=3015
ENV HOSTNAME=0.0.0.0
-CMD ["node", "server.js"]
+CMD ["node", "npm/hub/server.js"]
From eedc84ba486fd5c6c7f8f201a0c4d0ad7a3062ce Mon Sep 17 00:00:00 2001
From: ShadowDara <128976697+ShadowDara@users.noreply.github.com>
Date: Mon, 14 Sep 2026 23:11:44 +0200
Subject: [PATCH 31/62] Add installed templates and docs refresh
Add support for installed templates in the web UI and backend, including listing, filtering, and dedicated load endpoints alongside built-in/custom templates. Refresh the generated frontend assets and docs pages, add markdown/doc routes, update changelog and template metadata, and clean up legacy install/test artifacts from the frontend bundle.
---
.../assets/_virtual_page-data_index.js | 812 +++++++++++++++
.../_virtual_page-markdown_changelog.js | 1 +
.../assets/_virtual_page-markdown_readme.js | 124 +++
cmd/findergen/frontend/assets/cacheviewer.js | 2 +-
cmd/findergen/frontend/assets/config.js | 1 +
cmd/findergen/frontend/assets/configeditor.js | 2 +-
cmd/findergen/frontend/assets/creator.js | 4 +-
cmd/findergen/frontend/assets/index.js | 2 +-
cmd/findergen/frontend/assets/index2.js | 2 +-
cmd/findergen/frontend/assets/index3.js | 2 +-
cmd/findergen/frontend/assets/index4.js | 1 +
cmd/findergen/frontend/assets/main_entry.js | 927 +-----------------
cmd/findergen/frontend/assets/page.js | 1 +
cmd/findergen/frontend/assets/page2.js | 1 +
cmd/findergen/frontend/assets/samfile.js | 8 +-
cmd/findergen/frontend/assets/viewer.css | 2 +-
cmd/findergen/frontend/assets/viewer.js | 2 +-
cmd/findergen/frontend/assets/worlds.js | 2 +-
cmd/findergen/frontend/dependencies.txt | 35 +-
cmd/findergen/frontend/install.sh | 95 --
cmd/findergen/frontend/test/ejs/index.html | 1 +
cmd/findergen/frontend/test/jekyll/index.html | 1 +
.../line_extender/page/index.html | 1 +
.../tools/line_formatter/page/index.html | 1 +
.../tools/picture-mode-maker/page/index.html | 1 +
cmd/findergen/main.go | 81 +-
npm/site/data/backend.json | 28 +-
npm/site/data/gh-pages.json | 128 ++-
npm/site/docs/changelog.md | 12 +-
npm/site/pages/viewer.css | 5 +
npm/site/pages/viewer.tsx | 38 +-
npm/site/public/dependencies.txt | 2 +
npm/site/src/templates.js | 10 +-
33 files changed, 1206 insertions(+), 1129 deletions(-)
create mode 100644 cmd/findergen/frontend/assets/_virtual_page-data_index.js
create mode 100644 cmd/findergen/frontend/assets/_virtual_page-markdown_changelog.js
create mode 100644 cmd/findergen/frontend/assets/_virtual_page-markdown_readme.js
create mode 100644 cmd/findergen/frontend/assets/config.js
create mode 100644 cmd/findergen/frontend/assets/index4.js
create mode 100644 cmd/findergen/frontend/assets/page.js
create mode 100644 cmd/findergen/frontend/assets/page2.js
delete mode 100644 cmd/findergen/frontend/install.sh
create mode 100644 cmd/findergen/frontend/test/ejs/index.html
create mode 100644 cmd/findergen/frontend/test/jekyll/index.html
create mode 100644 cmd/findergen/frontend/tools/line_formatter/line_extender/page/index.html
create mode 100644 cmd/findergen/frontend/tools/line_formatter/page/index.html
create mode 100644 cmd/findergen/frontend/tools/picture-mode-maker/page/index.html
diff --git a/cmd/findergen/frontend/assets/_virtual_page-data_index.js b/cmd/findergen/frontend/assets/_virtual_page-data_index.js
new file mode 100644
index 00000000..ae507138
--- /dev/null
+++ b/cmd/findergen/frontend/assets/_virtual_page-data_index.js
@@ -0,0 +1,812 @@
+const n=`# AGENTS — Finder Template Authoring Guide
+
+This document is for AI assistants such as ChatGPT, Claude, Copilot,
+and similar tools that need to create valid Finder templates.
+
+Goal:
+
+- create Finder-compatible JSON5 templates
+- work with all supported template features
+- prefer valid, minimal, and robust patterns
+- avoid false positives and over-constrained matches
+
+## 1) What Finder matches
+
+Finder scans folders on the filesystem and checks whether a directory
+matches a template.
+
+A template describes:
+
+- the directory name pattern
+- required or forbidden files
+- required or forbidden subfolders
+- optional file constraints like size and hash
+- optional command validation
+- tags for discovery
+
+A template is a JSON5 file ending in \`.json5\` .
+
+Typical locations:
+
+- \`~/.finder/templates/\`
+- \`./.finder/templates/\`
+
+The filename without \`.json5\` becomes the template name, for example:
+
+- \`my-template.json5\` → \`my-template\`
+
+---
+
+## 2) Core template schema
+
+A valid Finder template looks like this:
+
+\`\`\`json5
+{
+ min_version: "0.3.16",
+ description: "My custom project type",
+ name: "*",
+ tags: ["node", "typescript"],
+ files: [
+ "package.json",
+ {
+ name: "src",
+ existence: "optional",
+ },
+ {
+ name: "*.ts",
+ existence: "required",
+ size: {
+ min: 1,
+ min_size_type: "KB",
+ },
+ },
+ ],
+ folders: [
+ {
+ name: "src",
+ folders: [],
+ files: ["index.ts"],
+ },
+ ],
+ command: "",
+ invert_command: false,
+ size: {
+ min: 10,
+ min_size_type: "KB",
+ },
+}
+\`\`\`
+
+---
+
+## 3) Supported top-level fields
+
+### \`description\` (string)
+
+Short human-readable explanation.
+
+\`\`\`json5
+"description": "Python service with pyproject.toml"
+\`\`\`
+
+### \`name\` (string)
+
+Pattern for the directory name.
+
+Use:
+
+- \`"*"\` for any folder name
+- \`"my-app"\` for exact name
+- \`"project-*"\` for glob wildcard matching
+- \`"^project-[0-9]+$"\` for regex matching
+
+Important:
+
+- Matching is exact-first, then regex, then glob fallback (see
+ the "Pattern matching" section below).
+- If you want to match all folders, prefer \`"*"\` .
+
+### \`files\` (array)
+
+Defines required/optional files.
+
+Can be either:
+
+- old style: string array
+- modern style: objects with metadata
+
+Examples:
+
+\`\`\`json5
+"files": [
+ "package.json",
+ "README.md"
+]
+\`\`\`
+
+\`\`\`json5
+"files": [
+ {
+ "name": "*.go",
+ "existence": "required"
+ },
+ {
+ "name": "go.mod",
+ "existence": "required"
+ },
+ {
+ "name": "*.dll",
+ "existence": "forbidden"
+ }
+]
+\`\`\`
+
+### \`existence\` values
+
+- \`required\` (default): file must exist
+- \`forbidden\` : file must not exist
+- \`optional\` : exists is okay, but not required
+
+Examples:
+
+\`\`\`json5
+{
+ name: ".git",
+ existence: "required",
+}
+\`\`\`
+
+\`\`\`json5
+{
+ name: "*.env",
+ existence: "forbidden",
+}
+\`\`\`
+
+### \`size\` (file or folder size constraint)
+
+Used under a file object or as a folder-level rule.
+
+\`\`\`json5
+"size": {
+ "min": 1,
+ "min_size_type": "KB",
+ "max": 500,
+ "max_size_type": "MB"
+}
+\`\`\`
+
+Valid size types:
+
+- \`B\`
+- \`KB\`
+- \`MB\`
+- \`GB\`
+
+For file-level checking:
+
+- file must exist
+- file size must satisfy the condition
+
+For folder-level checking:
+
+- total directory size is checked recursively
+
+### \`checksums\` (hash-based validation)
+
+You can require exact SHA256 or SHA512 for matching files.
+
+\`\`\`json5
+{
+ name: "*.zip",
+ checksums: {
+ sha256: "abc123...",
+ sha512: "def456...",
+ },
+}
+\`\`\`
+
+Rules:
+
+- both hashes are optional
+- if SHA256 is provided, it must match exactly
+- if SHA512 is provided, it must match exactly
+- hash letters are compared case-insensitive
+
+### \`folders\` (nested directory patterns)
+
+Used to require subfolders.
+
+\`\`\`json5
+"folders": [
+ {
+ "name": ".git"
+ },
+ {
+ "name": "src",
+ "folders": [
+ {
+ "name": "components"
+ }
+ ]
+ }
+]
+\`\`\`
+
+The nested \`Folder\` object supports the same shape recursively.
+
+### \`command\` (string)
+
+Executes a shell command inside the found directory after matching.
+
+\`\`\`json5
+"command": "git status --porcelain"
+\`\`\`
+
+Behavior:
+
+- empty string means no command check
+- command success is evaluated according to exit code
+
+### \`invert_command\` (bool)
+
+Controls logic of command result.
+
+\`\`\`json5
+"invert_ command": false
+\`\`\`
+
+Meaning:
+
+- \`false\` → command must return success (typically exit code 0)
+- \`true\` → command must return failure (typically exit code != 0)
+
+### \`tags\` (array of strings)
+
+Category labels for browsing or filtering by tag.
+
+\`\`\` json5
+"tags": ["git", "repo", "vcs"]
+\`\`\`
+
+### \`min_version\` (string)
+
+Minimum finder version compatibility.
+
+\`\`\` json5
+"min_version": "0.3.16"
+\`\`\`
+
+### \`mdnote\` (string)
+
+Optional Markdown note attached to a template. It is rendered in the
+web UI (template viewer / creator) as rich text and is ignored during
+matching. Since 0.3.17.
+
+\`\`\`json5
+"mdnote": "# My template\\n\\nSome **markdown** explaining what this matches."
+\`\`\`
+
+Note: the value is normally stored percent-encoded (like
+\`encodeURIComponent\`) when generated by the web creator — newlines
+become \`%0A\` — but any plain Markdown string is valid and supported.
+
+---
+
+## 3.5) Pattern matching: regex, glob, and exact
+
+Every name pattern in a template — the top-level \`name\`, every file
+\`name\`, and every folder \`name\` (including nested folders) — is
+resolved by the same matching function:
+
+\`\`\`go
+if pattern == name {
+ return true // 1) exact string match
+}
+if ok, err := regexp.MatchString(pattern, name); err == nil {
+ return ok // 2) full Go regex
+}
+ok, err := path.Match(pattern, name)
+return err == nil && ok // 3) glob fallback
+\`\`\`
+
+This creates a 3-tier matching strategy:
+
+| Priority | Method | Applies when |
+| -------- | ------------------------------- | ------------------------------------------ |
+| 1 | exact string equality | pattern equals the name verbatim |
+| 2 | Go regex (\`regexp.MatchString\`) | pattern is a valid regular expression |
+| 3 | glob (\`path.Match\`) | pattern is not a valid regex (e.g. \`*.ts\`) |
+
+### How to choose a pattern
+
+Because regex is attempted before glob, the same character can mean
+different things depending on the pattern:
+
+- \`"*.go"\` is not a valid regex, so it is treated as a glob and
+ matches any file ending in \`.go\`.
+- \`"^main\\.py$"\` is a valid regex (anchored, no wildcard ambiguity),
+ so it matches exactly one name.
+- \`"project-*"\` is not a valid regex, so it is treated as a glob.
+
+### Go regex syntax (priority 2)
+
+Patterns that compile as a Go regular expression match with full regex
+semantics against the entire entry name. Refer to Go's
+\`regexp/syntax\` (RE2) for the full language. Useful constructs:
+
+- anchors: \`^...$\`
+- character classes: \`[0-9]\`, \`[a-zA-Z]\`, \`[^...]\`
+- predefined classes: \`\\d\`, \`\\w\`, \`\\s\` (and uppercase negations)
+- quantifiers: \`*\`, \`+\`, \`?\`, \`{m,n}\`
+- alternation: \`(a|b)\`
+- groups: \`(abc)\`, non-capturing \`(?:abc)\`
+- escapes: \`\\.\`, \`\\\\\`
+
+Examples:
+
+\`\`\`json5
+// folder names like project-123, project-42 ...
+{ name: "^project-[0-9]+$" }
+\`\`\`
+
+\`\`\`json5
+// python entry files: main.py, app.py, ...
+{
+ name: "^(main|app|server)\\\\.py$",
+ existence: "required",
+}
+\`\`\`
+
+Note: Go regex is RE2 — no backreferences and no lookahead/lookbehind.
+If your pattern uses those, it fails to compile and falls back to glob.
+
+### Glob syntax (priority 3 fallback)
+
+When a pattern is not a valid regex, it is treated as a glob via Go's
+\`path.Match\`:
+
+- \`*\` matches any sequence of non-\`/\` characters
+- \`?\` matches any single non-\`/\` character
+- \`[abc]\` matches one character from the class
+- \`[^abc]\` / \`[!abc]\` matches one character not in the class
+- \`\\x\` escapes the next character
+
+There is no recursive \`**\` (doublestar) support — \`** \` does not
+descend into subdirectories.
+
+Examples:
+
+\`\`\`json5
+"name": "*.ts",
+\`\`\`
+
+\`\`\`json5
+"name": "file?.txt",
+\`\`\`
+
+\`\`\`json5
+"name": "[abc].go",
+\`\`\`
+
+### Where these patterns apply
+
+- top-level \`name\` → the scanned directory name
+- \`files[].name\` → file names inside the directory
+- \`folders[].name\` → subfolder names (recursively for nested folders)
+
+Regex patterns work in all of these places. Exact glob patterns like
+\`"src"\` or \`"package.json"\` work exactly as before.
+
+### Compatibility note
+
+Regex support was added in finder 0.3.17. If your template relies on
+regex patterns, set:
+
+\`\`\`json5
+"min_ version": "0.3.17"
+\`\`\`
+
+Templates for older finder versions should keep using glob or exact
+patterns only.
+
+---
+
+## 4) Matching semantics
+
+A directory is considered a match only if all required conditions are
+satisfied.
+
+This includes:
+
+- \`name\` matches the folder name
+- required files exist
+- forbidden files do not exist
+- required subfolders exist
+- size constraints pass
+- checksum constraints pass
+- command condition passes
+
+If any required rule fails, the directory is rejected.
+
+---
+
+## 5) Good patterns for template design
+
+### Prefer broad matching first
+
+Good default:
+
+\`\`\` json5
+{
+ name: "*",
+ files: ["package.json", "tsconfig.json"],
+}
+\`\`\`
+
+Bad:
+
+\`\`\`json5
+{
+ name: "my-app",
+ files: ["package.json"],
+}
+\`\`\`
+
+The second version is overly restrictive and will miss most valid
+project folders.
+
+### Require the smallest useful signal
+
+For example, a Go project should usually require:
+
+- \`go.mod\`
+- one or more \`* .go\` files
+
+Not a huge list of optional files.
+
+### Avoid false positives
+
+If your project has a \`README.md\` in many folders, do not require it
+unless it is central to your pattern.
+
+### Use wildcards and regex carefully
+
+\`\`\`json5
+"name": "*.git" // if you intended a hidden git folder, this is special-case logic
+\`\`\`
+
+Use patterns like \`"*"\` , \`"src"\` , \`"*.ts"\` , \`"package.json"\` rather
+than complex regex-style expressions when a simple glob suffices.
+
+When you do need regex (e.g. matching \`project-123\` with
+\`^project-[0-9]+$\` ), anchor with \`^\` and \`$\` to avoid unintended
+matches.
+
+---
+
+## 6) Examples
+
+### Example A: Git repository
+
+\`\`\`json5
+{
+ description: "Git repository root",
+ name: "*",
+ folders: [
+ {
+ name: ".git",
+ },
+ ],
+ tags: ["git", "repo"],
+}
+\`\`\`
+
+### Example B: Node project
+
+\`\`\`json5
+{
+ description: "Node.js project",
+ name: "*",
+ files: ["package.json", "src", "README.md"],
+ tags: ["node", "javascript", "typescript"],
+}
+\`\`\`
+
+### Example C: Python project
+
+\`\`\`json5
+{
+ description: "Python project with pyproject.toml",
+ name: "*",
+ files: [
+ "pyproject.toml",
+ {
+ name: "*.py",
+ existence: "required",
+ },
+ ],
+ tags: ["python", "project"],
+}
+\`\`\`
+
+### Example D: strict checksum template
+
+\`\`\`json5
+{
+ name: "*",
+ description: "test for checksums",
+ files: [
+ {
+ name: "*",
+ checksums: {
+ sha256: "26be688daf71f2c8e64eecfa7fdf7d1f3649b6aae80dbb686ec3a9beb9def05b",
+ },
+ },
+ ],
+ min_version: "0.3.16",
+}
+\`\`\`
+
+This matches only folders containing a file whose SHA256 matches
+exactly.
+
+### Example E: custom monorepo
+
+\`\`\`json5
+{
+ description: "Monorepo with apps and packages",
+ name: "*",
+ files: ["pnpm-workspace.yaml", "package.json"],
+ folders: [
+ {
+ name: "apps",
+ folders: [
+ {
+ name: "*",
+ files: ["package.json"],
+ },
+ ],
+ },
+ {
+ name: "packages",
+ folders: [
+ {
+ name: "*",
+ files: ["package.json"],
+ },
+ ],
+ },
+ ],
+ tags: ["monorepo", "workspace"],
+}
+\`\`\`
+
+### Example F: regex-matched folder name
+
+\`\`\`json5
+{
+ description: "Numbered project folder",
+ name: "^project-[0-9]+$",
+ files: [
+ {
+ name: "^(main|app)\\\\.py$",
+ existence: "required",
+ },
+ ],
+ tags: ["python", "numbered"],
+ min_version: "0.3.17",
+}
+\`\`\`
+
+This matches folders like \`project-123\` or \`project-42\` and requires
+exactly one of \`main.py\` or \`app.py\` to be present. The name uses a
+Go regex (RE2) — note the escaped dots \`\\\\.\` and anchors \`^...$\` .
+
+### Example G: regex file pattern with glob fallback
+
+\`\`\`json5
+{
+ description: "JavaScript project with strict entry points",
+ name: "*",
+ files: [
+ "package.json",
+ {
+ name: "^(index|main|app)\\\\.(js|ts|jsx|tsx)$",
+ existence: "required",
+ },
+ {
+ name: "\\\\.env$",
+ existence: "forbidden",
+ },
+ ],
+ tags: ["javascript", "strict"],
+ min_version: "0.3.17",
+}
+\`\`\`
+
+This requires one of \`index.js\` , \`main.js\` , \`app.js\` , \`index.ts\` , etc.
+and forbids any file ending in \`.env\` . Note that \`"*.env"\` would also
+work as a glob — the regex version is more explicit.
+
+---
+
+## 7) Rules for AI-generated Finder templates
+
+When generating a Finder template, the assistant should follow this
+checklist:
+
+1. Create a valid \`.json5\` file.
+2. Use \`name: "*"\` unless the directory name is intentionally constrained.
+3. Keep required files minimal and specific.
+4. Prefer \`required\` over broad file matching if a file is essential.
+5. Use \`forbidden\` only for truly disqualifying files.
+6. Use \`size\` only when it genuinely distinguishes the target project type.
+7. Use \`checksums\` only when exact file identity is important.
+8. Add \`tags\` for discoverability.
+9. Keep \`description\` clear and concise.
+10. Prefer a deliberately narrow but realistic match over a very broad guess.
+11. Validate with the project command before claiming success.
+
+---
+
+## 8) Validation commands
+
+After writing a template, validate it with one of these project commands:
+
+\`\`\`bash
+./finder check
+\`\`\`
+
+Or test a specific template:
+
+\`\`\`bash
+./finder my-template-name
+\`\`\`
+
+If a template exists in the custom template folder, it will be loaded
+automatically.
+
+---
+
+## 9) Common mistakes
+
+### Mistake 1: too strict \`name\`
+
+\`\`\`json5
+"name": "root"
+\`\`\`
+
+This will match almost nothing unless the folder is literally named \`root\` .
+
+Use:
+
+\`\`\`json5
+"name": "*"
+\`\`\`
+
+unless you intentionally want a fixed directory name.
+
+### Mistake 2: requiring too many files
+
+Large project templates often become unreliable if they require too
+many files.
+
+Prefer the smallest signal that distinguishes the project type.
+
+### Mistake 3: mixing regex and glob syntax unintentionally
+
+Finder tries regex first, then falls back to glob. This is usually
+fine, but remember that a pattern that looks like a regex is treated
+as a regex:
+
+- \`"*.ts"\` is invalid regex → glob, matches any \`.ts\` file
+- \`"^main\\\\.py$"\` is valid regex → only matches exactly \`main.py\`
+
+Use:
+
+- \`*.ts\`
+- \`package.json\`
+- \`src\`
+- \`^project-[0-9]+$\` (regex, only when you need it)
+
+Do not write patterns that accidentally compile as a regex and change
+meaning. If in doubt, prefer glob or exact names.
+
+### Mistake 4: forgetting the \`.json5\` extension
+
+The file must end in \`.json5\` .
+
+### Mistake 5: writing invalid JSON5
+
+Remember:
+
+- trailing commas may be allowed depending on parser handling
+- keep object structure valid
+- avoid broken braces and trailing commas in awkward spots
+
+### Mistake 6: requiring impossible signals
+
+For example, requiring a project-specific file that is generated only
+in CI or only in a subset of repositories will make your template
+unreliable.
+
+---
+
+## 10) Recommended prompt pattern for AI generation
+
+Use this when asking an AI to generate a Finder template:
+
+\`\`\`text
+Create a Finder template as a JSON5 file for <project type>.
+Use a custom template file in ~/.finder/templates/ or ./.finder/templates/.
+Requirements:
+- match folders with name "*" unless a narrower pattern is necessary
+- require the smallest set of meaningful files/folders
+- include tags and a clear description
+- allow optional files if needed
+- do not use overly strict name filters
+- ensure the structure is valid Finder JSON5
+- include examples of required files and nested folders if relevant
+- add a realistic command check only when needed
+- keep the template robust and not prone to false positives
+\`\`\`
+
+---
+
+## 11) Final rule
+
+A good Finder template should be:
+
+- valid JSON5
+- minimal but discriminative
+- not too broad
+- not too narrow
+- easy to debug
+- easy to maintain
+
+If you are unsure, prefer a simple template with the most reliable
+markers:
+
+- folder names
+- known files
+- known subfolders
+- one or two strong signs of the project type
+
+---
+
+## 12) One minimal example to copy
+
+\`\`\`json5
+{
+ description: "Simple project template",
+ name: "*",
+ files: [
+ "package.json",
+ {
+ name: "src",
+ existence: "optional",
+ },
+ ],
+ tags: ["project"],
+}
+\`\`\`
+
+This is intentionally simple and often a good starting point for custom
+templates.
+
+---
+
+## 13) When writing a new template for this repo
+
+If the task is to add a template to this project, keep in mind:
+
+- put it in the template directory used by the runtime
+- follow the repo’s JSON5 style closely
+- avoid accidental false positives
+- validate with finder checks after creation
+
+This repo has built-in examples in the templates folder and the project
+docs in the root files.
+ `;export{n as default};
diff --git a/cmd/findergen/frontend/assets/_virtual_page-markdown_changelog.js b/cmd/findergen/frontend/assets/_virtual_page-markdown_changelog.js
new file mode 100644
index 00000000..a6dd1ca7
--- /dev/null
+++ b/cmd/findergen/frontend/assets/_virtual_page-markdown_changelog.js
@@ -0,0 +1 @@
+const e={id:"changelog",type:"markdown",html:'CHANGELOG The whole finder CHANGELOG
Newest added Author field to finder templates added a subcommand to validate templates install templates from the web 0.3.17 - 13.09.2026 added regex support added mcapp minecraft world dashboard fixed buildcheck workflow added markdown notes to the templates which can be viewed in the web UI added command to view count of locations which where found added option to view the cache size updated the regex creator fixed a bug in the argparser lib where global flag where not found in subcommands Commits 8e63902 Update frontend assets, templates & deps40751f1 Add min_version, tags and mdnote to templates0191e23 Update finder templates to v0.3.17The diff also includes git parser cleanup and compatibility updates in the Go scanner code, plus dependency and generated site data refreshes that match the new library version.
86252b8 Add markdown notes and regex tooling7927ca0 Add Monaco editor and template view updates8dbd64a Add template markdown preview01c3ad7 Switch markdown notes to mdnotedc91ca1 Move template site under npm/sitecd28c08 Highlight Finder template patterns020dccf Add prettyJson util and normalize template inputImprove template input validation in npm/hub/lib/templates.ts: stricter type checks, parse-and-normalize JSON content before applying the byte-size limit, normalize/trim/lowercase tags and deduplicate them, and ensure saved content is non-null. Also apply minor formatting/TS fixes.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
18d87ce Split user page into client componentf0cde71 Add template highlighting and styling refresh7ec7ef5 Add template discovery polish and templates0bf8cfd Add gitdb package to export Git repos9c45e9d Add Nginx dashboard service3b40048 Add static site and type compatibility fixesa9a5be5 Add template tags and discovery UI141f271 Add recovery-checksum auth flow and account APIse45bbfd Fix template site Docker builddc27baa Add local dev mailbox, auth flows, UI & Docker fix19a1da4 Add Docker setup for app servicesa31ded0 Update backend asset stats; fix note preview closureaa4d6be Add cache count and size commands6629fab Add Markdown note support to creatora356afe Render markdown notes in template viewer07b256a Add match modes and share/restore UIUI: add a mode-selector (exact, startsWith, endsWith, contains), Base64 export field, copy button and restore input + feedback; update placeholders and tester hints. Styles added in regexcreator.css for selector and share/restore widgets. Logic: regexcreator.tsx wires mode buttons, share serialization (Base64 UTF‑8), clipboard copy, restore parsing and UI feedback. Core: src/lib/regex.ts adds MatchMode and mode option, assembles anchored/negated patterns per mode and returns the RegExp accordingly. Improves flexibility for file-extension and substring matching and allows saving/loading editor state.
f9d9fe7 fixed a bug in the argparser lib where global flag where not found in subcommandsf235ce4 Potential fix for code scanning alert no. 6: Arbitrary file access during archive extraction ("Zip Slip")0e98acb update vite6a579fc Potential fix for code scanning alert no. 5: Prototype-polluting function810b2b4 Potential fix for code scanning alert no. 4: Prototype-polluting functionf65a04f fix permission
0.3.16 - 08.09.2026 added cache creation added config editor added cache viewer Moved every site on the finder website to TSX instead add code to the ssg plugin which runs on build time - 07.09.2026 the search function should return an array of added size plugin for the frontend added syntax highliting for the markdown codeblocks updated some templates renamed checksums file in the release from SHA256SUMS to SHA256SUMS.txt added some helpfule vite plugins added file content checksum check fixed that to old template warning because it showed up the finder and the template where in the same version added SHA512 checksums 0.3.15 - 02.09.2025 added new Templates added a HTML Server with go backend to create and view all templates added json output support to finder, just add --json to command added tags and min version to a lot of the templates the Templates are now saved as minified json 0.3.14 - 25.06.2026 0.3.13 - 22.06.2026 0.3.12 - 22.06.2026 0.3.11 - 10.04.2026 0.3.10 - 10.04.2026 0.3.9 - 09.04.2026 0.3.8 - 27.02.2026 0.3.7 - 24.02.2026 0.3.6 - 24.02.2026 added Size option to the Templates updated README File updates CUSTOM_TEMPLATES added a new entry to the Template: min finder version which should added Version package 0.3.5 - 18.02.2026 made a Folder public for public finder modules added Template for added Time which the searching took resturctured the argparser added version Command added Argparser package removed loading templates directly from the Console or via a custom filepath! json output is broken in this Release, but will we fixed in future Releases formatted the tag Search output correctly 0.3.4 - 16.02.2026 changed Go Version to 1.18 fixed Search on all Drives on Windows from 0.3.3, it added Async Search made color package public 0.3.3 - 15.02.2026 added JSON Shema added File Options Search on all Drives on Windows added Tag Search 0.3.2 - 15.02.2026 0.3.1 - 15.02.2026 ✨ Features Runtime Custom Template System Custom Templates without Recompilation : Users can now create templates in ~/.finder/templates/ or ./.finder/templates/ without recompiling the programAutomatic Template Discovery : New .json5 files are automatically detected and loaded on startupUser Templates Override : User-defined templates can override built-in templates with the same namePrecedence System : User templates take precedence over built-in templatesCLI Reorganization & Modernization Modular CLI Architecture : Complete restructuring from monolithic designparser.go: Dedicated argument parsing logichandlers.go: Isolated command handlerscommands.go: Clean routing (reduced from 300+ to 60 lines)Command Aliases : New shorter forms for common commandsh, -h, --help in addition to helpls in addition to list--file in addition to -f--config in addition to -cCLIOptions Struct : Structured argument representation with predicates.IsHelp(), .IsList(), .IsCheck(), .IsFileLoad(), .IsDirectLoad(), .IsTemplateSearch().GetFileArg(), .GetDirectLoadArg(), .GetTemplateName()Verbose Mode : New --verbose flag for extended outputEnhanced Help System Better Help Structure : Organized into COMMANDS, FILE & CONFIG OPERATIONS, GLOBAL FLAGSTable Layout : Improved readability with consistent formattingCustom Templates Info : Documentation for user template setupDetailed Descriptions : Each command with clear explanationEnhanced List & Check Commands Separated Display : Built-in and custom templates are listed separatelyTemplate Sources : Source attribute shows whether template is built-in or customHelpful Hints : Paths for custom template setup are displayedImproved Validation : Check command validates with source information🧪 Testing 40+ new unit tests for CLI parser logicParser Tests : Comprehensive coverage for command recognition, flag parsing, argument extractionIntegration Tests : End-to-end tests for command executionRouting Tests : Tests for handler mappingError Handling Tests : Validation of error handling and user feedback📖 Documentation ARCHITECTURE.md : Detailed technical documentation of the new CLI structureREORGANIZATION.md : Comprehensive before/after comparison and explanationQUICKSTART.md : Practical guide for adding new commandsCUSTOM_TEMPLATES.md : User guide for custom template creationInline Code Comments : Improved code documentation🔧 Infrastructure Enhanced Template Loader (templateloader.go)LoadUserTemplates(): Discovers user templates from filesystemJSONtemplateLoaderWithUserTemplates(): Intelligent loading with user overrideLoadAllWithUserTemplates(): Combined built-in + custom template discoveryTemplate Override Mechanism : User templates can replace built-in templatesGraceful Error Handling : Missing user template directories are not fatal🎯 Quality Improvements Clean Code Structure : Single Responsibility Principle consistently appliedBetter Testability : Each module can be tested in isolationExtensibility : New commands can be added in 5 simple stepsBackward Compatibility : External API (HandleCommand()) unchanged👥 User Experience Better Error Messages : Context-sensitive error messages with suggestionsHelpful Hints : Tips for common tasks (e.g., where to place templates)Flexible Command Syntax : Multiple synonyms for each commandConsistent Output Formatting : Unified design across all commandsNo Recompilation Required : Custom templates are loaded at runtimeEfficient Template Discovery : Fast filesystem traversalMinimal Overhead : Template loading has negligible performance impact🐛 Bug Fixes & Improvements Improved error handling in template loading Better handling of missing or malformed user templates Consistent error messages across all commands Fixed edge cases in CLI argument parsing 📝 Breaking Changes No Breaking Changes : All existing commands work unchangedInternal structure completely refactored, but public API remains stable 🙏 Highlights This version brings the biggest improvement since 0.2.0:
Users can now create their own templates Codebase is more maintainable and extensible Test coverage drastically improved 0.3.0 - 23.01.2026 Template System & CLI Foundations
0.2.0 - 23.01.2026 More Templates Better Console Output Help Message
0.1.0 - 17.11.2025 Programm Init
0.0.0 - 30.11.2025 the start
'};export{e as default};
diff --git a/cmd/findergen/frontend/assets/_virtual_page-markdown_readme.js b/cmd/findergen/frontend/assets/_virtual_page-markdown_readme.js
new file mode 100644
index 00000000..a14dc217
--- /dev/null
+++ b/cmd/findergen/frontend/assets/_virtual_page-markdown_readme.js
@@ -0,0 +1,124 @@
+const s={id:"readme",type:"markdown",html:`finder
Finder is a lightweight command-line tool written in Go to locate projects and files based on predefined folder/file structure templates. It ships with 370+ built-in templates covering a huge range of technologies, frameworks, and services — and you can add your own without recompiling.
Current version: 0.3.17
Features Template-based search — find projects by folder/file structureCustom templates — drop .json5 files intoRegex support — use regular expressions in template patternsAsync search — searches all drives (Windows) or root /Caching — create and reuse a cache for significantly fasterJSON output — pipe results into other tools with --json.Tag search — browse templates by tag (-t).Binary search — find executables in your $PATH (-b).File size & checksum validation — templates can requireCommand validation — templates can run a shell command afterWeb UI (findergen) — a built-in HTTP server for browsing,Cross-platform — works on Windows, Linux, and macOS.Requirements Binaries The repository contains several binaries:
Binary Description finderMain CLI — search for projects and files using templates findergenHTTP server & web UI for template management, cache viewer, config editor csfBuild helper — compile scripts, go install with CGO, git repo pack/restore testerTemplate test tool — validates template files
Installation Build from source go build ./cmd/finderOr install directly (Go 1.18+):
go install github.com/shadowdara/finder/cmd/finder@latestThe produced binary is finder (on Windows finder.exe).
Build all binaries
+build.bat
+
+
+go build ./cmd/finder
+go build ./cmd/findergen
+go build ./cmd/testerOr using make:
make
+make release
+make install Usage Basic search finder <template-name>Find Git repositories:
finder gitCommands Command Aliases Description finderSearch for projects matching a template finder checkValidate all built-in and custom templates finder validatevalValidate a single template file finder listlsList all available templates finder tagstagShow all tags in the console finder -tSearch for templates by tag finder -bSearch for executables in your $PATH finder cpPrint the path to the global config file finder version-v, vPrint the current version finder templatetplSearch using an explicit template name
Global flags Flag Aliases Description --json-jOutput results as JSON --verbose-vvEnable verbose output
Cache flags Flag Aliases Description --cache-cUse the existing cache instead of searching --create-cache-ccCreate a new cache --create-cache-db-ccdCreate a Git database from cache data
Example
+finder react
+
+
+finder --json react
+
+
+finder --create-cache git
+
+
+finder --cache git
+
+
+finder -t python
+
+
+finder listValidate a single template
+finder validate my-template.json5
+
+
+finder validate go
+
+
+finder validate templates/go.json5 templates/django.json5
+
+
+finder val my-template.json5If a template file is not plain JSON and only parses after the JSON5 preprocessor runs, a warning is printed so you know the template depends on JSON5 features (e.g. unquoted keys):
File Result Warning
+my-template.json5 OK (File) Template is not plain JSON - it needs the JSON5 preprocessor to be parsedTemplates Built-in templates 370+ templates are shipped in templates/ and compiled into internal/templates/. They cover frameworks, languages, databases, CI/CD systems, cloud services, AI/ML tools, and much more.
Templates are JSON5 files. A minimal template:
{
+ name: "*" ,
+ folders: [ { name: ".git" } ] ,
+} A full template with all supported fields:
{
+ min_version: "0.3.6" ,
+ description: "My Custom Project Type" ,
+ name: "*" ,
+ tags: [ "node" , "typescript" ] ,
+ folders: [
+ {
+ name: "src" ,
+ folders: [ ] ,
+ files: [ "index.ts" ] ,
+ } ,
+ ] ,
+ files: [
+ "package.json" ,
+ {
+ name: "*.ts" ,
+ existence: "required" ,
+ size: {
+ min: 1 ,
+ min_size_type: "KB" ,
+ } ,
+ } ,
+ ] ,
+ command: "" ,
+ invert_command: false ,
+ size: {
+ min: 10 ,
+ min_size_type: "KB" ,
+ } ,
+} Custom templates Place your own .json5 template files in:
OS Path Windows \`%USERPROFILE%\\.finder\\templates\` Linux ~/.finder/templates/macOS ~/.finder/templates/
Or in the project-local directory:
./.finder/templates/User templates take precedence over built-in templates with the same name. See \`CUSTOM_TEMPLATES.md\` for the full guide.
Pattern matching (exact, regex, glob) Since v0.3.17 , every name pattern in a template — the top-level name, every file name, and every folder name (including nested folders) — is resolved by a 3-tier matching strategy :
Priority Method Applies when 1 Exact string equality pattern equals the name verbatim 2 Go regex (regexp.MatchString) pattern compiles as a valid regex (RE2) 3 Glob (path.Match) pattern is not a valid regex (e.g. *.ts)
This means:
"src" → exact match"^project-[0-9]+$" → valid regex, matches project-123, project-42, …"*.ts" → not a valid regex → glob fallback, matches any .ts file"^(main|app|server)\\.py$" → valid regex, matches exactly main.py,Regex patterns work in all name fields:
+{
+ name: "^project-[0-9]+$" ,
+ min_version: "0.3.17" ,
+ files: [
+ {
+
+ name: "^(main|app|server)\\\\.py$" ,
+ existence: "required" ,
+ } ,
+ ] ,
+ folders: [
+ {
+
+ name: "^(src|lib|pkg)$" ,
+ } ,
+ ] ,
+} Note: Go regex is RE2 — no backreferences and no lookahead/lookbehind. If your pattern uses unsupported syntax, it fails to compile and falls back to glob matching.
If your template relies on regex patterns, set "min_version": "0.3.17" to indicate the minimum Finder version required.
Config Since v0.3.15 , finder has a global config file at ~/.finder/config.json5. If the file does not exist, defaults are used:
{
+ port: 8080 ,
+ cache: false ,
+ create_cache_db: false ,
+ finder_instances: 8 ,
+} Key Type Default Description portint 13420HTTP server port for findergen cachebool falseEnable cache by default createcache dbbool falseCreate a Git database from cache data finder_instancesint 8Max parallel instances when creating cache
For a visual config editor, visit https://shadowdara.github.io/finder/configeditor .
Web UI (findergen) findergen starts a local HTTP server with a web interface for:
Template Creator — create and edit JSON5 templates visuallyTemplate Viewer — browse all built-in and custom templatesConfig Editor — edit config.json5 through the browserCache Viewer — inspect cached search resultsRegex Creator — build and test regular expressions for templatesMinecraft World Dashboard — view Minecraft worlds from the cache
+./findergen
+
+
+./findergen --port 3000
+
+
+./findergen worldsProject structure finder/
+├── cmd/
+│ ├── finder/ # Main CLI binary
+│ ├── findergen/ # Web UI server binary
+│ ├── csf/ # Build helper binary
+│ └── tester/ # Template test binary
+├── internal/
+│ ├── bt/ # Build tools (script compiler, git repo)
+│ ├── cache/ # Cache system & Git DB
+│ ├── cli/ # CLI command handling
+│ ├── config/ # Configuration loading
+│ ├── finderversion/ # Version constants
+│ ├── history/ # Search history
+│ ├── loader/ # File loading utilities
+│ ├── mcapp/ # Minecraft world data
+│ ├── search/ # Core search logic & binary check
+│ ├── structure/ # Folder/template structure parsing
+│ └── templates/ # Compiled templates + loader
+├── pub/
+│ ├── argparser/ # Argument parsing library
+│ ├── color/ # Terminal color utilities
+│ ├── fsd/ # Filesystem directory utilities
+│ ├── goansi/ # ANSI escape codes
+│ ├── json5/ # JSON5 parser
+│ └── version/ # Semantic version comparison
+├── templates/ # Source JSON5 templates (370+)
+└── finder-template-generator-ssg/ # Static site generator for docsDevelopment Run tests go test ./...Generate coverage report go test -coverprofile=coverage ./...
+go tool cover -html=coverageBuild go build ./cmd/finderValidate templates go run ./cmd/finder checkList all templates go run ./cmd/finder listContributing Found a missing or inaccurate template? Please open an issue. Add new templates via PR. Keep them in JSON5 and provide a short Feel free to contribute code improvements or new features. Roadmap License See \`LICENSE\` .
Project: https://github.com/shadowdara/finder Website: https://shadowdara.github.io/finder
The Project fs-tools was more or less the prototype for finder.
Info Video (a Youtube Video )
`};export{s as default};
diff --git a/cmd/findergen/frontend/assets/cacheviewer.js b/cmd/findergen/frontend/assets/cacheviewer.js
index 7600aeec..fca2201a 100644
--- a/cmd/findergen/frontend/assets/cacheviewer.js
+++ b/cmd/findergen/frontend/assets/cacheviewer.js
@@ -1 +1 @@
-import{j as e,r as f,e as y}from"./main_entry.js";const S=new URLSearchParams(window.location.search),T=S.get("name");let k="/api/template/load/cache?name="+T;function A(a){w(a),g(a)}async function g(a){try{const t=await fetch(k);if(!t.ok)throw new Error(`HTTP ${t.status}`);const n=await t.json();$(a,n),H(a)}catch(t){console.error(t),C(a)}}function w(a){a.innerHTML=e("main",{class:"loc-viewer"},e("p",{class:"loc-loading"},"Loading Projects…"))}function C(a){var t;a.innerHTML=e("main",{class:"loc-viewer error"},e("div",{class:"error-card"},e("span",{class:"eyebrow"},"ERROR"),e("h1",null,"Projektordner konnten nicht geladen werden."),e("p",null,"Der Server ist momentan nicht erreichbar."),e("button",{class:"loc-btn",id:"loc-retry",type:"button"},"Retry"))),(t=a.querySelector("#loc-retry"))==null||t.addEventListener("click",()=>{w(a),g(a)})}function j(a){return a.map(t=>{const n=t.replace(/\\/g,"/"),c=n.match(/^([A-Za-z]:)\/(.*)$/),i=c?c[1].toUpperCase():"?",r=n.split("/").filter(Boolean),o=r[r.length-1]??n;return{full:n,drive:i,name:o,depth:r.length,nested:!1}})}function q(a){const t=a.map(n=>n.full);for(const n of a)n.nested=t.some(c=>c!==n.full&&n.full.startsWith(c+"/"))}function x(a){const t=new Date(a);return isNaN(t.getTime())?a:t.toLocaleString("de-DE",{dateStyle:"medium",timeStyle:"short"})}function $(a,t){const n=j(t.locations);q(n);const c=[...new Set(n.map(r=>r.drive))].sort(),i=n.filter(r=>r.nested).length;a.innerHTML=e("main",{class:"loc-viewer"},e("header",{class:"loc-header"},e("div",null,e("span",{class:"eyebrow"},e("a",{href:"../"},"HOME")),e("h1",null,"Projektordner"),e("p",null,"Zuletzt gescannt: ",x(t.date))),e("div",{class:"loc-stats"},e("div",{class:"loc-stat"},e("strong",null,n.length),e("span",null,"Ordner")),f(c.map(r=>e("div",{class:"loc-stat"},e("strong",null,"$",n.filter(o=>o.drive===r).length),e("span",null,"$",y(r)))).join("")),e("div",{class:"loc-stat"},e("strong",null,i),e("span",null,"Verschachtelt")))),e("section",{class:"loc-toolbar"},e("div",{class:"loc-search"},e("span",null,"⌕"),e("input",{id:"loc-search",type:"search",placeholder:"Ordner suchen...",autocomplete:"off"})),e("div",{class:"loc-filters"},e("button",{class:"loc-filter active","data-drive-filter":"all",type:"button"},"Alle ",e("span",null,n.length)),f(c.map(r=>e("button",{class:"loc-filter","data-drive-filter":"${escapeHtml(drive)}",type:"button"},"$",y(r)," ",e("span",null,"$",n.filter(o=>o.drive===r).length))).join(""))),e("label",{class:"loc-toggle"},e("input",{type:"checkbox",id:"loc-hide-nested"}),"Nur Top-Level anzeigen")),e("section",{class:"loc-grid",id:"loc-grid"},f(D(n))),e("div",{class:"loc-empty",id:"loc-empty",hidden:!0},"Keine Ordner gefunden."))}function D(a){return a.map(t=>e("article",{class:"loc-card","data-drive":t.drive,"data-nested":t.nested,"data-search":t.full.toLowerCase(),tabindex:"0",role:"button","data-copy":t.full,"aria-label":`Pfad ${t.full} kopieren`},e("div",{class:"loc-card-header"},e("span",{class:"loc-drive-badge"},t.drive),e("h3",{class:"loc-name"},t.name),t.nested&&e("span",{class:"loc-nested-badge"},"verschachtelt")),e("p",{class:"loc-path"},t.full),e("div",{class:"loc-card-footer"},e("span",{class:"loc-depth"},t.depth," Ebenen"),e("button",{class:"loc-copy-btn",type:"button","data-copy":t.full},"Copy")))).join("")}function H(a){const t=a.querySelector("#loc-search"),n=[...a.querySelectorAll("[data-drive-filter]")],c=a.querySelector("#loc-hide-nested"),i=a.querySelector("#loc-empty");let r="all";function o(){return[...a.querySelectorAll(".loc-card")]}function u(){var v;const l=(t==null?void 0:t.value.trim().toLowerCase())??"",s=(c==null?void 0:c.checked)??!1;let d=0;for(const p of o()){const b=!l||((v=p.dataset.search)==null?void 0:v.includes(l)),L=r==="all"||p.dataset.drive===r,E=!s||p.dataset.nested==="false",m=b&&L&&E;p.hidden=!m,m&&d++}i&&(i.hidden=d!==0)}t==null||t.addEventListener("input",u),c==null||c.addEventListener("change",u),n.forEach(l=>{l.addEventListener("click",()=>{n.forEach(s=>s.classList.remove("active")),l.classList.add("active"),r=l.dataset.driveFilter??"all",u()})});async function h(l){const s=l.dataset.copy??"";try{await navigator.clipboard.writeText(s);const d=l.textContent;l.tagName==="BUTTON"&&(l.textContent="Copied ✓",setTimeout(()=>l.textContent=d,1200))}catch(d){console.error("Kopieren fehlgeschlagen",d)}}a.querySelectorAll(".loc-copy-btn").forEach(l=>{l.addEventListener("click",s=>{s.stopPropagation(),h(l)})}),o().forEach(l=>{l.addEventListener("click",s=>{s.target.closest(".loc-copy-btn")||h(l)})})}export{A as default};
+import{j as e,r as f,e as y}from"./main_entry.js";const S=new URLSearchParams(window.location.search),T=S.get("name");let k="/api/template/load/cache?name="+T;function A(a){w(a),g(a)}async function g(a){try{const t=await fetch(k);if(!t.ok)throw new Error(`HTTP ${t.status}`);const n=await t.json();$(a,n),H(a)}catch{C(a)}}function w(a){a.innerHTML=e("main",{class:"loc-viewer"},e("p",{class:"loc-loading"},"Loading Projects…"))}function C(a){var t;a.innerHTML=e("main",{class:"loc-viewer error"},e("div",{class:"error-card"},e("span",{class:"eyebrow"},"ERROR"),e("h1",null,"Projektordner konnten nicht geladen werden."),e("p",null,"Der Server ist momentan nicht erreichbar."),e("button",{class:"loc-btn",id:"loc-retry",type:"button"},"Retry"))),(t=a.querySelector("#loc-retry"))==null||t.addEventListener("click",()=>{w(a),g(a)})}function j(a){return a.map(t=>{const n=t.replace(/\\/g,"/"),r=n.match(/^([A-Za-z]:)\/(.*)$/),i=r?r[1].toUpperCase():"?",c=n.split("/").filter(Boolean),o=c[c.length-1]??n;return{full:n,drive:i,name:o,depth:c.length,nested:!1}})}function q(a){const t=a.map(n=>n.full);for(const n of a)n.nested=t.some(r=>r!==n.full&&n.full.startsWith(r+"/"))}function x(a){const t=new Date(a);return isNaN(t.getTime())?a:t.toLocaleString("de-DE",{dateStyle:"medium",timeStyle:"short"})}function $(a,t){const n=j(t.locations);q(n);const r=[...new Set(n.map(c=>c.drive))].sort(),i=n.filter(c=>c.nested).length;a.innerHTML=e("main",{class:"loc-viewer"},e("header",{class:"loc-header"},e("div",null,e("span",{class:"eyebrow"},e("a",{href:"../"},"HOME")),e("h1",null,"Projektordner"),e("p",null,"Zuletzt gescannt: ",x(t.date))),e("div",{class:"loc-stats"},e("div",{class:"loc-stat"},e("strong",null,n.length),e("span",null,"Ordner")),f(r.map(c=>e("div",{class:"loc-stat"},e("strong",null,"$",n.filter(o=>o.drive===c).length),e("span",null,"$",y(c)))).join("")),e("div",{class:"loc-stat"},e("strong",null,i),e("span",null,"Verschachtelt")))),e("section",{class:"loc-toolbar"},e("div",{class:"loc-search"},e("span",null,"⌕"),e("input",{id:"loc-search",type:"search",placeholder:"Ordner suchen...",autocomplete:"off"})),e("div",{class:"loc-filters"},e("button",{class:"loc-filter active","data-drive-filter":"all",type:"button"},"Alle ",e("span",null,n.length)),f(r.map(c=>e("button",{class:"loc-filter","data-drive-filter":"${escapeHtml(drive)}",type:"button"},"$",y(c)," ",e("span",null,"$",n.filter(o=>o.drive===c).length))).join(""))),e("label",{class:"loc-toggle"},e("input",{type:"checkbox",id:"loc-hide-nested"}),"Nur Top-Level anzeigen")),e("section",{class:"loc-grid",id:"loc-grid"},f(D(n))),e("div",{class:"loc-empty",id:"loc-empty",hidden:!0},"Keine Ordner gefunden."))}function D(a){return a.map(t=>e("article",{class:"loc-card","data-drive":t.drive,"data-nested":t.nested,"data-search":t.full.toLowerCase(),tabindex:"0",role:"button","data-copy":t.full,"aria-label":`Pfad ${t.full} kopieren`},e("div",{class:"loc-card-header"},e("span",{class:"loc-drive-badge"},t.drive),e("h3",{class:"loc-name"},t.name),t.nested&&e("span",{class:"loc-nested-badge"},"verschachtelt")),e("p",{class:"loc-path"},t.full),e("div",{class:"loc-card-footer"},e("span",{class:"loc-depth"},t.depth," Ebenen"),e("button",{class:"loc-copy-btn",type:"button","data-copy":t.full},"Copy")))).join("")}function H(a){const t=a.querySelector("#loc-search"),n=[...a.querySelectorAll("[data-drive-filter]")],r=a.querySelector("#loc-hide-nested"),i=a.querySelector("#loc-empty");let c="all";function o(){return[...a.querySelectorAll(".loc-card")]}function u(){var v;const l=(t==null?void 0:t.value.trim().toLowerCase())??"",s=(r==null?void 0:r.checked)??!1;let d=0;for(const p of o()){const b=!l||((v=p.dataset.search)==null?void 0:v.includes(l)),L=c==="all"||p.dataset.drive===c,E=!s||p.dataset.nested==="false",m=b&&L&&E;p.hidden=!m,m&&d++}i&&(i.hidden=d!==0)}t==null||t.addEventListener("input",u),r==null||r.addEventListener("change",u),n.forEach(l=>{l.addEventListener("click",()=>{n.forEach(s=>s.classList.remove("active")),l.classList.add("active"),c=l.dataset.driveFilter??"all",u()})});async function h(l){const s=l.dataset.copy??"";try{await navigator.clipboard.writeText(s);const d=l.textContent;l.tagName==="BUTTON"&&(l.textContent="Copied ✓",setTimeout(()=>l.textContent=d,1200))}catch{}}a.querySelectorAll(".loc-copy-btn").forEach(l=>{l.addEventListener("click",s=>{s.stopPropagation(),h(l)})}),o().forEach(l=>{l.addEventListener("click",s=>{s.target.closest(".loc-copy-btn")||h(l)})})}export{A as default};
diff --git a/cmd/findergen/frontend/assets/config.js b/cmd/findergen/frontend/assets/config.js
new file mode 100644
index 00000000..315db9fb
--- /dev/null
+++ b/cmd/findergen/frontend/assets/config.js
@@ -0,0 +1 @@
+const e={id:"docs/config",type:"markdown",html:'Config fields Port Port for the findergen server to view and create templates.
Cache When set to true, the results of will be saved as a cache and can then be used afterwards
Create Cache Database When set to true, the cache data of finder will be saved in a Git DB. Git is required for this.
Finder Instances Finder instances which will run at the same time when creating cache for all templates
'};export{e as default};
diff --git a/cmd/findergen/frontend/assets/configeditor.js b/cmd/findergen/frontend/assets/configeditor.js
index 2681b525..19dbb5e5 100644
--- a/cmd/findergen/frontend/assets/configeditor.js
+++ b/cmd/findergen/frontend/assets/configeditor.js
@@ -1 +1 @@
-import{r as L,j as a,F as O}from"./main_entry.js";const J=new Map;function y(e,t){J.set(e,t)}function j(e){return J.get(e)}function T(e){return typeof e=="string"?L(e):e}function r(e){return e==null?"":String(e)}function $(e,t){return t!==void 0?t:e.default}function C(e,t,n){const c=j(e.type)??_,l=$(e,n);if(e.type==="group")return c(e,t,l);const d=e.default!==void 0,h=c(e,t,l);return a("div",{class:"cfg-field","data-field-key":r(t)},a("div",{class:"cfg-field-head"},a("label",{class:"cfg-label",for:r(t)},e.label??e.key,e.required?a("span",{class:"cfg-required",title:"Pflichtfeld"},"*"):""),d&&!e.readonly?a("button",{type:"button",class:"cfg-reset-btn","data-action":"reset-field","data-reset-for":r(t),"data-default":JSON.stringify(e.default),title:"reset to default"},"↺"):""),e.description?a("p",{class:"cfg-desc"},e.description):"",h,d?a("p",{class:"cfg-default"},"Default: ",a("code",null,JSON.stringify(e.default))):"")}y("string",(e,t,n)=>a("input",{id:r(t),type:"text",name:r(t),"data-path":r(t),class:"cfg-input",placeholder:r(e.placeholder),value:r(n),readonly:e.readonly,required:e.required}));y("textarea",(e,t,n)=>a("textarea",{id:r(t),name:r(t),"data-path":r(t),className:"cfg-input cfg-textarea",rows:e.rows??4,placeholder:r(e.placeholder),readonly:e.readonly},n!=null?String(n):""));y("number",(e,t,n)=>a("input",{id:r(t),type:"number",name:r(t),"data-path":r(t),"data-type":"number",className:"cfg-input",min:r(e.min),max:r(e.max),step:r(e.step??"any"),value:r(n),readonly:e.readonly,required:e.required}));y("boolean",(e,t,n)=>a("label",{className:"cfg-switch"},a("input",{id:r(t),type:"checkbox",name:r(t),"data-path":r(t),"data-type":"boolean",checked:!!n,disabled:e.readonly}),a("span",{className:"cfg-switch-track"})));y("select",(e,t,n)=>a("select",{id:r(t),name:r(t),"data-path":r(t),className:"cfg-input",disabled:e.readonly},(e.options??[]).map(c=>a("option",{value:r(c.value),selected:c.value===n},c.label))));y("multiselect",(e,t,n)=>{const c=new Set(Array.isArray(n)?n.map(String):[]);return a("select",{id:r(t),name:r(t),"data-path":r(t),"data-type":"multiselect",className:"cfg-input",multiple:!0,disabled:e.readonly},(e.options??[]).map(l=>a("option",{value:r(l.value),selected:c.has(l.value)},l.label)))});y("color",(e,t,n)=>a("div",{className:"cfg-color-row"},a("input",{id:r(t),type:"color",name:r(t),"data-path":r(t),className:"cfg-color-swatch",value:r(n)||"#000000",disabled:e.readonly}),a("input",{type:"text",className:"cfg-input","data-color-text-for":r(t),value:r(n),readonly:e.readonly})));y("date",(e,t,n)=>a("input",{id:r(t),type:"date",name:r(t),"data-path":r(t),className:"cfg-input",value:r(n),readonly:e.readonly}));y("json",(e,t,n)=>a("textarea",{id:r(t),name:r(t),"data-path":r(t),"data-type":"json",className:"cfg-input cfg-textarea cfg-mono",rows:e.rows??6,readonly:e.readonly},n!==void 0?JSON.stringify(n,null,2):""));y("group",(e,t)=>{const n=(e.fields??[]).map(c=>{var l,d;return T(C(c,`${t}.${c.key}`,((l=e.value)==null?void 0:l[c.key])??((d=e.default)==null?void 0:d[c.key])))});return a("fieldset",{class:"cfg-group","data-field-key":r(t)},a("legend",{class:"cfg-group-legend"},e.label??e.key),e.description?a("p",{class:"cfg-desc"},e.description):"",a("div",{class:"cfg-group-body"},n))});function _(e,t,n){return a(O,null,a("p",{class:"cfg-warning"},"Unbekannter Feldtyp ",String(e.type)," — Rohdaten-Editor als Fallback."),a("textarea",{id:r(t),name:r(t),"data-path":r(t),"data-type":"json",className:"cfg-input cfg-textarea cfg-mono",rows:4},n!==void 0?JSON.stringify(n,null,2):""))}function P(e,t={}){const n=t.id??"config-editor",c=t.values??{},l=e.fields.map(d=>T(C(d,d.key,c[d.key])));return a(O,null,a("div",{className:"cfg-editor",id:n,"data-save-url":e.saveUrl??"","data-save-method":e.saveMethod??"POST"},a("div",{className:"cfg-toolbar"},a("div",{className:"cfg-title-wrap"},e.title?a("h2",{class:"cfg-title"},e.title):"",e.description?a("p",{class:"cfg-editor-desc"},e.description):""),a("div",{className:"cfg-actions"},a("button",{type:"button",className:"cfg-btn","data-action":"reset-all"},"Reset all"),a("button",{type:"button",className:"cfg-btn","data-action":"copy"},"copy JSON"),a("button",{type:"button",className:"cfg-btn cfg-btn-primary","data-action":"save"},"Save"))),a("p",{className:"cfg-status","data-status":!0,hidden:!0}),a("form",{className:"cfg-form","data-config-form":!0},l),a("details",{className:"cfg-preview"},a("summary",null,"JSON-Preview"),a("pre",{className:"cfg-json-preview","data-json-preview":!0}))))}function D(e,t={}){const n=document.getElementById(e);if(!n)throw new Error(`setupConfigEditor: Element "${e}" nicht gefunden.`);const c=n,l=n.querySelector("[data-config-form]"),d=n.querySelector("[data-status]"),h=n.querySelector("[data-json-preview]");if(!l)throw new Error("setupConfigEditor: [data-config-form] nicht gefunden - falsches Element?");l.addEventListener("submit",s=>s.preventDefault());function q(s,o,u){const p=o.split("."),b=new Set(["__proto__","constructor","prototype"]);if(p.some(g=>b.has(g)))return;let i=s;for(let g=0;gu.selected).map(u=>u.value);if(o==="number"){const u=parseFloat(s.value);return isNaN(u)?null:u}if(o==="json")try{return s.value.trim()===""?null:JSON.parse(s.value)}catch{return{__parseError:!0,raw:s.value}}return s.value}function E(s,o){const u=s.getAttribute("data-type");if(s.type==="checkbox"){s.checked=!!o;return}if(s.tagName==="SELECT"&&s.multiple){const p=new Set(Array.isArray(o)?o.map(String):[]);Array.from(s.options).forEach(b=>{b.selected=p.has(b.value)});return}if(u==="json"){s.value=o==null?"":JSON.stringify(o,null,2);return}s.value=o==null?"":String(o)}function k(){return Array.from(l.querySelectorAll("input[data-path], select[data-path], textarea[data-path]"))}function N(){const s={};return k().forEach(o=>{q(s,o.getAttribute("data-path"),F(o))}),s}function v(){h&&(h.textContent=JSON.stringify(N(),null,2))}let x;function m(s,o="info"){d&&(d.textContent=s,d.hidden=!1,d.setAttribute("data-kind",o),window.clearTimeout(x),x=window.setTimeout(()=>d.hidden=!0,3500))}n.querySelectorAll('input[type="color"]').forEach(s=>{const o=n.querySelector(`[data-color-text-for="${s.id}"]`);o&&(s.addEventListener("input",()=>{o.value=s.value,v()}),o.addEventListener("input",()=>{/^#[0-9a-fA-F]{6}$/.test(o.value)&&(s.value=o.value),v()}))});function S(){v()}function A(s){var p,b;const o=s.target.closest("[data-action]");if(!o)return;const u=o.getAttribute("data-action");if(u==="reset-field"){const i=o.getAttribute("data-reset-for"),g=JSON.parse(o.getAttribute("data-default")),f=l.querySelector(`input[data-path="${i}"], select[data-path="${i}"], textarea[data-path="${i}"]`);f&&E(f,g),v(),m("Feld zurückgesetzt.","info")}if(u==="reset-all"&&(k().forEach(i=>{const g=i.closest(".cfg-field"),f=g==null?void 0:g.querySelector("[data-action=reset-field]");f&&E(i,JSON.parse(f.getAttribute("data-default")))}),v(),m("Alle Felder zurückgesetzt.","info")),u==="copy"){const i=JSON.stringify(N(),null,2);(p=navigator.clipboard)==null||p.writeText(i).then(()=>m("JSON in Zwischenablage kopiert.","success")).catch(()=>m("Kopieren fehlgeschlagen.","error"))}if(u==="save"){const i=N(),g=c.getAttribute("data-save-url");if(c.dispatchEvent(new CustomEvent("config:save",{detail:i,bubbles:!0})),(b=t.onSave)==null||b.call(t,i,c.id),g)fetch(g,{method:c.getAttribute("data-save-method")||"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}).then(f=>{if(!f.ok)throw new Error(`HTTP ${f.status}`);m("Gespeichert.","success")}).catch(f=>m(`Speichern fehlgeschlagen: ${f.message}`,"error"));else try{localStorage.setItem(`cfg:${c.id}`,JSON.stringify(i)),m("Lokal gespeichert.","success")}catch{m("Speichern fehlgeschlagen (localStorage).","error")}}}return l.addEventListener("input",S),l.addEventListener("change",S),n.addEventListener("click",A),v(),function(){l.removeEventListener("input",S),l.removeEventListener("change",S),n.removeEventListener("click",A)}}function I(e){try{const t=localStorage.getItem(`cfg:${e}`);return t?JSON.parse(t):{}}catch{return{}}}const w="app-config",B={title:"Finder Config",description:"More infos about it here",fields:[{key:"port",type:"number",label:"Port",default:13420,min:1,max:65535},{key:"cache",type:"boolean",label:"Cache",default:!1},{key:"create_cache_db",type:"boolean",label:"Create Cache Database",default:!1},{key:"finder_instances",type:"number",label:"Finder Instances",default:8,min:1,max:1e3}]};function H(e){const t=I(w);e.innerHTML=P(B,{id:w,values:t}),D(w,{onSave:(n,c)=>{}})}function z(e){e.innerHTML=a("main",{className:"configeditor-page"},a("div",{id:"configeditor"}),a("iframe",{src:"../docs/config",frameborder:"0",class:"md-iframe"}));const t=document.getElementById("configeditor");t!=null&&H(t)}export{z as default};
+import{r as L,j as a,F as j}from"./main_entry.js";const J=new Map;function y(e,t){J.set(e,t)}function $(e){return J.get(e)}function T(e){return typeof e=="string"?L(e):e}function r(e){return e==null?"":String(e)}function _(e,t){return t!==void 0?t:e.default}function C(e,t,n){const l=$(e.type)??P,i=_(e,n);if(e.type==="group")return l(e,t,i);const u=e.default!==void 0,S=l(e,t,i);return a("div",{class:"cfg-field","data-field-key":r(t)},a("div",{class:"cfg-field-head"},a("label",{class:"cfg-label",for:r(t)},e.label??e.key,e.required?a("span",{class:"cfg-required",title:"Pflichtfeld"},"*"):""),u&&!e.readonly?a("button",{type:"button",class:"cfg-reset-btn","data-action":"reset-field","data-reset-for":r(t),"data-default":JSON.stringify(e.default),title:"reset to default"},"↺"):""),e.description?a("p",{class:"cfg-desc"},e.description):"",S,u?a("p",{class:"cfg-default"},"Default: ",a("code",null,JSON.stringify(e.default))):"")}y("string",(e,t,n)=>a("input",{id:r(t),type:"text",name:r(t),"data-path":r(t),class:"cfg-input",placeholder:r(e.placeholder),value:r(n),readonly:e.readonly,required:e.required}));y("textarea",(e,t,n)=>a("textarea",{id:r(t),name:r(t),"data-path":r(t),className:"cfg-input cfg-textarea",rows:e.rows??4,placeholder:r(e.placeholder),readonly:e.readonly},n!=null?String(n):""));y("number",(e,t,n)=>a("input",{id:r(t),type:"number",name:r(t),"data-path":r(t),"data-type":"number",className:"cfg-input",min:r(e.min),max:r(e.max),step:r(e.step??"any"),value:r(n),readonly:e.readonly,required:e.required}));y("boolean",(e,t,n)=>a("label",{className:"cfg-switch"},a("input",{id:r(t),type:"checkbox",name:r(t),"data-path":r(t),"data-type":"boolean",checked:!!n,disabled:e.readonly}),a("span",{className:"cfg-switch-track"})));y("select",(e,t,n)=>a("select",{id:r(t),name:r(t),"data-path":r(t),className:"cfg-input",disabled:e.readonly},(e.options??[]).map(l=>a("option",{value:r(l.value),selected:l.value===n},l.label))));y("multiselect",(e,t,n)=>{const l=new Set(Array.isArray(n)?n.map(String):[]);return a("select",{id:r(t),name:r(t),"data-path":r(t),"data-type":"multiselect",className:"cfg-input",multiple:!0,disabled:e.readonly},(e.options??[]).map(i=>a("option",{value:r(i.value),selected:l.has(i.value)},i.label)))});y("color",(e,t,n)=>a("div",{className:"cfg-color-row"},a("input",{id:r(t),type:"color",name:r(t),"data-path":r(t),className:"cfg-color-swatch",value:r(n)||"#000000",disabled:e.readonly}),a("input",{type:"text",className:"cfg-input","data-color-text-for":r(t),value:r(n),readonly:e.readonly})));y("date",(e,t,n)=>a("input",{id:r(t),type:"date",name:r(t),"data-path":r(t),className:"cfg-input",value:r(n),readonly:e.readonly}));y("json",(e,t,n)=>a("textarea",{id:r(t),name:r(t),"data-path":r(t),"data-type":"json",className:"cfg-input cfg-textarea cfg-mono",rows:e.rows??6,readonly:e.readonly},n!==void 0?JSON.stringify(n,null,2):""));y("group",(e,t)=>{const n=(e.fields??[]).map(l=>{var i,u;return T(C(l,`${t}.${l.key}`,((i=e.value)==null?void 0:i[l.key])??((u=e.default)==null?void 0:u[l.key])))});return a("fieldset",{class:"cfg-group","data-field-key":r(t)},a("legend",{class:"cfg-group-legend"},e.label??e.key),e.description?a("p",{class:"cfg-desc"},e.description):"",a("div",{class:"cfg-group-body"},n))});function P(e,t,n){return a(j,null,a("p",{class:"cfg-warning"},"Unbekannter Feldtyp ",String(e.type)," — Rohdaten-Editor als Fallback."),a("textarea",{id:r(t),name:r(t),"data-path":r(t),"data-type":"json",className:"cfg-input cfg-textarea cfg-mono",rows:4},n!==void 0?JSON.stringify(n,null,2):""))}function D(e,t={}){const n=t.id??"config-editor",l=t.values??{},i=e.fields.map(u=>T(C(u,u.key,l[u.key])));return a(j,null,a("div",{className:"cfg-editor",id:n,"data-save-url":e.saveUrl??"","data-save-method":e.saveMethod??"POST"},a("div",{className:"cfg-toolbar"},a("div",{className:"cfg-title-wrap"},e.title?a("h2",{class:"cfg-title"},e.title):"",e.description?a("p",{class:"cfg-editor-desc"},e.description):""),a("div",{className:"cfg-actions"},a("button",{type:"button",className:"cfg-btn","data-action":"reset-all"},"Reset all"),a("button",{type:"button",className:"cfg-btn","data-action":"copy"},"copy JSON"),a("button",{type:"button",className:"cfg-btn cfg-btn-primary","data-action":"save"},"Save"))),a("p",{className:"cfg-status","data-status":!0,hidden:!0}),a("form",{className:"cfg-form","data-config-form":!0},i),a("details",{className:"cfg-preview"},a("summary",null,"JSON-Preview"),a("pre",{className:"cfg-json-preview","data-json-preview":!0}))))}function I(e,t={}){const n=document.getElementById(e);if(!n)throw new Error(`setupConfigEditor: Element "${e}" nicht gefunden.`);const l=n,i=n.querySelector("[data-config-form]"),u=n.querySelector("[data-status]"),S=n.querySelector("[data-json-preview]");if(!i)throw new Error("setupConfigEditor: [data-config-form] nicht gefunden - falsches Element?");i.addEventListener("submit",s=>s.preventDefault());function q(s,o,f){const g=o.split("."),m=new Set(["__proto__","constructor","prototype"]);if(g.length===0||g.some(d=>m.has(d)))return;let c=s;for(let d=0;df.selected).map(f=>f.value);if(o==="number"){const f=parseFloat(s.value);return isNaN(f)?null:f}if(o==="json")try{return s.value.trim()===""?null:JSON.parse(s.value)}catch{return{__parseError:!0,raw:s.value}}return s.value}function k(s,o){const f=s.getAttribute("data-type");if(s.type==="checkbox"){s.checked=!!o;return}if(s.tagName==="SELECT"&&s.multiple){const g=new Set(Array.isArray(o)?o.map(String):[]);Array.from(s.options).forEach(m=>{m.selected=g.has(m.value)});return}if(f==="json"){s.value=o==null?"":JSON.stringify(o,null,2);return}s.value=o==null?"":String(o)}function x(){return Array.from(i.querySelectorAll("input[data-path], select[data-path], textarea[data-path]"))}function w(){const s={};return x().forEach(o=>{q(s,o.getAttribute("data-path"),F(o))}),s}function h(){S&&(S.textContent=JSON.stringify(w(),null,2))}let O;function b(s,o="info"){u&&(u.textContent=s,u.hidden=!1,u.setAttribute("data-kind",o),window.clearTimeout(O),O=window.setTimeout(()=>u.hidden=!0,3500))}n.querySelectorAll('input[type="color"]').forEach(s=>{const o=n.querySelector(`[data-color-text-for="${s.id}"]`);o&&(s.addEventListener("input",()=>{o.value=s.value,h()}),o.addEventListener("input",()=>{/^#[0-9a-fA-F]{6}$/.test(o.value)&&(s.value=o.value),h()}))});function N(){h()}function A(s){var g,m;const o=s.target.closest("[data-action]");if(!o)return;const f=o.getAttribute("data-action");if(f==="reset-field"){const c=o.getAttribute("data-reset-for"),p=JSON.parse(o.getAttribute("data-default")),d=i.querySelector(`input[data-path="${c}"], select[data-path="${c}"], textarea[data-path="${c}"]`);d&&k(d,p),h(),b("Feld zurückgesetzt.","info")}if(f==="reset-all"&&(x().forEach(c=>{const p=c.closest(".cfg-field"),d=p==null?void 0:p.querySelector("[data-action=reset-field]");d&&k(c,JSON.parse(d.getAttribute("data-default")))}),h(),b("Alle Felder zurückgesetzt.","info")),f==="copy"){const c=JSON.stringify(w(),null,2);(g=navigator.clipboard)==null||g.writeText(c).then(()=>b("JSON in Zwischenablage kopiert.","success")).catch(()=>b("Kopieren fehlgeschlagen.","error"))}if(f==="save"){const c=w(),p=l.getAttribute("data-save-url");if(l.dispatchEvent(new CustomEvent("config:save",{detail:c,bubbles:!0})),(m=t.onSave)==null||m.call(t,c,l.id),p)fetch(p,{method:l.getAttribute("data-save-method")||"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)}).then(d=>{if(!d.ok)throw new Error(`HTTP ${d.status}`);b("Gespeichert.","success")}).catch(d=>b(`Speichern fehlgeschlagen: ${d.message}`,"error"));else try{localStorage.setItem(`cfg:${l.id}`,JSON.stringify(c)),b("Lokal gespeichert.","success")}catch{b("Speichern fehlgeschlagen (localStorage).","error")}}}return i.addEventListener("input",N),i.addEventListener("change",N),n.addEventListener("click",A),h(),function(){i.removeEventListener("input",N),i.removeEventListener("change",N),n.removeEventListener("click",A)}}function B(e){try{const t=localStorage.getItem(`cfg:${e}`);return t?JSON.parse(t):{}}catch{return{}}}const E="app-config",H={title:"Finder Config",description:"More infos about it here",fields:[{key:"port",type:"number",label:"Port",default:13420,min:1,max:65535},{key:"cache",type:"boolean",label:"Cache",default:!1},{key:"create_cache_db",type:"boolean",label:"Create Cache Database",default:!1},{key:"finder_instances",type:"number",label:"Finder Instances",default:8,min:1,max:1e3}]};function M(e){const t=B(E);e.innerHTML=D(H,{id:E,values:t}),I(E,{onSave:(n,l)=>{}})}function R(e){e.innerHTML=a("main",{className:"configeditor-page"},a("div",{id:"configeditor"}),a("iframe",{src:"../docs/config",frameborder:"0",class:"md-iframe"}));const t=document.getElementById("configeditor");t!=null&&M(t)}export{R as default};
diff --git a/cmd/findergen/frontend/assets/creator.js b/cmd/findergen/frontend/assets/creator.js
index 63223670..0faffe63 100644
--- a/cmd/findergen/frontend/assets/creator.js
+++ b/cmd/findergen/frontend/assets/creator.js
@@ -1,3 +1,3 @@
-import{j as r}from"./main_entry.js";let X=0;function j(){return X+=1,`n${Date.now().toString(36)}${X}`}function Z(e="new-file.txt"){return{id:j(),name:e,existence:"required",size:null,checksums:null}}function Q(e="new-folder"){return{id:j(),name:e,description:"",minVersion:"",command:"",invertCommand:!1,tags:[],files:[],folders:[],size:null,markdownNote:""}}function ce(e){const s=Q("*");return s.minVersion=e,s.description="Describe what this template matches",s}function I(e,s){if(e.id===s)return e;for(const t of e.folders){const o=I(t,s);if(o)return o}return null}function Y(e,s){for(const t of e.files)if(t.id===s)return{folder:e,file:t};for(const t of e.folders){const o=Y(t,s);if(o)return o}return null}function ee(e,s){const t=e.folders.findIndex(o=>o.id===s);return t!==-1?(e.folders.splice(t,1),!0):e.folders.some(o=>ee(o,s))}function te(e,s){const t=e.files.findIndex(o=>o.id===s);return t!==-1?(e.files.splice(t,1),!0):e.folders.some(o=>te(o,s))}function ne(e){if(!e||e.mix===void 0&&e.max===void 0)return;const s={};return e.mix!==void 0&&(s.mix=e.mix),e.max!==void 0&&(s.max=e.max),s}const de="required";function ue(e){const s={name:e.name};e.existence&&e.existence!==de&&(s.existence=e.existence);const t=ne(e.size);t&&(s.size=t);const o=me(e.checksums);return o&&(s.checksums=o),s}function me(e){if(!e)return;const s={},t=e.sha256.trim(),o=e.sha512.trim();if(t&&(s.sha256=t),o&&(s.sha512=o),Object.keys(s).length!==0)return s}function F(e,s=!0){const t={name:e.name};e.description.trim()&&(t.description=e.description),e.command.trim()&&(t.command=e.command),e.invertCommand&&(t.invert_command=!0),e.tags.length>0&&(t.tags=e.tags),e.files.length>0&&(t.files=e.files.map(ue)),e.folders.length>0&&(t.folders=e.folders.map(a=>F(a,!1))),s&&e.minVersion.trim()&&(t.min_version=e.minVersion.trim());const o=ne(e.size);if(o&&(t.size=o),s){const a=e.markdownNote;a&&(t.mdnote=a)}return t}function pe(e){return Array.isArray(e)?e.map(s=>{if(typeof s=="string")return{id:j(),name:s,existence:"required",size:null,checksums:null};const t=s;return{id:j(),name:t.name??"",existence:t.existence??"required",size:t.size?{min:t.size.mix,max:t.size.max}:null,checksums:t.checksums?{sha256:t.checksums.sha256??"",sha512:t.checksums.sha512??""}:null}}):[]}function D(e){const s=e.mdnote;let t="";return typeof s=="string"&&s.length>0&&(t=s),{id:j(),name:e.name??"",description:e.description??"",minVersion:e.min_version??"",command:e.command??"",invertCommand:!!e.invert_command,tags:Array.isArray(e.tags)?[...e.tags]:[],files:pe(e.files),folders:Array.isArray(e.folders)?e.folders.map(D):[],size:e.size?{mix:e.size.mix,max:e.size.max}:null,markdownNote:t}}function L(e){return e.replace(/&/g,"&").replace(//g,">")}function fe(e){let s="",t=0;const o=(a,c)=>{s+=`${L(c)} `};for(;t{s+=`${f} `};for(;t0&&a[a.length-1]==="object"?"key":"value",t++;continue}if(f===":"){x(f),c="value",t++;continue}if(f==='"'){let v=t+1,w="",$=!1;for(;v"${L(w)}"`,w==="name"&&(b=!0)):b?(s+=`"${fe(w)}" `,b=!1):s+=`"${L(w)}" `,c="value",t=v+1;continue}if(/[0-9-]/.test(f)){const v=e.slice(t).match(/^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/);if(v){s+=`${L(v[0])} `,t+=v[0].length,c="value",b=!1;continue}}if(/^(?:true|false|null)/.test(e.slice(t))){const v=e.slice(t).match(/^(?:true|false|null)/)[0];s+=`${v} `,t+=v.length,c="value",b=!1;continue}return L(e)}return s}function be(e,s){let t="new file",o=ce(s),a={kind:"folder",id:o.id},c=null,b="",x=!1;const f=new URLSearchParams(window.location.search),v=f.get("template"),w=f.get("filename"),$=f.get("origin_link");x=!0,x&&(b=r("button",{id:"btn-save",class:"btn btn-ghost",type:"button"},"Save JSON to file")),e.innerHTML=r("div",{class:"shell"},r("header",{class:"topbar"},r("div",{class:"brand"},r("span",{class:"brand-mark"},"finder"),r("span",{class:"brand-sep"},"/"),r("span",{class:"brand-sub"},"template builder"),r("span",{class:"brand-sep"},"/"),r("span",{class:"brand-sub"},r("a",{href:"../viewer/"},"TEMPLATE VIEWER")),r("span",{class:"brand-sep"},"/"),r("span",{class:"brand-sub"},r("a",{href:"../"},"HOME"))),r("div",{class:"topbar-actions"},r("a",{id:"btn-back-to-origin",class:"btn btn-ghost",type:"button",href:`${$}?template=${encodeURIComponent(JSON.stringify(F(o,!0)))}&name=${w}`},"Go back to origin"),r("button",{id:"btn-import",class:"btn btn-ghost",type:"button"},"Import JSON"),r("button",{id:"btn-copy",class:"btn btn-ghost",type:"button"},"Copy JSON"),b,r("button",{id:"btn-download",class:"btn btn-primary",type:"button"},"Download template.json"))),r("main",{class:"workspace"},r("section",{class:"pane pane-tree"},r("div",{class:"pane-head"},r("h2",null,"Structure"),r("button",{id:"btn-add-root-file",class:"icon-btn",type:"button",title:"Add file to root"},"+ file")),r("div",{id:"tree",class:"tree"})),r("section",{class:"pane pane-inspector"},r("div",{class:"pane-head"},r("h2",null,"Inspector")),r("div",{id:"inspector",class:"inspector"})),r("section",{class:"pane pane-preview"},r("div",{class:"pane-head"},r("h2",null,"JSON output")),r("pre",{id:"preview",class:"preview"}))),r("dialog",{id:"import-dialog",class:"import-dialog"},r("form",{method:"dialog",class:"import-form"},r("h3",null,"Import a template"),r("p",{class:"hint"},"Paste an existing folder-template JSON (or JSON5) document. It replaces the current tree."),r("textarea",{id:"import-text",rows:"14",spellcheck:"false",placeholder:'{ "name": "*", "files": [...] }'}),r("p",{id:"import-error",class:"import-error"}),r("div",{class:"import-actions"},r("button",{id:"import-cancel",class:"btn btn-ghost",type:"button"},"Cancel"),r("button",{id:"import-confirm",class:"btn btn-primary",type:"button"},"Replace tree")))));async function M(n){const d={name:n,content:F(o,!0)};let u="/api/template/create";try{const i=await fetch(u,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(d,null,2)});if(!i.ok)throw new Error(`Request failed with status ${i.status}`);const l=await i.text();JSON.parse(l).status=="ok"?alert("File created!"):alert("Could not create file!")}catch(i){console.error("Could not save template:",i)}}function ie(){return prompt("Wie soll die Datei heißen?",t)}if(x){const n=document.getElementById("btn-save");n==null||n.addEventListener("click",()=>{let d=ie();d!=null?M(d):alert("Name is Null!")})}const H=document.querySelector("#tree"),C=document.querySelector("#inspector"),P=document.querySelector("#preview"),J=document.querySelector("#import-dialog"),U=document.querySelector("#import-text"),V=document.querySelector("#import-error"),_=document.querySelector("#btn-back-to-origin");function N(){T(),ae(),y(),oe()}function oe(){!_||!$||(_.href=`${$}?template=${encodeURIComponent(JSON.stringify(F(o,!0)))}&name=${w}`)}function T(){H.innerHTML="",H.appendChild(B(o,0,!0))}function A(n,d,u){const i=document.createElement("button");return i.type="button",i.className="row-btn",i.textContent=n,i.title=d,i.addEventListener("click",l=>{l.stopPropagation(),u()}),i}function B(n,d,u){const i=document.createElement("div");i.className="node";const l=document.createElement("div");l.className="row row-folder",l.style.paddingLeft=`${d*18+10}px`,(a==null?void 0:a.kind)==="folder"&&a.id===n.id&&l.classList.add("row-selected"),l.addEventListener("click",()=>{a={kind:"folder",id:n.id},N()});const g=document.createElement("span");g.className="row-label",g.textContent=`${n.name||"(unnamed)"}/`,l.appendChild(g);const m=document.createElement("span");m.className="row-actions",m.appendChild(A("+dir","Add subfolder",()=>{const p=Q("new-folder");n.folders.push(p),a={kind:"folder",id:p.id},N()})),m.appendChild(A("+file","Add file",()=>{const p=Z("new-file.txt");n.files.push(p),a={kind:"file",id:p.id},N()})),u||m.appendChild(A("✕","Delete this folder",()=>{ee(o,n.id),a={kind:"folder",id:o.id},N()})),l.appendChild(m),i.appendChild(l);for(const p of n.files)i.appendChild(se(p.id,p.name,d+1));for(const p of n.folders)i.appendChild(B(p,d+1,!1));return i}function se(n,d,u){const i=document.createElement("div");i.className="node";const l=document.createElement("div");l.className="row row-file",l.style.paddingLeft=`${u*18+10}px`,(a==null?void 0:a.kind)==="file"&&a.id===n&&l.classList.add("row-selected"),l.addEventListener("click",()=>{a={kind:"file",id:n},N()});const g=document.createElement("span");g.className="row-label",g.textContent=d||"(unnamed)",l.appendChild(g);const m=document.createElement("span");return m.className="row-actions",m.appendChild(A("✕","Delete this file",()=>{te(o,n),a={kind:"folder",id:o.id},N()})),l.appendChild(m),i.appendChild(l),i}function E(n,d,u){const i=document.createElement("label");i.className="field";const l=document.createElement("span");if(l.className="field-label",l.textContent=n,i.appendChild(l),i.appendChild(d),u){const g=document.createElement("span");g.className="field-hint",g.textContent=u,i.appendChild(g)}return i}function q(n,d,u=""){const i=document.createElement("input");return i.type="text",i.value=n,i.placeholder=u,i.addEventListener("input",()=>d(i.value)),i}function W(n,d,u=""){const i=document.createElement("textarea");return i.rows=3,i.value=n,i.placeholder=u,i.addEventListener("input",()=>d(i.value)),i}function K(n,d){var O,S;const u=document.createElement("div");u.className="size-fields";const i=document.createElement("label");i.className="checkbox-line";const l=document.createElement("input");l.type="checkbox",l.checked=n!==null;const g=document.createElement("span");g.textContent="Constrain size",i.appendChild(l),i.appendChild(g),u.appendChild(i);const m=document.createElement("div");m.className="size-range",m.hidden=n===null;const p=document.createElement("input");p.type="number",p.placeholder="min bytes",p.value=((O=n==null?void 0:n.min)==null?void 0:O.toString())??"";const k=document.createElement("input");k.type="number",k.placeholder="max bytes",k.value=((S=n==null?void 0:n.max)==null?void 0:S.toString())??"";function z(){const R=p.value===""?void 0:Number(p.value),h=k.value===""?void 0:Number(k.value);d({min:R,max:h})}return p.addEventListener("input",z),k.addEventListener("input",z),m.appendChild(p),m.appendChild(k),u.appendChild(m),l.addEventListener("change",()=>{m.hidden=!l.checked,d(l.checked?{min:void 0,max:void 0}:null)}),u}function le(n,d){const u=document.createElement("div");u.className="checksum-fields";const i=q((n==null?void 0:n.sha256)??"",m=>g(m,l.value),"SHA-256 checksum"),l=q((n==null?void 0:n.sha512)??"",m=>g(i.value,m),"SHA-512 checksum");function g(m,p){const k={sha256:m.trim(),sha512:p.trim()};d(k.sha256||k.sha512?k:null)}return u.appendChild(i),u.appendChild(l),u}function ae(){if(C.innerHTML="",!a){const i=document.createElement("p");i.className="hint",i.textContent="Select a folder or file on the left to edit it.",C.appendChild(i);return}if(a.kind==="folder"){let i=function(){const h=z.markdownNote;k.textContent=h?`mdnote: "${h}"`:""};const l=I(o,a.id);if(!l)return;const g=l.id===o.id;C.appendChild(E("Name",q(l.name,h=>{l.name=h,T(),y()}))),C.appendChild(E("Description",W(l.description,h=>{l.description=h,y()}))),g&&C.appendChild(E("Minimum finder version",q(l.minVersion,h=>{l.minVersion=h,y()},s),"Old templates without a matching version will warn the user."));const m=W(l.markdownNote,h=>{l.markdownNote=h,y()},`# Kurze Beschreibung …
+import{j as r}from"./main_entry.js";let X=0;function j(){return X+=1,`n${Date.now().toString(36)}${X}`}function Z(e="new-file.txt"){return{id:j(),name:e,existence:"required",size:null,checksums:null}}function Q(e="new-folder"){return{id:j(),name:e,description:"",minVersion:"",command:"",invertCommand:!1,tags:[],files:[],folders:[],size:null,markdownNote:""}}function ce(e){const s=Q("*");return s.minVersion=e,s.description="Describe what this template matches",s}function I(e,s){if(e.id===s)return e;for(const t of e.folders){const o=I(t,s);if(o)return o}return null}function Y(e,s){for(const t of e.files)if(t.id===s)return{folder:e,file:t};for(const t of e.folders){const o=Y(t,s);if(o)return o}return null}function ee(e,s){const t=e.folders.findIndex(o=>o.id===s);return t!==-1?(e.folders.splice(t,1),!0):e.folders.some(o=>ee(o,s))}function te(e,s){const t=e.files.findIndex(o=>o.id===s);return t!==-1?(e.files.splice(t,1),!0):e.folders.some(o=>te(o,s))}function ne(e){if(!e||e.mix===void 0&&e.max===void 0)return;const s={};return e.mix!==void 0&&(s.mix=e.mix),e.max!==void 0&&(s.max=e.max),s}const de="required";function ue(e){const s={name:e.name};e.existence&&e.existence!==de&&(s.existence=e.existence);const t=ne(e.size);t&&(s.size=t);const o=me(e.checksums);return o&&(s.checksums=o),s}function me(e){if(!e)return;const s={},t=e.sha256.trim(),o=e.sha512.trim();if(t&&(s.sha256=t),o&&(s.sha512=o),Object.keys(s).length!==0)return s}function F(e,s=!0){const t={name:e.name};e.description.trim()&&(t.description=e.description),e.command.trim()&&(t.command=e.command),e.invertCommand&&(t.invert_command=!0),e.tags.length>0&&(t.tags=e.tags),e.files.length>0&&(t.files=e.files.map(ue)),e.folders.length>0&&(t.folders=e.folders.map(a=>F(a,!1))),s&&e.minVersion.trim()&&(t.min_version=e.minVersion.trim());const o=ne(e.size);if(o&&(t.size=o),s){const a=e.markdownNote;a&&(t.mdnote=a)}return t}function pe(e){return Array.isArray(e)?e.map(s=>{if(typeof s=="string")return{id:j(),name:s,existence:"required",size:null,checksums:null};const t=s;return{id:j(),name:t.name??"",existence:t.existence??"required",size:t.size?{min:t.size.mix,max:t.size.max}:null,checksums:t.checksums?{sha256:t.checksums.sha256??"",sha512:t.checksums.sha512??""}:null}}):[]}function D(e){const s=e.mdnote;let t="";return typeof s=="string"&&s.length>0&&(t=s),{id:j(),name:e.name??"",description:e.description??"",minVersion:e.min_version??"",command:e.command??"",invertCommand:!!e.invert_command,tags:Array.isArray(e.tags)?[...e.tags]:[],files:pe(e.files),folders:Array.isArray(e.folders)?e.folders.map(D):[],size:e.size?{mix:e.size.mix,max:e.size.max}:null,markdownNote:t}}function L(e){return e.replace(/&/g,"&").replace(//g,">")}function fe(e){let s="",t=0;const o=(a,c)=>{s+=`${L(c)} `};for(;t{s+=`${f} `};for(;t0&&a[a.length-1]==="object"?"key":"value",t++;continue}if(f===":"){x(f),c="value",t++;continue}if(f==='"'){let v=t+1,w="",$=!1;for(;v"${L(w)}"`,w==="name"&&(b=!0)):b?(s+=`"${fe(w)}" `,b=!1):s+=`"${L(w)}" `,c="value",t=v+1;continue}if(/[0-9-]/.test(f)){const v=e.slice(t).match(/^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/);if(v){s+=`${L(v[0])} `,t+=v[0].length,c="value",b=!1;continue}}if(/^(?:true|false|null)/.test(e.slice(t))){const v=e.slice(t).match(/^(?:true|false|null)/)[0];s+=`${v} `,t+=v.length,c="value",b=!1;continue}return L(e)}return s}function be(e,s){let t="new file",o=ce(s),a={kind:"folder",id:o.id},c=null,b="",x=!1;const f=new URLSearchParams(window.location.search),v=f.get("template"),w=f.get("filename"),$=f.get("origin_link");x=!0,x&&(b=r("button",{id:"btn-save",class:"btn btn-ghost",type:"button"},"Save JSON to file")),e.innerHTML=r("div",{class:"shell"},r("header",{class:"topbar"},r("div",{class:"brand"},r("span",{class:"brand-mark"},"finder"),r("span",{class:"brand-sep"},"/"),r("span",{class:"brand-sub"},"template builder"),r("span",{class:"brand-sep"},"/"),r("span",{class:"brand-sub"},r("a",{href:"../viewer/"},"TEMPLATE VIEWER")),r("span",{class:"brand-sep"},"/"),r("span",{class:"brand-sub"},r("a",{href:"../"},"HOME"))),r("div",{class:"topbar-actions"},r("a",{id:"btn-back-to-origin",class:"btn btn-ghost",type:"button",href:`${$}?template=${encodeURIComponent(JSON.stringify(F(o,!0)))}&name=${w}`},"Go back to origin"),r("button",{id:"btn-import",class:"btn btn-ghost",type:"button"},"Import JSON"),r("button",{id:"btn-copy",class:"btn btn-ghost",type:"button"},"Copy JSON"),b,r("button",{id:"btn-download",class:"btn btn-primary",type:"button"},"Download template.json"))),r("main",{class:"workspace"},r("section",{class:"pane pane-tree"},r("div",{class:"pane-head"},r("h2",null,"Structure"),r("button",{id:"btn-add-root-file",class:"icon-btn",type:"button",title:"Add file to root"},"+ file")),r("div",{id:"tree",class:"tree"})),r("section",{class:"pane pane-inspector"},r("div",{class:"pane-head"},r("h2",null,"Inspector")),r("div",{id:"inspector",class:"inspector"})),r("section",{class:"pane pane-preview"},r("div",{class:"pane-head"},r("h2",null,"JSON output")),r("pre",{id:"preview",class:"preview"}))),r("dialog",{id:"import-dialog",class:"import-dialog"},r("form",{method:"dialog",class:"import-form"},r("h3",null,"Import a template"),r("p",{class:"hint"},"Paste an existing folder-template JSON (or JSON5) document. It replaces the current tree."),r("textarea",{id:"import-text",rows:"14",spellcheck:"false",placeholder:'{ "name": "*", "files": [...] }'}),r("p",{id:"import-error",class:"import-error"}),r("div",{class:"import-actions"},r("button",{id:"import-cancel",class:"btn btn-ghost",type:"button"},"Cancel"),r("button",{id:"import-confirm",class:"btn btn-primary",type:"button"},"Replace tree")))));async function M(n){const d={name:n,content:F(o,!0)};let u="/api/template/create";try{const i=await fetch(u,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(d,null,2)});if(!i.ok)throw new Error(`Request failed with status ${i.status}`);const l=await i.text();JSON.parse(l).status=="ok"?alert("File created!"):alert("Could not create file!")}catch{}}function ie(){return prompt("Wie soll die Datei heißen?",t)}if(x){const n=document.getElementById("btn-save");n==null||n.addEventListener("click",()=>{let d=ie();d!=null?M(d):alert("Name is Null!")})}const H=document.querySelector("#tree"),k=document.querySelector("#inspector"),P=document.querySelector("#preview"),J=document.querySelector("#import-dialog"),U=document.querySelector("#import-text"),V=document.querySelector("#import-error"),_=document.querySelector("#btn-back-to-origin");function N(){T(),ae(),y(),oe()}function oe(){!_||!$||(_.href=`${$}?template=${encodeURIComponent(JSON.stringify(F(o,!0)))}&name=${w}`)}function T(){H.innerHTML="",H.appendChild(B(o,0,!0))}function A(n,d,u){const i=document.createElement("button");return i.type="button",i.className="row-btn",i.textContent=n,i.title=d,i.addEventListener("click",l=>{l.stopPropagation(),u()}),i}function B(n,d,u){const i=document.createElement("div");i.className="node";const l=document.createElement("div");l.className="row row-folder",l.style.paddingLeft=`${d*18+10}px`,(a==null?void 0:a.kind)==="folder"&&a.id===n.id&&l.classList.add("row-selected"),l.addEventListener("click",()=>{a={kind:"folder",id:n.id},N()});const g=document.createElement("span");g.className="row-label",g.textContent=`${n.name||"(unnamed)"}/`,l.appendChild(g);const m=document.createElement("span");m.className="row-actions",m.appendChild(A("+dir","Add subfolder",()=>{const p=Q("new-folder");n.folders.push(p),a={kind:"folder",id:p.id},N()})),m.appendChild(A("+file","Add file",()=>{const p=Z("new-file.txt");n.files.push(p),a={kind:"file",id:p.id},N()})),u||m.appendChild(A("✕","Delete this folder",()=>{ee(o,n.id),a={kind:"folder",id:o.id},N()})),l.appendChild(m),i.appendChild(l);for(const p of n.files)i.appendChild(se(p.id,p.name,d+1));for(const p of n.folders)i.appendChild(B(p,d+1,!1));return i}function se(n,d,u){const i=document.createElement("div");i.className="node";const l=document.createElement("div");l.className="row row-file",l.style.paddingLeft=`${u*18+10}px`,(a==null?void 0:a.kind)==="file"&&a.id===n&&l.classList.add("row-selected"),l.addEventListener("click",()=>{a={kind:"file",id:n},N()});const g=document.createElement("span");g.className="row-label",g.textContent=d||"(unnamed)",l.appendChild(g);const m=document.createElement("span");return m.className="row-actions",m.appendChild(A("✕","Delete this file",()=>{te(o,n),a={kind:"folder",id:o.id},N()})),l.appendChild(m),i.appendChild(l),i}function E(n,d,u){const i=document.createElement("label");i.className="field";const l=document.createElement("span");if(l.className="field-label",l.textContent=n,i.appendChild(l),i.appendChild(d),u){const g=document.createElement("span");g.className="field-hint",g.textContent=u,i.appendChild(g)}return i}function q(n,d,u=""){const i=document.createElement("input");return i.type="text",i.value=n,i.placeholder=u,i.addEventListener("input",()=>d(i.value)),i}function W(n,d,u=""){const i=document.createElement("textarea");return i.rows=3,i.value=n,i.placeholder=u,i.addEventListener("input",()=>d(i.value)),i}function K(n,d){var O,S;const u=document.createElement("div");u.className="size-fields";const i=document.createElement("label");i.className="checkbox-line";const l=document.createElement("input");l.type="checkbox",l.checked=n!==null;const g=document.createElement("span");g.textContent="Constrain size",i.appendChild(l),i.appendChild(g),u.appendChild(i);const m=document.createElement("div");m.className="size-range",m.hidden=n===null;const p=document.createElement("input");p.type="number",p.placeholder="min bytes",p.value=((O=n==null?void 0:n.min)==null?void 0:O.toString())??"";const C=document.createElement("input");C.type="number",C.placeholder="max bytes",C.value=((S=n==null?void 0:n.max)==null?void 0:S.toString())??"";function z(){const R=p.value===""?void 0:Number(p.value),h=C.value===""?void 0:Number(C.value);d({min:R,max:h})}return p.addEventListener("input",z),C.addEventListener("input",z),m.appendChild(p),m.appendChild(C),u.appendChild(m),l.addEventListener("change",()=>{m.hidden=!l.checked,d(l.checked?{min:void 0,max:void 0}:null)}),u}function le(n,d){const u=document.createElement("div");u.className="checksum-fields";const i=q((n==null?void 0:n.sha256)??"",m=>g(m,l.value),"SHA-256 checksum"),l=q((n==null?void 0:n.sha512)??"",m=>g(i.value,m),"SHA-512 checksum");function g(m,p){const C={sha256:m.trim(),sha512:p.trim()};d(C.sha256||C.sha512?C:null)}return u.appendChild(i),u.appendChild(l),u}function ae(){if(k.innerHTML="",!a){const i=document.createElement("p");i.className="hint",i.textContent="Select a folder or file on the left to edit it.",k.appendChild(i);return}if(a.kind==="folder"){let i=function(){const h=z.markdownNote;C.textContent=h?`mdnote: "${h}"`:""};const l=I(o,a.id);if(!l)return;const g=l.id===o.id;k.appendChild(E("Name",q(l.name,h=>{l.name=h,T(),y()}))),k.appendChild(E("Description",W(l.description,h=>{l.description=h,y()}))),g&&k.appendChild(E("Minimum finder version",q(l.minVersion,h=>{l.minVersion=h,y()},s),"Old templates without a matching version will warn the user."));const m=W(l.markdownNote,h=>{l.markdownNote=h,y()},`# Kurze Beschreibung …
-Optional: weitere Details zu diesem Template`);m.rows=6;const p=E("Markdown note",m,"Wird percent-encodiert (wie encodeURIComponent, z.B. neue Zeilen als %0A) im Feld mdnote gespeichert."),k=document.createElement("code");k.className="note-mdnote-preview";const z=l;m.addEventListener("input",()=>{i()}),p.appendChild(k),C.appendChild(p),C.appendChild(E("Command",q(l.command,h=>{l.command=h,y()},"e.g. npm run check"),"Optional command to run once this directory is found."));const O=document.createElement("label");O.className="checkbox-line";const S=document.createElement("input");S.type="checkbox",S.checked=l.invertCommand,S.addEventListener("change",()=>{l.invertCommand=S.checked,y()}),O.appendChild(S),O.appendChild(document.createTextNode("Invert command result (require exit code 1)")),C.appendChild(O),C.appendChild(E("Tags",q(l.tags.join(", "),h=>{l.tags=h.split(",").map(re=>re.trim()).filter(Boolean),y()},"backend, node, monorepo"),"Comma-separated.")),C.appendChild(E("Directory size",K(l.size,h=>{l.size=h,T(),y()})));const R=C.querySelector(".note-mdnote-preview");if(R){const h=(I(o,a.id)??o).markdownNote;R.textContent=h?`mdnote: "${h}"`:""}return}const n=Y(o,a.id);if(!n)return;const{file:d}=n;C.appendChild(E("Name",q(d.name,i=>{d.name=i,T(),y()})));const u=document.createElement("select");["required","forbidden","optional"].forEach(i=>{const l=document.createElement("option");l.value=i,l.textContent=i,d.existence===i&&(l.selected=!0),u.appendChild(l)}),u.addEventListener("change",()=>{d.existence=u.value,y()}),C.appendChild(E("Existence",u,"required = must exist, forbidden = must not exist, optional = ignored")),C.appendChild(E("File size",K(d.size,i=>{d.size=i,T(),y()}))),C.appendChild(E("Checksums",le(d.checksums,i=>{d.checksums=i,y()}),"Optional SHA-256 or SHA-512 checksum."))}function y(){const n=F(o,!0);P.innerHTML=he(JSON.stringify(n,null,2))}document.querySelector("#btn-add-root-file").addEventListener("click",()=>{const n=Z("new-file.txt");o.files.push(n),a={kind:"file",id:n.id},N()}),document.querySelector("#btn-copy").addEventListener("click",async()=>{const n=document.querySelector("#btn-copy");try{await navigator.clipboard.writeText(P.textContent??"");const d=n.textContent;n.textContent="Copied",setTimeout(()=>n.textContent=d,1200)}catch{n.textContent="Copy failed"}}),document.querySelector("#btn-download").addEventListener("click",()=>{const n=F(o,!0),d=new Blob([JSON.stringify(n,null,2)],{type:"application/json"}),u=URL.createObjectURL(d),i=document.createElement("a");i.href=u,i.download=`${o.name||"template"}.json`,i.click(),URL.revokeObjectURL(u)});function G(n){const d=n;typeof d.mdnote=="string"&&(o.markdownNote=d.mdnote)}if(document.querySelector("#btn-import").addEventListener("click",()=>{V.textContent="",U.value="",J.showModal()}),document.querySelector("#import-cancel").addEventListener("click",()=>{J.close()}),document.querySelector("#import-confirm").addEventListener("click",()=>{try{const n=JSON.parse(U.value);o=D(n),G(n),a={kind:"folder",id:o.id},J.close(),N()}catch(n){c=n instanceof Error?n.message:String(n),V.textContent=`Couldn't parse that JSON: ${c}`}}),w!=null&&(t=w),v!=null)try{const n=JSON.parse(v);o=D(n),G(n),a={kind:"folder",id:o.id}}catch(n){console.error("Could not load template from URL:",n)}N()}function ge(e,s){be(e,s)}export{ge as default};
+Optional: weitere Details zu diesem Template`);m.rows=6;const p=E("Markdown note",m,"Wird percent-encodiert (wie encodeURIComponent, z.B. neue Zeilen als %0A) im Feld mdnote gespeichert."),C=document.createElement("code");C.className="note-mdnote-preview";const z=l;m.addEventListener("input",()=>{i()}),p.appendChild(C),k.appendChild(p),k.appendChild(E("Command",q(l.command,h=>{l.command=h,y()},"e.g. npm run check"),"Optional command to run once this directory is found."));const O=document.createElement("label");O.className="checkbox-line";const S=document.createElement("input");S.type="checkbox",S.checked=l.invertCommand,S.addEventListener("change",()=>{l.invertCommand=S.checked,y()}),O.appendChild(S),O.appendChild(document.createTextNode("Invert command result (require exit code 1)")),k.appendChild(O),k.appendChild(E("Tags",q(l.tags.join(", "),h=>{l.tags=h.split(",").map(re=>re.trim()).filter(Boolean),y()},"backend, node, monorepo"),"Comma-separated.")),k.appendChild(E("Directory size",K(l.size,h=>{l.size=h,T(),y()})));const R=k.querySelector(".note-mdnote-preview");if(R){const h=(I(o,a.id)??o).markdownNote;R.textContent=h?`mdnote: "${h}"`:""}return}const n=Y(o,a.id);if(!n)return;const{file:d}=n;k.appendChild(E("Name",q(d.name,i=>{d.name=i,T(),y()})));const u=document.createElement("select");["required","forbidden","optional"].forEach(i=>{const l=document.createElement("option");l.value=i,l.textContent=i,d.existence===i&&(l.selected=!0),u.appendChild(l)}),u.addEventListener("change",()=>{d.existence=u.value,y()}),k.appendChild(E("Existence",u,"required = must exist, forbidden = must not exist, optional = ignored")),k.appendChild(E("File size",K(d.size,i=>{d.size=i,T(),y()}))),k.appendChild(E("Checksums",le(d.checksums,i=>{d.checksums=i,y()}),"Optional SHA-256 or SHA-512 checksum."))}function y(){const n=F(o,!0);P.innerHTML=he(JSON.stringify(n,null,2))}document.querySelector("#btn-add-root-file").addEventListener("click",()=>{const n=Z("new-file.txt");o.files.push(n),a={kind:"file",id:n.id},N()}),document.querySelector("#btn-copy").addEventListener("click",async()=>{const n=document.querySelector("#btn-copy");try{await navigator.clipboard.writeText(P.textContent??"");const d=n.textContent;n.textContent="Copied",setTimeout(()=>n.textContent=d,1200)}catch{n.textContent="Copy failed"}}),document.querySelector("#btn-download").addEventListener("click",()=>{const n=F(o,!0),d=new Blob([JSON.stringify(n,null,2)],{type:"application/json"}),u=URL.createObjectURL(d),i=document.createElement("a");i.href=u,i.download=`${o.name||"template"}.json`,i.click(),URL.revokeObjectURL(u)});function G(n){const d=n;typeof d.mdnote=="string"&&(o.markdownNote=d.mdnote)}if(document.querySelector("#btn-import").addEventListener("click",()=>{V.textContent="",U.value="",J.showModal()}),document.querySelector("#import-cancel").addEventListener("click",()=>{J.close()}),document.querySelector("#import-confirm").addEventListener("click",()=>{try{const n=JSON.parse(U.value);o=D(n),G(n),a={kind:"folder",id:o.id},J.close(),N()}catch(n){c=n instanceof Error?n.message:String(n),V.textContent=`Couldn't parse that JSON: ${c}`}}),w!=null&&(t=w),v!=null)try{const n=JSON.parse(v);o=D(n),G(n),a={kind:"folder",id:o.id}}catch{}N()}function ge(e,s){be(e,s)}export{ge as default};
diff --git a/cmd/findergen/frontend/assets/index.js b/cmd/findergen/frontend/assets/index.js
index 702483ee..c82dfdd9 100644
--- a/cmd/findergen/frontend/assets/index.js
+++ b/cmd/findergen/frontend/assets/index.js
@@ -1 +1 @@
-import{j as e,r as t,F as a}from"./main_entry.js";function u(r,n){r.innerHTML=e(a,null,e("article",{class:"markdown"},e("h1",{id:"finder-server"},"Finder Server"),e("ul",null,e("li",null,e("a",{href:"./creator"},"Template Creator")),e("li",null,e("a",{href:"./viewer"},"Template Viewer")),e("li",null,e("a",{href:"./configeditor"},"Config Editor")),e("li",null,e("a",{href:"./regexcreator"},"Regex Creator")),e("li",null,e("a",{href:"./tools"},"Tools"))),e("p",null,"Here you can create new templates for finder or view existing, or read the changelog!"),e("ul",null,e("li",null,e("a",{href:"./changelog"},"Changelog")),e("li",null,e("a",{href:"./readme"},"README"))),e("button",{id:"stop"},"Stop Server"),e("h2",null,"Agents.md"),e("p",null,"A Markdown file to explain your AI how to write templates for finder!"),t(n),e("h2",null,"Tools"),e("ul",null,e("li",null,e("a",{href:"./tools/markdowneditor"},"Markdown Editor")),e("li",null,e("a",{href:"./tools/minecraft/tellraw"},"Minecraft Tellraw Updater to SNBT")))));{let o="/api/stop";const l=document.getElementById("stop");l!=null&&(l.onclick=async()=>{await fetch(o)})}}export{u as default};
+const d={id:"docs/index",type:"markdown",html:'Finder Docs soon
'};export{d as default};
diff --git a/cmd/findergen/frontend/assets/index2.js b/cmd/findergen/frontend/assets/index2.js
index c7c54f1a..702483ee 100644
--- a/cmd/findergen/frontend/assets/index2.js
+++ b/cmd/findergen/frontend/assets/index2.js
@@ -1 +1 @@
-import{j as l,F as e}from"./main_entry.js";import{r as n}from"./mcappheader.js";function o(r){r.innerHTML=l(e,null,l(n,null),l("main",null,l("h1",null,"MC APP"),l("p",null,"This is the Homepage of the Server"),l("h3",null,"Features"),l("ul",null,l("li",null,l("a",{href:"./info"},"Info")),l("li",null,l("a",{href:"./worlds"},"World Searcher")))))}export{o as default};
+import{j as e,r as t,F as a}from"./main_entry.js";function u(r,n){r.innerHTML=e(a,null,e("article",{class:"markdown"},e("h1",{id:"finder-server"},"Finder Server"),e("ul",null,e("li",null,e("a",{href:"./creator"},"Template Creator")),e("li",null,e("a",{href:"./viewer"},"Template Viewer")),e("li",null,e("a",{href:"./configeditor"},"Config Editor")),e("li",null,e("a",{href:"./regexcreator"},"Regex Creator")),e("li",null,e("a",{href:"./tools"},"Tools"))),e("p",null,"Here you can create new templates for finder or view existing, or read the changelog!"),e("ul",null,e("li",null,e("a",{href:"./changelog"},"Changelog")),e("li",null,e("a",{href:"./readme"},"README"))),e("button",{id:"stop"},"Stop Server"),e("h2",null,"Agents.md"),e("p",null,"A Markdown file to explain your AI how to write templates for finder!"),t(n),e("h2",null,"Tools"),e("ul",null,e("li",null,e("a",{href:"./tools/markdowneditor"},"Markdown Editor")),e("li",null,e("a",{href:"./tools/minecraft/tellraw"},"Minecraft Tellraw Updater to SNBT")))));{let o="/api/stop";const l=document.getElementById("stop");l!=null&&(l.onclick=async()=>{await fetch(o)})}}export{u as default};
diff --git a/cmd/findergen/frontend/assets/index3.js b/cmd/findergen/frontend/assets/index3.js
index c4264c08..c7c54f1a 100644
--- a/cmd/findergen/frontend/assets/index3.js
+++ b/cmd/findergen/frontend/assets/index3.js
@@ -1 +1 @@
-import{j as e,F as n}from"./main_entry.js";const i=[{href:"./installscript/",title:"Install Script Generator",description:"Generiere ein einzelnes portables Bash-Install-Skript für Linux und macOS – mit Download, Extraktion, PATH-Eintrag und optionalen Installationsarten.",tags:["installer","bash","github"]},{href:"markdowneditor/",title:"Markdown Editor",description:"Bearbeite und vorschau Markdown-Dateien direkt im Browser, inklusive Live-Vorschau.",tags:["markdown","editor"]},{href:"./minecraft/tellraw/",title:"Minecraft Tellraw",description:"Baue tellraw-Kommandos für Minecraft – nützlich für Farben, Formatierungen und mehrere Segmente.",tags:["minecraft","tellraw","command"]}];function s(r){r.innerHTML=e(n,null,e("div",{class:"tool-header"},e("span",{class:"tool-eyebrow"},e("a",{href:"../"},"HOME")),e("h1",null,"Tools")),e("div",{class:"tool-grid"},i.map(a=>e("a",{class:"tool-card",href:a.href},e("h2",null,a.title),e("p",null,a.description),e("div",{class:"tool-tags"},a.tags.map(t=>e("span",{class:"tool-tag"},t)))))))}export{s as default};
+import{j as l,F as e}from"./main_entry.js";import{r as n}from"./mcappheader.js";function o(r){r.innerHTML=l(e,null,l(n,null),l("main",null,l("h1",null,"MC APP"),l("p",null,"This is the Homepage of the Server"),l("h3",null,"Features"),l("ul",null,l("li",null,l("a",{href:"./info"},"Info")),l("li",null,l("a",{href:"./worlds"},"World Searcher")))))}export{o as default};
diff --git a/cmd/findergen/frontend/assets/index4.js b/cmd/findergen/frontend/assets/index4.js
new file mode 100644
index 00000000..c4264c08
--- /dev/null
+++ b/cmd/findergen/frontend/assets/index4.js
@@ -0,0 +1 @@
+import{j as e,F as n}from"./main_entry.js";const i=[{href:"./installscript/",title:"Install Script Generator",description:"Generiere ein einzelnes portables Bash-Install-Skript für Linux und macOS – mit Download, Extraktion, PATH-Eintrag und optionalen Installationsarten.",tags:["installer","bash","github"]},{href:"markdowneditor/",title:"Markdown Editor",description:"Bearbeite und vorschau Markdown-Dateien direkt im Browser, inklusive Live-Vorschau.",tags:["markdown","editor"]},{href:"./minecraft/tellraw/",title:"Minecraft Tellraw",description:"Baue tellraw-Kommandos für Minecraft – nützlich für Farben, Formatierungen und mehrere Segmente.",tags:["minecraft","tellraw","command"]}];function s(r){r.innerHTML=e(n,null,e("div",{class:"tool-header"},e("span",{class:"tool-eyebrow"},e("a",{href:"../"},"HOME")),e("h1",null,"Tools")),e("div",{class:"tool-grid"},i.map(a=>e("a",{class:"tool-card",href:a.href},e("h2",null,a.title),e("p",null,a.description),e("div",{class:"tool-tags"},a.tags.map(t=>e("span",{class:"tool-tag"},t)))))))}export{s as default};
diff --git a/cmd/findergen/frontend/assets/main_entry.js b/cmd/findergen/frontend/assets/main_entry.js
index c59785f4..6e56193e 100644
--- a/cmd/findergen/frontend/assets/main_entry.js
+++ b/cmd/findergen/frontend/assets/main_entry.js
@@ -1,925 +1,2 @@
-const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./cacheviewer.js","./cacheviewer.css","./configeditor.js","./configeditor.css","./creator.js","./creator.css","./home.js","./home.css","./about.js","./mcappheader.js","./mcappheader.css","./index2.js","./info.js","./worlds.js","./regexcreator.js","./regexcreator.css","./samfile.js","./jquery.module.js","./samfile.css","./index3.js","./index.css","./installscript.js","./installscript.css","./markdowneditor.js","./markdown.js","./markdowneditor.css","./tellraw.js","./tellraw.css","./viewer.js","./viewer.css"])))=>i.map(i=>d[i]);
-const T="modulepreload",S=function(e,n){return new URL(e,n).href},w={},l=function(n,a,o){let h=Promise.resolve();if(a&&a.length>0){let p=function(r){return Promise.all(r.map(u=>Promise.resolve(u).then(m=>({status:"fulfilled",value:m}),m=>({status:"rejected",reason:m}))))};const i=document.getElementsByTagName("link"),s=document.querySelector("meta[property=csp-nonce]"),d=(s==null?void 0:s.nonce)||(s==null?void 0:s.getAttribute("nonce"));h=p(a.map(r=>{if(r=S(r,o),r in w)return;w[r]=!0;const u=r.endsWith(".css"),m=u?'[rel="stylesheet"]':"";if(!!o)for(let f=i.length-1;f>=0;f--){const j=i[f];if(j.href===r&&(!u||j.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${r}"]${m}`))return;const c=document.createElement("link");if(c.rel=u?"stylesheet":T,u||(c.as="script"),c.crossOrigin="",c.href=r,d&&c.setAttribute("nonce",d),document.head.appendChild(c),u)return new Promise((f,j)=>{c.addEventListener("load",f),c.addEventListener("error",()=>j(new Error(`Unable to preload CSS for ${r}`)))})}))}function b(p){const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=p,window.dispatchEvent(i),!i.defaultPrevented)throw p}return h.then(p=>{for(const i of p||[])i.status==="rejected"&&b(i.reason);return n().catch(b)})},g=""+new URL("markdownrootstyle.css",import.meta.url).href,E=""+new URL("markdownstyle.css",import.meta.url).href,y={cacheviewer:{id:"cacheviewer",type:"component",load:()=>l(()=>import("./cacheviewer.js"),__vite__mapDeps([0,1]),import.meta.url),data:null,styles:[]},changelog:{id:"changelog",type:"markdown",html:'CHANGELOG The whole finder CHANGELOG
Newest prob 0.3.17 added regex support added mcapp minecraft world dashboard fixed buildcheck workflow added markdown notes to the templates which can be viewed in the web UI added command to view count of locations which where found added option to view the cache size updated the regex creator fixed a bug in the argparser lib where global flag where not found in subcommands Commits 8e63902 Update frontend assets, templates & deps40751f1 Add min_version, tags and mdnote to templates0191e23 Update finder templates to v0.3.17The diff also includes git parser cleanup and compatibility updates in the Go scanner code, plus dependency and generated site data refreshes that match the new library version.
86252b8 Add markdown notes and regex tooling7927ca0 Add Monaco editor and template view updates8dbd64a Add template markdown preview01c3ad7 Switch markdown notes to mdnotedc91ca1 Move template site under npm/sitecd28c08 Highlight Finder template patterns020dccf Add prettyJson util and normalize template inputImprove template input validation in npm/hub/lib/templates.ts: stricter type checks, parse-and-normalize JSON content before applying the byte-size limit, normalize/trim/lowercase tags and deduplicate them, and ensure saved content is non-null. Also apply minor formatting/TS fixes.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
18d87ce Split user page into client componentf0cde71 Add template highlighting and styling refresh7ec7ef5 Add template discovery polish and templates0bf8cfd Add gitdb package to export Git repos9c45e9d Add Nginx dashboard service3b40048 Add static site and type compatibility fixesa9a5be5 Add template tags and discovery UI141f271 Add recovery-checksum auth flow and account APIse45bbfd Fix template site Docker builddc27baa Add local dev mailbox, auth flows, UI & Docker fix19a1da4 Add Docker setup for app servicesa31ded0 Update backend asset stats; fix note preview closureaa4d6be Add cache count and size commands6629fab Add Markdown note support to creatora356afe Render markdown notes in template viewer07b256a Add match modes and share/restore UIUI: add a mode-selector (exact, startsWith, endsWith, contains), Base64 export field, copy button and restore input + feedback; update placeholders and tester hints. Styles added in regexcreator.css for selector and share/restore widgets. Logic: regexcreator.tsx wires mode buttons, share serialization (Base64 UTF‑8), clipboard copy, restore parsing and UI feedback. Core: src/lib/regex.ts adds MatchMode and mode option, assembles anchored/negated patterns per mode and returns the RegExp accordingly. Improves flexibility for file-extension and substring matching and allows saving/loading editor state.
f9d9fe7 fixed a bug in the argparser lib where global flag where not found in subcommandsf235ce4 Potential fix for code scanning alert no. 6: Arbitrary file access during archive extraction ("Zip Slip")0e98acb update vite6a579fc Potential fix for code scanning alert no. 5: Prototype-polluting function810b2b4 Potential fix for code scanning alert no. 4: Prototype-polluting functionf65a04f fix permission0.3.16 - 08.09.2026 added cache creation added config editor added cache viewer Moved every site on the finder website to TSX instead add code to the ssg plugin which runs on build time - 07.09.2026 the search function should return an array of added size plugin for the frontend added syntax highliting for the markdown codeblocks updated some templates renamed checksums file in the release from SHA256SUMS to SHA256SUMS.txt added some helpfule vite plugins added file content checksum check fixed that to old template warning because it showed up the finder and the template where in the same version added SHA512 checksums 0.3.15 - 02.09.2025 added new Templates added a HTML Server with go backend to create and view all templates added json output support to finder, just add --json to command added tags and min version to a lot of the templates the Templates are now saved as minified json 0.3.14 - 25.06.2026 0.3.13 - 22.06.2026 0.3.12 - 22.06.2026 0.3.11 - 10.04.2026 0.3.10 - 10.04.2026 0.3.9 - 09.04.2026 0.3.8 - 27.02.2026 0.3.7 - 24.02.2026 0.3.6 - 24.02.2026 added Size option to the Templates updated README File updates CUSTOM_TEMPLATES added a new entry to the Template: min finder version which should added Version package 0.3.5 - 18.02.2026 made a Folder public for public finder modules added Template for added Time which the searching took resturctured the argparser added version Command added Argparser package removed loading templates directly from the Console or via a custom filepath! json output is broken in this Release, but will we fixed in future Releases formatted the tag Search output correctly 0.3.4 - 16.02.2026 changed Go Version to 1.18 fixed Search on all Drives on Windows from 0.3.3, it added Async Search made color package public 0.3.3 - 15.02.2026 added JSON Shema added File Options Search on all Drives on Windows added Tag Search 0.3.2 - 15.02.2026 0.3.1 - 15.02.2026 ✨ Features Runtime Custom Template System Custom Templates without Recompilation : Users can now create templates in ~/.finder/templates/ or ./.finder/templates/ without recompiling the programAutomatic Template Discovery : New .json5 files are automatically detected and loaded on startupUser Templates Override : User-defined templates can override built-in templates with the same namePrecedence System : User templates take precedence over built-in templatesCLI Reorganization & Modernization Modular CLI Architecture : Complete restructuring from monolithic designparser.go: Dedicated argument parsing logichandlers.go: Isolated command handlerscommands.go: Clean routing (reduced from 300+ to 60 lines)Command Aliases : New shorter forms for common commandsh, -h, --help in addition to helpls in addition to list--file in addition to -f--config in addition to -cCLIOptions Struct : Structured argument representation with predicates.IsHelp(), .IsList(), .IsCheck(), .IsFileLoad(), .IsDirectLoad(), .IsTemplateSearch().GetFileArg(), .GetDirectLoadArg(), .GetTemplateName()Verbose Mode : New --verbose flag for extended outputEnhanced Help System Better Help Structure : Organized into COMMANDS, FILE & CONFIG OPERATIONS, GLOBAL FLAGSTable Layout : Improved readability with consistent formattingCustom Templates Info : Documentation for user template setupDetailed Descriptions : Each command with clear explanationEnhanced List & Check Commands Separated Display : Built-in and custom templates are listed separatelyTemplate Sources : Source attribute shows whether template is built-in or customHelpful Hints : Paths for custom template setup are displayedImproved Validation : Check command validates with source information🧪 Testing 40+ new unit tests for CLI parser logicParser Tests : Comprehensive coverage for command recognition, flag parsing, argument extractionIntegration Tests : End-to-end tests for command executionRouting Tests : Tests for handler mappingError Handling Tests : Validation of error handling and user feedback📖 Documentation ARCHITECTURE.md : Detailed technical documentation of the new CLI structureREORGANIZATION.md : Comprehensive before/after comparison and explanationQUICKSTART.md : Practical guide for adding new commandsCUSTOM_TEMPLATES.md : User guide for custom template creationInline Code Comments : Improved code documentation🔧 Infrastructure Enhanced Template Loader (templateloader.go)LoadUserTemplates(): Discovers user templates from filesystemJSONtemplateLoaderWithUserTemplates(): Intelligent loading with user overrideLoadAllWithUserTemplates(): Combined built-in + custom template discoveryTemplate Override Mechanism : User templates can replace built-in templatesGraceful Error Handling : Missing user template directories are not fatal🎯 Quality Improvements Clean Code Structure : Single Responsibility Principle consistently appliedBetter Testability : Each module can be tested in isolationExtensibility : New commands can be added in 5 simple stepsBackward Compatibility : External API (HandleCommand()) unchanged👥 User Experience Better Error Messages : Context-sensitive error messages with suggestionsHelpful Hints : Tips for common tasks (e.g., where to place templates)Flexible Command Syntax : Multiple synonyms for each commandConsistent Output Formatting : Unified design across all commandsNo Recompilation Required : Custom templates are loaded at runtimeEfficient Template Discovery : Fast filesystem traversalMinimal Overhead : Template loading has negligible performance impact🐛 Bug Fixes & Improvements Improved error handling in template loading Better handling of missing or malformed user templates Consistent error messages across all commands Fixed edge cases in CLI argument parsing 📝 Breaking Changes No Breaking Changes : All existing commands work unchangedInternal structure completely refactored, but public API remains stable 🙏 Highlights This version brings the biggest improvement since 0.2.0:
Users can now create their own templates Codebase is more maintainable and extensible Test coverage drastically improved 0.3.0 - 23.01.2026 Template System & CLI Foundations
0.2.0 - 23.01.2026 More Templates Better Console Output Help Message
0.1.0 - 17.11.2025 Programm Init
0.0.0 - 30.11.2025 the start
',styles:[g]},configeditor:{id:"configeditor",type:"component",load:()=>l(()=>import("./configeditor.js"),__vite__mapDeps([2,3]),import.meta.url),data:null,styles:[E]},creator:{id:"creator",type:"component",load:()=>l(()=>import("./creator.js"),__vite__mapDeps([4,5]),import.meta.url),data:"0.3.17",styles:[]},"docs/config":{id:"docs/config",type:"markdown",html:'Config fields Port Port for the findergen server to view and create templates.
Cache When set to true, the results of will be saved as a cache and can then be used afterwards
Create Cache Database When set to true, the cache data of finder will be saved in a Git DB. Git is required for this.
Finder Instances Finder instances which will run at the same time when creating cache for all templates
',styles:[g]},"docs/index":{id:"docs/index",type:"markdown",html:'Finder Docs soon
',styles:[g]},home:{id:"home",type:"component",load:()=>l(()=>import("./home.js"),__vite__mapDeps([6,7]),import.meta.url),data:null,styles:[]},index:{id:"index",type:"component",load:()=>l(()=>import("./index.js"),[],import.meta.url),data:`# AGENTS — Finder Template Authoring Guide
-
-This document is for AI assistants such as ChatGPT, Claude, Copilot,
-and similar tools that need to create valid Finder templates.
-
-Goal:
-
-- create Finder-compatible JSON5 templates
-- work with all supported template features
-- prefer valid, minimal, and robust patterns
-- avoid false positives and over-constrained matches
-
-## 1) What Finder matches
-
-Finder scans folders on the filesystem and checks whether a directory
-matches a template.
-
-A template describes:
-
-- the directory name pattern
-- required or forbidden files
-- required or forbidden subfolders
-- optional file constraints like size and hash
-- optional command validation
-- tags for discovery
-
-A template is a JSON5 file ending in \`.json5\` .
-
-Typical locations:
-
-- \`~/.finder/templates/\`
-- \`./.finder/templates/\`
-
-The filename without \`.json5\` becomes the template name, for example:
-
-- \`my-template.json5\` → \`my-template\`
-
----
-
-## 2) Core template schema
-
-A valid Finder template looks like this:
-
-\`\`\`json5
-{
- min_version: "0.3.16",
- description: "My custom project type",
- name: "*",
- tags: ["node", "typescript"],
- files: [
- "package.json",
- {
- name: "src",
- existence: "optional",
- },
- {
- name: "*.ts",
- existence: "required",
- size: {
- min: 1,
- min_size_type: "KB",
- },
- },
- ],
- folders: [
- {
- name: "src",
- folders: [],
- files: ["index.ts"],
- },
- ],
- command: "",
- invert_command: false,
- size: {
- min: 10,
- min_size_type: "KB",
- },
-}
-\`\`\`
-
----
-
-## 3) Supported top-level fields
-
-### \`description\` (string)
-
-Short human-readable explanation.
-
-\`\`\`json5
-"description": "Python service with pyproject.toml"
-\`\`\`
-
-### \`name\` (string)
-
-Pattern for the directory name.
-
-Use:
-
-- \`"*"\` for any folder name
-- \`"my-app"\` for exact name
-- \`"project-*"\` for glob wildcard matching
-- \`"^project-[0-9]+$"\` for regex matching
-
-Important:
-
-- Matching is exact-first, then regex, then glob fallback (see
- the "Pattern matching" section below).
-- If you want to match all folders, prefer \`"*"\` .
-
-### \`files\` (array)
-
-Defines required/optional files.
-
-Can be either:
-
-- old style: string array
-- modern style: objects with metadata
-
-Examples:
-
-\`\`\`json5
-"files": [
- "package.json",
- "README.md"
-]
-\`\`\`
-
-\`\`\`json5
-"files": [
- {
- "name": "*.go",
- "existence": "required"
- },
- {
- "name": "go.mod",
- "existence": "required"
- },
- {
- "name": "*.dll",
- "existence": "forbidden"
- }
-]
-\`\`\`
-
-### \`existence\` values
-
-- \`required\` (default): file must exist
-- \`forbidden\` : file must not exist
-- \`optional\` : exists is okay, but not required
-
-Examples:
-
-\`\`\`json5
-{
- name: ".git",
- existence: "required",
-}
-\`\`\`
-
-\`\`\`json5
-{
- name: "*.env",
- existence: "forbidden",
-}
-\`\`\`
-
-### \`size\` (file or folder size constraint)
-
-Used under a file object or as a folder-level rule.
-
-\`\`\`json5
-"size": {
- "min": 1,
- "min_size_type": "KB",
- "max": 500,
- "max_size_type": "MB"
-}
-\`\`\`
-
-Valid size types:
-
-- \`B\`
-- \`KB\`
-- \`MB\`
-- \`GB\`
-
-For file-level checking:
-
-- file must exist
-- file size must satisfy the condition
-
-For folder-level checking:
-
-- total directory size is checked recursively
-
-### \`checksums\` (hash-based validation)
-
-You can require exact SHA256 or SHA512 for matching files.
-
-\`\`\`json5
-{
- name: "*.zip",
- checksums: {
- sha256: "abc123...",
- sha512: "def456...",
- },
-}
-\`\`\`
-
-Rules:
-
-- both hashes are optional
-- if SHA256 is provided, it must match exactly
-- if SHA512 is provided, it must match exactly
-- hash letters are compared case-insensitive
-
-### \`folders\` (nested directory patterns)
-
-Used to require subfolders.
-
-\`\`\`json5
-"folders": [
- {
- "name": ".git"
- },
- {
- "name": "src",
- "folders": [
- {
- "name": "components"
- }
- ]
- }
-]
-\`\`\`
-
-The nested \`Folder\` object supports the same shape recursively.
-
-### \`command\` (string)
-
-Executes a shell command inside the found directory after matching.
-
-\`\`\`json5
-"command": "git status --porcelain"
-\`\`\`
-
-Behavior:
-
-- empty string means no command check
-- command success is evaluated according to exit code
-
-### \`invert_command\` (bool)
-
-Controls logic of command result.
-
-\`\`\`json5
-"invert_ command": false
-\`\`\`
-
-Meaning:
-
-- \`false\` → command must return success (typically exit code 0)
-- \`true\` → command must return failure (typically exit code != 0)
-
-### \`tags\` (array of strings)
-
-Category labels for browsing or filtering by tag.
-
-\`\`\` json5
-"tags": ["git", "repo", "vcs"]
-\`\`\`
-
-### \`min_version\` (string)
-
-Minimum finder version compatibility.
-
-\`\`\` json5
-"min_version": "0.3.16"
-\`\`\`
-
-### \`mdnote\` (string)
-
-Optional Markdown note attached to a template. It is rendered in the
-web UI (template viewer / creator) as rich text and is ignored during
-matching. Since 0.3.17.
-
-\`\`\`json5
-"mdnote": "# My template\\n\\nSome **markdown** explaining what this matches."
-\`\`\`
-
-Note: the value is normally stored percent-encoded (like
-\`encodeURIComponent\`) when generated by the web creator — newlines
-become \`%0A\` — but any plain Markdown string is valid and supported.
-
----
-
-## 3.5) Pattern matching: regex, glob, and exact
-
-Every name pattern in a template — the top-level \`name\`, every file
-\`name\`, and every folder \`name\` (including nested folders) — is
-resolved by the same matching function:
-
-\`\`\`go
-if pattern == name {
- return true // 1) exact string match
-}
-if ok, err := regexp.MatchString(pattern, name); err == nil {
- return ok // 2) full Go regex
-}
-ok, err := path.Match(pattern, name)
-return err == nil && ok // 3) glob fallback
-\`\`\`
-
-This creates a 3-tier matching strategy:
-
-| Priority | Method | Applies when |
-| -------- | ------------------------------- | ------------------------------------------ |
-| 1 | exact string equality | pattern equals the name verbatim |
-| 2 | Go regex (\`regexp.MatchString\`) | pattern is a valid regular expression |
-| 3 | glob (\`path.Match\`) | pattern is not a valid regex (e.g. \`*.ts\`) |
-
-### How to choose a pattern
-
-Because regex is attempted before glob, the same character can mean
-different things depending on the pattern:
-
-- \`"*.go"\` is not a valid regex, so it is treated as a glob and
- matches any file ending in \`.go\`.
-- \`"^main\\.py$"\` is a valid regex (anchored, no wildcard ambiguity),
- so it matches exactly one name.
-- \`"project-*"\` is not a valid regex, so it is treated as a glob.
-
-### Go regex syntax (priority 2)
-
-Patterns that compile as a Go regular expression match with full regex
-semantics against the entire entry name. Refer to Go's
-\`regexp/syntax\` (RE2) for the full language. Useful constructs:
-
-- anchors: \`^...$\`
-- character classes: \`[0-9]\`, \`[a-zA-Z]\`, \`[^...]\`
-- predefined classes: \`\\d\`, \`\\w\`, \`\\s\` (and uppercase negations)
-- quantifiers: \`*\`, \`+\`, \`?\`, \`{m,n}\`
-- alternation: \`(a|b)\`
-- groups: \`(abc)\`, non-capturing \`(?:abc)\`
-- escapes: \`\\.\`, \`\\\\\`
-
-Examples:
-
-\`\`\`json5
-// folder names like project-123, project-42 ...
-{ name: "^project-[0-9]+$" }
-\`\`\`
-
-\`\`\`json5
-// python entry files: main.py, app.py, ...
-{
- name: "^(main|app|server)\\\\.py$",
- existence: "required",
-}
-\`\`\`
-
-Note: Go regex is RE2 — no backreferences and no lookahead/lookbehind.
-If your pattern uses those, it fails to compile and falls back to glob.
-
-### Glob syntax (priority 3 fallback)
-
-When a pattern is not a valid regex, it is treated as a glob via Go's
-\`path.Match\`:
-
-- \`*\` matches any sequence of non-\`/\` characters
-- \`?\` matches any single non-\`/\` character
-- \`[abc]\` matches one character from the class
-- \`[^abc]\` / \`[!abc]\` matches one character not in the class
-- \`\\x\` escapes the next character
-
-There is no recursive \`**\` (doublestar) support — \`** \` does not
-descend into subdirectories.
-
-Examples:
-
-\`\`\`json5
-"name": "*.ts",
-\`\`\`
-
-\`\`\`json5
-"name": "file?.txt",
-\`\`\`
-
-\`\`\`json5
-"name": "[abc].go",
-\`\`\`
-
-### Where these patterns apply
-
-- top-level \`name\` → the scanned directory name
-- \`files[].name\` → file names inside the directory
-- \`folders[].name\` → subfolder names (recursively for nested folders)
-
-Regex patterns work in all of these places. Exact glob patterns like
-\`"src"\` or \`"package.json"\` work exactly as before.
-
-### Compatibility note
-
-Regex support was added in finder 0.3.17. If your template relies on
-regex patterns, set:
-
-\`\`\`json5
-"min_ version": "0.3.17"
-\`\`\`
-
-Templates for older finder versions should keep using glob or exact
-patterns only.
-
----
-
-## 4) Matching semantics
-
-A directory is considered a match only if all required conditions are
-satisfied.
-
-This includes:
-
-- \`name\` matches the folder name
-- required files exist
-- forbidden files do not exist
-- required subfolders exist
-- size constraints pass
-- checksum constraints pass
-- command condition passes
-
-If any required rule fails, the directory is rejected.
-
----
-
-## 5) Good patterns for template design
-
-### Prefer broad matching first
-
-Good default:
-
-\`\`\` json5
-{
- name: "*",
- files: ["package.json", "tsconfig.json"],
-}
-\`\`\`
-
-Bad:
-
-\`\`\`json5
-{
- name: "my-app",
- files: ["package.json"],
-}
-\`\`\`
-
-The second version is overly restrictive and will miss most valid
-project folders.
-
-### Require the smallest useful signal
-
-For example, a Go project should usually require:
-
-- \`go.mod\`
-- one or more \`* .go\` files
-
-Not a huge list of optional files.
-
-### Avoid false positives
-
-If your project has a \`README.md\` in many folders, do not require it
-unless it is central to your pattern.
-
-### Use wildcards and regex carefully
-
-\`\`\`json5
-"name": "*.git" // if you intended a hidden git folder, this is special-case logic
-\`\`\`
-
-Use patterns like \`"*"\` , \`"src"\` , \`"*.ts"\` , \`"package.json"\` rather
-than complex regex-style expressions when a simple glob suffices.
-
-When you do need regex (e.g. matching \`project-123\` with
-\`^project-[0-9]+$\` ), anchor with \`^\` and \`$\` to avoid unintended
-matches.
-
----
-
-## 6) Examples
-
-### Example A: Git repository
-
-\`\`\`json5
-{
- description: "Git repository root",
- name: "*",
- folders: [
- {
- name: ".git",
- },
- ],
- tags: ["git", "repo"],
-}
-\`\`\`
-
-### Example B: Node project
-
-\`\`\`json5
-{
- description: "Node.js project",
- name: "*",
- files: ["package.json", "src", "README.md"],
- tags: ["node", "javascript", "typescript"],
-}
-\`\`\`
-
-### Example C: Python project
-
-\`\`\`json5
-{
- description: "Python project with pyproject.toml",
- name: "*",
- files: [
- "pyproject.toml",
- {
- name: "*.py",
- existence: "required",
- },
- ],
- tags: ["python", "project"],
-}
-\`\`\`
-
-### Example D: strict checksum template
-
-\`\`\`json5
-{
- name: "*",
- description: "test for checksums",
- files: [
- {
- name: "*",
- checksums: {
- sha256: "26be688daf71f2c8e64eecfa7fdf7d1f3649b6aae80dbb686ec3a9beb9def05b",
- },
- },
- ],
- min_version: "0.3.16",
-}
-\`\`\`
-
-This matches only folders containing a file whose SHA256 matches
-exactly.
-
-### Example E: custom monorepo
-
-\`\`\`json5
-{
- description: "Monorepo with apps and packages",
- name: "*",
- files: ["pnpm-workspace.yaml", "package.json"],
- folders: [
- {
- name: "apps",
- folders: [
- {
- name: "*",
- files: ["package.json"],
- },
- ],
- },
- {
- name: "packages",
- folders: [
- {
- name: "*",
- files: ["package.json"],
- },
- ],
- },
- ],
- tags: ["monorepo", "workspace"],
-}
-\`\`\`
-
-### Example F: regex-matched folder name
-
-\`\`\`json5
-{
- description: "Numbered project folder",
- name: "^project-[0-9]+$",
- files: [
- {
- name: "^(main|app)\\\\.py$",
- existence: "required",
- },
- ],
- tags: ["python", "numbered"],
- min_version: "0.3.17",
-}
-\`\`\`
-
-This matches folders like \`project-123\` or \`project-42\` and requires
-exactly one of \`main.py\` or \`app.py\` to be present. The name uses a
-Go regex (RE2) — note the escaped dots \`\\\\.\` and anchors \`^...$\` .
-
-### Example G: regex file pattern with glob fallback
-
-\`\`\`json5
-{
- description: "JavaScript project with strict entry points",
- name: "*",
- files: [
- "package.json",
- {
- name: "^(index|main|app)\\\\.(js|ts|jsx|tsx)$",
- existence: "required",
- },
- {
- name: "\\\\.env$",
- existence: "forbidden",
- },
- ],
- tags: ["javascript", "strict"],
- min_version: "0.3.17",
-}
-\`\`\`
-
-This requires one of \`index.js\` , \`main.js\` , \`app.js\` , \`index.ts\` , etc.
-and forbids any file ending in \`.env\` . Note that \`"*.env"\` would also
-work as a glob — the regex version is more explicit.
-
----
-
-## 7) Rules for AI-generated Finder templates
-
-When generating a Finder template, the assistant should follow this
-checklist:
-
-1. Create a valid \`.json5\` file.
-2. Use \`name: "*"\` unless the directory name is intentionally constrained.
-3. Keep required files minimal and specific.
-4. Prefer \`required\` over broad file matching if a file is essential.
-5. Use \`forbidden\` only for truly disqualifying files.
-6. Use \`size\` only when it genuinely distinguishes the target project type.
-7. Use \`checksums\` only when exact file identity is important.
-8. Add \`tags\` for discoverability.
-9. Keep \`description\` clear and concise.
-10. Prefer a deliberately narrow but realistic match over a very broad guess.
-11. Validate with the project command before claiming success.
-
----
-
-## 8) Validation commands
-
-After writing a template, validate it with one of these project commands:
-
-\`\`\`bash
-./finder check
-\`\`\`
-
-Or test a specific template:
-
-\`\`\`bash
-./finder my-template-name
-\`\`\`
-
-If a template exists in the custom template folder, it will be loaded
-automatically.
-
----
-
-## 9) Common mistakes
-
-### Mistake 1: too strict \`name\`
-
-\`\`\`json5
-"name": "root"
-\`\`\`
-
-This will match almost nothing unless the folder is literally named \`root\` .
-
-Use:
-
-\`\`\`json5
-"name": "*"
-\`\`\`
-
-unless you intentionally want a fixed directory name.
-
-### Mistake 2: requiring too many files
-
-Large project templates often become unreliable if they require too
-many files.
-
-Prefer the smallest signal that distinguishes the project type.
-
-### Mistake 3: mixing regex and glob syntax unintentionally
-
-Finder tries regex first, then falls back to glob. This is usually
-fine, but remember that a pattern that looks like a regex is treated
-as a regex:
-
-- \`"*.ts"\` is invalid regex → glob, matches any \`.ts\` file
-- \`"^main\\\\.py$"\` is valid regex → only matches exactly \`main.py\`
-
-Use:
-
-- \`*.ts\`
-- \`package.json\`
-- \`src\`
-- \`^project-[0-9]+$\` (regex, only when you need it)
-
-Do not write patterns that accidentally compile as a regex and change
-meaning. If in doubt, prefer glob or exact names.
-
-### Mistake 4: forgetting the \`.json5\` extension
-
-The file must end in \`.json5\` .
-
-### Mistake 5: writing invalid JSON5
-
-Remember:
-
-- trailing commas may be allowed depending on parser handling
-- keep object structure valid
-- avoid broken braces and trailing commas in awkward spots
-
-### Mistake 6: requiring impossible signals
-
-For example, requiring a project-specific file that is generated only
-in CI or only in a subset of repositories will make your template
-unreliable.
-
----
-
-## 10) Recommended prompt pattern for AI generation
-
-Use this when asking an AI to generate a Finder template:
-
-\`\`\`text
-Create a Finder template as a JSON5 file for <project type>.
-Use a custom template file in ~/.finder/templates/ or ./.finder/templates/.
-Requirements:
-- match folders with name "*" unless a narrower pattern is necessary
-- require the smallest set of meaningful files/folders
-- include tags and a clear description
-- allow optional files if needed
-- do not use overly strict name filters
-- ensure the structure is valid Finder JSON5
-- include examples of required files and nested folders if relevant
-- add a realistic command check only when needed
-- keep the template robust and not prone to false positives
-\`\`\`
-
----
-
-## 11) Final rule
-
-A good Finder template should be:
-
-- valid JSON5
-- minimal but discriminative
-- not too broad
-- not too narrow
-- easy to debug
-- easy to maintain
-
-If you are unsure, prefer a simple template with the most reliable
-markers:
-
-- folder names
-- known files
-- known subfolders
-- one or two strong signs of the project type
-
----
-
-## 12) One minimal example to copy
-
-\`\`\`json5
-{
- description: "Simple project template",
- name: "*",
- files: [
- "package.json",
- {
- name: "src",
- existence: "optional",
- },
- ],
- tags: ["project"],
-}
-\`\`\`
-
-This is intentionally simple and often a good starting point for custom
-templates.
-
----
-
-## 13) When writing a new template for this repo
-
-If the task is to add a template to this project, keep in mind:
-
-- put it in the template directory used by the runtime
-- follow the repo’s JSON5 style closely
-- avoid accidental false positives
-- validate with finder checks after creation
-
-This repo has built-in examples in the templates folder and the project
-docs in the root files.
- `,styles:[g]},"mcapp/about":{id:"mcapp/about",type:"component",load:()=>l(()=>import("./about.js"),__vite__mapDeps([8,9,10]),import.meta.url),data:null,styles:[]},"mcapp/index":{id:"mcapp/index",type:"component",load:()=>l(()=>import("./index2.js"),__vite__mapDeps([11,9,10]),import.meta.url),data:null,styles:[]},"mcapp/info":{id:"mcapp/info",type:"component",load:()=>l(()=>import("./info.js"),__vite__mapDeps([12,9,10]),import.meta.url),data:null,styles:[]},"mcapp/worlds":{id:"mcapp/worlds",type:"component",load:()=>l(()=>import("./worlds.js"),__vite__mapDeps([13,9,10]),import.meta.url),data:null,styles:[]},readme:{id:"readme",type:"markdown",html:`finder
Finder is a lightweight command-line tool written in Go to locate projects and files based on predefined folder/file structure templates. It ships with 370+ built-in templates covering a huge range of technologies, frameworks, and services — and you can add your own without recompiling.
Current version: 0.3.17
Features Template-based search — find projects by folder/file structureCustom templates — drop .json5 files intoRegex support — use regular expressions in template patternsAsync search — searches all drives (Windows) or root /Caching — create and reuse a cache for significantly fasterJSON output — pipe results into other tools with --json.Tag search — browse templates by tag (-t).Binary search — find executables in your $PATH (-b).File size & checksum validation — templates can requireCommand validation — templates can run a shell command afterWeb UI (findergen) — a built-in HTTP server for browsing,Cross-platform — works on Windows, Linux, and macOS.Requirements Binaries The repository contains several binaries:
Binary Description finderMain CLI — search for projects and files using templates findergenHTTP server & web UI for template management, cache viewer, config editor csfBuild helper — compile scripts, go install with CGO, git repo pack/restore testerTemplate test tool — validates template files
Installation Build from source go build ./cmd/finderOr install directly (Go 1.18+):
go install github.com/shadowdara/finder/cmd/finder@latestThe produced binary is finder (on Windows finder.exe).
Build all binaries
-build.bat
-
-
-go build ./cmd/finder
-go build ./cmd/findergen
-go build ./cmd/testerOr using make:
make
-make release
-make install Usage Basic search finder <template-name>Find Git repositories:
finder gitCommands Command Aliases Description finderSearch for projects matching a template finder checkValidate all built-in and custom templates finder listlsList all available templates finder tagstagShow all tags in the console finder -tSearch for templates by tag finder -bSearch for executables in your $PATH finder cpPrint the path to the global config file finder version-v, vPrint the current version finder templatetplSearch using an explicit template name
Global flags Flag Aliases Description --json-jOutput results as JSON --verbose-vvEnable verbose output
Cache flags Flag Aliases Description --cache-cUse the existing cache instead of searching --create-cache-ccCreate a new cache --create-cache-db-ccdCreate a Git database from cache data
Example
-finder react
-
-
-finder --json react
-
-
-finder --create-cache git
-
-
-finder --cache git
-
-
-finder -t python
-
-
-finder listTemplates Built-in templates 370+ templates are shipped in templates/ and compiled into internal/templates/. They cover frameworks, languages, databases, CI/CD systems, cloud services, AI/ML tools, and much more.
Templates are JSON5 files. A minimal template:
{
- name: "*" ,
- folders: [ { name: ".git" } ] ,
-} A full template with all supported fields:
{
- min_version: "0.3.6" ,
- description: "My Custom Project Type" ,
- name: "*" ,
- tags: [ "node" , "typescript" ] ,
- folders: [
- {
- name: "src" ,
- folders: [ ] ,
- files: [ "index.ts" ] ,
- } ,
- ] ,
- files: [
- "package.json" ,
- {
- name: "*.ts" ,
- existence: "required" ,
- size: {
- min: 1 ,
- min_size_type: "KB" ,
- } ,
- } ,
- ] ,
- command: "" ,
- invert_command: false ,
- size: {
- min: 10 ,
- min_size_type: "KB" ,
- } ,
-} Custom templates Place your own .json5 template files in:
OS Path Windows \`%USERPROFILE%\\.finder\\templates\` Linux ~/.finder/templates/macOS ~/.finder/templates/
Or in the project-local directory:
./.finder/templates/User templates take precedence over built-in templates with the same name. See \`CUSTOM_TEMPLATES.md\` for the full guide.
Pattern matching (exact, regex, glob) Since v0.3.17 , every name pattern in a template — the top-level name, every file name, and every folder name (including nested folders) — is resolved by a 3-tier matching strategy :
Priority Method Applies when 1 Exact string equality pattern equals the name verbatim 2 Go regex (regexp.MatchString) pattern compiles as a valid regex (RE2) 3 Glob (path.Match) pattern is not a valid regex (e.g. *.ts)
This means:
"src" → exact match"^project-[0-9]+$" → valid regex, matches project-123, project-42, …"*.ts" → not a valid regex → glob fallback, matches any .ts file"^(main|app|server)\\.py$" → valid regex, matches exactly main.py,Regex patterns work in all name fields:
-{
- name: "^project-[0-9]+$" ,
- min_version: "0.3.17" ,
- files: [
- {
-
- name: "^(main|app|server)\\\\.py$" ,
- existence: "required" ,
- } ,
- ] ,
- folders: [
- {
-
- name: "^(src|lib|pkg)$" ,
- } ,
- ] ,
-} Note: Go regex is RE2 — no backreferences and no lookahead/lookbehind. If your pattern uses unsupported syntax, it fails to compile and falls back to glob matching.
If your template relies on regex patterns, set "min_version": "0.3.17" to indicate the minimum Finder version required.
Config Since v0.3.15 , finder has a global config file at ~/.finder/config.json5. If the file does not exist, defaults are used:
{
- port: 8080 ,
- cache: false ,
- create_cache_db: false ,
- finder_instances: 8 ,
-} Key Type Default Description portint 13420HTTP server port for findergen cachebool falseEnable cache by default createcache dbbool falseCreate a Git database from cache data finder_instancesint 8Max parallel instances when creating cache
For a visual config editor, visit https://shadowdara.github.io/finder/configeditor .
Web UI (findergen) findergen starts a local HTTP server with a web interface for:
Template Creator — create and edit JSON5 templates visuallyTemplate Viewer — browse all built-in and custom templatesConfig Editor — edit config.json5 through the browserCache Viewer — inspect cached search resultsRegex Creator — build and test regular expressions for templatesMinecraft World Dashboard — view Minecraft worlds from the cache
-./findergen
-
-
-./findergen --port 3000
-
-
-./findergen worldsProject structure finder/
-├── cmd/
-│ ├── finder/ # Main CLI binary
-│ ├── findergen/ # Web UI server binary
-│ ├── csf/ # Build helper binary
-│ └── tester/ # Template test binary
-├── internal/
-│ ├── bt/ # Build tools (script compiler, git repo)
-│ ├── cache/ # Cache system & Git DB
-│ ├── cli/ # CLI command handling
-│ ├── config/ # Configuration loading
-│ ├── finderversion/ # Version constants
-│ ├── history/ # Search history
-│ ├── loader/ # File loading utilities
-│ ├── mcapp/ # Minecraft world data
-│ ├── search/ # Core search logic & binary check
-│ ├── structure/ # Folder/template structure parsing
-│ └── templates/ # Compiled templates + loader
-├── pub/
-│ ├── argparser/ # Argument parsing library
-│ ├── color/ # Terminal color utilities
-│ ├── fsd/ # Filesystem directory utilities
-│ ├── goansi/ # ANSI escape codes
-│ ├── json5/ # JSON5 parser
-│ └── version/ # Semantic version comparison
-├── templates/ # Source JSON5 templates (370+)
-└── finder-template-generator-ssg/ # Static site generator for docsDevelopment Run tests go test ./...Generate coverage report go test -coverprofile=coverage ./...
-go tool cover -html=coverageBuild go build ./cmd/finderValidate templates go run ./cmd/finder checkList all templates go run ./cmd/finder listContributing Found a missing or inaccurate template? Please open an issue. Add new templates via PR. Keep them in JSON5 and provide a short Feel free to contribute code improvements or new features. Roadmap License See \`LICENSE\` .
Project: https://github.com/shadowdara/finder Website: https://shadowdara.github.io/finder
The Project fs-tools was more or less the prototype for finder.
Info Video (a Youtube Video )
`,styles:[g]},regexcreator:{id:"regexcreator",type:"component",load:()=>l(()=>import("./regexcreator.js"),__vite__mapDeps([14,15]),import.meta.url),data:null,styles:[]},samfile:{id:"samfile",type:"component",load:()=>l(()=>import("./samfile.js"),__vite__mapDeps([16,17,18]),import.meta.url),data:null,styles:[]},"tools/index":{id:"tools/index",type:"component",load:()=>l(()=>import("./index3.js"),__vite__mapDeps([19,20]),import.meta.url),data:null,styles:[]},"tools/installscript":{id:"tools/installscript",type:"component",load:()=>l(()=>import("./installscript.js"),__vite__mapDeps([21,22]),import.meta.url),data:null,styles:[]},"tools/markdowneditor":{id:"tools/markdowneditor",type:"component",load:()=>l(()=>import("./markdowneditor.js"),__vite__mapDeps([23,24,25]),import.meta.url),data:null,styles:[]},"tools/minecraft/tellraw":{id:"tools/minecraft/tellraw",type:"component",load:()=>l(()=>import("./tellraw.js"),__vite__mapDeps([26,17,27]),import.meta.url),data:null,styles:[]},viewer:{id:"viewer",type:"component",load:()=>l(()=>import("./viewer.js"),__vite__mapDeps([28,24,29]),import.meta.url),data:null,styles:[]}},k=Symbol("html");function t(e,n,...a){if(typeof e=="function")return e({...n??{},children:a});const o=new Set(["disabled","checked","selected","readonly","required","multiple","hidden","autofocus","open"]),h=Object.entries(n??{}).filter(([s])=>s!=="children"&&s!=="key").map(([s,d])=>{if(d==null)return"";const r=s==="className"?"class":s;return typeof d=="boolean"&&o.has(r)?d?` ${r}`:"":typeof d=="boolean"?` ${r}="${d}"`:d===!1?"":` ${r}="${A(String(d))}"`}).join(""),b=a.flat(1/0).filter(s=>s!=null&&s!==!1).map(s=>v(s)?s.value:x(String(s))).join(""),i=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]).has(e)?`<${e}${h}>`:`<${e}${h}>${b}${e}>`;return q(i)}function C(e){const n=(e.children??[]).flat(1/0).filter(a=>a!=null&&a!==!1).map(a=>v(a)?a.value:x(String(a))).join("");return q(n)}function q(e){return{[k]:!0,value:e,toString(){return e}}}function v(e){return typeof e=="object"&&e!==null&&k in e}function A(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(//g,">")}function x(e){return e.replace(/&/g,"&").replace(//g,">")}function F(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function _(e){return q(e)}function I(e){for(const n of e){const a=new URL(n,import.meta.url).href;if(document.head.querySelector(`link[data-page-style="${CSS.escape(a)}"]`))continue;const o=document.createElement("link");o.rel="stylesheet",o.href=a,o.dataset.pageStyle=a,document.head.appendChild(o)}}function U(e){e.innerHTML=t("main",null,t("h1",null,"404"),t("p",null,"No page id was provided."),t("a",{href:"/"},"Go home"))}function P(e,n){const a=Object.keys(n).filter(o=>o!=="__404__").map(o=>t("li",null,t("a",{href:o==="index"?"/":`/${o}`},o))).join("");e.innerHTML=t("main",null,t("h1",null,"404"),t("p",null,"Page not found."),t("h2",null,"Available pages"),t("ul",null,_(a)),t("a",{href:"/"},"Go home"))}function L(e,n){e.innerHTML=t("main",null,t("h1",null,"404"),t("p",null,"Page ",n," not found."),t("a",{href:"/"},"Go home"))}function M(e,n,a){console.error(`[pages] Failed to load page "${n}"`,a),e.innerHTML=t("main",null,t("h1",null,"Failed to load page"),t("p",null,'Could not load "$',n,'".'),t("a",{href:"/"},"Go home"),t("pre",null,`[pages] Failed to load page "${n}"`),t("pre",null,a))}function R(e,n){n.type==="markdown"&&(e.innerHTML=t(C,null,t("a",{href:"../"},"Home"),t("article",{class:"markdown"},_(n.html??""))))}async function O(){const e=document.getElementById("app");if(e==null)throw new Error("Missing #app element");const n=window.PAGE_ID;if(!n){U(e);return}if(n==="__404__"){P(e,y);return}const a=y[n];if(!a){console.error(`[pages] Unknown page id: ${n}`),L(e,n);return}try{if(I(a.styles),a.type==="markdown"){R(e,a);return}await(await a.load()).default(e,a.data)}catch(o){M(e,n,o)}}O();export{C as F,F as e,t as j,_ as r};
+const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./cacheviewer.js","./cacheviewer.css","./configeditor.js","./configeditor.css","./creator.js","./creator.css","./home.js","./home.css","./about.js","./mcappheader.js","./mcappheader.css","./index3.js","./info.js","./worlds.js","./regexcreator.js","./regexcreator.css","./samfile.js","./jquery.module.js","./samfile.css","./index4.js","./index.css","./installscript.js","./installscript.css","./markdowneditor.js","./markdown.js","./markdowneditor.css","./tellraw.js","./tellraw.css","./viewer.js","./viewer.css"])))=>i.map(i=>d[i]);
+const O="modulepreload",A=function(e,o){return new URL(e,o).href},w={},r=function(o,t,l){let u=Promise.resolve();if(t&&t.length>0){let p=function(i){return Promise.all(i.map(c=>Promise.resolve(c).then(_=>({status:"fulfilled",value:_}),_=>({status:"rejected",reason:_}))))};const s=document.getElementsByTagName("link"),a=document.querySelector("meta[property=csp-nonce]"),d=(a==null?void 0:a.nonce)||(a==null?void 0:a.getAttribute("nonce"));u=p(t.map(i=>{if(i=A(i,l),i in w)return;w[i]=!0;const c=i.endsWith(".css"),_=c?'[rel="stylesheet"]':"";if(!!l)for(let f=s.length-1;f>=0;f--){const h=s[f];if(h.href===i&&(!c||h.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${_}`))return;const m=document.createElement("link");if(m.rel=c?"stylesheet":O,c||(m.as="script"),m.crossOrigin="",m.href=i,d&&m.setAttribute("nonce",d),document.head.appendChild(m),c)return new Promise((f,h)=>{m.addEventListener("load",f),m.addEventListener("error",()=>h(new Error(`Unable to preload CSS for ${i}`)))})}))}function E(p){const s=new Event("vite:preloadError",{cancelable:!0});if(s.payload=p,window.dispatchEvent(s),!s.defaultPrevented)throw p}return u.then(p=>{for(const s of p||[])s.status==="rejected"&&E(s.reason);return o().catch(E)})},y=""+new URL("markdownrootstyle.css",import.meta.url).href,D=""+new URL("markdownstyle.css",import.meta.url).href,v={cacheviewer:{id:"cacheviewer",type:"component",load:()=>r(()=>import("./cacheviewer.js"),__vite__mapDeps([0,1]),import.meta.url),data:null,styles:[]},changelog:{id:"changelog",type:"markdown",load:()=>r(()=>import("./_virtual_page-markdown_changelog.js"),[],import.meta.url),styles:[y]},configeditor:{id:"configeditor",type:"component",load:()=>r(()=>import("./configeditor.js"),__vite__mapDeps([2,3]),import.meta.url),data:null,styles:[D]},creator:{id:"creator",type:"component",load:()=>r(()=>import("./creator.js"),__vite__mapDeps([4,5]),import.meta.url),data:"0.3.18",styles:[]},"docs/config":{id:"docs/config",type:"markdown",load:()=>r(()=>import("./config.js"),[],import.meta.url),styles:[y]},"docs/index":{id:"docs/index",type:"markdown",load:()=>r(()=>import("./index.js"),[],import.meta.url),styles:[y]},home:{id:"home",type:"component",load:()=>r(()=>import("./home.js"),__vite__mapDeps([6,7]),import.meta.url),data:null,styles:[]},index:{id:"index",type:"component",load:()=>r(()=>import("./index2.js"),[],import.meta.url),loadData:()=>r(()=>import("./_virtual_page-data_index.js"),[],import.meta.url).then(e=>e.default),styles:[y]},"mcapp/about":{id:"mcapp/about",type:"component",load:()=>r(()=>import("./about.js"),__vite__mapDeps([8,9,10]),import.meta.url),data:null,styles:[]},"mcapp/index":{id:"mcapp/index",type:"component",load:()=>r(()=>import("./index3.js"),__vite__mapDeps([11,9,10]),import.meta.url),data:null,styles:[]},"mcapp/info":{id:"mcapp/info",type:"component",load:()=>r(()=>import("./info.js"),__vite__mapDeps([12,9,10]),import.meta.url),data:null,styles:[]},"mcapp/worlds":{id:"mcapp/worlds",type:"component",load:()=>r(()=>import("./worlds.js"),__vite__mapDeps([13,9,10]),import.meta.url),data:null,styles:[]},readme:{id:"readme",type:"markdown",load:()=>r(()=>import("./_virtual_page-markdown_readme.js"),[],import.meta.url),styles:[y]},regexcreator:{id:"regexcreator",type:"component",load:()=>r(()=>import("./regexcreator.js"),__vite__mapDeps([14,15]),import.meta.url),data:null,styles:[]},samfile:{id:"samfile",type:"component",load:()=>r(()=>import("./samfile.js"),__vite__mapDeps([16,17,18]),import.meta.url),data:null,styles:[]},"test/jekyll/index":{id:"test/jekyll/index",type:"component",load:()=>r(()=>import("./page.js"),[],import.meta.url),styles:[]},"tools/index":{id:"tools/index",type:"component",load:()=>r(()=>import("./index4.js"),__vite__mapDeps([19,20]),import.meta.url),data:null,styles:[]},"tools/installscript":{id:"tools/installscript",type:"component",load:()=>r(()=>import("./installscript.js"),__vite__mapDeps([21,22]),import.meta.url),data:null,styles:[]},"tools/line_formatter/line_extender/page":{id:"tools/line_formatter/line_extender/page",type:"component",load:()=>r(()=>Promise.resolve().then(()=>q),void 0,import.meta.url),data:null,styles:[]},"tools/line_formatter/page":{id:"tools/line_formatter/page",type:"component",load:()=>r(()=>Promise.resolve().then(()=>M),void 0,import.meta.url),data:null,styles:[]},"tools/markdowneditor":{id:"tools/markdowneditor",type:"component",load:()=>r(()=>import("./markdowneditor.js"),__vite__mapDeps([23,24,25]),import.meta.url),data:null,styles:[]},"tools/minecraft/tellraw":{id:"tools/minecraft/tellraw",type:"component",load:()=>r(()=>import("./tellraw.js"),__vite__mapDeps([26,17,27]),import.meta.url),data:null,styles:[]},"tools/picture-mode-maker/page":{id:"tools/picture-mode-maker/page",type:"component",load:()=>r(()=>import("./page2.js"),[],import.meta.url),data:null,styles:[]},viewer:{id:"viewer",type:"component",load:()=>r(()=>import("./viewer.js"),__vite__mapDeps([28,24,29]),import.meta.url),data:null,styles:[]}},P=Symbol("html");function n(e,o,...t){if(typeof e=="function")return e({...o??{},children:t});const l=new Set(["disabled","checked","selected","readonly","required","multiple","hidden","autofocus","open"]),u=Object.entries(o??{}).filter(([a])=>a!=="children"&&a!=="key").map(([a,d])=>{if(d==null)return"";const i=a==="className"?"class":a;return typeof d=="boolean"&&l.has(i)?d?` ${i}`:"":typeof d=="boolean"?` ${i}="${d}"`:d===!1?"":` ${i}="${k(String(d))}"`}).join(""),E=t.flat(1/0).filter(a=>a!=null&&a!==!1).map(a=>L(a)?a.value:T(String(a))).join(""),s=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]).has(e)?`<${e}${u}>`:`<${e}${u}>${E}${e}>`;return g(s)}function b(e){const o=(e.children??[]).flat(1/0).filter(t=>t!=null&&t!==!1).map(t=>L(t)?t.value:T(String(t))).join("");return g(o)}function g(e){return{[P]:!0,value:e,toString(){return e}}}function L(e){return typeof e=="object"&&e!==null&&P in e}function k(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(//g,">")}function T(e){return e.replace(/&/g,"&").replace(//g,">")}function G(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function R(e){return g(e)}function I(e){for(const o of e){const t=new URL(o,import.meta.url).href;if(document.head.querySelector(`link[data-page-style="${CSS.escape(t)}"]`))continue;const l=document.createElement("link");l.rel="stylesheet",l.href=t,l.dataset.pageStyle=t,document.head.appendChild(l)}}function V(e){e.innerHTML=n("main",null,n("h1",null,"404"),n("p",null,"No page id was provided."),n("a",{href:"/"},"Go home"))}function S(e,o){const t=Object.keys(o).filter(l=>l!=="__404__").map(l=>n("li",null,n("a",{href:l==="index"?"/":`/${l}`},l))).join("");e.innerHTML=n("main",null,n("h1",null,"404"),n("p",null,"Page not found."),n("h2",null,"Available pages"),n("ul",null,R(t)),n("a",{href:"/"},"Go home"))}function $(e,o){e.innerHTML=n("main",null,n("h1",null,"404"),n("p",null,"Page ",o," not found."),n("a",{href:"/"},"Go home"))}function x(e,o,t){e.innerHTML=n("main",null,n("h1",null,"Failed to load page"),n("p",null,'Could not load "$',o,'".'),n("a",{href:"/"},"Go home"),n("pre",null,`[pages] Failed to load page "${o}"`),n("pre",null,t))}async function j(e,o){if(o.type!=="markdown")return;let t=o.html??"";typeof o.load=="function"&&(t=(await o.load()).default.html??t),e.innerHTML=n(b,null,n("a",{href:"../"},"Home"),n("article",{class:"markdown"},R(t)))}async function H(){const e=document.getElementById("app");if(e==null)throw new Error("Missing #app element");const o=window.PAGE_ID;if(!o){V(e);return}if(o==="__404__"){S(e,v);return}const t=v[o];if(!t){$(e,o);return}try{if(I(t.styles),t.type==="markdown"){await j(e,t);return}if(t.type==="liquid")return;const l=await t.load(),u="loadData"in t&&typeof t.loadData=="function"?await t.loadData():t.data;await l.default(e,u)}catch(l){x(e,o,l)}}H();const q=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"})),M=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"}));export{b as F,G as e,n as j,R as r};
diff --git a/cmd/findergen/frontend/assets/page.js b/cmd/findergen/frontend/assets/page.js
new file mode 100644
index 00000000..75256b8a
--- /dev/null
+++ b/cmd/findergen/frontend/assets/page.js
@@ -0,0 +1 @@
+console.log("hallo"),alert("ne");
diff --git a/cmd/findergen/frontend/assets/page2.js b/cmd/findergen/frontend/assets/page2.js
new file mode 100644
index 00000000..6e34687d
--- /dev/null
+++ b/cmd/findergen/frontend/assets/page2.js
@@ -0,0 +1 @@
+document.getElementById("generate").addEventListener("click",async function(){const t=document.getElementById("link1"),n=document.getElementById("link2"),c=document.getElementById("link3"),e=` > `;document.getElementById("output").innerText=e,document.getElementById("copy-button").innerHTML="Copy Link ",document.getElementById("b-copy").addEventListener("click",async function(){navigator.clipboard.writeText(e).then(function(){document.getElementById("b-copy").innerText="Link copied"})})});
diff --git a/cmd/findergen/frontend/assets/samfile.js b/cmd/findergen/frontend/assets/samfile.js
index d870d103..48d01169 100644
--- a/cmd/findergen/frontend/assets/samfile.js
+++ b/cmd/findergen/frontend/assets/samfile.js
@@ -1,6 +1,6 @@
-import{j as e,F as I}from"./main_entry.js";import{j as L}from"./jquery.module.js";function o(t){return decodeURIComponent(escape(t))}function s(t){return unescape(encodeURIComponent(t))}function B(t){let i=`#ifdef SAMFILE_BUILD
+import{j as e,F as g}from"./main_entry.js";import{j as I}from"./jquery.module.js";function o(t){return decodeURIComponent(escape(t))}function s(t){return unescape(encodeURIComponent(t))}function L(t){let i=`#ifdef SAMFILE_BUILD
`;const c=t.split(/\r?\n/);for(const a of c)i+=" ",i+=a;return i+=`
-#endif`,i}function S(t,i,c,a,r,u,l,m,x,p,E){let d={};return d.version=t,d.customsections=s(r),d.macros=s(u),d.buildmacros=s(x),d.sections={fling:s(i),settings:s(c),types:s(a),samfile:s(l),batch2:s(m),js:s(E),lua:s(p)},d}function C(t){return t.version==""&&(t.version="2"),`// autogenerated samfile
+#endif`,i}function B(t,i,c,a,r,u,l,m,x,p,E){let d={};return d.version=t,d.customsections=s(r),d.macros=s(u),d.buildmacros=s(x),d.sections={fling:s(i),settings:s(c),types:s(a),samfile:s(l),batch2:s(m),js:s(E),lua:s(p)},d}function S(t){return t.version==""&&(t.version="2"),`// autogenerated samfile
#define VERSION ${t.version}
@@ -37,9 +37,9 @@ ${o(t.sections.lua)}
${o(t.customsections)}
-${B(o(t.buildmacros))}
+${L(o(t.buildmacros))}
%%section SAMFILEGENERATOR_DATA
${JSON.stringify(t)}
%%endsection
-`}function $(t){t.innerHTML=e(I,null,e("p",null,"Samfile Generator"),e("input",{id:"input",placeholder:"Version"}),e("textarea",{id:"text"},"// Add macros here"),e("textarea",{id:"text1"},"// Your Fling code"),e("textarea",{id:"text2"},"# Your Settings here"),e("textarea",{id:"text3"},"# Your Section Types here"),e("textarea",{id:"text5"},"# samfile section"),e("textarea",{id:"text6"},"# batch2 section"),e("textarea",{id:"text4"},"// add more sections here"),e("textarea",{id:"text7"},"# Write build macros here"),e("textarea",{id:"text8"},"-- Lua sectiin"),e("textarea",{id:"text9"},"// JS Section"),e("hr",null),e("textarea",{id:"import"}),e("button",{id:"importBtn"},"Import"),e("pre",{id:"output",style:"width: 100%; height: 100%"}),e("button",{id:"copybtn"},"Copy Content")),L("title").text("Samfile Generator");const i=document.getElementById("input"),c=document.getElementById("text"),a=document.getElementById("text1"),r=document.getElementById("text2"),u=document.getElementById("text3"),l=document.getElementById("text4"),m=document.getElementById("text5"),x=document.getElementById("text6"),p=document.getElementById("text7"),E=document.getElementById("text8"),d=document.getElementById("text9"),v=document.getElementById("output");function n(){v.innerText=C(S(i.value,a.value,r.value,u.value,l.value,c.value,m.value,x.value,p.value,E.value,d.value))}n(),i.addEventListener("input",n),c.addEventListener("input",n),a.addEventListener("input",n),r.addEventListener("input",n),u.addEventListener("input",n),l.addEventListener("input",n),m.addEventListener("input",n),x.addEventListener("input",n),p.addEventListener("input",n),E.addEventListener("input",n),d.addEventListener("input",n),document.getElementById("copybtn").addEventListener("click",async()=>{const y=v.innerText,f=document.getElementById("copybtn");try{await navigator.clipboard.writeText(y),f.textContent="✓ Copied!",setTimeout(()=>{f.textContent="Copy Content"},1500)}catch(g){console.error("Copy failed:",g),f.textContent="Copy failed",setTimeout(()=>{f.textContent="Copy Content"},1500)}})}export{$ as default};
+`}function $(t){t.innerHTML=e(g,null,e("p",null,"Samfile Generator"),e("input",{id:"input",placeholder:"Version"}),e("textarea",{id:"text"},"// Add macros here"),e("textarea",{id:"text1"},"// Your Fling code"),e("textarea",{id:"text2"},"# Your Settings here"),e("textarea",{id:"text3"},"# Your Section Types here"),e("textarea",{id:"text5"},"# samfile section"),e("textarea",{id:"text6"},"# batch2 section"),e("textarea",{id:"text4"},"// add more sections here"),e("textarea",{id:"text7"},"# Write build macros here"),e("textarea",{id:"text8"},"-- Lua sectiin"),e("textarea",{id:"text9"},"// JS Section"),e("hr",null),e("textarea",{id:"import"}),e("button",{id:"importBtn"},"Import"),e("pre",{id:"output",style:"width: 100%; height: 100%"}),e("button",{id:"copybtn"},"Copy Content")),I("title").text("Samfile Generator");const i=document.getElementById("input"),c=document.getElementById("text"),a=document.getElementById("text1"),r=document.getElementById("text2"),u=document.getElementById("text3"),l=document.getElementById("text4"),m=document.getElementById("text5"),x=document.getElementById("text6"),p=document.getElementById("text7"),E=document.getElementById("text8"),d=document.getElementById("text9"),f=document.getElementById("output");function n(){f.innerText=S(B(i.value,a.value,r.value,u.value,l.value,c.value,m.value,x.value,p.value,E.value,d.value))}n(),i.addEventListener("input",n),c.addEventListener("input",n),a.addEventListener("input",n),r.addEventListener("input",n),u.addEventListener("input",n),l.addEventListener("input",n),m.addEventListener("input",n),x.addEventListener("input",n),p.addEventListener("input",n),E.addEventListener("input",n),d.addEventListener("input",n),document.getElementById("copybtn").addEventListener("click",async()=>{const y=f.innerText,v=document.getElementById("copybtn");try{await navigator.clipboard.writeText(y),v.textContent="✓ Copied!",setTimeout(()=>{v.textContent="Copy Content"},1500)}catch{v.textContent="Copy failed",setTimeout(()=>{v.textContent="Copy Content"},1500)}})}export{$ as default};
diff --git a/cmd/findergen/frontend/assets/viewer.css b/cmd/findergen/frontend/assets/viewer.css
index 8354b515..252a5d6d 100644
--- a/cmd/findergen/frontend/assets/viewer.css
+++ b/cmd/findergen/frontend/assets/viewer.css
@@ -1 +1 @@
-*{box-sizing:border-box}body{margin:0;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:radial-gradient(circle at top left,rgba(99,102,241,.14),transparent 35%),#09090b;color:#f4f4f5}button,input{font:inherit}.viewer{width:min(1400px,calc(100% - 48px));margin:0 auto;padding:64px 0 100px}.viewer-header{display:flex;justify-content:space-between;align-items:flex-end;gap:32px;margin-bottom:42px}.eyebrow{display:inline-block;margin-bottom:10px;font-size:11px;font-weight:700;letter-spacing:.14em;color:#818cf8}.viewer h1{margin:0;font-size:clamp(40px,6vw,68px);line-height:.95;letter-spacing:-.055em}.viewer-header p{margin:18px 0 0;color:#a1a1aa;font-size:16px}.stats{display:flex;gap:12px}.stat{min-width:110px;padding:16px 18px;border:1px solid #27272a;border-radius:14px;background:#18181bb8;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.stat strong{display:block;font-size:24px;letter-spacing:-.04em}.stat span{display:block;margin-top:3px;color:#71717a;font-size:12px}.toolbar{display:flex;align-items:center;gap:14px;margin-bottom:24px;padding:10px;border:1px solid #27272a;border-radius:18px;background:#18181bbf;-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);position:sticky;top:16px;z-index:10}.search{display:flex;align-items:center;gap:10px;flex:1;padding:0 14px;color:#71717a}.search span{font-size:22px}.search input{width:100%;border:0;outline:0;background:transparent;color:#f4f4f5;font-size:14px}.search input::placeholder{color:#52525b}.filters{display:flex;gap:4px;padding:4px;border-radius:12px;background:#09090b}.filter{display:flex;align-items:center;gap:7px;border:0;border-radius:9px;padding:8px 11px;background:transparent;color:#71717a;font-size:12px;font-weight:600;cursor:pointer;transition:background .15s ease,color .15s ease}.filter span{min-width:18px;padding:2px 5px;border-radius:5px;background:#27272a;font-size:10px}.filter:hover{color:#d4d4d8}.filter.active{background:#27272a;color:#fff}.filter.active span{background:#3f3f46}.template-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(360px,1fr));gap:18px}.template-card{overflow:hidden;border:1px solid #27272a;border-radius:18px;background:#111113;transition:transform .2s ease,border-color .2s ease,box-shadow .2s ease}.template-card:hover{transform:translateY(-3px);border-color:#3f3f46;box-shadow:0 18px 50px #00000059}.template-card[hidden]{display:none}.card-header{display:flex;align-items:center;gap:13px;padding:18px 18px 14px}.template-icon{display:grid;place-items:center;width:38px;height:38px;border-radius:10px;background:#1c1c20;color:#818cf8;font-size:16px}.template-info{min-width:0}.template-info h2{overflow:hidden;margin:0;color:#fafafa;font-size:14px;font-weight:650;text-overflow:ellipsis;white-space:nowrap}.badge{display:inline-block;margin-top:5px;padding:2px 7px;border-radius:5px;font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.06em}.badge.templates{background:#818cf81f;color:#818cf8}.badge.builtin{background:#2dd4bf1a;color:#2dd4bf}.code-preview{height:240px;margin:0 10px;overflow:hidden;border:1px solid #1f1f23;border-radius:12px;background:#09090b;position:relative}.code-preview:after{content:"";position:absolute;inset:auto 0 0;height:70px;background:linear-gradient(transparent,#09090b);pointer-events:none}.code-preview pre{margin:0;padding:16px;color:#a1a1aa;font-family:JetBrains Mono,SFMono-Regular,Consolas,monospace;font-size:11px;line-height:1.65;white-space:pre-wrap;word-break:break-word}.card-footer{display:flex;align-items:center;justify-content:space-between;padding:14px 18px 16px;color:#52525b;font-size:11px}.copy-button{border:1px solid #27272a;border-radius:7px;padding:6px 10px;background:#18181b;color:#a1a1aa;font-size:11px;font-weight:600;cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease}.copy-button:hover{border-color:#3f3f46;background:#27272a;color:#fff}.empty-state{padding:100px 20px;text-align:center}.empty-icon{margin-bottom:15px;color:#52525b;font-size:38px}.empty-state h2{margin:0;font-size:20px}.empty-state p{color:#71717a}.error{display:grid;place-items:center;min-height:70vh}.error-card{max-width:500px;padding:32px;border:1px solid #27272a;border-radius:18px;background:#111113}.error-card h1{font-size:28px}.error-card p{color:#71717a}@media(max-width:760px){.viewer{width:min(100% - 24px,1400px);padding-top:32px}.viewer-header{align-items:flex-start;flex-direction:column}.stats{width:100%}.stat{flex:1}.toolbar{align-items:stretch;flex-direction:column;position:static}.filters{overflow-x:auto}.filter{white-space:nowrap}.template-grid{grid-template-columns:1fr}}.tag-filters{display:flex;align-items:center;flex-wrap:wrap;gap:6px;width:100%;padding:8px 10px 2px;border-top:1px solid #27272a}.tag-filter-label{margin-right:4px;color:#52525b;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.tag-filter{display:inline-flex;align-items:center;height:27px;padding:0 9px;border:1px solid #27272a;border-radius:7px;background:#18181b;color:#71717a;font-size:11px;font-weight:550;cursor:pointer;transition:background .15s ease,border-color .15s ease,color .15s ease,transform .15s ease}.tag-filter:hover{border-color:#3f3f46;background:#27272a;color:#d4d4d8}.tag-filter.active{border-color:#818cf859;background:#818cf81f;color:#a5b4fc}.tag-filter.active:hover{border-color:#818cf880;background:#818cf82e}.template-tags{display:flex;flex-wrap:wrap;gap:4px;margin-top:7px}.tag{display:inline-flex;align-items:center;height:21px;padding:0 6px;border:1px solid #27272a;border-radius:5px;background:#18181b;color:#71717a;font-size:10px;font-weight:500;cursor:pointer;transition:background .15s ease,border-color .15s ease,color .15s ease}.tag:hover{border-color:#818cf859;background:#818cf814;color:#a5b4fc}.template-card{cursor:pointer}.template-card:focus-visible{outline:2px solid #a78bfa;outline-offset:3px}.template-modal{width:min(900px,calc(100vw - 2rem));max-width:900px;max-height:calc(100vh - 2rem);padding:0;border:1px solid rgba(255,255,255,.1);border-radius:18px;background:#111114;color:#f4f4f5;box-shadow:0 25px 80px #000000a6,0 0 0 1px #8b5cf614}.template-modal::backdrop{background:#000000b8;-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px)}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 2rem)}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;padding:1.25rem 1.5rem;border-bottom:1px solid rgba(255,255,255,.08)}.modal-header h2{margin:.3rem 0 0;font-size:1.35rem;line-height:1.2}.modal-close{display:grid;place-items:center;width:34px;height:34px;border:1px solid rgba(255,255,255,.1);border-radius:9px;background:#ffffff0a;color:#a1a1aa;font-size:1.4rem;line-height:1;cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease}.modal-close:hover{background:#8b5cf626;border-color:#8b5cf666;color:#c4b5fd}.modal-tags{display:flex;flex-wrap:wrap;gap:.4rem;padding:1rem 1.5rem 0}.modal-tag{padding:.3rem .6rem;border:1px solid rgba(139,92,246,.25);border-radius:999px;background:#8b5cf614;color:#c4b5fd;font-size:.75rem}.modal-code{overflow:auto;margin:1rem 1.5rem;border:1px solid rgba(255,255,255,.08);border-radius:12px;background:#09090b}.modal-code pre{margin:0;padding:1.25rem;min-height:200px;color:#d4d4d8;font-family:JetBrains Mono,Fira Code,monospace;font-size:.8rem;line-height:1.65;white-space:pre}.modal-markdown{overflow:auto;margin:1rem 1.5rem 0;border:1px solid rgba(255,255,255,.08);border-radius:12px;background:#0d0d10;max-height:40vh}.modal-markdown-head{padding:.8rem 1.25rem 0}.modal-markdown-head .eyebrow{margin-bottom:0}.markdown-note{padding:.25rem 1.25rem 1.25rem;color:#d4d4d8;font-size:.875rem;line-height:1.7}.markdown-note h1,.markdown-note h2,.markdown-note h3,.markdown-note h4,.markdown-note h5,.markdown-note h6{margin:1.2em 0 .35em;line-height:1.3;color:#f4f4f5}.markdown-note h1{font-size:1.5rem;border-bottom:1px solid rgba(255,255,255,.1);padding-bottom:.3em}.markdown-note h2{font-size:1.25rem}.markdown-note p{margin:.7em 0}.markdown-note a{color:#a5b4fc}.markdown-note ul,.markdown-note ol{margin:.6em 0;padding-left:1.4em}.markdown-note code{font-family:JetBrains Mono,Fira Code,monospace;font-size:.85em;background:#ffffff12;padding:.15em .35em;border-radius:4px}.markdown-note pre{background:#09090b;border:1px solid rgba(255,255,255,.07);border-radius:8px;padding:.9em 1em;overflow-x:auto}.markdown-note pre code{background:none;padding:0}.markdown-note blockquote{margin:.8em 0;padding:.4em 1em;border-left:3px solid #818cf8;background:#818cf812;color:#a1a1aa}.markdown-note img{max-width:100%;border-radius:8px}.markdown-note table{border-collapse:collapse;margin:.8em 0}.markdown-note th,.markdown-note td{border:1px solid rgba(255,255,255,.12);padding:.4em .7em}.markdown-note th{background:#ffffff0d}.modal-footer{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.9rem 1.5rem 1.25rem;color:#71717a;font-size:.75rem}@media(max-width:700px){.template-modal{width:calc(100vw - 1rem);max-height:calc(100vh - 1rem);border-radius:14px}.modal-header{padding:1rem}.modal-tags{padding:.75rem 1rem 0}.modal-code{margin:.75rem 1rem}.modal-markdown{margin:0 1rem .75rem}.modal-footer{padding:.75rem 1rem 1rem}}
+*{box-sizing:border-box}body{margin:0;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:radial-gradient(circle at top left,rgba(99,102,241,.14),transparent 35%),#09090b;color:#f4f4f5}button,input{font:inherit}.viewer{width:min(1400px,calc(100% - 48px));margin:0 auto;padding:64px 0 100px}.viewer-header{display:flex;justify-content:space-between;align-items:flex-end;gap:32px;margin-bottom:42px}.eyebrow{display:inline-block;margin-bottom:10px;font-size:11px;font-weight:700;letter-spacing:.14em;color:#818cf8}.viewer h1{margin:0;font-size:clamp(40px,6vw,68px);line-height:.95;letter-spacing:-.055em}.viewer-header p{margin:18px 0 0;color:#a1a1aa;font-size:16px}.stats{display:flex;gap:12px}.stat{min-width:110px;padding:16px 18px;border:1px solid #27272a;border-radius:14px;background:#18181bb8;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.stat strong{display:block;font-size:24px;letter-spacing:-.04em}.stat span{display:block;margin-top:3px;color:#71717a;font-size:12px}.toolbar{display:flex;align-items:center;gap:14px;margin-bottom:24px;padding:10px;border:1px solid #27272a;border-radius:18px;background:#18181bbf;-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);position:sticky;top:16px;z-index:10}.search{display:flex;align-items:center;gap:10px;flex:1;padding:0 14px;color:#71717a}.search span{font-size:22px}.search input{width:100%;border:0;outline:0;background:transparent;color:#f4f4f5;font-size:14px}.search input::placeholder{color:#52525b}.filters{display:flex;gap:4px;padding:4px;border-radius:12px;background:#09090b}.filter{display:flex;align-items:center;gap:7px;border:0;border-radius:9px;padding:8px 11px;background:transparent;color:#71717a;font-size:12px;font-weight:600;cursor:pointer;transition:background .15s ease,color .15s ease}.filter span{min-width:18px;padding:2px 5px;border-radius:5px;background:#27272a;font-size:10px}.filter:hover{color:#d4d4d8}.filter.active{background:#27272a;color:#fff}.filter.active span{background:#3f3f46}.template-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(360px,1fr));gap:18px}.template-card{overflow:hidden;border:1px solid #27272a;border-radius:18px;background:#111113;transition:transform .2s ease,border-color .2s ease,box-shadow .2s ease}.template-card:hover{transform:translateY(-3px);border-color:#3f3f46;box-shadow:0 18px 50px #00000059}.template-card[hidden]{display:none}.card-header{display:flex;align-items:center;gap:13px;padding:18px 18px 14px}.template-icon{display:grid;place-items:center;width:38px;height:38px;border-radius:10px;background:#1c1c20;color:#818cf8;font-size:16px}.template-info{min-width:0}.template-info h2{overflow:hidden;margin:0;color:#fafafa;font-size:14px;font-weight:650;text-overflow:ellipsis;white-space:nowrap}.badge{display:inline-block;margin-top:5px;padding:2px 7px;border-radius:5px;font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.06em}.badge.templates{background:#818cf81f;color:#818cf8}.badge.builtin{background:#2dd4bf1a;color:#2dd4bf}.badge.installed{background:#fbbf241f;color:#fbbf24}.code-preview{height:240px;margin:0 10px;overflow:hidden;border:1px solid #1f1f23;border-radius:12px;background:#09090b;position:relative}.code-preview:after{content:"";position:absolute;inset:auto 0 0;height:70px;background:linear-gradient(transparent,#09090b);pointer-events:none}.code-preview pre{margin:0;padding:16px;color:#a1a1aa;font-family:JetBrains Mono,SFMono-Regular,Consolas,monospace;font-size:11px;line-height:1.65;white-space:pre-wrap;word-break:break-word}.card-footer{display:flex;align-items:center;justify-content:space-between;padding:14px 18px 16px;color:#52525b;font-size:11px}.copy-button{border:1px solid #27272a;border-radius:7px;padding:6px 10px;background:#18181b;color:#a1a1aa;font-size:11px;font-weight:600;cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease}.copy-button:hover{border-color:#3f3f46;background:#27272a;color:#fff}.empty-state{padding:100px 20px;text-align:center}.empty-icon{margin-bottom:15px;color:#52525b;font-size:38px}.empty-state h2{margin:0;font-size:20px}.empty-state p{color:#71717a}.error{display:grid;place-items:center;min-height:70vh}.error-card{max-width:500px;padding:32px;border:1px solid #27272a;border-radius:18px;background:#111113}.error-card h1{font-size:28px}.error-card p{color:#71717a}@media(max-width:760px){.viewer{width:min(100% - 24px,1400px);padding-top:32px}.viewer-header{align-items:flex-start;flex-direction:column}.stats{width:100%}.stat{flex:1}.toolbar{align-items:stretch;flex-direction:column;position:static}.filters{overflow-x:auto}.filter{white-space:nowrap}.template-grid{grid-template-columns:1fr}}.tag-filters{display:flex;align-items:center;flex-wrap:wrap;gap:6px;width:100%;padding:8px 10px 2px;border-top:1px solid #27272a}.tag-filter-label{margin-right:4px;color:#52525b;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.tag-filter{display:inline-flex;align-items:center;height:27px;padding:0 9px;border:1px solid #27272a;border-radius:7px;background:#18181b;color:#71717a;font-size:11px;font-weight:550;cursor:pointer;transition:background .15s ease,border-color .15s ease,color .15s ease,transform .15s ease}.tag-filter:hover{border-color:#3f3f46;background:#27272a;color:#d4d4d8}.tag-filter.active{border-color:#818cf859;background:#818cf81f;color:#a5b4fc}.tag-filter.active:hover{border-color:#818cf880;background:#818cf82e}.template-tags{display:flex;flex-wrap:wrap;gap:4px;margin-top:7px}.tag{display:inline-flex;align-items:center;height:21px;padding:0 6px;border:1px solid #27272a;border-radius:5px;background:#18181b;color:#71717a;font-size:10px;font-weight:500;cursor:pointer;transition:background .15s ease,border-color .15s ease,color .15s ease}.tag:hover{border-color:#818cf859;background:#818cf814;color:#a5b4fc}.template-card{cursor:pointer}.template-card:focus-visible{outline:2px solid #a78bfa;outline-offset:3px}.template-modal{width:min(900px,calc(100vw - 2rem));max-width:900px;max-height:calc(100vh - 2rem);padding:0;border:1px solid rgba(255,255,255,.1);border-radius:18px;background:#111114;color:#f4f4f5;box-shadow:0 25px 80px #000000a6,0 0 0 1px #8b5cf614}.template-modal::backdrop{background:#000000b8;-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px)}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 2rem)}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;padding:1.25rem 1.5rem;border-bottom:1px solid rgba(255,255,255,.08)}.modal-header h2{margin:.3rem 0 0;font-size:1.35rem;line-height:1.2}.modal-close{display:grid;place-items:center;width:34px;height:34px;border:1px solid rgba(255,255,255,.1);border-radius:9px;background:#ffffff0a;color:#a1a1aa;font-size:1.4rem;line-height:1;cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease}.modal-close:hover{background:#8b5cf626;border-color:#8b5cf666;color:#c4b5fd}.modal-tags{display:flex;flex-wrap:wrap;gap:.4rem;padding:1rem 1.5rem 0}.modal-tag{padding:.3rem .6rem;border:1px solid rgba(139,92,246,.25);border-radius:999px;background:#8b5cf614;color:#c4b5fd;font-size:.75rem}.modal-code{overflow:auto;margin:1rem 1.5rem;border:1px solid rgba(255,255,255,.08);border-radius:12px;background:#09090b}.modal-code pre{margin:0;padding:1.25rem;min-height:200px;color:#d4d4d8;font-family:JetBrains Mono,Fira Code,monospace;font-size:.8rem;line-height:1.65;white-space:pre}.modal-markdown{overflow:auto;margin:1rem 1.5rem 0;border:1px solid rgba(255,255,255,.08);border-radius:12px;background:#0d0d10;max-height:40vh}.modal-markdown-head{padding:.8rem 1.25rem 0}.modal-markdown-head .eyebrow{margin-bottom:0}.markdown-note{padding:.25rem 1.25rem 1.25rem;color:#d4d4d8;font-size:.875rem;line-height:1.7}.markdown-note h1,.markdown-note h2,.markdown-note h3,.markdown-note h4,.markdown-note h5,.markdown-note h6{margin:1.2em 0 .35em;line-height:1.3;color:#f4f4f5}.markdown-note h1{font-size:1.5rem;border-bottom:1px solid rgba(255,255,255,.1);padding-bottom:.3em}.markdown-note h2{font-size:1.25rem}.markdown-note p{margin:.7em 0}.markdown-note a{color:#a5b4fc}.markdown-note ul,.markdown-note ol{margin:.6em 0;padding-left:1.4em}.markdown-note code{font-family:JetBrains Mono,Fira Code,monospace;font-size:.85em;background:#ffffff12;padding:.15em .35em;border-radius:4px}.markdown-note pre{background:#09090b;border:1px solid rgba(255,255,255,.07);border-radius:8px;padding:.9em 1em;overflow-x:auto}.markdown-note pre code{background:none;padding:0}.markdown-note blockquote{margin:.8em 0;padding:.4em 1em;border-left:3px solid #818cf8;background:#818cf812;color:#a1a1aa}.markdown-note img{max-width:100%;border-radius:8px}.markdown-note table{border-collapse:collapse;margin:.8em 0}.markdown-note th,.markdown-note td{border:1px solid rgba(255,255,255,.12);padding:.4em .7em}.markdown-note th{background:#ffffff0d}.modal-footer{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.9rem 1.5rem 1.25rem;color:#71717a;font-size:.75rem}@media(max-width:700px){.template-modal{width:calc(100vw - 1rem);max-height:calc(100vh - 1rem);border-radius:14px}.modal-header{padding:1rem}.modal-tags{padding:.75rem 1rem 0}.modal-code{margin:.75rem 1rem}.modal-markdown{margin:0 1rem .75rem}.modal-footer{padding:.75rem 1rem 1rem}}
diff --git a/cmd/findergen/frontend/assets/viewer.js b/cmd/findergen/frontend/assets/viewer.js
index 9fb65143..7377e9b2 100644
--- a/cmd/findergen/frontend/assets/viewer.js
+++ b/cmd/findergen/frontend/assets/viewer.js
@@ -1 +1 @@
-import{j as t,F as M,e as u,r as U}from"./main_entry.js";import{p as I}from"./markdown.js";let N="/api/template/load/all";function D(e){J(e)}let H=t("dialog",{class:"template-modal",id:"template-modal"},t("div",{class:"modal-card"},t("div",{class:"modal-header"},t("div",null,t("span",{class:"eyebrow"},"TEMPLATE"),t("h2",{id:"modal-title"},"Template")),t("button",{class:"modal-close",id:"modal-close",type:"button","aria-label":"Schließen"},"×")),t("div",{class:"modal-tags",id:"modal-tags"}),t("div",{class:"modal-code"},t("pre",{id:"modal-content"})),t("div",{class:"modal-markdown",id:"modal-markdown",hidden:!0},t("div",{class:"modal-markdown-head"},t("span",{class:"eyebrow"},"MARKDOWN NOTE")),t("article",{class:"markdown-note"})),t("div",{class:"modal-footer"},t("span",{id:"modal-size"}),t("a",{class:"copy-button",type:"button",id:"modal-edit"},"Edit"),t("button",{class:"copy-button",id:"modal-copy",type:"button"},"Copy"))));function j(e,a){const n=P(a.templates);e.innerHTML=t(M,null,H,t("main",{class:"viewer"},t("header",{class:"viewer-header"},t("div",null,t("span",{class:"eyebrow"},"TEMPLATE VIEWER")," /"," ",t("span",{class:"eyebrow"},t("a",{href:"../creator"},"TEMPLATE CREATOR"))," ","/"," ",t("span",{class:"eyebrow"},t("a",{href:"../"},"HOME")),t("h1",null,"Templates"),t("p",null,"Search and explore all available templates.")),t("div",{class:"stats"},t("div",{class:"stat"},t("strong",null,a.count_templates),t("span",null,"Templates")),t("div",{class:"stat"},t("strong",null,a.count_buildin_templates),t("span",null,"Built-in")),t("div",{class:"stat"},t("strong",null,a.count_custom_templates),t("span",null,"Custom")))),t("section",{class:"toolbar"},t("div",{class:"search"},t("span",null,"⌕"),t("input",{id:"template-search",type:"search",placeholder:"Search templates...",autocomplete:"off"})),t("div",{class:"filters"},t("button",{class:"filter active","data-filter":"all"},"All",t("span",null,a.templates.length)),t(M,null,t("button",{class:"filter","data-filter":"builtin"},"Built-in",t("span",null,a.builtin.length)),t("button",{class:"filter","data-filter":"custom"},"Custom",t("span",null,a.custom.length))))),t("div",{class:"tag-filters"},t("span",{class:"tag-filter-label"},"Tags:"),t("button",{class:"tag-filter active",type:"button","data-tag-filter":"all"},"All"),n.map(r=>t("button",{class:"tag-filter",type:"button","data-tag-filter":u(r)},u(r)))),t("br",null),t("section",{class:"template-grid",id:"template-grid"},O(a.builtin,"builtin"),O(a.custom,"custom")),t("div",{class:"empty-state",id:"empty-state",hidden:!0},t("div",{class:"empty-icon"},"⌕"),t("h2",null,"No templates found"),t("p",null,"Try a different search term.")))),B(e)}async function J(e){try{const a=await fetch(N);if(!a.ok)throw new Error(`HTTP ${a.status}`);const n=await a.json();j(e,{templates:Object.entries(n.templates),builtin:Object.entries(n.builtin),custom:Object.entries(n.custom),count_templates:n.count_templates,count_buildin_templates:n.count_buildin_templates,count_custom_templates:n.count_custom_templates})}catch(a){console.error(a),e.innerHTML=t("main",{class:"viewer error"},t("div",{class:"error-card"},t("span",{class:"eyebrow"},"ERROR"),t("h1",null,"Templates could not be loaded."),t("p",null,"The template server is currently not reachable.")))}}function O(e,a){return e.map(([n,r])=>{const f=$(r),v=`../creator?template=${encodeURIComponent(r)}&filename=${encodeURIComponent(n)}`,c=`../cacheviewer?name=${encodeURIComponent(n)}`;return t("article",{class:"template-card","data-type":a,"data-name":u(n).toLowerCase(),"data-tags":u(f.join("|").toLowerCase()),tabindex:"0",role:"button","aria-label":`Template ${u(n)} open`},t("div",{class:"card-header"},t("div",{class:"template-icon"},a==="builtin"?"★":"◇"),t("div",{class:"template-info"},t("h2",null,u(n)),t("span",{class:`badge ${a}`},a==="builtin"?"Built-in":"Template"),f.length?t("div",{class:"template-tags"},f.map(h=>t("button",{class:"tag",type:"button","data-tag":u(h)},u(h)))):"")),t("div",{class:"code-preview"},t("pre",null,U(F(r)))),t("div",{class:"card-footer"},t("span",null,r.length.toLocaleString()," Zeichen"),t("a",{href:c,class:"copy-button"},"View Cache"),t("a",{href:v,class:"copy-button"},"Edit"),t("button",{class:"copy-button","data-content":encodeURIComponent(r),type:"button"},"Copy")))})}function B(e){const a=e.querySelector("#template-search"),n=[...e.querySelectorAll(".template-card")],r=[...e.querySelectorAll(".filter")],f=[...e.querySelectorAll(".tag-filter")],v=e.querySelector("#empty-state"),c=e.querySelector("#template-modal"),h=e.querySelector("#modal-title"),q=e.querySelector("#modal-content"),x=e.querySelector("#modal-tags"),A=e.querySelector("#modal-size"),w=e.querySelector("#modal-close"),d=e.querySelector("#modal-copy"),R=e.querySelector("#modal-edit"),T=e.querySelector("#modal-markdown"),C=e.querySelector(".markdown-note");let E="all",L="all";function k(){var s,m;const l=(a==null?void 0:a.value.trim().toLowerCase())??"";let o=0;for(const g of n){const y=!l||((s=g.dataset.name)==null?void 0:s.includes(l)),b=E==="all"||g.dataset.type===E,S=((m=g.dataset.tags)==null?void 0:m.split("|").filter(Boolean))??[],i=L==="all"||S.includes(L.toLowerCase()),p=y&&b&&i;g.hidden=!p,p&&o++}v&&(v.hidden=o!==0)}a==null||a.addEventListener("input",k),r.forEach(l=>{l.addEventListener("click",()=>{r.forEach(o=>{o.classList.remove("active")}),l.classList.add("active"),E=l.dataset.filter??"all",k()})}),f.forEach(l=>{l.addEventListener("click",()=>{f.forEach(o=>{o.classList.remove("active")}),l.classList.add("active"),L=l.dataset.tagFilter??"all",k()})}),e.querySelectorAll(".tag").forEach(l=>{l.addEventListener("click",()=>{const o=l.dataset.tag;if(!o)return;const s=e.querySelector(`.tag-filter[data-tag-filter="${CSS.escape(o)}"]`);s==null||s.click()})}),e.querySelectorAll(".copy-button").forEach(l=>{l.addEventListener("click",async()=>{const o=decodeURIComponent(l.dataset.content??"");await navigator.clipboard.writeText(o);const s=l.textContent;l.textContent="Copied ✓",setTimeout(()=>{l.textContent=s},1200)})});function _(l){var b,S;const o=l,s=((b=o.querySelector("h2"))==null?void 0:b.textContent)??"Template",m=((S=o.querySelector("pre"))==null?void 0:S.textContent)??"",g=[...o.querySelectorAll(".tag")].map(i=>{var p;return((p=i.textContent)==null?void 0:p.trim())??""}).filter(Boolean);if(!c||!h||!q)return;if(h.textContent=s,q.textContent=m,A&&(A.textContent=`${m.length.toLocaleString()} Zeichen`),x&&(x.innerHTML=g.map(i=>`${u(i)} `).join("")),d&&(d.dataset.content=encodeURIComponent(m),d.textContent="Copy"),R){const i=JSON.stringify(JSON.parse(m),null,0);R.href=`../creator?template=${encodeURIComponent(i)}&filename=${encodeURIComponent(s)}`}let y="";try{const i=JSON.parse(m),p=i==null?void 0:i.mdnote;typeof p=="string"&&p.length>0&&(y=I(p))}catch{y=""}T&&C&&(y?(T.hidden=!1,C.innerHTML=U(y).toString()):(T.hidden=!0,C.innerHTML="")),c.showModal()}e.addEventListener("click",l=>{const o=l.target;if(o.closest(".copy-button")||o.closest(".tag"))return;const s=o.closest(".template-card");s&&_(s)}),e.addEventListener("keydown",l=>{const s=l.target.closest(".template-card");s&&(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),_(s))}),w==null||w.addEventListener("click",()=>{c==null||c.close()}),c==null||c.addEventListener("click",l=>{l.target===c&&c.close()}),d==null||d.addEventListener("click",async()=>{const l=decodeURIComponent(d.dataset.content??"");await navigator.clipboard.writeText(l),d.textContent="Copied ✓",setTimeout(()=>{d.textContent="Copy"},1200)})}function F(e){try{return JSON.stringify(JSON.parse(e),null,2)}catch{return e}}function $(e){try{const a=JSON.parse(e);return Array.isArray(a.tags)?a.tags.filter(n=>typeof n=="string").map(n=>n.trim()).filter(Boolean):[]}catch{return[]}}function P(e){const a=new Set;for(const[,n]of e)for(const r of $(n))a.add(r);return[...a].sort((n,r)=>n.localeCompare(r))}export{D as default};
+import{j as t,F as M,e as p,r as I}from"./main_entry.js";import{p as $}from"./markdown.js";let N="/api/template/load/all";function D(e){J(e)}let j=t("dialog",{class:"template-modal",id:"template-modal"},t("div",{class:"modal-card"},t("div",{class:"modal-header"},t("div",null,t("span",{class:"eyebrow"},"TEMPLATE"),t("h2",{id:"modal-title"},"Template")),t("button",{class:"modal-close",id:"modal-close",type:"button","aria-label":"Schließen"},"×")),t("div",{class:"modal-tags",id:"modal-tags"}),t("div",{class:"modal-code"},t("pre",{id:"modal-content"})),t("div",{class:"modal-markdown",id:"modal-markdown",hidden:!0},t("div",{class:"modal-markdown-head"},t("span",{class:"eyebrow"},"MARKDOWN NOTE")),t("article",{class:"markdown-note"})),t("div",{class:"modal-footer"},t("span",{id:"modal-size"}),t("a",{class:"copy-button",type:"button",id:"modal-edit"},"Edit"),t("button",{class:"copy-button",id:"modal-copy",type:"button"},"Copy"))));function H(e,a){const n=P(a.templates);e.innerHTML=t(M,null,j,t("main",{class:"viewer"},t("header",{class:"viewer-header"},t("div",null,t("span",{class:"eyebrow"},"TEMPLATE VIEWER")," /"," ",t("span",{class:"eyebrow"},t("a",{href:"../creator"},"TEMPLATE CREATOR"))," ","/"," ",t("span",{class:"eyebrow"},t("a",{href:"../"},"HOME")),t("h1",null,"Templates"),t("p",null,"Search and explore all available templates.")),t("div",{class:"stats"},t("div",{class:"stat"},t("strong",null,a.count_templates),t("span",null,"Templates")),t("div",{class:"stat"},t("strong",null,a.count_buildin_templates),t("span",null,"Built-in")),t("div",{class:"stat"},t("strong",null,a.count_installed_templates),t("span",null,"Installed")),t("div",{class:"stat"},t("strong",null,a.count_custom_templates),t("span",null,"Custom")))),t("section",{class:"toolbar"},t("div",{class:"search"},t("span",null,"⌕"),t("input",{id:"template-search",type:"search",placeholder:"Search templates...",autocomplete:"off"})),t("div",{class:"filters"},t("button",{class:"filter active","data-filter":"all"},"All",t("span",null,a.templates.length)),t(M,null,t("button",{class:"filter","data-filter":"builtin"},"Built-in",t("span",null,a.builtin.length)),t("button",{class:"filter","data-filter":"installed"},"Installed",t("span",null,a.installed.length)),t("button",{class:"filter","data-filter":"custom"},"Custom",t("span",null,a.custom.length))))),t("div",{class:"tag-filters"},t("span",{class:"tag-filter-label"},"Tags:"),t("button",{class:"tag-filter active",type:"button","data-tag-filter":"all"},"All"),n.map(c=>t("button",{class:"tag-filter",type:"button","data-tag-filter":p(c)},p(c)))),t("br",null),t("section",{class:"template-grid",id:"template-grid"},x(a.builtin,"builtin"),x(a.installed,"installed"),x(a.custom,"custom")),t("div",{class:"empty-state",id:"empty-state",hidden:!0},t("div",{class:"empty-icon"},"⌕"),t("h2",null,"No templates found"),t("p",null,"Try a different search term.")))),B(e)}async function J(e){try{const a=await fetch(N);if(!a.ok)throw new Error(`HTTP ${a.status}`);const n=await a.json();H(e,{templates:Object.entries(n.templates),builtin:Object.entries(n.builtin),installed:Object.entries(n.installed??{}),custom:Object.entries(n.custom),count_templates:n.count_templates,count_buildin_templates:n.count_buildin_templates,count_installed_templates:n.count_installed_templates??0,count_custom_templates:n.count_custom_templates})}catch{e.innerHTML=t("main",{class:"viewer error"},t("div",{class:"error-card"},t("span",{class:"eyebrow"},"ERROR"),t("h1",null,"Templates could not be loaded."),t("p",null,"The template server is currently not reachable.")))}}function x(e,a){return e.map(([n,c])=>{const f=U(c),v=`../creator?template=${encodeURIComponent(c)}&filename=${encodeURIComponent(n)}`,r=`../cacheviewer?name=${encodeURIComponent(n)}`,b=a==="builtin"?"★":a==="installed"?"⬇":"◇",S=a==="builtin"?"Built-in":a==="installed"?"Installed":"Template";return t("article",{class:"template-card","data-type":a,"data-name":p(n).toLowerCase(),"data-tags":p(f.join("|").toLowerCase()),tabindex:"0",role:"button","aria-label":`Template ${p(n)} open`},t("div",{class:"card-header"},t("div",{class:"template-icon"},b),t("div",{class:"template-info"},t("h2",null,p(n)),t("span",{class:`badge ${a}`},S),f.length?t("div",{class:"template-tags"},f.map(h=>t("button",{class:"tag",type:"button","data-tag":p(h)},p(h)))):"")),t("div",{class:"code-preview"},t("pre",null,I(F(c)))),t("div",{class:"card-footer"},t("span",null,c.length.toLocaleString()," Zeichen"),t("a",{href:r,class:"copy-button"},"View Cache"),t("a",{href:v,class:"copy-button"},"Edit"),t("button",{class:"copy-button","data-content":encodeURIComponent(c),type:"button"},"Copy")))})}function B(e){const a=e.querySelector("#template-search"),n=[...e.querySelectorAll(".template-card")],c=[...e.querySelectorAll(".filter")],f=[...e.querySelectorAll(".tag-filter")],v=e.querySelector("#empty-state"),r=e.querySelector("#template-modal"),b=e.querySelector("#modal-title"),S=e.querySelector("#modal-content"),h=e.querySelector("#modal-tags"),A=e.querySelector("#modal-size"),C=e.querySelector("#modal-close"),d=e.querySelector("#modal-copy"),R=e.querySelector("#modal-edit"),E=e.querySelector("#modal-markdown"),L=e.querySelector(".markdown-note");let k="all",q="all";function _(){var o,m;const l=(a==null?void 0:a.value.trim().toLowerCase())??"";let s=0;for(const g of n){const y=!l||((o=g.dataset.name)==null?void 0:o.includes(l)),T=k==="all"||g.dataset.type===k,w=((m=g.dataset.tags)==null?void 0:m.split("|").filter(Boolean))??[],i=q==="all"||w.includes(q.toLowerCase()),u=y&&T&&i;g.hidden=!u,u&&s++}v&&(v.hidden=s!==0)}a==null||a.addEventListener("input",_),c.forEach(l=>{l.addEventListener("click",()=>{c.forEach(s=>{s.classList.remove("active")}),l.classList.add("active"),k=l.dataset.filter??"all",_()})}),f.forEach(l=>{l.addEventListener("click",()=>{f.forEach(s=>{s.classList.remove("active")}),l.classList.add("active"),q=l.dataset.tagFilter??"all",_()})}),e.querySelectorAll(".tag").forEach(l=>{l.addEventListener("click",()=>{const s=l.dataset.tag;if(!s)return;const o=e.querySelector(`.tag-filter[data-tag-filter="${CSS.escape(s)}"]`);o==null||o.click()})}),e.querySelectorAll(".copy-button").forEach(l=>{l.addEventListener("click",async()=>{const s=decodeURIComponent(l.dataset.content??"");await navigator.clipboard.writeText(s);const o=l.textContent;l.textContent="Copied ✓",setTimeout(()=>{l.textContent=o},1200)})});function O(l){var T,w;const s=l,o=((T=s.querySelector("h2"))==null?void 0:T.textContent)??"Template",m=((w=s.querySelector("pre"))==null?void 0:w.textContent)??"",g=[...s.querySelectorAll(".tag")].map(i=>{var u;return((u=i.textContent)==null?void 0:u.trim())??""}).filter(Boolean);if(!r||!b||!S)return;if(b.textContent=o,S.textContent=m,A&&(A.textContent=`${m.length.toLocaleString()} Zeichen`),h&&(h.innerHTML=g.map(i=>`${p(i)} `).join("")),d&&(d.dataset.content=encodeURIComponent(m),d.textContent="Copy"),R){const i=JSON.stringify(JSON.parse(m),null,0);R.href=`../creator?template=${encodeURIComponent(i)}&filename=${encodeURIComponent(o)}`}let y="";try{const i=JSON.parse(m),u=i==null?void 0:i.mdnote;typeof u=="string"&&u.length>0&&(y=$(u))}catch{y=""}E&&L&&(y?(E.hidden=!1,L.innerHTML=I(y).toString()):(E.hidden=!0,L.innerHTML="")),r.showModal()}e.addEventListener("click",l=>{const s=l.target;if(s.closest(".copy-button")||s.closest(".tag"))return;const o=s.closest(".template-card");o&&O(o)}),e.addEventListener("keydown",l=>{const o=l.target.closest(".template-card");o&&(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),O(o))}),C==null||C.addEventListener("click",()=>{r==null||r.close()}),r==null||r.addEventListener("click",l=>{l.target===r&&r.close()}),d==null||d.addEventListener("click",async()=>{const l=decodeURIComponent(d.dataset.content??"");await navigator.clipboard.writeText(l),d.textContent="Copied ✓",setTimeout(()=>{d.textContent="Copy"},1200)})}function F(e){try{return JSON.stringify(JSON.parse(e),null,2)}catch{return e}}function U(e){try{const a=JSON.parse(e);return Array.isArray(a.tags)?a.tags.filter(n=>typeof n=="string").map(n=>n.trim()).filter(Boolean):[]}catch{return[]}}function P(e){const a=new Set;for(const[,n]of e)for(const c of U(n))a.add(c);return[...a].sort((n,c)=>n.localeCompare(c))}export{D as default};
diff --git a/cmd/findergen/frontend/assets/worlds.js b/cmd/findergen/frontend/assets/worlds.js
index d404fd2b..93221d7a 100644
--- a/cmd/findergen/frontend/assets/worlds.js
+++ b/cmd/findergen/frontend/assets/worlds.js
@@ -1 +1 @@
-import{j as t,F as r}from"./main_entry.js";import{r as f}from"./mcappheader.js";function R(d){d.innerHTML=t(r,null,t(f,null),t("main",null,t("table",null,t("thead",null,t("tr",null,t("th",null,"Icon"),t("th",null,"Folder Name"),t("th",null,"Last Modified"),t("th",null,"Size"),t("th",null,"Path"))),t("tbody",{id:"world-list"}))));async function c(){try{let l="";const _=(await(await fetch(l+"/api/system")).json()).os==="windows",h=await(await fetch(l+"/api/mcapp/worlds")).json(),s=document.getElementById("world-list");s.innerHTML="",h.forEach(n=>{const a=document.createElement("tr");let u=n.icon,o=n.path;const i=n.path.split(/[/\\]+/),p=i[i.length-2],m=encodeURIComponent(o.replace(/[/\\]level\.dat$/i,""));let e=n.size;e>=1024*1024?e=(e/(1024*1024)).toFixed(2)+" MB":e>=1024?e=(e/1024).toFixed(2)+" KB":e=e+" B",a.innerHTML=t(r,null,t("td",null,t("img",{src:l+`/___static___/webcache/${u}`,width:"32"})),t("td",null,p),t("td",null,n.last_modified),t("td",null,e),t("td",null,t("a",{target:"_blanc",href:l+`/api/openfolder?path=${m}`},o))),s.appendChild(a)})}catch(l){console.error("Fehler beim Laden:",l)}}c()}export{R as default};
+import{j as t,F as r}from"./main_entry.js";import{r as m}from"./mcappheader.js";function R(d){d.innerHTML=t(r,null,t(m,null),t("main",null,t("table",null,t("thead",null,t("tr",null,t("th",null,"Icon"),t("th",null,"Folder Name"),t("th",null,"Last Modified"),t("th",null,"Size"),t("th",null,"Path"))),t("tbody",{id:"world-list"}))));async function c(){try{let l="";const _=(await(await fetch(l+"/api/system")).json()).os==="windows",h=await(await fetch(l+"/api/mcapp/worlds")).json(),s=document.getElementById("world-list");s.innerHTML="",h.forEach(n=>{const a=document.createElement("tr");let u=n.icon,o=n.path;const i=n.path.split(/[/\\]+/),p=i[i.length-2],f=encodeURIComponent(o.replace(/[/\\]level\.dat$/i,""));let e=n.size;e>=1024*1024?e=(e/(1024*1024)).toFixed(2)+" MB":e>=1024?e=(e/1024).toFixed(2)+" KB":e=e+" B",a.innerHTML=t(r,null,t("td",null,t("img",{src:l+`/___static___/webcache/${u}`,width:"32"})),t("td",null,p),t("td",null,n.last_modified),t("td",null,e),t("td",null,t("a",{target:"_blanc",href:l+`/api/openfolder?path=${f}`},o))),s.appendChild(a)})}catch{}}c()}export{R as default};
diff --git a/cmd/findergen/frontend/dependencies.txt b/cmd/findergen/frontend/dependencies.txt
index 786d3c8a..5f544975 100644
--- a/cmd/findergen/frontend/dependencies.txt
+++ b/cmd/findergen/frontend/dependencies.txt
@@ -18,12 +18,7 @@
@devframes/hub@0.9.12 -- MIT
@devframes/json-render-ui@0.9.12 -- MIT
@devframes/json-render@0.9.12 -- MIT
-@devframes/plugin-inspect@0.9.12 -- MIT
-@devframes/plugin-messages@0.9.12 -- MIT
-@devframes/plugin-terminals@0.9.12 -- MIT
@devframes/service-open@0.9.12 -- MIT
-@devframes/vite@0.9.12 -- MIT
-@esbuild/win32-x64@0.25.12 -- MIT
@esbuild/win32-x64@0.28.2 -- MIT
@eslint-community/eslint-utils@4.10.1 -- MIT
@eslint-community/regexpp@4.12.2 -- MIT
@@ -33,6 +28,7 @@
@eslint/js@10.0.1 -- MIT
@eslint/object-schema@3.0.5 -- Apache-2.0
@eslint/plugin-kit@0.7.2 -- Apache-2.0
+@floating-ui/dom@1.8.0 -- MIT
@humanfs/core@0.19.2 -- Apache-2.0
@humanfs/node@0.16.8 -- Apache-2.0
@humanfs/types@0.15.0 -- Apache-2.0
@@ -47,13 +43,13 @@
@json-render/core@0.20.0 -- Apache-2.0
@modelcontextprotocol/core@2.0.0 -- MIT
@modelcontextprotocol/server@2.0.0 -- MIT
+@node-steam/vdf@2.2.0 -- MIT
@oxc-project/types@0.148.0 -- MIT
@parcel/watcher-win32-x64@2.6.0 -- MIT
@parcel/watcher@2.6.0 -- MIT
@rolldown/binding-win32-x64-msvc@1.2.7 -- MIT
@rolldown/pluginutils@1.0.1 -- MIT
@rollup/plugin-yaml@5.0.0 -- MIT
-@rollup/pluginutils@4.2.1 -- MIT
@rollup/pluginutils@5.4.0 -- MIT
@rollup/rollup-win32-x64-gnu@4.63.1 -- MIT
@rollup/rollup-win32-x64-msvc@4.63.1 -- MIT
@@ -64,6 +60,7 @@
@tailwindcss/oxide-win32-x64-msvc@4.3.3 -- MIT
@tailwindcss/oxide@4.3.3 -- MIT
@tailwindcss/vite@4.3.3 -- MIT
+@types/ejs@3.1.5 -- MIT
@types/eslint@8.56.12 -- MIT
@types/esrecurse@4.3.1 -- MIT
@types/estree@1.0.9 -- MIT
@@ -71,7 +68,7 @@
@types/jquery@4.0.1 -- MIT
@types/json-schema@7.0.15 -- MIT
@types/license-checker@25.0.6 -- MIT
-@types/node@26.5.0 -- MIT
+@types/node@26.5.1 -- MIT
@typescript-eslint/eslint-plugin@8.69.0 -- MIT
@typescript-eslint/parser@8.69.0 -- MIT
@typescript-eslint/project-service@8.69.0 -- MIT
@@ -83,13 +80,12 @@
@typescript-eslint/utils@8.69.0 -- MIT
@typescript-eslint/visitor-keys@8.69.0 -- MIT
@vitejs/devtools-kit@0.7.2 -- MIT
-@vitejs/devtools@0.7.2 -- MIT
+@vitejs/devtools@0.7.3 -- MIT
abbrev@1.1.1 -- ISC
acorn-jsx@5.3.2 -- MIT
acorn@8.18.0 -- MIT
ajv@6.15.0 -- MIT
ansi-regex@6.3.0 -- MIT
-ansi-styles@3.2.1 -- MIT
ansi-styles@6.2.3 -- MIT
argparse@2.0.1 -- Python-2.0
array-find-index@1.0.2 -- MIT
@@ -106,7 +102,6 @@ bundle-name@4.1.0 -- MIT
cac@7.0.0 -- MIT
camel-case@4.1.2 -- MIT
caniuse-lite@1.0.30001810 -- CC-BY-4.0
-chalk@2.4.2 -- MIT
chalk@6.0.0 -- MIT
chokidar@5.0.0 -- MIT
citty@0.2.2 -- MIT
@@ -122,7 +117,6 @@ confbox@0.3.1 -- MIT
convert-source-map@2.0.0 -- MIT
cross-spawn@7.0.6 -- MIT
crossws@0.4.12 -- MIT
-debug@3.2.7 -- MIT
debug@4.4.3 -- MIT
debuglog@1.0.1 -- MIT
deep-is@0.1.4 -- MIT
@@ -134,20 +128,19 @@ detect-libc@2.1.2 -- Apache-2.0
devframe@0.9.12 -- MIT
dezalgo@1.0.4 -- ISC
dot-case@3.0.4 -- MIT
+ejs@6.0.1 -- Apache-2.0
electron-to-chromium@1.5.422 -- ISC
emoji-regex@10.6.0 -- MIT
enhanced-resolve@5.24.5 -- MIT
entities@4.5.0 -- BSD-2-Clause
es-errors@1.3.0 -- MIT
-esbuild@0.25.12 -- MIT
esbuild@0.28.2 -- MIT
escalade@3.2.0 -- MIT
-escape-string-regexp@1.0.5 -- MIT
escape-string-regexp@4.0.0 -- MIT
eslint-scope@9.1.2 -- BSD-2-Clause
eslint-visitor-keys@3.4.3 -- Apache-2.0
eslint-visitor-keys@5.0.1 -- Apache-2.0
-eslint@10.9.1 -- MIT
+eslint@10.10.0 -- MIT
espree@11.2.0 -- BSD-2-Clause
esquery@1.7.0 -- BSD-3-Clause
esrecurse@4.3.0 -- BSD-2-Clause
@@ -162,7 +155,7 @@ fast-levenshtein@2.0.6 -- MIT
fdir@6.5.0 -- MIT
file-entry-cache@8.0.0 -- MIT
find-up@5.0.0 -- MIT
-finder-template-generator@0.3.17 -- UNLICENSED
+finder-template-generator@0.3.18 -- UNLICENSED
flat-cache@4.0.1 -- MIT
flatted@3.4.4 -- ISC
fs.realpath@1.0.0 -- ISC
@@ -210,10 +203,12 @@ lightningcss-win32-x64-msvc@1.32.0 -- MPL-2.0
lightningcss-win32-x64-msvc@1.33.0 -- MPL-2.0
lightningcss@1.32.0 -- MPL-2.0
lightningcss@1.33.0 -- MPL-2.0
+liquidjs@10.29.0 -- MIT
local-pkg@1.2.1 -- MIT
locate-path@6.0.0 -- MIT
lower-case@2.0.2 -- MIT
lru-cache@5.1.1 -- ISC
+lucide@1.45.0 -- ISC
magic-string@0.30.21 -- MIT
minimatch@10.2.6 -- BlueOak-1.0.0
minimatch@3.1.5 -- ISC
@@ -250,7 +245,6 @@ path-parse@1.0.7 -- MIT
pathe@2.0.3 -- MIT
perfect-debounce@2.1.0 -- MIT
picocolors@1.1.1 -- ISC
-picomatch@2.3.2 -- MIT
picomatch@4.0.7 -- MIT
pkg-types@1.3.1 -- MIT
pkg-types@2.3.3 -- MIT
@@ -270,11 +264,10 @@ rolldown@1.2.7 -- MIT
rollup-plugin-string@3.0.0 -- MIT
rollup-plugin-visualizer@7.1.1 -- MIT
rollup-pluginutils@2.8.2 -- MIT
-rollup@2.80.0 -- MIT
rollup@4.63.1 -- MIT
rou3@0.9.2 -- MIT
run-applescript@7.1.0 -- MIT
-sass@1.104.0 -- MIT
+sass@1.104.1 -- MIT
semver@5.7.2 -- ISC
semver@6.3.1 -- ISC
semver@7.8.5 -- ISC
@@ -284,14 +277,12 @@ slide@1.1.6 -- ISC
source-map-js@1.2.1 -- BSD-3-Clause
source-map-support@0.5.21 -- MIT
source-map@0.6.1 -- BSD-3-Clause
-source-map@0.8.0 -- BSD-3-Clause
spdx-compare@1.0.0 -- MIT
spdx-correct@3.2.0 -- Apache-2.0
spdx-exceptions@2.5.0 -- CC-BY-3.0
spdx-expression-parse@3.0.1 -- MIT
spdx-license-ids@3.0.23 -- CC0-1.0
spdx-ranges@2.1.1 -- (MIT AND CC-BY-3.0)
-spdx-satisfies@4.0.1 -- MIT
srvx@1.0.4 -- MIT
string-width@7.2.0 -- MIT
string-width@8.2.2 -- MIT
@@ -310,8 +301,8 @@ ts-api-utils@2.5.0 -- MIT
tslib@2.8.1 -- 0BSD
tsx@4.23.13 -- MIT
type-check@0.4.0 -- MIT
-typescript-eslint@8.69.0 -- MIT
-typescript@5.9.3 -- Apache-2.0
+typescript-eslint@8.70.0 -- MIT
+typescript@5.7.3 -- Apache-2.0
ufo@1.6.4 -- MIT
undici-types@8.9.0 -- MIT
unplugin-remove@1.0.3 -- MIT
diff --git a/cmd/findergen/frontend/install.sh b/cmd/findergen/frontend/install.sh
deleted file mode 100644
index 61504b95..00000000
--- a/cmd/findergen/frontend/install.sh
+++ /dev/null
@@ -1,95 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-
-REPO="shadowdara/finder"
-INSTALL_DIR="${INSTALL_DIR:-$HOME/.local/bin}"
-
-detect_os() {
- case "$(uname -s)" in
- Linux*) echo "linux" ;;
- Darwin*) echo "darwin" ;;
- MINGW*|MSYS*|CYGWIN*) echo "windows" ;;
- *)
- echo "Unsupported OS: $(uname -s)" >&2
- exit 1
- ;;
- esac
-}
-
-detect_arch() {
- case "$(uname -m)" in
- x86_64|amd64) echo "amd64" ;;
- arm64|aarch64) echo "arm64" ;;
- *)
- echo "Unsupported architecture: $(uname -m)" >&2
- exit 1
- ;;
- esac
-}
-
-OS="$(detect_os)"
-ARCH="$(detect_arch)"
-
-echo "Detecting platform..."
-echo " OS: $OS"
-echo " Arch: $ARCH"
-
-VERSION="$(
- curl -fsSL \
- "https://api.github.com/repos/${REPO}/releases/latest" |
- grep '"tag_name":' |
- sed -E 's/.*"([^"]+)".*/\1/'
-)"
-
-if [ -z "$VERSION" ]; then
- echo "Could not determine latest version." >&2
- exit 1
-fi
-
-echo " Version: $VERSION"
-
-ARCHIVE="finder_${VERSION}_${OS}_${ARCH}"
-
-if [ "$OS" = "windows" ]; then
- ARCHIVE="${ARCHIVE}.zip"
-else
- ARCHIVE="${ARCHIVE}.tar.gz"
-fi
-
-URL="https://github.com/${REPO}/releases/download/${VERSION}/${ARCHIVE}"
-
-TMP="$(mktemp -d)"
-trap 'rm -rf "$TMP"' EXIT
-
-echo "Downloading:"
-echo " $URL"
-
-curl -fL "$URL" -o "$TMP/archive"
-
-mkdir -p "$INSTALL_DIR"
-
-if [ "$OS" = "windows" ]; then
- unzip -q "$TMP/archive" -d "$TMP/package"
-else
- mkdir "$TMP/package"
- tar -xzf "$TMP/archive" -C "$TMP/package"
-fi
-
-if [ "$OS" = "windows" ]; then
- cp "$TMP/package/finder.exe" "$INSTALL_DIR/finder.exe"
-else
- install -m 755 "$TMP/package/finder" "$INSTALL_DIR/finder"
-fi
-
-echo
-echo "Finder installed successfully!"
-echo
-echo " $INSTALL_DIR/finder"
-
-if [[ ":$PATH:" != *":$INSTALL_DIR:"* ]]; then
- echo "export PATH=\"\$PATH:$INSTALL_DIR\"" >> "$HOME/.bashrc"
- export PATH="$PATH:$INSTALL_DIR"
-fi
-
-source ~/.bashrc
diff --git a/cmd/findergen/frontend/test/ejs/index.html b/cmd/findergen/frontend/test/ejs/index.html
new file mode 100644
index 00000000..4a1c7ac4
--- /dev/null
+++ b/cmd/findergen/frontend/test/ejs/index.html
@@ -0,0 +1 @@
+Hallo Max! Du bist 20 Jahre alt.
\ No newline at end of file
diff --git a/cmd/findergen/frontend/test/jekyll/index.html b/cmd/findergen/frontend/test/jekyll/index.html
new file mode 100644
index 00000000..66295446
--- /dev/null
+++ b/cmd/findergen/frontend/test/jekyll/index.html
@@ -0,0 +1 @@
+header
\ No newline at end of file
diff --git a/cmd/findergen/frontend/tools/line_formatter/line_extender/page/index.html b/cmd/findergen/frontend/tools/line_formatter/line_extender/page/index.html
new file mode 100644
index 00000000..26afc74e
--- /dev/null
+++ b/cmd/findergen/frontend/tools/line_formatter/line_extender/page/index.html
@@ -0,0 +1 @@
+Finder
\ No newline at end of file
diff --git a/cmd/findergen/frontend/tools/line_formatter/page/index.html b/cmd/findergen/frontend/tools/line_formatter/page/index.html
new file mode 100644
index 00000000..c4edc784
--- /dev/null
+++ b/cmd/findergen/frontend/tools/line_formatter/page/index.html
@@ -0,0 +1 @@
+Finder
\ No newline at end of file
diff --git a/cmd/findergen/frontend/tools/picture-mode-maker/page/index.html b/cmd/findergen/frontend/tools/picture-mode-maker/page/index.html
new file mode 100644
index 00000000..77a4a3d2
--- /dev/null
+++ b/cmd/findergen/frontend/tools/picture-mode-maker/page/index.html
@@ -0,0 +1 @@
+Finder
\ No newline at end of file
diff --git a/cmd/findergen/main.go b/cmd/findergen/main.go
index 60b0903e..51d59383 100644
--- a/cmd/findergen/main.go
+++ b/cmd/findergen/main.go
@@ -341,11 +341,20 @@ func main() {
return
}
+ installed, err := templates.LoadInstalledTemplates()
+ if err != nil {
+ http.Error(w, "Failed to load installed templates", http.StatusInternalServerError)
+ return
+ }
+
builtin := make([]string, 0)
custom := make([]string, 0)
+ installedNames := make([]string, 0)
for _, name := range templateNames {
- if _, exists := userTemplates[name]; exists {
+ if _, exists := installed[name]; exists {
+ installedNames = append(installedNames, name)
+ } else if _, exists := userTemplates[name]; exists {
custom = append(custom, name)
} else {
builtin = append(builtin, name)
@@ -356,6 +365,7 @@ func main() {
"templates": templateNames,
"builtin": builtin,
"custom": custom,
+ "installed": installedNames,
"templatecount": len(templateNames),
}
@@ -379,16 +389,25 @@ func main() {
return
}
+ installed, err := templates.LoadInstalledTemplates()
+ if err != nil {
+ http.Error(w, "Failed to load installed templates", http.StatusInternalServerError)
+ return
+ }
+
builtin := make([]string, 0)
custom := make([]string, 0)
+ installedNames := make([]string, 0)
alltemplates := map[string]string{}
allbuildinTemplates := map[string]string{}
allcustomTemplates := map[string]string{}
+ allinstalledTemplates := map[string]string{}
for _, name := range templateNames {
- if _, exists := userTemplates[name]; exists {
-
+ if _, exists := installed[name]; exists {
+ installedNames = append(installedNames, name)
+ } else if _, exists := userTemplates[name]; exists {
custom = append(custom, name)
} else {
builtin = append(builtin, name)
@@ -409,6 +428,20 @@ func main() {
allbuildinTemplates[name] = normalized
}
+ // Load every Installed Template (from `finder install`)
+ for _, name := range installedNames {
+ data, exists := installed[name]
+ if !exists {
+ http.Error(w, "Template not found", http.StatusNotFound)
+ return
+ }
+
+ normalized := json5.PreprocessJSON5(string(data))
+
+ alltemplates[name] = normalized
+ allinstalledTemplates[name] = normalized
+ }
+
// Load every Custom Template
// load Custom Templates after wards
for _, name := range custom {
@@ -425,12 +458,14 @@ func main() {
}
response := map[string]interface{}{
- "count_templates": len(alltemplates),
- "count_buildin_templates": len(allbuildinTemplates),
- "count_custom_templates": len(allcustomTemplates),
- "templates": alltemplates,
- "builtin": allbuildinTemplates,
- "custom": allcustomTemplates,
+ "count_templates": len(alltemplates),
+ "count_buildin_templates": len(allbuildinTemplates),
+ "count_installed_templates": len(allinstalledTemplates),
+ "count_custom_templates": len(allcustomTemplates),
+ "templates": alltemplates,
+ "builtin": allbuildinTemplates,
+ "installed": allinstalledTemplates,
+ "custom": allcustomTemplates,
}
if err := json.NewEncoder(w).Encode(response); err != nil {
@@ -488,6 +523,34 @@ func main() {
writeTemplateJSON(w, name, "builtin", data)
})
+ // Load an installed template (from `finder install`)
+ mux.HandleFunc("/api/template/load/installed", func(w http.ResponseWriter, r *http.Request) {
+ if r.Method != http.MethodGet {
+ http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)
+ return
+ }
+
+ name := r.URL.Query().Get("name")
+ if name == "" {
+ http.Error(w, "Missing template name", http.StatusBadRequest)
+ return
+ }
+
+ installed, err := templates.LoadInstalledTemplates()
+ if err != nil {
+ http.Error(w, "Failed to load installed templates", http.StatusInternalServerError)
+ return
+ }
+
+ data, exists := installed[name]
+ if !exists {
+ http.Error(w, "Template not found", http.StatusNotFound)
+ return
+ }
+
+ writeTemplateJSON(w, name, "installed", data)
+ })
+
// Load a template cache by its name
mux.HandleFunc("/api/template/load/cache", func(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
diff --git a/npm/site/data/backend.json b/npm/site/data/backend.json
index 911b3914..07ffd74e 100644
--- a/npm/site/data/backend.json
+++ b/npm/site/data/backend.json
@@ -1,29 +1,29 @@
{
- "generatedAt": "2026-09-14T11:49:03.816Z",
+ "generatedAt": "2026-09-14T21:10:53.964Z",
"total": {
"files": 68,
- "bytes": 350917,
- "kilobytes": 342.69,
- "megabytes": 0.33
+ "bytes": 351602,
+ "kilobytes": 343.36,
+ "megabytes": 0.34
},
"byExtension": [
{
"extension": ".js",
"files": 27,
- "bytes": 275812,
- "percentage": 78.6
+ "bytes": 276394,
+ "percentage": 78.61
},
{
"extension": ".css",
"files": 15,
- "bytes": 56648,
- "percentage": 16.14
+ "bytes": 56700,
+ "percentage": 16.13
},
{
"extension": ".txt",
"files": 1,
- "bytes": 9466,
- "percentage": 2.7
+ "bytes": 9517,
+ "percentage": 2.71
},
{
"extension": ".html",
@@ -46,7 +46,7 @@
{
"path": "assets/_virtual_page-markdown_changelog.js",
"extension": ".js",
- "bytes": 30566
+ "bytes": 30767
},
{
"path": "assets/_virtual_page-data_index.js",
@@ -71,12 +71,12 @@
{
"path": "dependencies.txt",
"extension": ".txt",
- "bytes": 9466
+ "bytes": 9517
},
{
"path": "assets/viewer.css",
"extension": ".css",
- "bytes": 9349
+ "bytes": 9401
},
{
"path": "assets/configeditor.js",
@@ -91,7 +91,7 @@
{
"path": "assets/viewer.js",
"extension": ".js",
- "bytes": 7931
+ "bytes": 8312
},
{
"path": "assets/regexcreator.js",
diff --git a/npm/site/data/gh-pages.json b/npm/site/data/gh-pages.json
index 36e348bc..b7739365 100644
--- a/npm/site/data/gh-pages.json
+++ b/npm/site/data/gh-pages.json
@@ -1,49 +1,38 @@
{
- "generatedAt": "2026-09-13T23:34:52.067Z",
+ "generatedAt": "2026-09-14T21:11:06.431Z",
"total": {
- "files": 58,
- "bytes": 417268,
- "kilobytes": 407.49,
+ "files": 68,
+ "bytes": 418973,
+ "kilobytes": 409.15,
"megabytes": 0.4
},
"byExtension": [
{
"extension": ".js",
- "files": 20,
- "bytes": 341297,
- "percentage": 81.79
+ "files": 27,
+ "bytes": 343574,
+ "percentage": 82
},
{
"extension": ".css",
"files": 15,
- "bytes": 56648,
- "percentage": 13.58
+ "bytes": 56700,
+ "percentage": 13.53
},
{
"extension": ".txt",
"files": 1,
- "bytes": 9413,
- "percentage": 2.26
+ "bytes": 9517,
+ "percentage": 2.27
},
{
"extension": ".html",
- "files": 21,
- "bytes": 7899,
- "percentage": 1.89
- },
- {
- "extension": ".sh",
- "files": 1,
- "bytes": 2011,
- "percentage": 0.48
+ "files": 25,
+ "bytes": 9182,
+ "percentage": 2.19
}
],
"files": [
- {
- "path": "assets/main_entry.js",
- "extension": ".js",
- "bytes": 88782
- },
{
"path": "assets/jquery.module.js",
"extension": ".js",
@@ -52,17 +41,32 @@
{
"path": "assets/viewer.js",
"extension": ".js",
- "bytes": 77571
+ "bytes": 77785
},
{
"path": "assets/installscript.js",
"extension": ".js",
"bytes": 32265
},
+ {
+ "path": "assets/_virtual_page-markdown_changelog.js",
+ "extension": ".js",
+ "bytes": 30767
+ },
+ {
+ "path": "assets/_virtual_page-data_index.js",
+ "extension": ".js",
+ "bytes": 25412
+ },
+ {
+ "path": "assets/_virtual_page-markdown_readme.js",
+ "extension": ".js",
+ "bytes": 24851
+ },
{
"path": "assets/creator.js",
"extension": ".js",
- "bytes": 15664
+ "bytes": 15609
},
{
"path": "assets/markdown.js",
@@ -72,18 +76,23 @@
{
"path": "dependencies.txt",
"extension": ".txt",
- "bytes": 9413
+ "bytes": 9517
},
{
"path": "assets/viewer.css",
"extension": ".css",
- "bytes": 9349
+ "bytes": 9401
},
{
"path": "assets/configeditor.js",
"extension": ".js",
"bytes": 9239
},
+ {
+ "path": "assets/main_entry.js",
+ "extension": ".js",
+ "bytes": 8441
+ },
{
"path": "assets/regexcreator.js",
"extension": ".js",
@@ -127,7 +136,7 @@
{
"path": "assets/cacheviewer.js",
"extension": ".js",
- "bytes": 3498
+ "bytes": 3478
},
{
"path": "assets/home.js",
@@ -137,7 +146,7 @@
{
"path": "assets/samfile.js",
"extension": ".js",
- "bytes": 3291
+ "bytes": 3256
},
{
"path": "assets/samfile.css",
@@ -169,11 +178,6 @@
"extension": ".css",
"bytes": 2194
},
- {
- "path": "install.sh",
- "extension": ".sh",
- "bytes": 2011
- },
{
"path": "assets/index.css",
"extension": ".css",
@@ -192,18 +196,28 @@
{
"path": "assets/worlds.js",
"extension": ".js",
- "bytes": 1139
+ "bytes": 1099
},
{
- "path": "assets/index3.js",
+ "path": "assets/index4.js",
"extension": ".js",
"bytes": 1069
},
{
- "path": "assets/index.js",
+ "path": "assets/index2.js",
"extension": ".js",
"bytes": 1004
},
+ {
+ "path": "assets/page2.js",
+ "extension": ".js",
+ "bytes": 738
+ },
+ {
+ "path": "assets/config.js",
+ "extension": ".js",
+ "bytes": 623
+ },
{
"path": "assets/info.js",
"extension": ".js",
@@ -265,7 +279,22 @@
"bytes": 406
},
{
- "path": "assets/index2.js",
+ "path": "tools/line_formatter/line_extender/page/index.html",
+ "extension": ".html",
+ "bytes": 387
+ },
+ {
+ "path": "tools/picture-mode-maker/page/index.html",
+ "extension": ".html",
+ "bytes": 377
+ },
+ {
+ "path": "tools/line_formatter/page/index.html",
+ "extension": ".html",
+ "bytes": 373
+ },
+ {
+ "path": "assets/index3.js",
"extension": ".js",
"bytes": 369
},
@@ -325,9 +354,24 @@
"bytes": 228
},
{
- "path": "jekyll/index.html",
+ "path": "assets/index.js",
+ "extension": ".js",
+ "bytes": 129
+ },
+ {
+ "path": "test/jekyll/index.html",
"extension": ".html",
- "bytes": 51
+ "bytes": 109
+ },
+ {
+ "path": "test/ejs/index.html",
+ "extension": ".html",
+ "bytes": 88
+ },
+ {
+ "path": "assets/page.js",
+ "extension": ".js",
+ "bytes": 34
}
]
}
\ No newline at end of file
diff --git a/npm/site/docs/changelog.md b/npm/site/docs/changelog.md
index 0c48cb65..23406811 100644
--- a/npm/site/docs/changelog.md
+++ b/npm/site/docs/changelog.md
@@ -2,7 +2,13 @@
_The whole finder CHANGELOG_
-## Newest prob 0.3.17
+## Newest
+
+- added Author field to finder templates
+- added a subcommand to validate templates
+- install templates from the web
+
+## 0.3.17 - 13.09.2026
- added regex support
- added mcapp minecraft world dashboard
@@ -13,7 +19,7 @@ _The whole finder CHANGELOG_
- updated the regex creator
- fixed a bug in the argparser lib where global flag where not found in subcommands
-### Commits
+Commits
- _[8e63902](https://github.com/shadowdara/finder/tree/8e6390298c29bfeb6984a7e40190cb6eaa6d3350)_ Update frontend assets, templates & deps
Regenerate frontend/site assets and metadata: update cmd/findergen frontend main_entry.js (changelog/docs/markdown additions), bump lightningcss to 1.33 in dependency lists, and refresh generated site stats (npm/site/data/backend.json and gh-pages.json). Also update templates index (npm/site/src/templates.js) to add min_version/tags for many templates. These changes reflect a site build and template metadata refresh.
@@ -245,6 +251,8 @@ Improves flexibility for file-extension and substring matching and allows saving
- _[c41219a](https://github.com/shadowdara/finder/tree/c41219ae4b2326a88abdd3c7c15627f179b0ed4e)_ add csf
+
+
## 0.3.16 - 08.09.2026
- added cache creation
diff --git a/npm/site/pages/viewer.css b/npm/site/pages/viewer.css
index b509bbdb..4bba82ba 100644
--- a/npm/site/pages/viewer.css
+++ b/npm/site/pages/viewer.css
@@ -324,6 +324,11 @@ input {
color: #2dd4bf;
}
+.badge.installed {
+ background: rgba(251, 191, 36, 0.12);
+ color: #fbbf24;
+}
+
/* Code */
.code-preview {
diff --git a/npm/site/pages/viewer.tsx b/npm/site/pages/viewer.tsx
index d3abf85b..58bee957 100644
--- a/npm/site/pages/viewer.tsx
+++ b/npm/site/pages/viewer.tsx
@@ -7,9 +7,11 @@ import { SERVER_ADRESS } from "../src/vars.js";
export interface ServerResponse {
count_templates: number;
count_buildin_templates: number;
+ count_installed_templates: number;
count_custom_templates: number;
templates: Record;
builtin: Record;
+ installed: Record;
custom: Record;
}
@@ -30,9 +32,11 @@ export default function render(el: HTMLDivElement) {
renderViewer(el, {
templates: builtin,
builtin,
+ installed: [],
custom: [],
count_templates: builtin.length,
count_buildin_templates: builtin.length,
+ count_installed_templates: 0,
count_custom_templates: 0,
});
return;
@@ -93,9 +97,11 @@ function renderViewer(
data: {
templates: [string, string][];
builtin: [string, string][];
+ installed: [string, string][];
custom: [string, string][];
count_templates: number;
count_buildin_templates: number;
+ count_installed_templates: number;
count_custom_templates: number;
},
) {
@@ -136,6 +142,13 @@ function renderViewer(
Built-in
+ {!isStatic ? (
+
+ {data.count_installed_templates}
+ Installed
+
+ ) : null}
+
{!isStatic ? (
{data.count_custom_templates}
@@ -169,6 +182,11 @@ function renderViewer(
{data.builtin.length}
+
+ Installed
+ {data.installed.length}
+
+
Custom
{data.custom.length}
@@ -197,6 +215,7 @@ function renderViewer(
{renderTemplates(data.builtin, "builtin")}
+ {!isStatic ? renderTemplates(data.installed, "installed") : null}
{!isStatic ? renderTemplates(data.custom, "custom") : null}
@@ -225,9 +244,11 @@ async function renderServer(el: HTMLDivElement) {
renderViewer(el, {
templates: Object.entries(data.templates),
builtin: Object.entries(data.builtin),
+ installed: Object.entries(data.installed ?? {}),
custom: Object.entries(data.custom),
count_templates: data.count_templates,
count_buildin_templates: data.count_buildin_templates,
+ count_installed_templates: data.count_installed_templates ?? 0,
count_custom_templates: data.count_custom_templates,
});
} catch (error) {
@@ -247,7 +268,7 @@ async function renderServer(el: HTMLDivElement) {
function renderTemplates(
templates: [string, string][],
- type: "templates" | "builtin" | "custom",
+ type: "templates" | "builtin" | "installed" | "custom",
) {
return templates.map(([name, content]) => {
const tags = getTags(content);
@@ -258,6 +279,15 @@ function renderTemplates(
const cacheUrl = `../cacheviewer?name=${encodeURIComponent(name)}`;
+ const icon = type === "builtin" ? "★" : type === "installed" ? "⬇" : "◇";
+
+ const badgeText =
+ type === "builtin"
+ ? "Built-in"
+ : type === "installed"
+ ? "Installed"
+ : "Template";
+
return (