fix: various small frontend issues

This commit is contained in:
d34dscene
2025-04-14 15:45:07 +02:00
parent 0590a8809d
commit 5fb9d0c08e
25 changed files with 438 additions and 465 deletions
+9 -6
View File
@@ -97,7 +97,7 @@ func UpsertRouter(a *config.App) http.HandlerFunc {
strings.Split(params.Router.Service, "@")[0],
)
}
// Check if router is new and add dns provider
// Check if router is new and add default dns provider (if there is one)
if _, ok := existingConfig.Config.Routers[params.Name]; !ok && dnsProvider.ID != 0 {
if err = q.AddRouterDNSProvider(r.Context(), db.AddRouterDNSProviderParams{
TraefikID: existingConfig.ID,
@@ -133,7 +133,7 @@ func UpsertRouter(a *config.App) http.HandlerFunc {
}
err = q.UpsertTraefikConfig(r.Context(), db.UpsertTraefikConfigParams{
ProfileID: existingConfig.ID,
ProfileID: existingConfig.ProfileID,
Source: source.Local,
Config: existingConfig.Config,
})
@@ -241,10 +241,10 @@ func validateRouterParams(params *UpsertRouterParams) error {
}
// Validate HTTP specific fields
if params.Router.Rule == "" {
return errors.New("http router requires a rule")
return errors.New("HTTP router requires a rule")
}
if len(params.Router.EntryPoints) == 0 {
return errors.New("http router requires at least one entrypoint")
return errors.New("HTTP router requires at least one entrypoint")
}
case "tcp":
if params.TCPRouter == nil {
@@ -255,7 +255,10 @@ func validateRouterParams(params *UpsertRouterParams) error {
}
// Validate TCP specific fields
if params.TCPRouter.Rule == "" {
return errors.New("tcp router requires a rule")
return errors.New("TCP router requires a rule")
}
if params.TCPRouter.EntryPoints == nil {
return errors.New("TCP router requires at least one entrypoint")
}
case "udp":
if params.UDPRouter == nil {
@@ -266,7 +269,7 @@ func validateRouterParams(params *UpsertRouterParams) error {
}
// Validate UDP specific fields
if len(params.UDPRouter.EntryPoints) == 0 {
return errors.New("udp router requires at least one entrypoint")
return errors.New("UDP router requires at least one entrypoint")
}
default:
return ErrInvalidRouterType
+3 -2
View File
@@ -193,9 +193,10 @@ func (a *App) setDefaultProfile(ctx context.Context) error {
return nil
}
// Skip if profile is correct
if profile.Url == a.Config.Traefik.URL &&
*profile.Username == a.Config.Traefik.Username &&
*profile.Password == a.Config.Traefik.Password &&
util.SafeDeref(profile.Username) == a.Config.Traefik.Username &&
util.SafeDeref(profile.Password) == a.Config.Traefik.Password &&
profile.Tls == a.Config.Traefik.TLS {
return nil
}
+45 -38
View File
@@ -1,5 +1,5 @@
-- +goose Up
CREATE TABLE profiles (
CREATE TABLE "profiles" (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(255) NOT NULL UNIQUE,
url TEXT NOT NULL,
@@ -10,33 +10,6 @@ CREATE TABLE profiles (
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username VARCHAR(255) NOT NULL UNIQUE,
password TEXT NOT NULL,
email VARCHAR(255),
is_admin BOOLEAN NOT NULL DEFAULT FALSE,
otp VARCHAR(6),
otp_expiry TIMESTAMP,
last_login TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE agents (
id TEXT PRIMARY KEY,
profile_id INTEGER NOT NULL,
public_ip TEXT,
private_ips JSONB,
containers JSONB,
active_ip TEXT,
hostname TEXT,
token TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (profile_id) REFERENCES profiles (id) ON DELETE CASCADE
);
CREATE TABLE dns_providers (
id INTEGER PRIMARY KEY,
name VARCHAR(255) NOT NULL UNIQUE,
@@ -63,6 +36,19 @@ CREATE TABLE traefik (
CONSTRAINT valid_source CHECK (source IN ('local', 'api', 'agent'))
);
CREATE TABLE "users" (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username VARCHAR(255) NOT NULL UNIQUE,
password TEXT NOT NULL,
email VARCHAR(255),
is_admin BOOLEAN NOT NULL DEFAULT FALSE,
otp VARCHAR(6),
otp_expiry TIMESTAMP,
last_login TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE "settings" (
key VARCHAR(255) PRIMARY KEY,
value TEXT NOT NULL,
@@ -70,6 +56,20 @@ CREATE TABLE "settings" (
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE "agents" (
id TEXT PRIMARY KEY,
profile_id INTEGER NOT NULL,
hostname TEXT,
public_ip TEXT,
private_ips JSONB,
containers JSONB,
active_ip TEXT,
token TEXT NOT NULL DEFAULT '',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (profile_id) REFERENCES profiles (id) ON DELETE CASCADE
);
CREATE TABLE "router_dns_provider" (
traefik_id INTEGER NOT NULL,
provider_id INTEGER NOT NULL,
@@ -79,6 +79,16 @@ CREATE TABLE "router_dns_provider" (
UNIQUE (traefik_id, router_name, provider_id)
);
CREATE TABLE errors (
id INTEGER PRIMARY KEY AUTOINCREMENT,
profile_id INTEGER NOT NULL,
category TEXT NOT NULL,
message TEXT NOT NULL,
details TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (profile_id) REFERENCES profiles (id) ON DELETE CASCADE
);
CREATE UNIQUE INDEX idx_traefik_profile_source ON traefik (profile_id, source)
WHERE
source IN ('local', 'api');
@@ -97,8 +107,8 @@ WHERE
is_active = 1;
END;
-- +goose StatementEnd
-- +goose StatementBegin
CREATE TRIGGER ensure_single_active_update BEFORE
UPDATE ON dns_providers FOR EACH ROW WHEN NEW.is_active = 1 BEGIN
@@ -109,19 +119,16 @@ WHERE
is_active = 1;
END;
-- +goose StatementEnd
CREATE UNIQUE INDEX unique_dns_error ON errors (profile_id, category, details);
-- +goose Down
DROP TABLE IF EXISTS profiles;
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS agents;
DROP TABLE IF EXISTS dns_providers;
DROP TABLE IF EXISTS traefik;
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS settings;
DROP TABLE IF EXISTS agents;
DROP TABLE IF EXISTS router_dns_provider;
DROP TABLE IF EXISTS errors;
+44 -66
View File
@@ -111,91 +111,69 @@ type AgentContainers []AgentContainer
// Handles the JSON marshalling and unmarshalling of the TraefikEntryPoints type
func (e *TraefikEntryPoints) Scan(value any) error {
bytes, ok := value.([]byte)
if !ok {
return fmt.Errorf("expected bytes, got %T", value)
}
return json.Unmarshal(bytes, (*[]EntryPointAPI)(e))
return scanJSON(value, e)
}
func (e TraefikEntryPoints) Value() (driver.Value, error) {
return json.Marshal(e)
}
// Handles the JSON marshalling and unmarshalling of the TraefikOverview type
func (o *TraefikOverview) Scan(value any) error {
bytes, ok := value.([]byte)
if !ok {
return fmt.Errorf("expected bytes, got %T", value)
}
return json.Unmarshal(bytes, (*TraefikOverview)(o))
return scanJSON(value, o)
}
func (o TraefikOverview) Value() (driver.Value, error) {
return json.Marshal(o)
}
// Handles the JSON marshalling and unmarshalling of the ConfigurationWrapper type
func (c *TraefikConfiguration) Scan(value any) error {
func (t *TraefikConfiguration) Scan(value any) error {
return scanJSON(value, t)
}
func (t TraefikConfiguration) Value() (driver.Value, error) {
return json.Marshal(t)
}
func (d *DNSProviderConfig) Scan(value any) error {
return scanJSON(value, d)
}
func (d DNSProviderConfig) Value() (driver.Value, error) {
return json.Marshal(d)
}
func (a *AgentPrivateIPs) Scan(value any) error {
return scanJSON(value, a)
}
func (a AgentPrivateIPs) Value() (driver.Value, error) {
return json.Marshal(a)
}
func (a *AgentContainers) Scan(value any) error {
return scanJSON(value, a)
}
func (a AgentContainers) Value() (driver.Value, error) {
return json.Marshal(a)
}
// scanJSON is a helper function to unmarshal a JSON value into a struct
func scanJSON[T any](value any, out *T) (err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("panic during Scan: %v", r)
}
}()
if value == nil {
c = nil
return nil
}
bytes, ok := value.([]byte)
if !ok {
return fmt.Errorf("failed to scan Configuration: expected []byte, got %T", value)
return fmt.Errorf("expected []byte, got %T", value)
}
return json.Unmarshal(bytes, &c)
}
// Value implements driver.Valuer
func (c TraefikConfiguration) Value() (driver.Value, error) {
if c.Routers == nil && c.Middlewares == nil && c.Services == nil && c.TCPRouters == nil &&
c.TCPMiddlewares == nil &&
c.TCPServices == nil &&
c.UDPRouters == nil &&
c.UDPServices == nil {
return nil, nil
}
return json.Marshal(c)
}
func (c *DNSProviderConfig) Scan(value any) error {
bytes, ok := value.([]byte)
if !ok {
return fmt.Errorf("expected bytes, got %T", value)
}
return json.Unmarshal(bytes, c)
}
func (c DNSProviderConfig) Value() (driver.Value, error) {
return json.Marshal(c)
}
func (c *AgentPrivateIPs) Scan(value any) error {
bytes, ok := value.([]byte)
if !ok {
return fmt.Errorf("expected bytes, got %T", value)
}
return json.Unmarshal(bytes, c)
}
func (c AgentPrivateIPs) Value() (driver.Value, error) {
return json.Marshal(c)
}
func (c *AgentContainers) Scan(value any) error {
bytes, ok := value.([]byte)
if !ok {
return fmt.Errorf("expected bytes, got %T", value)
}
return json.Unmarshal(bytes, c)
}
func (c AgentContainers) Value() (driver.Value, error) {
return json.Marshal(c)
return json.Unmarshal(bytes, out)
}
// Additional conversion helpers
+2 -3
View File
@@ -9,6 +9,7 @@ import (
"github.com/MizuchiLabs/mantrae/internal/db"
"github.com/traefik/traefik/v3/pkg/config/dynamic"
"github.com/traefik/traefik/v3/pkg/config/runtime"
"golang.org/x/exp/maps"
"sigs.k8s.io/yaml"
)
@@ -190,7 +191,5 @@ func mergeMaps[K comparable, V any](base, overlay map[K]V) {
return
}
for k, v := range overlay {
base[k] = v
}
maps.Copy(base, overlay)
}
+7
View File
@@ -23,6 +23,13 @@ func IsTest() bool {
return strings.HasSuffix(os.Args[0], ".test")
}
func SafeDeref(s *string) string {
if s == nil {
return ""
}
return *s
}
// GenPassword generates a random password of the specified length
func GenPassword(length int) string {
const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*"
+7 -7
View File
@@ -12,25 +12,25 @@
},
"devDependencies": {
"@sveltejs/adapter-static": "^3.0.8",
"@sveltejs/kit": "^2.20.4",
"@sveltejs/kit": "^2.20.5",
"@sveltejs/vite-plugin-svelte": "^5.0.3",
"@tailwindcss/postcss": "^4.1.3",
"@types/eslint": "^9.6.1",
"@types/node": "^22.14.0",
"@types/node": "^22.14.1",
"bits-ui": "1.3.17",
"clsx": "^2.1.1",
"eslint": "^9.24.0",
"eslint-config-prettier": "^10.1.1",
"eslint-config-prettier": "^10.1.2",
"eslint-plugin-svelte": "^3.5.1",
"formsnap": "^2.0.0",
"formsnap": "^2.0.1",
"globals": "^16.0.0",
"lucide-svelte": "^0.487.0",
"mode-watcher": "^0.5.1",
"prettier": "^3.5.3",
"prettier-plugin-svelte": "^3.3.3",
"prettier-plugin-tailwindcss": "^0.6.11",
"svelte": "^5.25.8",
"svelte-check": "^4.1.5",
"svelte": "^5.26.3",
"svelte-check": "^4.1.6",
"svelte-highlight": "^7.8.3",
"svelte-sonner": "^0.3.28",
"sveltekit-superforms": "^2.24.1",
@@ -40,7 +40,7 @@
"tailwindcss-animate": "^1.0.7",
"typescript": "^5.8.3",
"typescript-eslint": "^8.29.1",
"vite": "^6.2.5",
"vite": "^6.2.6",
"yaml": "^2.7.1",
"zod": "^3.24.2"
},
+201 -201
View File
@@ -17,13 +17,13 @@ importers:
devDependencies:
'@sveltejs/adapter-static':
specifier: ^3.0.8
version: 3.0.8(@sveltejs/kit@2.20.4(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))
version: 3.0.8(@sveltejs/kit@2.20.5(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))
'@sveltejs/kit':
specifier: ^2.20.4
version: 2.20.4(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))
specifier: ^2.20.5
version: 2.20.5(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))
'@sveltejs/vite-plugin-svelte':
specifier: ^5.0.3
version: 5.0.3(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))
version: 5.0.3(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))
'@tailwindcss/postcss':
specifier: ^4.1.3
version: 4.1.3
@@ -31,11 +31,11 @@ importers:
specifier: ^9.6.1
version: 9.6.1
'@types/node':
specifier: ^22.14.0
version: 22.14.0
specifier: ^22.14.1
version: 22.14.1
bits-ui:
specifier: 1.3.17
version: 1.3.17(svelte@5.25.8)
version: 1.3.17(svelte@5.26.3)
clsx:
specifier: ^2.1.1
version: 2.1.1
@@ -43,47 +43,47 @@ importers:
specifier: ^9.24.0
version: 9.24.0(jiti@2.4.2)
eslint-config-prettier:
specifier: ^10.1.1
version: 10.1.1(eslint@9.24.0(jiti@2.4.2))
specifier: ^10.1.2
version: 10.1.2(eslint@9.24.0(jiti@2.4.2))
eslint-plugin-svelte:
specifier: ^3.5.1
version: 3.5.1(eslint@9.24.0(jiti@2.4.2))(svelte@5.25.8)
version: 3.5.1(eslint@9.24.0(jiti@2.4.2))(svelte@5.26.3)
formsnap:
specifier: ^2.0.0
version: 2.0.0(svelte@5.25.8)(sveltekit-superforms@2.24.1(@sveltejs/kit@2.20.4(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(@types/json-schema@7.0.15)(svelte@5.25.8)(typescript@5.8.3))
specifier: ^2.0.1
version: 2.0.1(svelte@5.26.3)(sveltekit-superforms@2.24.1(@sveltejs/kit@2.20.5(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(@types/json-schema@7.0.15)(svelte@5.26.3)(typescript@5.8.3))
globals:
specifier: ^16.0.0
version: 16.0.0
lucide-svelte:
specifier: ^0.487.0
version: 0.487.0(svelte@5.25.8)
version: 0.487.0(svelte@5.26.3)
mode-watcher:
specifier: ^0.5.1
version: 0.5.1(svelte@5.25.8)
version: 0.5.1(svelte@5.26.3)
prettier:
specifier: ^3.5.3
version: 3.5.3
prettier-plugin-svelte:
specifier: ^3.3.3
version: 3.3.3(prettier@3.5.3)(svelte@5.25.8)
version: 3.3.3(prettier@3.5.3)(svelte@5.26.3)
prettier-plugin-tailwindcss:
specifier: ^0.6.11
version: 0.6.11(prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@5.25.8))(prettier@3.5.3)
version: 0.6.11(prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@5.26.3))(prettier@3.5.3)
svelte:
specifier: ^5.25.8
version: 5.25.8
specifier: ^5.26.3
version: 5.26.3
svelte-check:
specifier: ^4.1.5
version: 4.1.5(svelte@5.25.8)(typescript@5.8.3)
specifier: ^4.1.6
version: 4.1.6(svelte@5.26.3)(typescript@5.8.3)
svelte-highlight:
specifier: ^7.8.3
version: 7.8.3
svelte-sonner:
specifier: ^0.3.28
version: 0.3.28(svelte@5.25.8)
version: 0.3.28(svelte@5.26.3)
sveltekit-superforms:
specifier: ^2.24.1
version: 2.24.1(@sveltejs/kit@2.20.4(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(@types/json-schema@7.0.15)(svelte@5.25.8)(typescript@5.8.3)
version: 2.24.1(@sveltejs/kit@2.20.5(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(@types/json-schema@7.0.15)(svelte@5.26.3)(typescript@5.8.3)
tailwind-merge:
specifier: ^3.2.0
version: 3.2.0
@@ -103,8 +103,8 @@ importers:
specifier: ^8.29.1
version: 8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)
vite:
specifier: ^6.2.5
version: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)
specifier: ^6.2.6
version: 6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)
yaml:
specifier: ^2.7.1
version: 2.7.1
@@ -282,8 +282,8 @@ packages:
cpu: [x64]
os: [win32]
'@eslint-community/eslint-utils@4.5.1':
resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==}
'@eslint-community/eslint-utils@4.6.0':
resolution: {integrity: sha512-WhCn7Z7TauhBtmzhvKpoQs0Wwb/kBcy4CwpuI0/eEIr2Lx2auxmulAzLr91wVZJaz47iUZdkXOK7WlAfxGKCnA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
@@ -366,8 +366,8 @@ packages:
resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==}
engines: {node: '>=18.18'}
'@internationalized/date@3.7.0':
resolution: {integrity: sha512-VJ5WS3fcVx0bejE/YHfbDKR/yawZgKqn/if+oEeLqNwBtPzVB06olkfcnojTmEMX+gTpH+FlQ69SHNitJ8/erQ==}
'@internationalized/date@3.8.0':
resolution: {integrity: sha512-J51AJ0fEL68hE4CwGPa6E0PO6JDaVLd8aln48xFCSy7CZkZc96dGEGmLs2OEEbBxcsVZtfrqkXJwI2/MSG8yKw==}
'@jridgewell/gen-mapping@0.3.8':
resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
@@ -399,110 +399,110 @@ packages:
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'}
'@polka/url@1.0.0-next.28':
resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==}
'@polka/url@1.0.0-next.29':
resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==}
'@poppinss/macroable@1.0.4':
resolution: {integrity: sha512-ct43jurbe7lsUX5eIrj4ijO3j/6zIPp7CDnFWXDs7UPAbw1Pu1iH3oAmFdP4jcskKJBURH5M9oTtyeiUXyHX8Q==}
engines: {node: '>=18.16.0'}
'@rollup/rollup-android-arm-eabi@4.39.0':
resolution: {integrity: sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==}
'@rollup/rollup-android-arm-eabi@4.40.0':
resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==}
cpu: [arm]
os: [android]
'@rollup/rollup-android-arm64@4.39.0':
resolution: {integrity: sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==}
'@rollup/rollup-android-arm64@4.40.0':
resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==}
cpu: [arm64]
os: [android]
'@rollup/rollup-darwin-arm64@4.39.0':
resolution: {integrity: sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==}
'@rollup/rollup-darwin-arm64@4.40.0':
resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==}
cpu: [arm64]
os: [darwin]
'@rollup/rollup-darwin-x64@4.39.0':
resolution: {integrity: sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==}
'@rollup/rollup-darwin-x64@4.40.0':
resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==}
cpu: [x64]
os: [darwin]
'@rollup/rollup-freebsd-arm64@4.39.0':
resolution: {integrity: sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==}
'@rollup/rollup-freebsd-arm64@4.40.0':
resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==}
cpu: [arm64]
os: [freebsd]
'@rollup/rollup-freebsd-x64@4.39.0':
resolution: {integrity: sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==}
'@rollup/rollup-freebsd-x64@4.40.0':
resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==}
cpu: [x64]
os: [freebsd]
'@rollup/rollup-linux-arm-gnueabihf@4.39.0':
resolution: {integrity: sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==}
'@rollup/rollup-linux-arm-gnueabihf@4.40.0':
resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==}
cpu: [arm]
os: [linux]
'@rollup/rollup-linux-arm-musleabihf@4.39.0':
resolution: {integrity: sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==}
'@rollup/rollup-linux-arm-musleabihf@4.40.0':
resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==}
cpu: [arm]
os: [linux]
'@rollup/rollup-linux-arm64-gnu@4.39.0':
resolution: {integrity: sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==}
'@rollup/rollup-linux-arm64-gnu@4.40.0':
resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==}
cpu: [arm64]
os: [linux]
'@rollup/rollup-linux-arm64-musl@4.39.0':
resolution: {integrity: sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==}
'@rollup/rollup-linux-arm64-musl@4.40.0':
resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==}
cpu: [arm64]
os: [linux]
'@rollup/rollup-linux-loongarch64-gnu@4.39.0':
resolution: {integrity: sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==}
'@rollup/rollup-linux-loongarch64-gnu@4.40.0':
resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==}
cpu: [loong64]
os: [linux]
'@rollup/rollup-linux-powerpc64le-gnu@4.39.0':
resolution: {integrity: sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==}
'@rollup/rollup-linux-powerpc64le-gnu@4.40.0':
resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==}
cpu: [ppc64]
os: [linux]
'@rollup/rollup-linux-riscv64-gnu@4.39.0':
resolution: {integrity: sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==}
'@rollup/rollup-linux-riscv64-gnu@4.40.0':
resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==}
cpu: [riscv64]
os: [linux]
'@rollup/rollup-linux-riscv64-musl@4.39.0':
resolution: {integrity: sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==}
'@rollup/rollup-linux-riscv64-musl@4.40.0':
resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==}
cpu: [riscv64]
os: [linux]
'@rollup/rollup-linux-s390x-gnu@4.39.0':
resolution: {integrity: sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==}
'@rollup/rollup-linux-s390x-gnu@4.40.0':
resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==}
cpu: [s390x]
os: [linux]
'@rollup/rollup-linux-x64-gnu@4.39.0':
resolution: {integrity: sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==}
'@rollup/rollup-linux-x64-gnu@4.40.0':
resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==}
cpu: [x64]
os: [linux]
'@rollup/rollup-linux-x64-musl@4.39.0':
resolution: {integrity: sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==}
'@rollup/rollup-linux-x64-musl@4.40.0':
resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==}
cpu: [x64]
os: [linux]
'@rollup/rollup-win32-arm64-msvc@4.39.0':
resolution: {integrity: sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==}
'@rollup/rollup-win32-arm64-msvc@4.40.0':
resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==}
cpu: [arm64]
os: [win32]
'@rollup/rollup-win32-ia32-msvc@4.39.0':
resolution: {integrity: sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==}
'@rollup/rollup-win32-ia32-msvc@4.40.0':
resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==}
cpu: [ia32]
os: [win32]
'@rollup/rollup-win32-x64-msvc@4.39.0':
resolution: {integrity: sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==}
'@rollup/rollup-win32-x64-msvc@4.40.0':
resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==}
cpu: [x64]
os: [win32]
@@ -531,8 +531,8 @@ packages:
peerDependencies:
'@sveltejs/kit': ^2.0.0
'@sveltejs/kit@2.20.4':
resolution: {integrity: sha512-B3Y1mb1Qjt57zXLVch5tfqsK/ebHe6uYTcFSnGFNwRpId3+fplLgQK6Z2zhDVBezSsPuhDq6Pry+9PA88ocN6Q==}
'@sveltejs/kit@2.20.5':
resolution: {integrity: sha512-zT/97KvVUo19jEGZa972ls7KICjPCB53j54TVxnEFT5VEwL16G+YFqRVwJbfxh7AmS7/Ptr1rKF7Qt4FBMDNlw==}
engines: {node: '>=18.13'}
hasBin: true
peerDependencies:
@@ -555,8 +555,8 @@ packages:
svelte: ^5.0.0
vite: ^6.0.0
'@swc/helpers@0.5.15':
resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
'@swc/helpers@0.5.17':
resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==}
'@tailwindcss/node@4.1.3':
resolution: {integrity: sha512-H/6r6IPFJkCfBJZ2dKZiPJ7Ueb2wbL592+9bQEl2r73qbX6yGnmQVIfiUvDRB2YI0a3PWDrzUwkvQx1XW1bNkA==}
@@ -654,8 +654,8 @@ packages:
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
'@types/node@22.14.0':
resolution: {integrity: sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==}
'@types/node@22.14.1':
resolution: {integrity: sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==}
'@types/validator@13.12.3':
resolution: {integrity: sha512-2ipwZ2NydGQJImne+FhNdhgRM37e9lCev99KnqkbFHd94Xn/mErARWI1RSLem1QA19ch5kOhzIZd7e8CA2FI8g==}
@@ -859,8 +859,8 @@ packages:
dlv@1.1.3:
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
effect@3.14.6:
resolution: {integrity: sha512-/QMsBfMw2Gt10x3y2jVqDanLpKFrhc4L/3vqjrD36GWeuOcjN+1mvsvw9+RseAq9hmmkc3MFvLznfiEopqcPuw==}
effect@3.14.8:
resolution: {integrity: sha512-cHV6Mc2gb1e6l+CxhCeZm1JOzE4C9Mp7MhqHNFuAcSds2c2f23ZAb1ef4gBRHMIcdJ5sr3KGm+Xn+4z/UByE8w==}
enhanced-resolve@5.18.1:
resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==}
@@ -881,8 +881,8 @@ packages:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
eslint-config-prettier@10.1.1:
resolution: {integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==}
eslint-config-prettier@10.1.2:
resolution: {integrity: sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA==}
hasBin: true
peerDependencies:
eslint: '>=7.0.0'
@@ -992,8 +992,8 @@ packages:
flatted@3.3.3:
resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
formsnap@2.0.0:
resolution: {integrity: sha512-W61elddvdzeBEs10nNvwxQnx/FctJFHBXPk9uluNQAckHo1nuSUvSQGIjtLjTKIbQdQnwEOoxqWrk9tuv0U7hA==}
formsnap@2.0.1:
resolution: {integrity: sha512-iJSe4YKd/W6WhLwKDVJU9FQeaJRpEFuolhju7ZXlRpUVyDdqFdMP8AUBICgnVvQPyP41IPAlBa/v0Eo35iE6wQ==}
engines: {node: '>=18', pnpm: '>=8.7.0'}
peerDependencies:
svelte: ^5.0.0
@@ -1407,8 +1407,8 @@ packages:
resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
rollup@4.39.0:
resolution: {integrity: sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==}
rollup@4.40.0:
resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
@@ -1470,8 +1470,8 @@ packages:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
svelte-check@4.1.5:
resolution: {integrity: sha512-Gb0T2IqBNe1tLB9EB1Qh+LOe+JB8wt2/rNBDGvkxQVvk8vNeAoG+vZgFB/3P5+zC7RWlyBlzm9dVjZFph/maIg==}
svelte-check@4.1.6:
resolution: {integrity: sha512-P7w/6tdSfk3zEVvfsgrp3h3DFC75jCdZjTQvgGJtjPORs1n7/v2VMPIoty3PWv7jnfEm3x0G/p9wH4pecTb0Wg==}
engines: {node: '>= 18.0.0'}
hasBin: true
peerDependencies:
@@ -1507,8 +1507,8 @@ packages:
peerDependencies:
svelte: ^5.0.0
svelte@5.25.8:
resolution: {integrity: sha512-yRmjmT5rgCZUMfCKS5varGlSe/nQyr2oClyIirbBChfTFc00YjVAyVWo1zOH74La3hi5KRSkNJKncyJ04PwIYA==}
svelte@5.26.3:
resolution: {integrity: sha512-SgDfx70CmW8Rev9XRu5sN/3Paa/mSh3DGxDDEgtecdjbhLrmgK18McanP+gNE8HYGm8tXiXZN3Fn31NcqBML+Q==}
engines: {node: '>=18'}
sveltekit-superforms@2.24.1:
@@ -1621,8 +1621,8 @@ packages:
resolution: {integrity: sha512-36B2ryl4+oL5QxZ3AzD0t5SsMNGvTtQHpjgFO5tbNxfXbMFkY822ktCDe1MnlqV3301QQI9SLHDNJokDI+Z9pA==}
engines: {node: '>= 0.10'}
vite@6.2.5:
resolution: {integrity: sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==}
vite@6.2.6:
resolution: {integrity: sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
hasBin: true
peerDependencies:
@@ -1802,7 +1802,7 @@ snapshots:
'@esbuild/win32-x64@0.25.2':
optional: true
'@eslint-community/eslint-utils@4.5.1(eslint@9.24.0(jiti@2.4.2))':
'@eslint-community/eslint-utils@4.6.0(eslint@9.24.0(jiti@2.4.2))':
dependencies:
eslint: 9.24.0(jiti@2.4.2)
eslint-visitor-keys: 3.4.3
@@ -1894,9 +1894,9 @@ snapshots:
'@humanwhocodes/retry@0.4.2': {}
'@internationalized/date@3.7.0':
'@internationalized/date@3.8.0':
dependencies:
'@swc/helpers': 0.5.15
'@swc/helpers': 0.5.17
'@jridgewell/gen-mapping@0.3.8':
dependencies:
@@ -1927,69 +1927,69 @@ snapshots:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.19.1
'@polka/url@1.0.0-next.28': {}
'@polka/url@1.0.0-next.29': {}
'@poppinss/macroable@1.0.4':
optional: true
'@rollup/rollup-android-arm-eabi@4.39.0':
'@rollup/rollup-android-arm-eabi@4.40.0':
optional: true
'@rollup/rollup-android-arm64@4.39.0':
'@rollup/rollup-android-arm64@4.40.0':
optional: true
'@rollup/rollup-darwin-arm64@4.39.0':
'@rollup/rollup-darwin-arm64@4.40.0':
optional: true
'@rollup/rollup-darwin-x64@4.39.0':
'@rollup/rollup-darwin-x64@4.40.0':
optional: true
'@rollup/rollup-freebsd-arm64@4.39.0':
'@rollup/rollup-freebsd-arm64@4.40.0':
optional: true
'@rollup/rollup-freebsd-x64@4.39.0':
'@rollup/rollup-freebsd-x64@4.40.0':
optional: true
'@rollup/rollup-linux-arm-gnueabihf@4.39.0':
'@rollup/rollup-linux-arm-gnueabihf@4.40.0':
optional: true
'@rollup/rollup-linux-arm-musleabihf@4.39.0':
'@rollup/rollup-linux-arm-musleabihf@4.40.0':
optional: true
'@rollup/rollup-linux-arm64-gnu@4.39.0':
'@rollup/rollup-linux-arm64-gnu@4.40.0':
optional: true
'@rollup/rollup-linux-arm64-musl@4.39.0':
'@rollup/rollup-linux-arm64-musl@4.40.0':
optional: true
'@rollup/rollup-linux-loongarch64-gnu@4.39.0':
'@rollup/rollup-linux-loongarch64-gnu@4.40.0':
optional: true
'@rollup/rollup-linux-powerpc64le-gnu@4.39.0':
'@rollup/rollup-linux-powerpc64le-gnu@4.40.0':
optional: true
'@rollup/rollup-linux-riscv64-gnu@4.39.0':
'@rollup/rollup-linux-riscv64-gnu@4.40.0':
optional: true
'@rollup/rollup-linux-riscv64-musl@4.39.0':
'@rollup/rollup-linux-riscv64-musl@4.40.0':
optional: true
'@rollup/rollup-linux-s390x-gnu@4.39.0':
'@rollup/rollup-linux-s390x-gnu@4.40.0':
optional: true
'@rollup/rollup-linux-x64-gnu@4.39.0':
'@rollup/rollup-linux-x64-gnu@4.40.0':
optional: true
'@rollup/rollup-linux-x64-musl@4.39.0':
'@rollup/rollup-linux-x64-musl@4.40.0':
optional: true
'@rollup/rollup-win32-arm64-msvc@4.39.0':
'@rollup/rollup-win32-arm64-msvc@4.40.0':
optional: true
'@rollup/rollup-win32-ia32-msvc@4.39.0':
'@rollup/rollup-win32-ia32-msvc@4.40.0':
optional: true
'@rollup/rollup-win32-x64-msvc@4.39.0':
'@rollup/rollup-win32-x64-msvc@4.40.0':
optional: true
'@sideway/address@4.1.5':
@@ -2013,13 +2013,13 @@ snapshots:
dependencies:
acorn: 8.14.1
'@sveltejs/adapter-static@3.0.8(@sveltejs/kit@2.20.4(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))':
'@sveltejs/adapter-static@3.0.8(@sveltejs/kit@2.20.5(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))':
dependencies:
'@sveltejs/kit': 2.20.4(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))
'@sveltejs/kit': 2.20.5(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))
'@sveltejs/kit@2.20.4(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))':
'@sveltejs/kit@2.20.5(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))':
dependencies:
'@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))
'@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))
'@types/cookie': 0.6.0
cookie: 0.6.0
devalue: 5.1.1
@@ -2031,32 +2031,32 @@ snapshots:
sade: 1.8.1
set-cookie-parser: 2.7.1
sirv: 3.0.1
svelte: 5.25.8
vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)
svelte: 5.26.3
vite: 6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)
'@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))':
'@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))':
dependencies:
'@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))
'@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))
debug: 4.4.0
svelte: 5.25.8
vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)
svelte: 5.26.3
vite: 6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)
transitivePeerDependencies:
- supports-color
'@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))':
'@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))':
dependencies:
'@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))
'@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))
debug: 4.4.0
deepmerge: 4.3.1
kleur: 4.1.5
magic-string: 0.30.17
svelte: 5.25.8
vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)
vitefu: 1.0.6(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))
svelte: 5.26.3
vite: 6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)
vitefu: 1.0.6(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))
transitivePeerDependencies:
- supports-color
'@swc/helpers@0.5.15':
'@swc/helpers@0.5.17':
dependencies:
tslib: 2.8.1
@@ -2139,7 +2139,7 @@ snapshots:
'@types/json-schema@7.0.15': {}
'@types/node@22.14.0':
'@types/node@22.14.1':
dependencies:
undici-types: 6.21.0
@@ -2223,7 +2223,7 @@ snapshots:
'@typescript-eslint/utils@8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)':
dependencies:
'@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0(jiti@2.4.2))
'@eslint-community/eslint-utils': 4.6.0(eslint@9.24.0(jiti@2.4.2))
'@typescript-eslint/scope-manager': 8.29.1
'@typescript-eslint/types': 8.29.1
'@typescript-eslint/typescript-estree': 8.29.1(typescript@5.8.3)
@@ -2283,15 +2283,15 @@ snapshots:
balanced-match@1.0.2: {}
bits-ui@1.3.17(svelte@5.25.8):
bits-ui@1.3.17(svelte@5.26.3):
dependencies:
'@floating-ui/core': 1.6.9
'@floating-ui/dom': 1.6.13
'@internationalized/date': 3.7.0
'@internationalized/date': 3.8.0
esm-env: 1.2.2
runed: 0.23.4(svelte@5.25.8)
svelte: 5.25.8
svelte-toolbelt: 0.7.1(svelte@5.25.8)
runed: 0.23.4(svelte@5.26.3)
svelte: 5.26.3
svelte-toolbelt: 0.7.1(svelte@5.26.3)
tabbable: 6.2.0
brace-expansion@1.1.11:
@@ -2369,7 +2369,7 @@ snapshots:
dlv@1.1.3:
optional: true
effect@3.14.6:
effect@3.14.8:
dependencies:
'@standard-schema/spec': 1.0.0
fast-check: 3.23.2
@@ -2417,13 +2417,13 @@ snapshots:
escape-string-regexp@4.0.0: {}
eslint-config-prettier@10.1.1(eslint@9.24.0(jiti@2.4.2)):
eslint-config-prettier@10.1.2(eslint@9.24.0(jiti@2.4.2)):
dependencies:
eslint: 9.24.0(jiti@2.4.2)
eslint-plugin-svelte@3.5.1(eslint@9.24.0(jiti@2.4.2))(svelte@5.25.8):
eslint-plugin-svelte@3.5.1(eslint@9.24.0(jiti@2.4.2))(svelte@5.26.3):
dependencies:
'@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0(jiti@2.4.2))
'@eslint-community/eslint-utils': 4.6.0(eslint@9.24.0(jiti@2.4.2))
'@jridgewell/sourcemap-codec': 1.5.0
eslint: 9.24.0(jiti@2.4.2)
esutils: 2.0.3
@@ -2432,9 +2432,9 @@ snapshots:
postcss-load-config: 3.1.4(postcss@8.5.3)
postcss-safe-parser: 7.0.1(postcss@8.5.3)
semver: 7.7.1
svelte-eslint-parser: 1.1.2(svelte@5.25.8)
svelte-eslint-parser: 1.1.2(svelte@5.26.3)
optionalDependencies:
svelte: 5.25.8
svelte: 5.26.3
transitivePeerDependencies:
- ts-node
@@ -2449,7 +2449,7 @@ snapshots:
eslint@9.24.0(jiti@2.4.2):
dependencies:
'@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0(jiti@2.4.2))
'@eslint-community/eslint-utils': 4.6.0(eslint@9.24.0(jiti@2.4.2))
'@eslint-community/regexpp': 4.12.1
'@eslint/config-array': 0.20.0
'@eslint/config-helpers': 0.2.1
@@ -2558,11 +2558,11 @@ snapshots:
flatted@3.3.3: {}
formsnap@2.0.0(svelte@5.25.8)(sveltekit-superforms@2.24.1(@sveltejs/kit@2.20.4(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(@types/json-schema@7.0.15)(svelte@5.25.8)(typescript@5.8.3)):
formsnap@2.0.1(svelte@5.26.3)(sveltekit-superforms@2.24.1(@sveltejs/kit@2.20.5(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(@types/json-schema@7.0.15)(svelte@5.26.3)(typescript@5.8.3)):
dependencies:
svelte: 5.25.8
svelte-toolbelt: 0.5.0(svelte@5.25.8)
sveltekit-superforms: 2.24.1(@sveltejs/kit@2.20.4(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(@types/json-schema@7.0.15)(svelte@5.25.8)(typescript@5.8.3)
svelte: 5.26.3
svelte-toolbelt: 0.5.0(svelte@5.26.3)
sveltekit-superforms: 2.24.1(@sveltejs/kit@2.20.5(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(@types/json-schema@7.0.15)(svelte@5.26.3)(typescript@5.8.3)
fsevents@2.3.3:
optional: true
@@ -2712,9 +2712,9 @@ snapshots:
lodash.merge@4.6.2: {}
lucide-svelte@0.487.0(svelte@5.25.8):
lucide-svelte@0.487.0(svelte@5.26.3):
dependencies:
svelte: 5.25.8
svelte: 5.26.3
magic-string@0.30.17:
dependencies:
@@ -2737,9 +2737,9 @@ snapshots:
dependencies:
brace-expansion: 2.0.1
mode-watcher@0.5.1(svelte@5.25.8):
mode-watcher@0.5.1(svelte@5.26.3):
dependencies:
svelte: 5.25.8
svelte: 5.26.3
mri@1.2.0: {}
@@ -2811,16 +2811,16 @@ snapshots:
prelude-ls@1.2.1: {}
prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@5.25.8):
prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@5.26.3):
dependencies:
prettier: 3.5.3
svelte: 5.25.8
svelte: 5.26.3
prettier-plugin-tailwindcss@0.6.11(prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@5.25.8))(prettier@3.5.3):
prettier-plugin-tailwindcss@0.6.11(prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@5.26.3))(prettier@3.5.3):
dependencies:
prettier: 3.5.3
optionalDependencies:
prettier-plugin-svelte: 3.3.3(prettier@3.5.3)(svelte@5.25.8)
prettier-plugin-svelte: 3.3.3(prettier@3.5.3)(svelte@5.26.3)
prettier@3.5.3: {}
@@ -2845,40 +2845,40 @@ snapshots:
reusify@1.1.0: {}
rollup@4.39.0:
rollup@4.40.0:
dependencies:
'@types/estree': 1.0.7
optionalDependencies:
'@rollup/rollup-android-arm-eabi': 4.39.0
'@rollup/rollup-android-arm64': 4.39.0
'@rollup/rollup-darwin-arm64': 4.39.0
'@rollup/rollup-darwin-x64': 4.39.0
'@rollup/rollup-freebsd-arm64': 4.39.0
'@rollup/rollup-freebsd-x64': 4.39.0
'@rollup/rollup-linux-arm-gnueabihf': 4.39.0
'@rollup/rollup-linux-arm-musleabihf': 4.39.0
'@rollup/rollup-linux-arm64-gnu': 4.39.0
'@rollup/rollup-linux-arm64-musl': 4.39.0
'@rollup/rollup-linux-loongarch64-gnu': 4.39.0
'@rollup/rollup-linux-powerpc64le-gnu': 4.39.0
'@rollup/rollup-linux-riscv64-gnu': 4.39.0
'@rollup/rollup-linux-riscv64-musl': 4.39.0
'@rollup/rollup-linux-s390x-gnu': 4.39.0
'@rollup/rollup-linux-x64-gnu': 4.39.0
'@rollup/rollup-linux-x64-musl': 4.39.0
'@rollup/rollup-win32-arm64-msvc': 4.39.0
'@rollup/rollup-win32-ia32-msvc': 4.39.0
'@rollup/rollup-win32-x64-msvc': 4.39.0
'@rollup/rollup-android-arm-eabi': 4.40.0
'@rollup/rollup-android-arm64': 4.40.0
'@rollup/rollup-darwin-arm64': 4.40.0
'@rollup/rollup-darwin-x64': 4.40.0
'@rollup/rollup-freebsd-arm64': 4.40.0
'@rollup/rollup-freebsd-x64': 4.40.0
'@rollup/rollup-linux-arm-gnueabihf': 4.40.0
'@rollup/rollup-linux-arm-musleabihf': 4.40.0
'@rollup/rollup-linux-arm64-gnu': 4.40.0
'@rollup/rollup-linux-arm64-musl': 4.40.0
'@rollup/rollup-linux-loongarch64-gnu': 4.40.0
'@rollup/rollup-linux-powerpc64le-gnu': 4.40.0
'@rollup/rollup-linux-riscv64-gnu': 4.40.0
'@rollup/rollup-linux-riscv64-musl': 4.40.0
'@rollup/rollup-linux-s390x-gnu': 4.40.0
'@rollup/rollup-linux-x64-gnu': 4.40.0
'@rollup/rollup-linux-x64-musl': 4.40.0
'@rollup/rollup-win32-arm64-msvc': 4.40.0
'@rollup/rollup-win32-ia32-msvc': 4.40.0
'@rollup/rollup-win32-x64-msvc': 4.40.0
fsevents: 2.3.3
run-parallel@1.2.0:
dependencies:
queue-microtask: 1.2.3
runed@0.23.4(svelte@5.25.8):
runed@0.23.4(svelte@5.26.3):
dependencies:
esm-env: 1.2.2
svelte: 5.25.8
svelte: 5.26.3
sade@1.8.1:
dependencies:
@@ -2896,7 +2896,7 @@ snapshots:
sirv@3.0.1:
dependencies:
'@polka/url': 1.0.0-next.28
'@polka/url': 1.0.0-next.29
mrmime: 2.0.1
totalist: 3.0.1
@@ -2924,19 +2924,19 @@ snapshots:
dependencies:
has-flag: 4.0.0
svelte-check@4.1.5(svelte@5.25.8)(typescript@5.8.3):
svelte-check@4.1.6(svelte@5.26.3)(typescript@5.8.3):
dependencies:
'@jridgewell/trace-mapping': 0.3.25
chokidar: 4.0.3
fdir: 6.4.3
picocolors: 1.1.1
sade: 1.8.1
svelte: 5.25.8
svelte: 5.26.3
typescript: 5.8.3
transitivePeerDependencies:
- picomatch
svelte-eslint-parser@1.1.2(svelte@5.25.8):
svelte-eslint-parser@1.1.2(svelte@5.26.3):
dependencies:
eslint-scope: 8.3.0
eslint-visitor-keys: 4.2.0
@@ -2945,30 +2945,30 @@ snapshots:
postcss-scss: 4.0.9(postcss@8.5.3)
postcss-selector-parser: 7.1.0
optionalDependencies:
svelte: 5.25.8
svelte: 5.26.3
svelte-highlight@7.8.3:
dependencies:
highlight.js: 11.11.1
svelte-sonner@0.3.28(svelte@5.25.8):
svelte-sonner@0.3.28(svelte@5.26.3):
dependencies:
svelte: 5.25.8
svelte: 5.26.3
svelte-toolbelt@0.5.0(svelte@5.25.8):
svelte-toolbelt@0.5.0(svelte@5.26.3):
dependencies:
clsx: 2.1.1
style-to-object: 1.0.8
svelte: 5.25.8
svelte: 5.26.3
svelte-toolbelt@0.7.1(svelte@5.25.8):
svelte-toolbelt@0.7.1(svelte@5.26.3):
dependencies:
clsx: 2.1.1
runed: 0.23.4(svelte@5.25.8)
runed: 0.23.4(svelte@5.26.3)
style-to-object: 1.0.8
svelte: 5.25.8
svelte: 5.26.3
svelte@5.25.8:
svelte@5.26.3:
dependencies:
'@ampproject/remapping': 2.3.0
'@jridgewell/sourcemap-codec': 1.5.0
@@ -2985,12 +2985,12 @@ snapshots:
magic-string: 0.30.17
zimmerframe: 1.1.2
sveltekit-superforms@2.24.1(@sveltejs/kit@2.20.4(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(@types/json-schema@7.0.15)(svelte@5.25.8)(typescript@5.8.3):
sveltekit-superforms@2.24.1(@sveltejs/kit@2.20.5(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(@types/json-schema@7.0.15)(svelte@5.26.3)(typescript@5.8.3):
dependencies:
'@sveltejs/kit': 2.20.4(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.25.8)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))
'@sveltejs/kit': 2.20.5(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)))(svelte@5.26.3)(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))
devalue: 5.1.1
memoize-weak: 1.0.2
svelte: 5.25.8
svelte: 5.26.3
ts-deepmerge: 7.0.2
optionalDependencies:
'@exodus/schemasafe': 1.3.0
@@ -3000,7 +3000,7 @@ snapshots:
'@vinejs/vine': 3.0.1
arktype: 2.1.19
class-validator: 0.14.1
effect: 3.14.6
effect: 3.14.8
joi: 17.13.3
json-schema-to-ts: 3.1.1
superstruct: 2.0.2
@@ -3095,21 +3095,21 @@ snapshots:
validator@13.15.0:
optional: true
vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1):
vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1):
dependencies:
esbuild: 0.25.2
postcss: 8.5.3
rollup: 4.39.0
rollup: 4.40.0
optionalDependencies:
'@types/node': 22.14.0
'@types/node': 22.14.1
fsevents: 2.3.3
jiti: 2.4.2
lightningcss: 1.29.2
yaml: 2.7.1
vitefu@1.0.6(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)):
vitefu@1.0.6(vite@6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)):
optionalDependencies:
vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)
vite: 6.2.6(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)
which@2.0.2:
dependencies:
+1
View File
@@ -330,6 +330,7 @@ export const api = {
},
async shareRouter(data: UpsertRouterParams, profileId: number) {
console.log(data);
await send(`/router/${profileId}`, {
method: 'POST',
body: data
@@ -65,7 +65,7 @@
<form onsubmit={handleSubmit}>
<div class="grid gap-4">
{#each fields as field}
{#each fields as field (field.key)}
<FormField {...field} {disabled} bind:data={formData} />
{/each}
</div>
@@ -145,7 +145,7 @@
{#if isChainMiddleware}
<div class="flex flex-col gap-2">
{#if Array.isArray(fieldValue) && fieldValue.length > 0 && disabled}
{#each fieldValue as middleware}
{#each fieldValue as middleware (middleware)}
<div class="flex items-center gap-2">
<Input type="text" value={middleware} readonly {disabled} />
{#if !disabled}
@@ -169,7 +169,7 @@
: 'Select Middlewares'}
</Select.Trigger>
<Select.Content>
{#each $mwNames as name}
{#each $mwNames as name (name)}
<Select.Item value={name}>{name}</Select.Item>
{/each}
</Select.Content>
@@ -187,9 +187,9 @@
<div class="flex flex-col gap-2">
{#if Array.isArray(fieldValue) && isObjectArray(fieldValue)}
<div class="ml-4 flex flex-col gap-2 rounded border-l p-4">
{#each fieldValue as item, i}
{#each fieldValue as item, i (i)}
<div class="flex flex-col gap-2 rounded">
{#each Object.entries(item) as [field, value]}
{#each Object.entries(item) as [field, value] (field)}
<div class="grid grid-cols-4 items-center gap-2">
<Label class="col-span-1">{formatLabel(field)}</Label>
<Input
@@ -219,7 +219,7 @@
{/each}
</div>
{:else}
{#each (fieldValue as string[]) || [] as value, i}
{#each (fieldValue as string[]) || [] as value, i (i)}
<div class="flex gap-2">
<Input
type="text"
+1 -1
View File
@@ -87,7 +87,7 @@
{dns.type ? dns.type : 'Select type'}
</Select.Trigger>
<Select.Content class="no-scrollbar max-h-[300px] overflow-y-auto">
{#each dnsProviders as type}
{#each dnsProviders as type (type.value)}
<Select.Item value={type.value} label={type.label}>
{type.label}
</Select.Item>
+14 -21
View File
@@ -32,33 +32,26 @@
return;
}
// Sync service name with router
service.name = router.name;
service.protocol = router.protocol;
const protocol = (router.protocol = service.protocol = router.protocol);
router.service = router.name;
service.name = router.name;
let params: UpsertRouterParams = {
const params: UpsertRouterParams = {
name: router.name,
protocol: router.protocol
protocol,
...(protocol === 'http'
? {
router,
service
}
: {
[`${protocol}Router`]: router,
[`${protocol}Service`]: service
})
};
switch (router.protocol) {
case 'http':
params.router = router;
params.service = service;
break;
case 'tcp':
params.tcpRouter = router;
params.tcpService = service;
break;
case 'udp':
params.udpRouter = router;
params.udpService = service;
break;
}
await api.upsertRouter(params);
open = false;
toast.success(`Router ${mode === 'create' ? 'created' : 'updated'} successfully`);
open = false;
} catch (err: unknown) {
const e = err as Error;
toast.error(`Failed to ${mode} router`, {
+2 -2
View File
@@ -134,7 +134,7 @@
{#if searchQuery !== ''}
<Command.Group heading="Routers">
<Command.Empty>No results found.</Command.Empty>
{#each $routerServiceMerge || [] as m}
{#each $routerServiceMerge || [] as m (m.router.name)}
<Command.Item onSelect={() => updateRouter(m.router, m.service)} value={m.router.name}>
<Route class="mr-2 h-4 w-4" />
<span>{m.router.name}</span>
@@ -144,7 +144,7 @@
<Command.Separator />
<Command.Group heading="Middlewares">
<Command.Empty>No results found.</Command.Empty>
{#each $middlewares || [] as m}
{#each $middlewares || [] as m (m.name)}
<Command.Item onSelect={() => updateMiddleware(m)} value={m.name}>
<Layers class="mr-2 h-4 w-4" />
<span>{m.name}</span>
@@ -0,0 +1,52 @@
<script lang="ts" generics="T">
import * as Select from '$lib/components/ui/select/index.js';
import { Button } from '$lib/components/ui/button';
import type { BulkAction } from './types';
export let selectedCount: number;
export let totalCount: number;
export let actions: BulkAction<T>[] = [];
export let selectedItems: T[] = [];
</script>
<div class="bg-muted/50 my-2 flex items-center justify-between gap-2 rounded-lg border p-2 pr-6">
<div class="flex items-center gap-2">
{#each actions as action (action.label)}
{#if action.type === 'button'}
<Button
variant={action.variant ?? 'secondary'}
size="sm"
class={action.class}
onclick={() => action.onClick?.(selectedItems)}
disabled={action.disabled}
>
{#if action.icon}
{@const Icon = action.icon}
<Icon size={16} class="mr-1 h-4 w-4" />
{/if}
{action.label}
</Button>
{:else if action.type === 'select' && action.options}
<Select.Root
type="single"
onValueChange={(value) => {
const option = action.options?.find((o) => o.value === value);
option?.onClick(selectedItems, value);
}}
>
<Select.Trigger>
{action.label}
</Select.Trigger>
<Select.Content>
{#each action.options as option (option.value)}
<Select.Item value={option.value}>{option.label}</Select.Item>
{/each}
</Select.Content>
</Select.Root>
{/if}
{/each}
</div>
<span class="text-muted-foreground text-sm">
{selectedCount} of {totalCount} item(s) selected.
</span>
</div>
@@ -16,7 +16,7 @@
</script>
<div class="flex flex-col items-start gap-1">
{#each visibleItems as item}
{#each visibleItems as item (item)}
<Badge {variant} {...restProps}>{item}</Badge>
{/each}
{#if remaining > 0}
@@ -113,7 +113,7 @@
</HoverCard.Trigger>
<HoverCard.Content class="w-auto">
<div class="flex flex-col gap-2">
{#each parsedRules as { value, isClickable }}
{#each parsedRules as { value, isClickable } (value)}
<div class="flex flex-col">
<div class="flex items-center gap-2">
{#if isClickable}
+9 -57
View File
@@ -27,7 +27,6 @@
import { TraefikSource } from '$lib/types';
import { source } from '$lib/stores/source';
import { api, rdps } from '$lib/api';
import type { SvelteComponent } from 'svelte';
import {
ArrowDown,
ArrowUp,
@@ -37,27 +36,11 @@
ChevronsRight,
Delete,
Plus,
Search,
type IconProps
Search
} from 'lucide-svelte';
import { limit } from '$lib/stores/common';
import { toast } from 'svelte-sonner';
export type BulkAction<TData> = {
label: string;
icon?: typeof SvelteComponent<IconProps>;
class?: string | undefined;
variant?:
| 'default'
| 'destructive'
| 'outline'
| 'secondary'
| 'ghost'
| 'link'
| null
| undefined;
onClick: (selectedRows: TData[]) => Promise<void> | void;
};
import BulkActions from './BulkActions.svelte';
import type { BulkAction } from './types';
type DataTableProps<TData, TValue> = {
columns: ColumnDef<TData, TValue>[];
@@ -218,18 +201,6 @@
pagination.pageSize = Number(value);
limit.value = value;
}
async function executeBulkAction(action: BulkAction<TData>) {
const selectedRowsData = table.getSelectedRowModel().rows.map((row) => row.original);
if (selectedRowsData.length === 0) return;
try {
await action.onClick(selectedRowsData);
table.resetRowSelection(true);
} catch (err: unknown) {
const e = err as Error;
toast.error(`Action "${action.label}" failed.`, { description: e.message });
}
}
</script>
<div>
@@ -354,32 +325,13 @@
</Table.Root>
{/key}
</div>
{#if table.getSelectedRowModel().rows.length > 0 && bulkActions && bulkActions.length > 0}
<div
class="bg-muted/50 my-2 flex items-center justify-between gap-2 rounded-lg border p-2 pr-6"
>
<div class="flex items-center gap-2">
{#each bulkActions as action (action.label)}
<Button
variant={action.variant ?? 'secondary'}
size="sm"
class={action.class}
onclick={() => executeBulkAction(action)}
>
{#if action.icon}
{@const Icon = action.icon}
<Icon size={16} class="mr-1 h-4 w-4" />
{/if}
{action.label}
</Button>
{/each}
</div>
<span class="text-muted-foreground text-sm">
{table.getFilteredSelectedRowModel().rows.length} of
{table.getFilteredRowModel().rows.length} item(s) selected.
</span>
</div>
<BulkActions
selectedCount={table.getFilteredSelectedRowModel().rows.length}
totalCount={table.getFilteredRowModel().rows.length}
actions={bulkActions}
selectedItems={table.getSelectedRowModel().rows.map((row) => row.original)}
/>
{/if}
<!-- Pagination -->
+19
View File
@@ -0,0 +1,19 @@
import type { SvelteComponent } from 'svelte';
import type { IconProps } from 'lucide-svelte';
export type BulkAction<T> = {
type: 'button' | 'select';
label: string;
icon?: typeof SvelteComponent<IconProps>;
variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';
class?: string;
disabled?: boolean;
// For button type
onClick?: (selectedItems: T[]) => Promise<void> | void;
// For select type
options?: {
label: string;
value: string;
onClick: (selectedItems: T[], value: string) => Promise<void> | void;
}[];
};
@@ -260,7 +260,7 @@
{#if showDropdown}
<ul class="bg-card absolute mt-1 max-h-48 w-80 overflow-y-auto rounded-lg border p-2">
{#each filteredRules as template, i}
{#each filteredRules as template, i (template)}
<button
role="option"
aria-selected={i === selectedRuleIndex}
@@ -293,7 +293,7 @@
<div class="text-muted-foreground text-xs">
<span class="font-bold">Examples:</span>
<ul class="list-inside list-disc">
{#each ruleTemplates[type] as template}
{#each ruleTemplates[type] as template (template)}
<li>{template}</li>
{/each}
</ul>
-42
View File
@@ -62,45 +62,3 @@ export function cleanupFormData(data: unknown): unknown {
// Return null for empty objects to remove them entirely
return hasValidProperty ? result : null;
}
// export function cleanupFormData(data: Record<string, unknown>|null): Record<string, unknown>|null {
// if (data === null || typeof data !== 'object') {
// return data;
// }
// // Handle arrays
// if (Array.isArray(data)) {
// // Filter out empty strings from arrays
// const filtered = data.filter(item => item !== '');
// // If the array is now empty, return null to remove it
// if (filtered.length === 0) {
// return null;
// }
// // Clean each item in the array
// return filtered.map(item => cleanupFormData(item));
// }
// // Handle objects
// const result = {};
// let hasValue = false;
// for (const [key, value] of Object.entries(data)) {
// // Clean the value recursively
// const cleanValue = cleanupFormData(value);
// // Only include non-empty values
// if (cleanValue !== null &&
// cleanValue !== undefined &&
// cleanValue !== '' &&
// !(typeof cleanValue === 'object' && Object.keys(cleanValue).length === 0) &&
// !(Array.isArray(cleanValue) && cleanValue.length === 0)) {
// result[key] = cleanValue;
// hasValue = true;
// }
// }
// // If the object has no valid properties, return null to remove it
// return hasValue ? result : null;
// }
+5 -5
View File
@@ -9,7 +9,7 @@
let token = $state('');
// Clean and trim the value
const onPaste = (value: string) => value.replace(/[^0-9]/g, '').trim();
const pasteTransformer = (value: string) => value.replace(/[^0-9]/g, '').trim();
const onComplete = async () => {
const username = page.url.searchParams.get('username');
if (!username || !token) return;
@@ -31,7 +31,7 @@
e.preventDefault();
try {
const text = await navigator.clipboard.readText();
const cleaned = onPaste(text);
const cleaned = pasteTransformer(text);
token = cleaned.slice(0, 6); // Limit to max length
} catch (err) {
console.error('Failed to read clipboard:', err);
@@ -51,18 +51,18 @@
pattern={REGEXP_ONLY_DIGITS}
bind:value={token}
{onComplete}
{onPaste}
{pasteTransformer}
onkeydown={handleKeyDown}
>
{#snippet children({ cells })}
<InputOTP.Group>
{#each cells.slice(0, 3) as cell}
{#each cells.slice(0, 3) as cell (cell)}
<InputOTP.Slot {cell} />
{/each}
</InputOTP.Group>
<InputOTP.Separator />
<InputOTP.Group>
{#each cells.slice(3, 6) as cell}
{#each cells.slice(3, 6) as cell (cell)}
<InputOTP.Slot {cell} />
{/each}
</InputOTP.Group>
+3 -1
View File
@@ -1,6 +1,6 @@
<script lang="ts">
import ColumnBadge from '$lib/components/tables/ColumnBadge.svelte';
import DataTable, { type BulkAction } from '$lib/components/tables/DataTable.svelte';
import DataTable from '$lib/components/tables/DataTable.svelte';
import MiddlewareModal from '$lib/components/modals/middleware.svelte';
import TableActions from '$lib/components/tables/TableActions.svelte';
import type { ColumnDef } from '@tanstack/table-core';
@@ -12,6 +12,7 @@
import { toast } from 'svelte-sonner';
import { source } from '$lib/stores/source';
import { profile } from '$lib/stores/profile';
import type { BulkAction } from '$lib/components/tables/types';
interface ModalState {
isOpen: boolean;
@@ -146,6 +147,7 @@
const mwBulkActions: BulkAction<Middleware>[] = [
{
type: 'button',
label: 'Delete',
icon: Trash,
variant: 'destructive',
+2 -1
View File
@@ -7,7 +7,6 @@
import type { Router, Service, TLS } from '$lib/types/router';
import { Pencil, Route, Trash } from 'lucide-svelte';
import { TraefikSource } from '$lib/types';
import type { BulkAction } from '$lib/components/tables/DataTable.svelte';
import { api, rdps, routerServiceMerge, type RouterWithService } from '$lib/api';
import { renderComponent } from '$lib/components/ui/data-table';
import { toast } from 'svelte-sonner';
@@ -15,6 +14,7 @@
import { onMount } from 'svelte';
import ColumnRule from '$lib/components/tables/ColumnRule.svelte';
import { profile } from '$lib/stores/profile';
import type { BulkAction } from '$lib/components/tables/types';
interface ModalState {
isOpen: boolean;
@@ -289,6 +289,7 @@
const routerBulkActions: BulkAction<RouterWithService>[] = [
{
type: 'button',
label: 'Delete',
icon: Trash,
variant: 'destructive',
+2 -2
View File
@@ -179,7 +179,7 @@
<Separator />
</Card.Header>
<Card.Content class="flex flex-col gap-6">
{#each Object.entries($settings) as [key, setting]}
{#each Object.entries($settings) as [key, setting] (key)}
<div class="flex flex-col justify-start gap-4 sm:flex-row sm:justify-between">
<Label>
{formatSettingName(key)}
@@ -255,7 +255,7 @@
</Dialog.Description>
</Dialog.Header>
<div class="flex flex-col gap-2">
{#each $backups || [] as backup}
{#each $backups || [] as backup (backup.name)}
<div class="flex items-center justify-between font-mono text-sm">
<Button variant="link" onclick={() => api.downloadBackupByName(backup.name)}>
Backup: