mirror of
https://github.com/MizuchiLabs/mantrae.git
synced 2026-05-08 00:49:49 -05:00
fix: various small frontend issues
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
@@ -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"
|
||||
},
|
||||
|
||||
Generated
+201
-201
@@ -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:
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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`, {
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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 -->
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
// }
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user