diff --git a/.gitignore b/.gitignore index 0accd35..7d424d4 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,12 @@ coverage/ /cmd/core/bin/ /coverage.txt /bin/core + +# lthn-desktop build artifacts +cmd/lthn-desktop/build/bin/ +cmd/lthn-desktop/frontend/dist/ +cmd/lthn-desktop/frontend.old/dist/ + +# core-demo build artifacts +cmd/core-demo/build/bin/ +cmd/core-demo/public/dist/ diff --git a/Taskfile.yml b/Taskfile.yml index f35896f..3e541fb 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -1,8 +1,10 @@ version: '3' includes: - gui: ./cmd/core-gui/Taskfile.yml + gui: ./cmd/lthn-desktop/Taskfile.yml cli: ./cmd/core/Taskfile.yml + demo: ./cmd/core-demo/Taskfile.yml + ide: ./cmd/core-gui/Taskfile.yml tasks: test: diff --git a/cmd/core-demo/Taskfile.yml b/cmd/core-demo/Taskfile.yml new file mode 100644 index 0000000..942bddf --- /dev/null +++ b/cmd/core-demo/Taskfile.yml @@ -0,0 +1,42 @@ +version: '3' + +includes: + common: "./build/Taskfile.yml" + windows: "./build/windows/Taskfile.yml" + darwin: "./build/darwin/Taskfile.yml" + linux: "./build/linux/Taskfile.yml" + +vars: + APP_NAME: "core-demo" + BIN_DIR: "./build/bin" + VITE_PORT: '{{.WAILS_VITE_PORT | default 9245}}' + +tasks: + build: + summary: Builds the application + cmds: + - task: "{{OS}}:build" + + package: + summary: Packages a production build of the application + cmds: + - task: "{{OS}}:package" + + run: + summary: Runs the application + cmds: + - task: "{{OS}}:run" + + # This is the main dev task called by the Makefile. + # It delegates to the actual wails command below. + dev: + summary: Runs the application in development mode + cmds: + - task: dev:wails + + # This task contains the real wails dev command. + # This avoids the recursive loop and provides a clear target. + dev:wails: + internal: true + cmds: + - wails3 dev -config ./build/config.yml -port {{.VITE_PORT}} diff --git a/cmd/core-demo/apps/mining.itw3.json b/cmd/core-demo/apps/mining.itw3.json new file mode 100644 index 0000000..2bcbabb --- /dev/null +++ b/cmd/core-demo/apps/mining.itw3.json @@ -0,0 +1,50 @@ +{ + "code": "mining", + "type": "app", + "name": "Mining Module", + "version": "0.1.0", + "namespace": "mining", + "description": "Cryptocurrency mining management", + "author": "Lethean", + "contexts": ["miner", "default"], + "menu": [ + { + "id": "mining", + "label": "Mining", + "order": 200, + "contexts": ["miner"], + "children": [ + {"id": "mining-dashboard", "label": "Dashboard", "route": "/mining/dashboard", "order": 1}, + {"id": "mining-pools", "label": "Pools", "route": "/mining/pools", "order": 2}, + {"id": "mining-sep1", "separator": true, "order": 3}, + {"id": "mining-start", "label": "Start Mining", "action": "mining:start", "order": 4}, + {"id": "mining-stop", "label": "Stop Mining", "action": "mining:stop", "order": 5} + ] + } + ], + "routes": [ + {"path": "/mining/dashboard", "component": "mining-dashboard", "title": "Mining Dashboard", "contexts": ["miner"]}, + {"path": "/mining/pools", "component": "mining-pools", "title": "Mining Pools", "contexts": ["miner"]} + ], + "api": [ + {"method": "GET", "path": "/status", "description": "Get mining status"}, + {"method": "POST", "path": "/start", "description": "Start mining"}, + {"method": "POST", "path": "/stop", "description": "Stop mining"}, + {"method": "GET", "path": "/pools", "description": "List configured pools"} + ], + "downloads": { + "x86_64": { + "darwin": {"url": "https://releases.example.com/mining/darwin-x86_64.tar.gz"}, + "linux": {"url": "https://releases.example.com/mining/linux-x86_64.tar.gz"}, + "windows": {"url": "https://releases.example.com/mining/windows-x86_64.zip"} + }, + "aarch64": { + "darwin": {"url": "https://releases.example.com/mining/darwin-aarch64.tar.gz"} + } + }, + "config": { + "defaultPool": "", + "threads": 0, + "intensity": 50 + } +} diff --git a/cmd/core-demo/claude_bridge.go b/cmd/core-demo/claude_bridge.go new file mode 100644 index 0000000..8ecc368 --- /dev/null +++ b/cmd/core-demo/claude_bridge.go @@ -0,0 +1,157 @@ +package main + +import ( + "encoding/json" + "log" + "net/http" + "sync" + "time" + + "github.com/gorilla/websocket" +) + +var wsUpgrader = websocket.Upgrader{ + ReadBufferSize: 1024, + WriteBufferSize: 1024, + CheckOrigin: func(r *http.Request) bool { + return true + }, +} + +// ClaudeBridge forwards messages between GUI clients and the MCP core WebSocket. +type ClaudeBridge struct { + mcpConn *websocket.Conn + mcpURL string + clients map[*websocket.Conn]bool + clientsMu sync.RWMutex + broadcast chan []byte + reconnectMu sync.Mutex +} + +// NewClaudeBridge creates a new bridge to the MCP core WebSocket. +func NewClaudeBridge(mcpURL string) *ClaudeBridge { + return &ClaudeBridge{ + mcpURL: mcpURL, + clients: make(map[*websocket.Conn]bool), + broadcast: make(chan []byte, 256), + } +} + +// Start connects to the MCP WebSocket and starts the bridge. +func (cb *ClaudeBridge) Start() { + go cb.connectToMCP() + go cb.broadcastLoop() +} + +// connectToMCP establishes connection to the MCP core WebSocket. +func (cb *ClaudeBridge) connectToMCP() { + for { + cb.reconnectMu.Lock() + if cb.mcpConn != nil { + cb.mcpConn.Close() + } + + log.Printf("Claude bridge connecting to MCP at %s", cb.mcpURL) + conn, _, err := websocket.DefaultDialer.Dial(cb.mcpURL, nil) + if err != nil { + log.Printf("Claude bridge failed to connect to MCP: %v", err) + cb.reconnectMu.Unlock() + time.Sleep(5 * time.Second) + continue + } + + cb.mcpConn = conn + cb.reconnectMu.Unlock() + log.Printf("Claude bridge connected to MCP") + + // Read messages from MCP and broadcast to clients + for { + _, message, err := conn.ReadMessage() + if err != nil { + log.Printf("Claude bridge MCP read error: %v", err) + break + } + cb.broadcast <- message + } + + // Connection lost, retry + time.Sleep(2 * time.Second) + } +} + +// broadcastLoop sends messages from MCP to all connected clients. +func (cb *ClaudeBridge) broadcastLoop() { + for message := range cb.broadcast { + cb.clientsMu.RLock() + for client := range cb.clients { + err := client.WriteMessage(websocket.TextMessage, message) + if err != nil { + log.Printf("Claude bridge client write error: %v", err) + } + } + cb.clientsMu.RUnlock() + } +} + +// HandleWebSocket handles WebSocket connections from GUI clients. +func (cb *ClaudeBridge) HandleWebSocket(w http.ResponseWriter, r *http.Request) { + conn, err := wsUpgrader.Upgrade(w, r, nil) + if err != nil { + log.Printf("Claude bridge upgrade error: %v", err) + return + } + + cb.clientsMu.Lock() + cb.clients[conn] = true + cb.clientsMu.Unlock() + + // Send connected message + connMsg, _ := json.Marshal(map[string]any{ + "type": "system", + "data": "Connected to Claude bridge", + "timestamp": time.Now(), + }) + conn.WriteMessage(websocket.TextMessage, connMsg) + + defer func() { + cb.clientsMu.Lock() + delete(cb.clients, conn) + cb.clientsMu.Unlock() + conn.Close() + }() + + // Read messages from client and forward to MCP + for { + _, message, err := conn.ReadMessage() + if err != nil { + break + } + + // Parse the message to check type + var msg map[string]any + if err := json.Unmarshal(message, &msg); err != nil { + continue + } + + // Forward claude_message to MCP + if msgType, ok := msg["type"].(string); ok && msgType == "claude_message" { + cb.sendToMCP(message) + } + } +} + +// sendToMCP sends a message to the MCP WebSocket. +func (cb *ClaudeBridge) sendToMCP(message []byte) { + cb.reconnectMu.Lock() + defer cb.reconnectMu.Unlock() + + if cb.mcpConn == nil { + log.Printf("Claude bridge: MCP not connected") + return + } + + err := cb.mcpConn.WriteMessage(websocket.TextMessage, message) + if err != nil { + log.Printf("Claude bridge MCP write error: %v", err) + } +} diff --git a/cmd/core-demo/go.mod b/cmd/core-demo/go.mod new file mode 100644 index 0000000..330c540 --- /dev/null +++ b/cmd/core-demo/go.mod @@ -0,0 +1,120 @@ +module core-gui + +go 1.25.5 + +require ( + github.com/Snider/Core v0.0.0-00010101000000-000000000000 + github.com/Snider/Core/pkg/display v0.0.0 + github.com/Snider/Core/pkg/mcp v0.0.0-00010101000000-000000000000 + github.com/Snider/Core/pkg/webview v0.0.0-00010101000000-000000000000 + github.com/Snider/Core/pkg/ws v0.0.0-00010101000000-000000000000 + github.com/gorilla/websocket v1.5.3 + github.com/wailsapp/wails/v3 v3.0.0-alpha.41 +) + +replace ( + github.com/Snider/Core => ../../ + github.com/Snider/Core/pkg/config => ../../pkg/config + github.com/Snider/Core/pkg/core => ../../pkg/core + github.com/Snider/Core/pkg/crypt => ../../pkg/crypt + github.com/Snider/Core/pkg/display => ../../pkg/display + github.com/Snider/Core/pkg/docs => ../../pkg/docs + github.com/Snider/Core/pkg/help => ../../pkg/help + github.com/Snider/Core/pkg/i18n => ../../pkg/i18n + github.com/Snider/Core/pkg/ide => ../../pkg/ide + github.com/Snider/Core/pkg/io => ../../pkg/io + github.com/Snider/Core/pkg/mcp => ../../pkg/mcp + github.com/Snider/Core/pkg/module => ../../pkg/module + github.com/Snider/Core/pkg/plugin => ../../pkg/plugin + github.com/Snider/Core/pkg/process => ../../pkg/process + github.com/Snider/Core/pkg/runtime => ../../pkg/runtime + github.com/Snider/Core/pkg/webview => ../../pkg/webview + github.com/Snider/Core/pkg/workspace => ../../pkg/workspace + github.com/Snider/Core/pkg/ws => ../../pkg/ws +) + +require ( + dario.cat/mergo v1.0.2 // indirect + git.sr.ht/~jackmordaunt/go-toast/v2 v2.0.3 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/ProtonMail/go-crypto v1.3.0 // indirect + github.com/Snider/Core/pkg/config v0.0.0-00010101000000-000000000000 // indirect + github.com/Snider/Core/pkg/core v0.0.0 // indirect + github.com/Snider/Core/pkg/docs v0.0.0-00010101000000-000000000000 // indirect + github.com/Snider/Core/pkg/help v0.0.0-00010101000000-000000000000 // indirect + github.com/Snider/Core/pkg/i18n v0.0.0-00010101000000-000000000000 // indirect + github.com/Snider/Core/pkg/ide v0.0.0-00010101000000-000000000000 // indirect + github.com/Snider/Core/pkg/module v0.0.0-00010101000000-000000000000 // indirect + github.com/Snider/Core/pkg/process v0.0.0-00010101000000-000000000000 // indirect + github.com/Snider/Enchantrix v0.0.2 // indirect + github.com/adrg/xdg v0.5.3 // indirect + github.com/bep/debounce v1.2.1 // indirect + github.com/bytedance/sonic v1.14.0 // indirect + github.com/bytedance/sonic/loader v0.3.0 // indirect + github.com/cloudflare/circl v1.6.1 // indirect + github.com/cloudwego/base64x v0.1.6 // indirect + github.com/cyphar/filepath-securejoin v0.6.1 // indirect + github.com/ebitengine/purego v0.9.1 // indirect + github.com/emirpasic/gods v1.18.1 // indirect + github.com/gabriel-vasile/mimetype v1.4.8 // indirect + github.com/gin-contrib/sse v1.1.0 // indirect + github.com/gin-gonic/gin v1.11.0 // indirect + github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect + github.com/go-git/go-billy/v5 v5.6.2 // indirect + github.com/go-git/go-git/v5 v5.16.4 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.27.0 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/goccy/go-yaml v1.18.0 // indirect + github.com/godbus/dbus/v5 v5.2.0 // indirect + github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect + github.com/google/jsonschema-go v0.3.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/jchv/go-winloader v0.0.0-20250406163304-c1995be93bd1 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/kevinburke/ssh_config v1.4.0 // indirect + github.com/klauspost/cpuid/v2 v2.3.0 // indirect + github.com/leaanthony/go-ansi-parser v1.6.1 // indirect + github.com/leaanthony/u v1.1.1 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/lmittmann/tint v1.1.2 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/modelcontextprotocol/go-sdk v1.2.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/nicksnyder/go-i18n/v2 v2.6.1 // indirect + github.com/pelletier/go-toml/v2 v2.2.4 // indirect + github.com/pjbgf/sha1cd v0.5.0 // indirect + github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/quic-go/qpack v0.5.1 // indirect + github.com/quic-go/quic-go v0.54.0 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/samber/lo v1.52.0 // indirect + github.com/sergi/go-diff v1.4.0 // indirect + github.com/skeema/knownhosts v1.3.2 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.3.0 // indirect + github.com/wailsapp/go-webview2 v1.0.23 // indirect + github.com/wailsapp/mimetype v1.4.1 // indirect + github.com/xanzy/ssh-agent v0.3.3 // indirect + github.com/yosida95/uritemplate/v3 v3.0.2 // indirect + go.uber.org/mock v0.5.0 // indirect + golang.org/x/arch v0.20.0 // indirect + golang.org/x/crypto v0.45.0 // indirect + golang.org/x/mod v0.30.0 // indirect + golang.org/x/net v0.47.0 // indirect + golang.org/x/oauth2 v0.33.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/text v0.32.0 // indirect + golang.org/x/tools v0.39.0 // indirect + google.golang.org/protobuf v1.36.9 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect +) diff --git a/cmd/core-demo/go.sum b/cmd/core-demo/go.sum new file mode 100644 index 0000000..222660a --- /dev/null +++ b/cmd/core-demo/go.sum @@ -0,0 +1,235 @@ +dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= +dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= +git.sr.ht/~jackmordaunt/go-toast/v2 v2.0.3 h1:N3IGoHHp9pb6mj1cbXbuaSXV/UMKwmbKLf53nQmtqMA= +git.sr.ht/~jackmordaunt/go-toast/v2 v2.0.3/go.mod h1:QtOLZGz8olr4qH2vWK0QH0w0O4T9fEIjMuWpKUsH7nc= +github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= +github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw= +github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE= +github.com/Snider/Enchantrix v0.0.2 h1:ExZQiBhfS/p/AHFTKhY80TOd+BXZjK95EzByAEgwvjs= +github.com/Snider/Enchantrix v0.0.2/go.mod h1:CtFcLAvnDT1KcuF1JBb/DJj0KplY8jHryO06KzQ1hsQ= +github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78= +github.com/adrg/xdg v0.5.3/go.mod h1:nlTsY+NNiCBGCK2tpm09vRqfVzrc2fLmXGpBLF0zlTQ= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= +github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= +github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ= +github.com/bytedance/sonic v1.14.0/go.mod h1:WoEbx8WTcFJfzCe0hbmyTGrfjt8PzNEBdxlNUO24NhA= +github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA= +github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= +github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= +github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= +github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= +github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= +github.com/cyphar/filepath-securejoin v0.6.1 h1:5CeZ1jPXEiYt3+Z6zqprSAgSWiggmpVyciv8syjIpVE= +github.com/cyphar/filepath-securejoin v0.6.1/go.mod h1:A8hd4EnAeyujCJRrICiOWqjS1AX0a9kM5XL+NwKoYSc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/ebitengine/purego v0.9.1 h1:a/k2f2HQU3Pi399RPW1MOaZyhKJL9w/xFpKAg4q1s0A= +github.com/ebitengine/purego v0.9.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o= +github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= +github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= +github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w= +github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM= +github.com/gin-gonic/gin v1.11.0 h1:OW/6PLjyusp2PPXtyxKHU0RbX6I/l28FTdDlae5ueWk= +github.com/gin-gonic/gin v1.11.0/go.mod h1:+iq/FyxlGzII0KHiBGjuNn4UNENUlKbGlNmc+W50Dls= +github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= +github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= +github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= +github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= +github.com/go-git/go-git/v5 v5.16.4 h1:7ajIEZHZJULcyJebDLo99bGgS0jRrOxzZG4uCk2Yb2Y= +github.com/go-git/go-git/v5 v5.16.4/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHOvC0/uWoy2Fzwn4= +github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= +github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= +github.com/godbus/dbus/v5 v5.2.0 h1:3WexO+U+yg9T70v9FdHr9kCxYlazaAXUhx2VMkbfax8= +github.com/godbus/dbus/v5 v5.2.0/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c= +github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= +github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/jsonschema-go v0.3.0 h1:6AH2TxVNtk3IlvkkhjrtbUc4S8AvO0Xii0DxIygDg+Q= +github.com/google/jsonschema-go v0.3.0/go.mod h1:r5quNTdLOYEz95Ru18zA0ydNbBuYoo9tgaYcxEYhJVE= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jchv/go-winloader v0.0.0-20250406163304-c1995be93bd1 h1:njuLRcjAuMKr7kI3D85AXWkw6/+v9PwtV6M6o11sWHQ= +github.com/jchv/go-winloader v0.0.0-20250406163304-c1995be93bd1/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kevinburke/ssh_config v1.4.0 h1:6xxtP5bZ2E4NF5tuQulISpTO2z8XbtH8cg1PWkxoFkQ= +github.com/kevinburke/ssh_config v1.4.0/go.mod h1:q2RIzfka+BXARoNexmF9gkxEX7DmvbW9P4hIVx2Kg4M= +github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= +github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leaanthony/go-ansi-parser v1.6.1 h1:xd8bzARK3dErqkPFtoF9F3/HgN8UQk0ed1YDKpEz01A= +github.com/leaanthony/go-ansi-parser v1.6.1/go.mod h1:+vva/2y4alzVmmIEpk9QDhA7vLC5zKDTRwfZGOp3IWU= +github.com/leaanthony/u v1.1.1 h1:TUFjwDGlNX+WuwVEzDqQwC2lOv0P4uhTQw7CMFdiK7M= +github.com/leaanthony/u v1.1.1/go.mod h1:9+o6hejoRljvZ3BzdYlVL0JYCwtnAsVuN9pVTQcaRfI= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/lmittmann/tint v1.1.2 h1:2CQzrL6rslrsyjqLDwD11bZ5OpLBPU+g3G/r5LSfS8w= +github.com/lmittmann/tint v1.1.2/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ= +github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/modelcontextprotocol/go-sdk v1.2.0 h1:Y23co09300CEk8iZ/tMxIX1dVmKZkzoSBZOpJwUnc/s= +github.com/modelcontextprotocol/go-sdk v1.2.0/go.mod h1:6fM3LCm3yV7pAs8isnKLn07oKtB0MP9LHd3DfAcKw10= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/nicksnyder/go-i18n/v2 v2.6.1 h1:JDEJraFsQE17Dut9HFDHzCoAWGEQJom5s0TRd17NIEQ= +github.com/nicksnyder/go-i18n/v2 v2.6.1/go.mod h1:Vee0/9RD3Quc/NmwEjzzD7VTZ+Ir7QbXocrkhOzmUKA= +github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= +github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= +github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= +github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/pjbgf/sha1cd v0.5.0 h1:a+UkboSi1znleCDUNT3M5YxjOnN1fz2FhN48FlwCxs0= +github.com/pjbgf/sha1cd v0.5.0/go.mod h1:lhpGlyHLpQZoxMv8HcgXvZEhcGs0PG/vsZnEJ7H0iCM= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= +github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= +github.com/quic-go/quic-go v0.54.0 h1:6s1YB9QotYI6Ospeiguknbp2Znb/jZYjZLRXn9kMQBg= +github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/samber/lo v1.52.0 h1:Rvi+3BFHES3A8meP33VPAxiBZX/Aws5RxrschYGjomw= +github.com/samber/lo v1.52.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= +github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw= +github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/skeema/knownhosts v1.3.2 h1:EDL9mgf4NzwMXCTfaxSD/o/a5fxDw/xL9nkU28JjdBg= +github.com/skeema/knownhosts v1.3.2/go.mod h1:bEg3iQAuw+jyiw+484wwFJoKSLwcfd7fqRy+N0QTiow= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA= +github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4= +github.com/wailsapp/go-webview2 v1.0.23 h1:jmv8qhz1lHibCc79bMM/a/FqOnnzOGEisLav+a0b9P0= +github.com/wailsapp/go-webview2 v1.0.23/go.mod h1:qJmWAmAmaniuKGZPWwne+uor3AHMB5PFhqiK0Bbj8kc= +github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs= +github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o= +github.com/wailsapp/wails/v3 v3.0.0-alpha.41 h1:DYcC1/vtO862sxnoyCOMfLLypbzpFWI257fR6zDYY+Y= +github.com/wailsapp/wails/v3 v3.0.0-alpha.41/go.mod h1:7i8tSuA74q97zZ5qEJlcVZdnO+IR7LT2KU8UpzYMPsw= +github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= +github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= +github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4= +github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4= +go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= +go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/arch v0.20.0 h1:dx1zTU0MAE98U+TQ8BLl7XsJbgze2WnNKF/8tGp/Q6c= +golang.org/x/arch v0.20.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= +golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac h1:l5+whBCLH3iH2ZNHYLbAe58bo7yrN4mVcnkHDYz5vvs= +golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac/go.mod h1:hH+7mtFmImwwcMvScyxUhjuVHR3HGaDPMn9rMSUUbxo= +golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= +golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= +golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/oauth2 v0.33.0 h1:4Q+qn+E5z8gPRJfmRy7C2gGG3T4jIprK6aSYgTXGRpo= +golang.org/x/oauth2 v0.33.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= +golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= +golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= +google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= +google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/cmd/core-demo/main.go b/cmd/core-demo/main.go new file mode 100644 index 0000000..941fb3f --- /dev/null +++ b/cmd/core-demo/main.go @@ -0,0 +1,73 @@ +package main + +import ( + "embed" + "io/fs" + "log" + + core "github.com/Snider/Core" + "github.com/wailsapp/wails/v3/pkg/application" + "github.com/wailsapp/wails/v3/pkg/services/notifications" +) + +//go:embed all:frontend/dist/frontend/browser +var assets embed.FS + +// Default MCP port for the embedded server +const mcpPort = 9877 + +func main() { + // Create the Core runtime with plugin support + rt, err := core.NewRuntime() + if err != nil { + log.Fatal(err) + } + + // Create the notifications service for native system notifications + notifier := notifications.New() + + // Wire the notifier to the display service for native notifications + rt.Display.SetNotifier(notifier) + + // Create the MCP bridge for Claude Code integration + // This provides WebView access, console capture, window control, and process management + mcpBridge := NewMCPBridge(mcpPort, rt.Display) + + // Collect all services including plugins + // Display service registered separately so Wails calls its Startup() for tray/window + services := []application.Service{ + application.NewService(rt.Runtime), + application.NewService(rt.Display), + application.NewService(notifier), // Native notifications + application.NewService(rt.Docs), + application.NewService(rt.Config), + application.NewService(rt.I18n), + application.NewService(rt.Help), + application.NewService(rt.Crypt), + application.NewService(rt.IDE), + application.NewService(rt.Module), + application.NewService(rt.Workspace), + application.NewService(mcpBridge), // MCP Bridge for Claude Code + } + services = append(services, rt.PluginServices()...) + + // Strip the embed path prefix so files are served from root + staticAssets, err := fs.Sub(assets, "frontend/dist/frontend/browser") + if err != nil { + log.Fatal(err) + } + + app := application.New(application.Options{ + Services: services, + Assets: application.AssetOptions{ + Handler: application.AssetFileServerFS(staticAssets), + }, + }) + + log.Printf("Starting Core GUI with MCP server on port %d", mcpPort) + + err = app.Run() + if err != nil { + log.Fatal(err) + } +} diff --git a/cmd/core-demo/mcp_bridge.go b/cmd/core-demo/mcp_bridge.go new file mode 100644 index 0000000..e8fe4ca --- /dev/null +++ b/cmd/core-demo/mcp_bridge.go @@ -0,0 +1,1135 @@ +package main + +import ( + "context" + "encoding/base64" + "encoding/json" + "fmt" + "log" + "net/http" + "sync" + + "github.com/Snider/Core/pkg/display" + "github.com/Snider/Core/pkg/mcp" + "github.com/Snider/Core/pkg/webview" + "github.com/Snider/Core/pkg/ws" + "github.com/wailsapp/wails/v3/pkg/application" +) + +// MCPBridge wires together MCP, WebView, Display and WebSocket services +// and starts the MCP HTTP server after Wails initializes. +type MCPBridge struct { + mcpService *mcp.Service + webview *webview.Service + display *display.Service + wsHub *ws.Hub + claudeBridge *ClaudeBridge + app *application.App + port int + running bool + mu sync.Mutex +} + +// NewMCPBridge creates a new MCP bridge with all services wired up. +func NewMCPBridge(port int, displaySvc *display.Service) *MCPBridge { + wv := webview.New() + hub := ws.NewHub() + mcpSvc := mcp.NewStandaloneWithPort(port) + mcpSvc.SetWebView(wv) + mcpSvc.SetDisplay(displaySvc) + + // Create Claude bridge to forward messages to MCP core on port 9876 + claudeBridge := NewClaudeBridge("ws://localhost:9876/ws") + + return &MCPBridge{ + mcpService: mcpSvc, + webview: wv, + display: displaySvc, + wsHub: hub, + claudeBridge: claudeBridge, + port: port, + } +} + +// ServiceStartup is called by Wails when the app starts. +// This wires up the app reference and starts the HTTP server. +func (b *MCPBridge) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { + b.mu.Lock() + defer b.mu.Unlock() + + // Get the Wails app reference + b.app = application.Get() + if b.app == nil { + return fmt.Errorf("failed to get Wails app reference") + } + + // Wire up the WebView service with the app + b.webview.SetApp(b.app) + + // Set up console listener + b.webview.SetupConsoleListener() + + // Inject console capture into all windows after a short delay + // (windows may not be created yet) + go b.injectConsoleCapture() + + // Start the HTTP server for MCP + go b.startHTTPServer() + + log.Printf("MCP Bridge started on port %d", b.port) + return nil +} + +// injectConsoleCapture injects the console capture script into windows. +func (b *MCPBridge) injectConsoleCapture() { + // Wait a bit for windows to be created + // In production, you'd use events to detect window creation + windows := b.webview.ListWindows() + for _, w := range windows { + if err := b.webview.InjectConsoleCapture(w.Name); err != nil { + log.Printf("Failed to inject console capture in %s: %v", w.Name, err) + } + } +} + +// startHTTPServer starts the HTTP server for MCP and WebSocket. +func (b *MCPBridge) startHTTPServer() { + b.running = true + + // Start the WebSocket hub + hubCtx := context.Background() + go b.wsHub.Run(hubCtx) + + // Claude bridge disabled - port 9876 is not an MCP WebSocket server + // b.claudeBridge.Start() + + mux := http.NewServeMux() + + // WebSocket endpoint for GUI clients + mux.HandleFunc("/ws", b.wsHub.HandleWebSocket) + + // WebSocket endpoint for real-time display events + mux.HandleFunc("/events", b.handleEventsWebSocket) + + // MCP info endpoint + mux.HandleFunc("/mcp", b.handleMCPInfo) + + // MCP tools endpoint (simple HTTP for now, SSE later) + mux.HandleFunc("/mcp/tools", b.handleMCPTools) + mux.HandleFunc("/mcp/call", b.handleMCPCall) + + // Health check + mux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(map[string]any{ + "status": "ok", + "mcp": true, + "webview": b.webview != nil, + "display": b.display != nil, + }) + }) + + addr := fmt.Sprintf(":%d", b.port) + log.Printf("MCP HTTP server listening on %s", addr) + + if err := http.ListenAndServe(addr, mux); err != nil { + log.Printf("MCP HTTP server error: %v", err) + } +} + +// handleMCPInfo returns MCP server information. +func (b *MCPBridge) handleMCPInfo(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.Header().Set("Access-Control-Allow-Origin", "*") + + info := map[string]any{ + "name": "core", + "version": "0.1.0", + "capabilities": map[string]any{ + "webview": true, + "display": b.display != nil, + "windowControl": b.display != nil, + "screenControl": b.display != nil, + "websocket": fmt.Sprintf("ws://localhost:%d/ws", b.port), + "events": fmt.Sprintf("ws://localhost:%d/events", b.port), + }, + } + json.NewEncoder(w).Encode(info) +} + +// handleMCPTools returns the list of available tools. +func (b *MCPBridge) handleMCPTools(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.Header().Set("Access-Control-Allow-Origin", "*") + + // Return tool list - grouped by category + tools := []map[string]string{ + // File operations + {"name": "file_read", "description": "Read the contents of a file"}, + {"name": "file_write", "description": "Write content to a file"}, + {"name": "file_edit", "description": "Edit a file by replacing text"}, + {"name": "file_delete", "description": "Delete a file"}, + {"name": "file_exists", "description": "Check if file exists"}, + {"name": "file_rename", "description": "Rename or move a file"}, + {"name": "dir_list", "description": "List directory contents"}, + {"name": "dir_create", "description": "Create a directory"}, + {"name": "lang_detect", "description": "Detect file language"}, + {"name": "lang_list", "description": "List supported languages"}, + // Process management + {"name": "process_start", "description": "Start a process"}, + {"name": "process_stop", "description": "Stop a process"}, + {"name": "process_kill", "description": "Kill a process"}, + {"name": "process_list", "description": "List processes"}, + {"name": "process_output", "description": "Get process output"}, + {"name": "process_input", "description": "Send input to process"}, + // WebSocket streaming + {"name": "ws_start", "description": "Start WebSocket server"}, + {"name": "ws_info", "description": "Get WebSocket info"}, + // WebView interaction (JS runtime, console, DOM) + {"name": "webview_list", "description": "List windows"}, + {"name": "webview_eval", "description": "Execute JavaScript"}, + {"name": "webview_console", "description": "Get console messages"}, + {"name": "webview_console_clear", "description": "Clear console buffer"}, + {"name": "webview_click", "description": "Click element"}, + {"name": "webview_type", "description": "Type into element"}, + {"name": "webview_query", "description": "Query DOM elements"}, + {"name": "webview_navigate", "description": "Navigate to URL"}, + {"name": "webview_source", "description": "Get page source"}, + {"name": "webview_url", "description": "Get current page URL"}, + {"name": "webview_title", "description": "Get current page title"}, + {"name": "webview_screenshot", "description": "Capture page as base64 PNG"}, + {"name": "webview_screenshot_element", "description": "Capture specific element as PNG"}, + {"name": "webview_scroll", "description": "Scroll to element or position"}, + {"name": "webview_hover", "description": "Hover over element"}, + {"name": "webview_select", "description": "Select option in dropdown"}, + {"name": "webview_check", "description": "Check/uncheck checkbox or radio"}, + {"name": "webview_element_info", "description": "Get detailed info about element"}, + {"name": "webview_computed_style", "description": "Get computed styles for element"}, + {"name": "webview_highlight", "description": "Visually highlight element"}, + {"name": "webview_dom_tree", "description": "Get DOM tree structure"}, + {"name": "webview_errors", "description": "Get captured error messages"}, + {"name": "webview_performance", "description": "Get performance metrics"}, + {"name": "webview_resources", "description": "List loaded resources"}, + {"name": "webview_network", "description": "Get network requests log"}, + {"name": "webview_network_clear", "description": "Clear network request log"}, + {"name": "webview_network_inject", "description": "Inject network interceptor for detailed logging"}, + {"name": "webview_pdf", "description": "Export page as PDF (base64 data URI)"}, + {"name": "webview_print", "description": "Open print dialog for window"}, + // Window/Display control (native app control) + {"name": "window_list", "description": "List all windows with positions"}, + {"name": "window_get", "description": "Get info about a specific window"}, + {"name": "window_create", "description": "Create a new window at specific position"}, + {"name": "window_close", "description": "Close a window by name"}, + {"name": "window_position", "description": "Move a window to specific coordinates"}, + {"name": "window_size", "description": "Resize a window"}, + {"name": "window_bounds", "description": "Set position and size in one call"}, + {"name": "window_maximize", "description": "Maximize a window"}, + {"name": "window_minimize", "description": "Minimize a window"}, + {"name": "window_restore", "description": "Restore from maximized/minimized"}, + {"name": "window_focus", "description": "Bring window to front"}, + {"name": "window_focused", "description": "Get currently focused window"}, + {"name": "window_visibility", "description": "Show or hide a window"}, + {"name": "window_always_on_top", "description": "Pin window above others"}, + {"name": "window_title", "description": "Change window title"}, + {"name": "window_title_get", "description": "Get current window title"}, + {"name": "window_fullscreen", "description": "Toggle fullscreen mode"}, + {"name": "screen_list", "description": "List all screens/monitors"}, + {"name": "screen_get", "description": "Get specific screen by ID"}, + {"name": "screen_primary", "description": "Get primary screen info"}, + {"name": "screen_at_point", "description": "Get screen containing a point"}, + {"name": "screen_for_window", "description": "Get screen a window is on"}, + {"name": "screen_work_areas", "description": "Get usable screen space (excluding dock/menubar)"}, + // Layout management + {"name": "layout_save", "description": "Save current window arrangement with a name"}, + {"name": "layout_restore", "description": "Restore a saved layout by name"}, + {"name": "layout_list", "description": "List all saved layouts"}, + {"name": "layout_delete", "description": "Delete a saved layout"}, + {"name": "layout_get", "description": "Get details of a specific layout"}, + {"name": "layout_tile", "description": "Auto-tile windows (left/right/grid/quadrants)"}, + {"name": "layout_snap", "description": "Snap window to screen edge/corner"}, + {"name": "layout_stack", "description": "Stack windows in cascade pattern"}, + {"name": "layout_workflow", "description": "Apply preset workflow layout (coding/debugging/presenting)"}, + // System tray + {"name": "tray_set_icon", "description": "Set system tray icon"}, + {"name": "tray_set_tooltip", "description": "Set system tray tooltip"}, + {"name": "tray_set_label", "description": "Set system tray label"}, + {"name": "tray_set_menu", "description": "Set system tray menu items"}, + {"name": "tray_info", "description": "Get system tray info"}, + // Window background colour (for transparency) + {"name": "window_background_colour", "description": "Set window background colour with alpha"}, + // System integration + {"name": "clipboard_read", "description": "Read text from system clipboard"}, + {"name": "clipboard_write", "description": "Write text to system clipboard"}, + {"name": "clipboard_has", "description": "Check if clipboard has content"}, + {"name": "clipboard_clear", "description": "Clear the clipboard"}, + {"name": "notification_show", "description": "Show native system notification"}, + {"name": "notification_permission_request", "description": "Request notification permission"}, + {"name": "notification_permission_check", "description": "Check notification permission status"}, + {"name": "theme_get", "description": "Get current system theme (dark/light)"}, + {"name": "theme_system", "description": "Get system theme preference"}, + {"name": "focus_set", "description": "Set focus to specific window"}, + // Dialogs + {"name": "dialog_open_file", "description": "Show file open dialog"}, + {"name": "dialog_save_file", "description": "Show file save dialog"}, + {"name": "dialog_open_directory", "description": "Show directory picker"}, + {"name": "dialog_confirm", "description": "Show confirmation dialog (yes/no)"}, + {"name": "dialog_prompt", "description": "Show input prompt dialog (not supported natively)"}, + // Event subscriptions (WebSocket) + {"name": "event_info", "description": "Get WebSocket event server info and connected clients"}, + } + json.NewEncoder(w).Encode(map[string]any{"tools": tools}) +} + +// handleMCPCall handles tool calls via HTTP POST. +// This provides a REST bridge for display/window tools. +func (b *MCPBridge) handleMCPCall(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS") + w.Header().Set("Access-Control-Allow-Headers", "Content-Type") + + if r.Method == "OPTIONS" { + w.WriteHeader(http.StatusOK) + return + } + + if r.Method != "POST" { + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + return + } + + var req struct { + Tool string `json:"tool"` + Params map[string]any `json:"params"` + } + + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + // Execute tools based on prefix + var result map[string]any + if len(req.Tool) > 8 && req.Tool[:8] == "webview_" { + result = b.executeWebviewTool(req.Tool, req.Params) + } else { + result = b.executeDisplayTool(req.Tool, req.Params) + } + json.NewEncoder(w).Encode(result) +} + +// executeDisplayTool handles window and screen tool execution. +func (b *MCPBridge) executeDisplayTool(tool string, params map[string]any) map[string]any { + if b.display == nil { + return map[string]any{"error": "display service not available"} + } + + switch tool { + case "window_list": + windows := b.display.ListWindowInfos() + return map[string]any{"windows": windows} + + case "window_get": + name, _ := params["name"].(string) + info, err := b.display.GetWindowInfo(name) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"window": info} + + case "window_position": + name, _ := params["name"].(string) + x, _ := params["x"].(float64) + y, _ := params["y"].(float64) + err := b.display.SetWindowPosition(name, int(x), int(y)) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "name": name, "x": int(x), "y": int(y)} + + case "window_size": + name, _ := params["name"].(string) + width, _ := params["width"].(float64) + height, _ := params["height"].(float64) + err := b.display.SetWindowSize(name, int(width), int(height)) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "name": name, "width": int(width), "height": int(height)} + + case "window_bounds": + name, _ := params["name"].(string) + x, _ := params["x"].(float64) + y, _ := params["y"].(float64) + width, _ := params["width"].(float64) + height, _ := params["height"].(float64) + err := b.display.SetWindowBounds(name, int(x), int(y), int(width), int(height)) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "name": name, "x": int(x), "y": int(y), "width": int(width), "height": int(height)} + + case "window_maximize": + name, _ := params["name"].(string) + err := b.display.MaximizeWindow(name) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "action": "maximize"} + + case "window_minimize": + name, _ := params["name"].(string) + err := b.display.MinimizeWindow(name) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "action": "minimize"} + + case "window_restore": + name, _ := params["name"].(string) + err := b.display.RestoreWindow(name) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "action": "restore"} + + case "window_focus": + name, _ := params["name"].(string) + err := b.display.FocusWindow(name) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "action": "focus"} + + case "screen_list": + screens := b.display.GetScreens() + return map[string]any{"screens": screens} + + case "screen_get": + id := getStringParam(params, "id") + screen, err := b.display.GetScreen(id) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"screen": screen} + + case "screen_primary": + screen, err := b.display.GetPrimaryScreen() + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"screen": screen} + + case "screen_at_point": + x := getIntParam(params, "x") + y := getIntParam(params, "y") + screen, err := b.display.GetScreenAtPoint(x, y) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"screen": screen} + + case "screen_for_window": + name := getStringParam(params, "name") + screen, err := b.display.GetScreenForWindow(name) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"screen": screen} + + case "window_create": + opts := display.CreateWindowOptions{ + Name: getStringParam(params, "name"), + Title: getStringParam(params, "title"), + URL: getStringParam(params, "url"), + X: getIntParam(params, "x"), + Y: getIntParam(params, "y"), + Width: getIntParam(params, "width"), + Height: getIntParam(params, "height"), + } + info, err := b.display.CreateWindow(opts) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "window": info} + + case "window_close": + name, _ := params["name"].(string) + err := b.display.CloseWindow(name) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "action": "close"} + + case "window_visibility": + name, _ := params["name"].(string) + visible, _ := params["visible"].(bool) + err := b.display.SetWindowVisibility(name, visible) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "visible": visible} + + case "window_always_on_top": + name, _ := params["name"].(string) + onTop, _ := params["onTop"].(bool) + err := b.display.SetWindowAlwaysOnTop(name, onTop) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "alwaysOnTop": onTop} + + case "window_title": + name, _ := params["name"].(string) + title, _ := params["title"].(string) + err := b.display.SetWindowTitle(name, title) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "title": title} + + case "window_title_get": + name := getStringParam(params, "name") + title, err := b.display.GetWindowTitle(name) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"title": title} + + case "window_fullscreen": + name, _ := params["name"].(string) + fullscreen, _ := params["fullscreen"].(bool) + err := b.display.SetWindowFullscreen(name, fullscreen) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "fullscreen": fullscreen} + + case "screen_work_areas": + areas := b.display.GetWorkAreas() + return map[string]any{"workAreas": areas} + + case "window_focused": + name := b.display.GetFocusedWindow() + return map[string]any{"focused": name} + + case "layout_save": + name, _ := params["name"].(string) + err := b.display.SaveLayout(name) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "name": name} + + case "layout_restore": + name, _ := params["name"].(string) + err := b.display.RestoreLayout(name) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "name": name} + + case "layout_list": + layouts := b.display.ListLayouts() + return map[string]any{"layouts": layouts} + + case "layout_delete": + name, _ := params["name"].(string) + err := b.display.DeleteLayout(name) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "name": name} + + case "layout_get": + name, _ := params["name"].(string) + layout := b.display.GetLayout(name) + if layout == nil { + return map[string]any{"error": "layout not found", "name": name} + } + return map[string]any{"layout": layout} + + case "layout_tile": + mode := getStringParam(params, "mode") + var windowNames []string + if names, ok := params["windows"].([]any); ok { + for _, n := range names { + if s, ok := n.(string); ok { + windowNames = append(windowNames, s) + } + } + } + err := b.display.TileWindows(display.TileMode(mode), windowNames) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "mode": mode} + + case "layout_snap": + name := getStringParam(params, "name") + position := getStringParam(params, "position") + err := b.display.SnapWindow(name, display.SnapPosition(position)) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "position": position} + + case "layout_stack": + var windowNames []string + if names, ok := params["windows"].([]any); ok { + for _, n := range names { + if s, ok := n.(string); ok { + windowNames = append(windowNames, s) + } + } + } + offsetX := getIntParam(params, "offsetX") + offsetY := getIntParam(params, "offsetY") + err := b.display.StackWindows(windowNames, offsetX, offsetY) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "layout_workflow": + workflow := getStringParam(params, "workflow") + err := b.display.ApplyWorkflowLayout(display.WorkflowType(workflow)) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "workflow": workflow} + + case "tray_set_tooltip": + tooltip := getStringParam(params, "tooltip") + err := b.display.SetTrayTooltip(tooltip) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "tray_set_label": + label := getStringParam(params, "label") + err := b.display.SetTrayLabel(label) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "tray_set_icon": + // Icon data as base64 encoded PNG + iconBase64 := getStringParam(params, "icon") + if iconBase64 == "" { + return map[string]any{"error": "icon data required"} + } + // Decode base64 + iconData, err := base64.StdEncoding.DecodeString(iconBase64) + if err != nil { + return map[string]any{"error": "invalid base64 icon data: " + err.Error()} + } + err = b.display.SetTrayIcon(iconData) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "tray_set_menu": + // Menu items as JSON array + var items []display.TrayMenuItem + if menuData, ok := params["menu"].([]any); ok { + menuJSON, _ := json.Marshal(menuData) + json.Unmarshal(menuJSON, &items) + } + err := b.display.SetTrayMenu(items) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "tray_info": + info := b.display.GetTrayInfo() + return info + + case "window_background_colour": + name := getStringParam(params, "name") + r := uint8(getIntParam(params, "r")) + g := uint8(getIntParam(params, "g")) + b_val := uint8(getIntParam(params, "b")) + a := uint8(getIntParam(params, "a")) + if a == 0 { + a = 255 // Default to opaque + } + err := b.display.SetWindowBackgroundColour(name, r, g, b_val, a) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "clipboard_read": + text, err := b.display.ReadClipboard() + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"text": text} + + case "clipboard_write": + text, _ := params["text"].(string) + err := b.display.WriteClipboard(text) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "clipboard_has": + has := b.display.HasClipboard() + return map[string]any{"hasContent": has} + + case "clipboard_clear": + err := b.display.ClearClipboard() + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "notification_show": + title := getStringParam(params, "title") + message := getStringParam(params, "message") + subtitle := getStringParam(params, "subtitle") + id := getStringParam(params, "id") + err := b.display.ShowNotification(display.NotificationOptions{ + ID: id, + Title: title, + Message: message, + Subtitle: subtitle, + }) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "notification_permission_request": + granted, err := b.display.RequestNotificationPermission() + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"granted": granted} + + case "notification_permission_check": + authorized, err := b.display.CheckNotificationPermission() + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"authorized": authorized} + + case "theme_get": + theme := b.display.GetTheme() + return map[string]any{"theme": theme} + + case "theme_system": + theme := b.display.GetSystemTheme() + return map[string]any{"theme": theme} + + case "focus_set": + name := getStringParam(params, "name") + err := b.display.FocusWindow(name) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "dialog_open_file": + title := getStringParam(params, "title") + defaultDir := getStringParam(params, "defaultDirectory") + multiple, _ := params["allowMultiple"].(bool) + opts := display.OpenFileOptions{ + Title: title, + DefaultDirectory: defaultDir, + AllowMultiple: multiple, + } + if multiple { + paths, err := b.display.OpenFileDialog(opts) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"paths": paths} + } + path, err := b.display.OpenSingleFileDialog(opts) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"path": path} + + case "dialog_save_file": + title := getStringParam(params, "title") + defaultDir := getStringParam(params, "defaultDirectory") + defaultFilename := getStringParam(params, "defaultFilename") + path, err := b.display.SaveFileDialog(display.SaveFileOptions{ + Title: title, + DefaultDirectory: defaultDir, + DefaultFilename: defaultFilename, + }) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"path": path} + + case "dialog_open_directory": + title := getStringParam(params, "title") + defaultDir := getStringParam(params, "defaultDirectory") + path, err := b.display.OpenDirectoryDialog(display.OpenDirectoryOptions{ + Title: title, + DefaultDirectory: defaultDir, + }) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"path": path} + + case "dialog_confirm": + title := getStringParam(params, "title") + message := getStringParam(params, "message") + confirmed, err := b.display.ConfirmDialog(title, message) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"confirmed": confirmed} + + case "dialog_prompt": + title := getStringParam(params, "title") + message := getStringParam(params, "message") + result, ok, err := b.display.PromptDialog(title, message) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"result": result, "ok": ok} + + case "event_info": + eventMgr := b.display.GetEventManager() + if eventMgr == nil { + return map[string]any{"error": "event manager not available"} + } + return map[string]any{ + "endpoint": fmt.Sprintf("ws://localhost:%d/events", b.port), + "connectedClients": eventMgr.ConnectedClients(), + "eventTypes": []string{ + "window.focus", "window.blur", "window.move", "window.resize", + "window.close", "window.create", "theme.change", "screen.change", + }, + } + + default: + return map[string]any{"error": "unknown tool", "tool": tool} + } +} + +// executeWebviewTool handles webview/JS tool execution. +func (b *MCPBridge) executeWebviewTool(tool string, params map[string]any) map[string]any { + if b.webview == nil { + return map[string]any{"error": "webview service not available"} + } + + switch tool { + case "webview_list": + windows := b.webview.ListWindows() + return map[string]any{"windows": windows} + + case "webview_eval": + windowName := getStringParam(params, "window") + code := getStringParam(params, "code") + result, err := b.webview.ExecJS(windowName, code) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"result": result} + + case "webview_console": + level := getStringParam(params, "level") + limit := getIntParam(params, "limit") + if limit == 0 { + limit = 100 + } + messages := b.webview.GetConsoleMessages(level, limit) + return map[string]any{"messages": messages} + + case "webview_console_clear": + b.webview.ClearConsole() + return map[string]any{"success": true} + + case "webview_click": + windowName := getStringParam(params, "window") + selector := getStringParam(params, "selector") + err := b.webview.Click(windowName, selector) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "webview_type": + windowName := getStringParam(params, "window") + selector := getStringParam(params, "selector") + text := getStringParam(params, "text") + err := b.webview.Type(windowName, selector, text) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "webview_query": + windowName := getStringParam(params, "window") + selector := getStringParam(params, "selector") + result, err := b.webview.QuerySelector(windowName, selector) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"elements": result} + + case "webview_navigate": + windowName := getStringParam(params, "window") + url := getStringParam(params, "url") + err := b.webview.Navigate(windowName, url) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "webview_source": + windowName := getStringParam(params, "window") + result, err := b.webview.GetPageSource(windowName) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"source": result} + + case "webview_url": + windowName := getStringParam(params, "window") + result, err := b.webview.GetURL(windowName) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"url": result} + + case "webview_title": + windowName := getStringParam(params, "window") + result, err := b.webview.GetTitle(windowName) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"title": result} + + case "webview_screenshot": + windowName := getStringParam(params, "window") + data, err := b.webview.Screenshot(windowName) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"data": data} + + case "webview_screenshot_element": + windowName := getStringParam(params, "window") + selector := getStringParam(params, "selector") + data, err := b.webview.ScreenshotElement(windowName, selector) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"data": data} + + case "webview_scroll": + windowName := getStringParam(params, "window") + selector := getStringParam(params, "selector") + x := getIntParam(params, "x") + y := getIntParam(params, "y") + err := b.webview.Scroll(windowName, selector, x, y) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "webview_hover": + windowName := getStringParam(params, "window") + selector := getStringParam(params, "selector") + err := b.webview.Hover(windowName, selector) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "webview_select": + windowName := getStringParam(params, "window") + selector := getStringParam(params, "selector") + value := getStringParam(params, "value") + err := b.webview.Select(windowName, selector, value) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "webview_check": + windowName := getStringParam(params, "window") + selector := getStringParam(params, "selector") + checked, _ := params["checked"].(bool) + err := b.webview.Check(windowName, selector, checked) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "webview_element_info": + windowName := getStringParam(params, "window") + selector := getStringParam(params, "selector") + result, err := b.webview.GetElementInfo(windowName, selector) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"element": result} + + case "webview_computed_style": + windowName := getStringParam(params, "window") + selector := getStringParam(params, "selector") + var properties []string + if props, ok := params["properties"].([]any); ok { + for _, p := range props { + if s, ok := p.(string); ok { + properties = append(properties, s) + } + } + } + result, err := b.webview.GetComputedStyle(windowName, selector, properties) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"styles": result} + + case "webview_highlight": + windowName := getStringParam(params, "window") + selector := getStringParam(params, "selector") + duration := getIntParam(params, "duration") + err := b.webview.Highlight(windowName, selector, duration) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "webview_dom_tree": + windowName := getStringParam(params, "window") + maxDepth := getIntParam(params, "maxDepth") + result, err := b.webview.GetDOMTree(windowName, maxDepth) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"tree": result} + + case "webview_errors": + limit := getIntParam(params, "limit") + if limit == 0 { + limit = 50 + } + errors := b.webview.GetErrors(limit) + return map[string]any{"errors": errors} + + case "webview_performance": + windowName := getStringParam(params, "window") + result, err := b.webview.GetPerformance(windowName) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"performance": result} + + case "webview_resources": + windowName := getStringParam(params, "window") + result, err := b.webview.GetResources(windowName) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"resources": result} + + case "webview_network": + windowName := getStringParam(params, "window") + limit := getIntParam(params, "limit") + result, err := b.webview.GetNetworkRequests(windowName, limit) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"requests": result} + + case "webview_network_clear": + windowName := getStringParam(params, "window") + err := b.webview.ClearNetworkRequests(windowName) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "webview_network_inject": + windowName := getStringParam(params, "window") + err := b.webview.InjectNetworkInterceptor(windowName) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "webview_pdf": + windowName := getStringParam(params, "window") + options := make(map[string]any) + if filename := getStringParam(params, "filename"); filename != "" { + options["filename"] = filename + } + if margin, ok := params["margin"].(float64); ok { + options["margin"] = margin + } + data, err := b.webview.ExportToPDF(windowName, options) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"data": data} + + case "webview_print": + windowName := getStringParam(params, "window") + err := b.webview.PrintToPDF(windowName) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + default: + return map[string]any{"error": "unknown webview tool", "tool": tool} + } +} + +// Helper functions for parameter extraction +func getStringParam(params map[string]any, key string) string { + if v, ok := params[key].(string); ok { + return v + } + return "" +} + +func getIntParam(params map[string]any, key string) int { + if v, ok := params[key].(float64); ok { + return int(v) + } + return 0 +} + +// GetMCPService returns the MCP service for direct access. +func (b *MCPBridge) GetMCPService() *mcp.Service { + return b.mcpService +} + +// GetWebView returns the WebView service. +func (b *MCPBridge) GetWebView() *webview.Service { + return b.webview +} + +// GetDisplay returns the Display service. +func (b *MCPBridge) GetDisplay() *display.Service { + return b.display +} + +// handleEventsWebSocket handles WebSocket connections for real-time display events. +func (b *MCPBridge) handleEventsWebSocket(w http.ResponseWriter, r *http.Request) { + eventMgr := b.display.GetEventManager() + if eventMgr == nil { + http.Error(w, "event manager not available", http.StatusServiceUnavailable) + return + } + eventMgr.HandleWebSocket(w, r) +} diff --git a/cmd/core-demo/public/assets/app.js b/cmd/core-demo/public/assets/app.js new file mode 100644 index 0000000..28abaa3 --- /dev/null +++ b/cmd/core-demo/public/assets/app.js @@ -0,0 +1 @@ +console.log("Hello from app.js!"); diff --git a/cmd/core-demo/public/assets/apptray.png b/cmd/core-demo/public/assets/apptray.png new file mode 100644 index 0000000..0778fc6 Binary files /dev/null and b/cmd/core-demo/public/assets/apptray.png differ diff --git a/cmd/core-demo/public/bindings/github.com/wailsapp/wails/v3/internal/eventcreate.ts b/cmd/core-demo/public/bindings/github.com/wailsapp/wails/v3/internal/eventcreate.ts new file mode 100644 index 0000000..1ea1058 --- /dev/null +++ b/cmd/core-demo/public/bindings/github.com/wailsapp/wails/v3/internal/eventcreate.ts @@ -0,0 +1,9 @@ +//@ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +Object.freeze($Create.Events); diff --git a/cmd/core-demo/public/bindings/github.com/wailsapp/wails/v3/internal/eventdata.d.ts b/cmd/core-demo/public/bindings/github.com/wailsapp/wails/v3/internal/eventdata.d.ts new file mode 100644 index 0000000..3dd1807 --- /dev/null +++ b/cmd/core-demo/public/bindings/github.com/wailsapp/wails/v3/internal/eventdata.d.ts @@ -0,0 +1,2 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT diff --git a/cmd/core-demo/public/html/assets/app.js b/cmd/core-demo/public/html/assets/app.js new file mode 100644 index 0000000..0a38b01 --- /dev/null +++ b/cmd/core-demo/public/html/assets/app.js @@ -0,0 +1,4 @@ +// This is the main entry point for the frontend application. +// We can add application-specific JavaScript here in the future. + +console.log("Core Framework App Loaded"); diff --git a/cmd/core-demo/public/html/index.html b/cmd/core-demo/public/html/index.html new file mode 100644 index 0000000..162b8c8 --- /dev/null +++ b/cmd/core-demo/public/html/index.html @@ -0,0 +1,87 @@ + + + + + + Core Framework + + + + + + +
+ +
+

+ Core Framework +

+

A modular foundation for building robust desktop applications.

+
+ +
+

Loaded Services

+
+ + +
+
+ + + + +
+

Config

+

Manages application state and user preferences.

+
+ + +
+
+ + + +
+

Display

+

Controls windows, menus, and system tray interactions.

+
+ + +
+
+ + + +
+

Crypt

+

Provides cryptographic functions and security.

+
+ +
+
+ +
+ + + + \ No newline at end of file diff --git a/cmd/core-demo/public/html/system-tray.html b/cmd/core-demo/public/html/system-tray.html new file mode 100644 index 0000000..90d2cd2 --- /dev/null +++ b/cmd/core-demo/public/html/system-tray.html @@ -0,0 +1,98 @@ + + + + + + Core System Tray + + + + + + +
+ +
+

+ Core Status +

+

Services at a glance.

+
+ +
+
+ + +
+
+ + + + +
+
+

Config

+

State and preferences loaded.

+
+
+ + +
+
+ + + +
+
+

Display

+

UI manager is active.

+
+
+ + +
+
+ + + +
+
+

Crypt

+

Security services are running.

+
+
+ +
+
+ + + +
+ + + + \ No newline at end of file diff --git a/cmd/core-demo/public/package-lock.json b/cmd/core-demo/public/package-lock.json new file mode 100644 index 0000000..4e88f78 --- /dev/null +++ b/cmd/core-demo/public/package-lock.json @@ -0,0 +1,1084 @@ +{ + "name": "core-app", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "core-app", + "version": "0.0.0", + "dependencies": { + "@tailwindplus/elements": "^1.0.18", + "@wailsio/runtime": "^3.0.0-alpha.72" + }, + "devDependencies": { + "tailwindcss": "^4.1.14", + "vite": "^7.1.12" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz", + "integrity": "sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.5.tgz", + "integrity": "sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz", + "integrity": "sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.5.tgz", + "integrity": "sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.5.tgz", + "integrity": "sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.5.tgz", + "integrity": "sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.5.tgz", + "integrity": "sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.5.tgz", + "integrity": "sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.5.tgz", + "integrity": "sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.5.tgz", + "integrity": "sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.5.tgz", + "integrity": "sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.5.tgz", + "integrity": "sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.5.tgz", + "integrity": "sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.5.tgz", + "integrity": "sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.5.tgz", + "integrity": "sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz", + "integrity": "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.5.tgz", + "integrity": "sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.5.tgz", + "integrity": "sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.5.tgz", + "integrity": "sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.5.tgz", + "integrity": "sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.5.tgz", + "integrity": "sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz", + "integrity": "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindplus/elements": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/@tailwindplus/elements/-/elements-1.0.18.tgz", + "integrity": "sha512-JvqwL+6LwDIxC5zV9kAcI1wttpkUhgkGr7bcuYGH7fxnmgvVJglBERqlgPGGDXWB+lpuFgjgkvtK3pMm/7MvTA==", + "license": "SEE LICENSE IN LICENSE.md" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@wailsio/runtime": { + "version": "3.0.0-alpha.72", + "resolved": "https://registry.npmjs.org/@wailsio/runtime/-/runtime-3.0.0-alpha.72.tgz", + "integrity": "sha512-VJjDa0GBG7tp7WBMlytzLvsZ4gBQVBftIwiJ+dSg2C4e11N6JonJZp9iHT2xgK35rewKdwbX1vMDyrcBcyZYoA==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.5.tgz", + "integrity": "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.52.5", + "@rollup/rollup-android-arm64": "4.52.5", + "@rollup/rollup-darwin-arm64": "4.52.5", + "@rollup/rollup-darwin-x64": "4.52.5", + "@rollup/rollup-freebsd-arm64": "4.52.5", + "@rollup/rollup-freebsd-x64": "4.52.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.5", + "@rollup/rollup-linux-arm-musleabihf": "4.52.5", + "@rollup/rollup-linux-arm64-gnu": "4.52.5", + "@rollup/rollup-linux-arm64-musl": "4.52.5", + "@rollup/rollup-linux-loong64-gnu": "4.52.5", + "@rollup/rollup-linux-ppc64-gnu": "4.52.5", + "@rollup/rollup-linux-riscv64-gnu": "4.52.5", + "@rollup/rollup-linux-riscv64-musl": "4.52.5", + "@rollup/rollup-linux-s390x-gnu": "4.52.5", + "@rollup/rollup-linux-x64-gnu": "4.52.5", + "@rollup/rollup-linux-x64-musl": "4.52.5", + "@rollup/rollup-openharmony-arm64": "4.52.5", + "@rollup/rollup-win32-arm64-msvc": "4.52.5", + "@rollup/rollup-win32-ia32-msvc": "4.52.5", + "@rollup/rollup-win32-x64-gnu": "4.52.5", + "@rollup/rollup-win32-x64-msvc": "4.52.5", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.16.tgz", + "integrity": "sha512-pONL5awpaQX4LN5eiv7moSiSPd/DLDzKVRJz8Q9PgzmAdd1R4307GQS2ZpfiN7ZmekdQrfhZZiSE5jkLR4WNaA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/vite": { + "version": "7.1.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.12.tgz", + "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + } + } +} diff --git a/cmd/core-demo/public/package.json b/cmd/core-demo/public/package.json new file mode 100644 index 0000000..32c6d85 --- /dev/null +++ b/cmd/core-demo/public/package.json @@ -0,0 +1,17 @@ +{ + "name": "core-app", + "version": "0.0.0", + "scripts": { + "start": "vite", + "build": "vite build", + "build:dev": "vite build --mode development" + }, + "dependencies": { + "@tailwindplus/elements": "^1.0.18", + "@wailsio/runtime": "^3.0.0-alpha.72" + }, + "devDependencies": { + "tailwindcss": "^4.1.14", + "vite": "^7.1.12" + } +} diff --git a/cmd/core-demo/public/vite.config.js b/cmd/core-demo/public/vite.config.js new file mode 100644 index 0000000..4813670 --- /dev/null +++ b/cmd/core-demo/public/vite.config.js @@ -0,0 +1,17 @@ +import { defineConfig } from 'vite'; + +// https://vitejs.dev/config/ +export default defineConfig({ + // Set the root of the project to the 'html' directory. + // Vite will look for index.html in this folder. + root: 'html', + + build: { + // Set the output directory for the build. + // We need to go up one level from 'html' to place the 'dist' folder + // in the correct location for Wails. + outDir: '../dist', + // Ensure the output directory is emptied before each build. + emptyOutDir: true, + }, +}); diff --git a/cmd/core-gui/Taskfile.yml b/cmd/core-gui/Taskfile.yml index e11a691..3239ce8 100644 --- a/cmd/core-gui/Taskfile.yml +++ b/cmd/core-gui/Taskfile.yml @@ -7,9 +7,9 @@ includes: linux: "./build/linux/Taskfile.yml" vars: - APP_NAME: "core" + APP_NAME: "core-gui" BIN_DIR: "./build/bin" - VITE_PORT: '{{.WAILS_VITE_PORT | default 9245}}' + VITE_PORT: '{{.WAILS_VITE_PORT | default 9246}}' tasks: build: diff --git a/cmd/lthn-desktop/Taskfile.yml b/cmd/lthn-desktop/Taskfile.yml new file mode 100644 index 0000000..2cef61b --- /dev/null +++ b/cmd/lthn-desktop/Taskfile.yml @@ -0,0 +1,42 @@ +version: '3' + +includes: + common: "./build/Taskfile.yml" + windows: "./build/windows/Taskfile.yml" + darwin: "./build/darwin/Taskfile.yml" + linux: "./build/linux/Taskfile.yml" + +vars: + APP_NAME: "lthn-desktop" + BIN_DIR: "./build/bin" + VITE_PORT: '{{.WAILS_VITE_PORT | default 9247}}' + +tasks: + build: + summary: Builds the application + cmds: + - task: "{{OS}}:build" + + package: + summary: Packages a production build of the application + cmds: + - task: "{{OS}}:package" + + run: + summary: Runs the application + cmds: + - task: "{{OS}}:run" + + # This is the main dev task called by the Makefile. + # It delegates to the actual wails command below. + dev: + summary: Runs the application in development mode + cmds: + - task: dev:wails + + # This task contains the real wails dev command. + # This avoids the recursive loop and provides a clear target. + dev:wails: + internal: true + cmds: + - wails3 dev -config ./build/config.yml -port {{.VITE_PORT}} diff --git a/cmd/lthn-desktop/apps/mining.itw3.json b/cmd/lthn-desktop/apps/mining.itw3.json new file mode 100644 index 0000000..2bcbabb --- /dev/null +++ b/cmd/lthn-desktop/apps/mining.itw3.json @@ -0,0 +1,50 @@ +{ + "code": "mining", + "type": "app", + "name": "Mining Module", + "version": "0.1.0", + "namespace": "mining", + "description": "Cryptocurrency mining management", + "author": "Lethean", + "contexts": ["miner", "default"], + "menu": [ + { + "id": "mining", + "label": "Mining", + "order": 200, + "contexts": ["miner"], + "children": [ + {"id": "mining-dashboard", "label": "Dashboard", "route": "/mining/dashboard", "order": 1}, + {"id": "mining-pools", "label": "Pools", "route": "/mining/pools", "order": 2}, + {"id": "mining-sep1", "separator": true, "order": 3}, + {"id": "mining-start", "label": "Start Mining", "action": "mining:start", "order": 4}, + {"id": "mining-stop", "label": "Stop Mining", "action": "mining:stop", "order": 5} + ] + } + ], + "routes": [ + {"path": "/mining/dashboard", "component": "mining-dashboard", "title": "Mining Dashboard", "contexts": ["miner"]}, + {"path": "/mining/pools", "component": "mining-pools", "title": "Mining Pools", "contexts": ["miner"]} + ], + "api": [ + {"method": "GET", "path": "/status", "description": "Get mining status"}, + {"method": "POST", "path": "/start", "description": "Start mining"}, + {"method": "POST", "path": "/stop", "description": "Stop mining"}, + {"method": "GET", "path": "/pools", "description": "List configured pools"} + ], + "downloads": { + "x86_64": { + "darwin": {"url": "https://releases.example.com/mining/darwin-x86_64.tar.gz"}, + "linux": {"url": "https://releases.example.com/mining/linux-x86_64.tar.gz"}, + "windows": {"url": "https://releases.example.com/mining/windows-x86_64.zip"} + }, + "aarch64": { + "darwin": {"url": "https://releases.example.com/mining/darwin-aarch64.tar.gz"} + } + }, + "config": { + "defaultPool": "", + "threads": 0, + "intensity": 50 + } +} diff --git a/cmd/lthn-desktop/claude_bridge.go b/cmd/lthn-desktop/claude_bridge.go new file mode 100644 index 0000000..8ecc368 --- /dev/null +++ b/cmd/lthn-desktop/claude_bridge.go @@ -0,0 +1,157 @@ +package main + +import ( + "encoding/json" + "log" + "net/http" + "sync" + "time" + + "github.com/gorilla/websocket" +) + +var wsUpgrader = websocket.Upgrader{ + ReadBufferSize: 1024, + WriteBufferSize: 1024, + CheckOrigin: func(r *http.Request) bool { + return true + }, +} + +// ClaudeBridge forwards messages between GUI clients and the MCP core WebSocket. +type ClaudeBridge struct { + mcpConn *websocket.Conn + mcpURL string + clients map[*websocket.Conn]bool + clientsMu sync.RWMutex + broadcast chan []byte + reconnectMu sync.Mutex +} + +// NewClaudeBridge creates a new bridge to the MCP core WebSocket. +func NewClaudeBridge(mcpURL string) *ClaudeBridge { + return &ClaudeBridge{ + mcpURL: mcpURL, + clients: make(map[*websocket.Conn]bool), + broadcast: make(chan []byte, 256), + } +} + +// Start connects to the MCP WebSocket and starts the bridge. +func (cb *ClaudeBridge) Start() { + go cb.connectToMCP() + go cb.broadcastLoop() +} + +// connectToMCP establishes connection to the MCP core WebSocket. +func (cb *ClaudeBridge) connectToMCP() { + for { + cb.reconnectMu.Lock() + if cb.mcpConn != nil { + cb.mcpConn.Close() + } + + log.Printf("Claude bridge connecting to MCP at %s", cb.mcpURL) + conn, _, err := websocket.DefaultDialer.Dial(cb.mcpURL, nil) + if err != nil { + log.Printf("Claude bridge failed to connect to MCP: %v", err) + cb.reconnectMu.Unlock() + time.Sleep(5 * time.Second) + continue + } + + cb.mcpConn = conn + cb.reconnectMu.Unlock() + log.Printf("Claude bridge connected to MCP") + + // Read messages from MCP and broadcast to clients + for { + _, message, err := conn.ReadMessage() + if err != nil { + log.Printf("Claude bridge MCP read error: %v", err) + break + } + cb.broadcast <- message + } + + // Connection lost, retry + time.Sleep(2 * time.Second) + } +} + +// broadcastLoop sends messages from MCP to all connected clients. +func (cb *ClaudeBridge) broadcastLoop() { + for message := range cb.broadcast { + cb.clientsMu.RLock() + for client := range cb.clients { + err := client.WriteMessage(websocket.TextMessage, message) + if err != nil { + log.Printf("Claude bridge client write error: %v", err) + } + } + cb.clientsMu.RUnlock() + } +} + +// HandleWebSocket handles WebSocket connections from GUI clients. +func (cb *ClaudeBridge) HandleWebSocket(w http.ResponseWriter, r *http.Request) { + conn, err := wsUpgrader.Upgrade(w, r, nil) + if err != nil { + log.Printf("Claude bridge upgrade error: %v", err) + return + } + + cb.clientsMu.Lock() + cb.clients[conn] = true + cb.clientsMu.Unlock() + + // Send connected message + connMsg, _ := json.Marshal(map[string]any{ + "type": "system", + "data": "Connected to Claude bridge", + "timestamp": time.Now(), + }) + conn.WriteMessage(websocket.TextMessage, connMsg) + + defer func() { + cb.clientsMu.Lock() + delete(cb.clients, conn) + cb.clientsMu.Unlock() + conn.Close() + }() + + // Read messages from client and forward to MCP + for { + _, message, err := conn.ReadMessage() + if err != nil { + break + } + + // Parse the message to check type + var msg map[string]any + if err := json.Unmarshal(message, &msg); err != nil { + continue + } + + // Forward claude_message to MCP + if msgType, ok := msg["type"].(string); ok && msgType == "claude_message" { + cb.sendToMCP(message) + } + } +} + +// sendToMCP sends a message to the MCP WebSocket. +func (cb *ClaudeBridge) sendToMCP(message []byte) { + cb.reconnectMu.Lock() + defer cb.reconnectMu.Unlock() + + if cb.mcpConn == nil { + log.Printf("Claude bridge: MCP not connected") + return + } + + err := cb.mcpConn.WriteMessage(websocket.TextMessage, message) + if err != nil { + log.Printf("Claude bridge MCP write error: %v", err) + } +} diff --git a/cmd/lthn-desktop/frontend.old/.dockerignore b/cmd/lthn-desktop/frontend.old/.dockerignore new file mode 100644 index 0000000..b592cf4 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/.dockerignore @@ -0,0 +1,7 @@ +node_modules +npm-debug.log +Dockerfile +.dockerignore +.env +.git +.gitignore diff --git a/cmd/lthn-desktop/frontend.old/.editorconfig b/cmd/lthn-desktop/frontend.old/.editorconfig new file mode 100644 index 0000000..f166060 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/.editorconfig @@ -0,0 +1,17 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single +ij_typescript_use_double_quotes = false + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/cmd/lthn-desktop/frontend.old/.gitignore b/cmd/lthn-desktop/frontend.old/.gitignore new file mode 100644 index 0000000..192ab77 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/.gitignore @@ -0,0 +1,42 @@ +# See https://docs.github.com/get-started/getting-started-with-git/ignoring-files for more about ignoring files. +.npmrc +# Compiled output +/dist +/tmp +/out-tsc +/bazel-out + +# Node +/node_modules +npm-debug.log +yarn-error.log + +# IDEs and editors +.idea/ +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# Visual Studio Code +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# Miscellaneous +/.angular/cache +.sass-cache/ +/connect.lock +/coverage +/libpeerconnection.log +testem.log +/typings + +# System files +.DS_Store +Thumbs.db diff --git a/cmd/lthn-desktop/frontend.old/README.md b/cmd/lthn-desktop/frontend.old/README.md new file mode 100644 index 0000000..f30320b --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/README.md @@ -0,0 +1,69 @@ +### Installation +- `npm install` (install dependencies) +- `npm outdated` (verify dependency status) + +### Development +- `npm run start` +- Visit http://localhost:4200 + +## Lint +- `npm run lint` + +## Tests (headless-ready, no Chrome required) +- Unit/integration: `npm run test` (opens browser), or: + - Headless (uses Puppeteer Chromium): `npm run test:headless` + - Coverage report (HTML + text-summary): `npm run coverage` +- Coverage thresholds are enforced in Karma (≈80% statements/lines/functions, 70% branches for global). Adjust in `karma.conf.js` if needed. + +### TDD workflow and test naming (Good/Bad/Ugly) +- Follow strict TDD: + 1) Write failing tests from user stories + acceptance criteria + 2) Implement minimal code to pass + 3) Refactor +- Test case naming convention: each logical test should have three variants to clarify intent and data quality. + - Example helpers in `src/testing/gbu.ts`: + ```ts + import { itGood, itBad, itUgly, trio } from 'src/testing/gbu'; + + itGood('saves profile', () => {/* valid data */}); + itBad('saves profile', () => {/* incorrect data (edge) */}); + itUgly('saves profile', () => {/* invalid data/conditions */}); + + // Or use trio + trio('process order', { + good: () => {/* ... */}, + bad: () => {/* ... */}, + ugly: () => {/* ... */}, + }); + ``` +- Do not modify router-outlet containers in tests/components. + +### Standalone Angular 20+ patterns (migration notes) +- This app is moving to Angular standalone APIs. Prefer: + - Standalone components (`standalone: true`, add `imports: []` per component) + - `provideRouter(...)`, `provideHttpClient(...)`, `provideServiceWorker(...)` in `app.config.ts` + - Translation is configured via `app.config.ts` using `TranslateModule.forRoot(...)` and an HTTP loader. +- Legacy NgModules should be converted progressively. If an `NgModule` remains but is unrouted/unreferenced, keep it harmlessly until deletion is approved. Do not alter the main router-outlet page context panel. + +### Web Awesome + Font Awesome (Pro) +- Both Font Awesome and Web Awesome are integrated. Do not remove. Web Awesome assets are copied via `angular.json` assets, and its base path is set at runtime in `app.ts`: + ```ts + import('@awesome.me/webawesome').then(m => m.setBasePath('/assets/web-awesome')); + ``` +- CSS includes are defined in `angular.json` and `src/styles.css`. + +### SSR and production +- Build (browser + server): `npm run build` +- Serve SSR bundle: `npm run serve` → http://localhost:4000 + +### Notes for other LLMs / contributors +- Respect the constraints: + - Do NOT edit the router-outlet main panel; pages/services are the focus + - Preserve existing functionality; do not remove Web Awesome/Font Awesome + - Use strict TDD and Good/Bad/Ugly naming for tests + - Keep or improve code coverage ≥ configured thresholds for changed files +- Use Angular 20+ standalone patterns; update `app.config.ts` for global providers. +- For tests, prefer headless runs via Puppeteer (no local Chrome needed). + +### Author +- Author: danny diff --git a/cmd/lthn-desktop/frontend.old/angular.json b/cmd/lthn-desktop/frontend.old/angular.json new file mode 100644 index 0000000..c32e185 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/angular.json @@ -0,0 +1,132 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "lthn.io": { + "projectType": "application", + "schematics": {}, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular/build:application", + "options": { + "browser": "src/main.ts", + "polyfills": [ + "zone.js" + ], + "tsConfig": "tsconfig.app.json", + "assets": [ + { + "glob": "**/*", + "input": "public" + }, + { + "glob": "@awesome.me/webawesome/**/*.*", + "input": "node_modules/", + "output": "/" + }, + "src/sitemap.xml", + "src/robots.txt" + ], + "styles": [ + "node_modules/@fortawesome/fontawesome-free/css/all.min.css", + "src/styles.css" + ], + "scripts": [], + "define": { + "import.meta.vitest": "undefined" + } + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "1MB", + "maximumError": "1MB" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "4kB", + "maximumError": "8kB" + } + ], + "outputHashing": "all", + "serviceWorker": "ngsw-config.json", + "server": "src/main.server.ts", + "outputMode": "server", + "ssr": { + "entry": "src/server.ts" + } + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true, + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.development.ts" + } + ] + } + }, + "defaultConfiguration": "development" + }, + "serve": { + "builder": "@angular/build:dev-server", + "configurations": { + "production": { + "buildTarget": "lthn.io:build:production" + }, + "development": { + "buildTarget": "lthn.io:build:development" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular/build:extract-i18n" + }, + "test": { + "builder": "@angular/build:karma", + "options": { + "polyfills": [ + "zone.js", + "zone.js/testing", + "src/test.ts" + ], + "tsConfig": "tsconfig.spec.json", + "assets": [ + { + "glob": "**/*", + "input": "public" + } + ], + "styles": [ + "src/styles.css" + ] + } + }, + "lint": { + "builder": "@angular-eslint/builder:lint", + "options": { + "lintFilePatterns": [ + "src/**/*.ts", + "src/**/*.html" + ] + } + } + } + } + }, + "cli": { + "schematicCollections": [ + "angular-eslint" + ], + "analytics": false + } +} diff --git a/cmd/lthn-desktop/frontend.old/eslint.config.js b/cmd/lthn-desktop/frontend.old/eslint.config.js new file mode 100644 index 0000000..225b05e --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/eslint.config.js @@ -0,0 +1,63 @@ +// @ts-check +const eslint = require("@eslint/js"); +const tseslint = require("typescript-eslint"); +const angular = require("angular-eslint"); + +module.exports = tseslint.config( + { + files: ["**/*.ts"], + extends: [ + eslint.configs.recommended, + ...tseslint.configs.recommended, + ...tseslint.configs.stylistic, + ...angular.configs.tsRecommended, + ], + processor: angular.processInlineTemplates, + rules: { + "@angular-eslint/directive-selector": [ + "error", + { + type: "attribute", + prefix: "app", + style: "camelCase", + }, + ], + "@angular-eslint/component-selector": [ + "error", + { + type: "element", + prefix: "app", + style: "kebab-case", + }, + ], + "@angular-eslint/component-class-suffix": [ + "error", + { + suffixes: ["", "Component"] + } + ], + "@angular-eslint/prefer-inject": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-unused-vars": [ + "error", + { "argsIgnorePattern": "^_", "varsIgnorePattern": "^_" } + ], + "no-undefined": "off", + "no-var": "error", + "prefer-const": "error", + "func-names": "error", + "id-length": "error", + "newline-before-return": "error", + "space-before-blocks": "error", + "no-alert": "error" + }, + }, + { + files: ["**/*.html"], + extends: [ + ...angular.configs.templateRecommended, + ...angular.configs.templateAccessibility, + ], + rules: {}, + } +); diff --git a/cmd/lthn-desktop/frontend.old/karma.conf.js b/cmd/lthn-desktop/frontend.old/karma.conf.js new file mode 100644 index 0000000..d5d1ab2 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/karma.conf.js @@ -0,0 +1,61 @@ +process.env.CHROME_BIN = process.env.CHROME_BIN || (function() { + try { return require('puppeteer').executablePath(); } catch { return undefined; } +})(); + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + jasmine: { + // you can add configuration options for Jasmine here + // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html + // for example, you can disable the random execution order + random: true + }, + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + jasmineHtmlReporter: { + suppressAll: true // removes the duplicated traces + }, + coverageReporter: { + dir: require('path').join(__dirname, './coverage/angular-starter'), + subdir: '.', + reporters: [ + { type: 'html' }, + { type: 'text-summary' } + ], + check: { + global: { + statements: 80, + branches: 70, + functions: 80, + lines: 80 + } + } + }, + reporters: ['progress', 'kjhtml'], + browsers: ['Chrome'], + customLaunchers: { + ChromeHeadless: { + base: 'Chrome', + flags: [ + '--headless', + '--disable-gpu', + '--no-sandbox', + '--disable-dev-shm-usage', + '--disable-web-security', + '--remote-debugging-port=9222' + ] + } + }, + restartOnFileChange: true + }); +}; diff --git a/cmd/lthn-desktop/frontend.old/ngsw-config.json b/cmd/lthn-desktop/frontend.old/ngsw-config.json new file mode 100644 index 0000000..69edd28 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/ngsw-config.json @@ -0,0 +1,30 @@ +{ + "$schema": "./node_modules/@angular/service-worker/config/schema.json", + "index": "/index.html", + "assetGroups": [ + { + "name": "app", + "installMode": "prefetch", + "resources": { + "files": [ + "/favicon.ico", + "/index.csr.html", + "/index.html", + "/manifest.webmanifest", + "/*.css", + "/*.js" + ] + } + }, + { + "name": "assets", + "installMode": "lazy", + "updateMode": "prefetch", + "resources": { + "files": [ + "/**/*.(svg|cur|jpg|jpeg|png|apng|webp|avif|gif|otf|ttf|woff|woff2)" + ] + } + } + ] +} diff --git a/cmd/lthn-desktop/frontend.old/package-lock.json b/cmd/lthn-desktop/frontend.old/package-lock.json new file mode 100644 index 0000000..f2449b9 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/package-lock.json @@ -0,0 +1,12685 @@ +{ + "name": "lthn.io", + "version": "20.3.2", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "lthn.io", + "version": "20.3.2", + "dependencies": { + "@angular/common": "^20.3.2", + "@angular/compiler": "^20.3.2", + "@angular/core": "^20.3.2", + "@angular/forms": "^20.3.2", + "@angular/platform-browser": "^20.3.2", + "@angular/platform-server": "^20.3.2", + "@angular/router": "^20.3.2", + "@angular/service-worker": "^20.3.2", + "@angular/ssr": "^20.3.3", + "@awesome.me/kit-2e7e02d1b1": "^1.0.6", + "@awesome.me/webawesome": "file:~/Code/lib/webawesome", + "@fortawesome/fontawesome-free": "^7.0.1", + "@ngx-translate/core": "^17.0.0", + "@ngx-translate/http-loader": "^17.0.0", + "bootstrap": "^5.3.8", + "express": "^5.1.0", + "rxjs": "^7.8.2", + "tslib": "^2.8.1", + "uuid": "^13.0.0", + "zone.js": "^0.15.1" + }, + "devDependencies": { + "@angular/build": "^20.3.3", + "@angular/cli": "^20.3.3", + "@angular/compiler-cli": "^20.3.2", + "@types/express": "^5.0.3", + "@types/jasmine": "^5.1.9", + "@types/node": "^24.6.0", + "angular-eslint": "^20.3.0", + "eslint": "^9.36.0", + "jasmine-core": "^5.11.0", + "karma": "^6.4.4", + "karma-chrome-launcher": "^3.2.0", + "karma-coverage": "^2.2.1", + "karma-jasmine": "^5.1.0", + "karma-jasmine-html-reporter": "^2.1.0", + "puppeteer": "^23.7.0", + "typescript": "~5.8.3", + "typescript-eslint": "^8.45.0" + } + }, + "../../../../../../Downloads/webawesome-zip": { + "name": "@awesome.me/webawesome", + "version": "3.0.0", + "extraneous": true, + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "4.1.0", + "@floating-ui/dom": "^1.6.13", + "@lit/react": "^1.0.8", + "@shoelace-style/animations": "^1.2.0", + "@shoelace-style/localize": "^3.2.1", + "composed-offset-position": "^0.0.6", + "lit": "^3.2.1", + "nanoid": "^5.1.5", + "qr-creator": "^1.0.0" + }, + "devDependencies": { + "@wc-toolkit/jsx-types": "^1.3.0", + "eleventy-plugin-git-commit-date": "^0.1.3", + "esbuild": "^0.25.11" + }, + "engines": { + "node": ">=14.17.0" + } + }, + "../../../../../lib/webawesome": { + "name": "@awesome.me/webawesome", + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "4.1.0", + "@floating-ui/dom": "^1.6.13", + "@lit/react": "^1.0.8", + "@shoelace-style/animations": "^1.2.0", + "@shoelace-style/localize": "^3.2.1", + "composed-offset-position": "^0.0.6", + "lit": "^3.2.1", + "nanoid": "^5.1.5", + "qr-creator": "^1.0.0" + }, + "devDependencies": { + "@wc-toolkit/jsx-types": "^1.3.0", + "eleventy-plugin-git-commit-date": "^0.1.3", + "esbuild": "^0.25.11" + }, + "engines": { + "node": ">=14.17.0" + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.1.0.tgz", + "integrity": "sha512-sEyWjw28a/9iluA37KLGu8vjxEIlb60uxznfTUmXImy7H5NvbpSO6yYgmgH5KiD7j+zTUUihiST0jEP12IoXow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.35.0.tgz", + "integrity": "sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.35.0.tgz", + "integrity": "sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.35.0.tgz", + "integrity": "sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.35.0.tgz", + "integrity": "sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.35.0.tgz", + "integrity": "sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.35.0.tgz", + "integrity": "sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.35.0.tgz", + "integrity": "sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.35.0.tgz", + "integrity": "sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.35.0.tgz", + "integrity": "sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.35.0.tgz", + "integrity": "sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.35.0.tgz", + "integrity": "sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.35.0.tgz", + "integrity": "sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.35.0.tgz", + "integrity": "sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.2003.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2003.3.tgz", + "integrity": "sha512-DOnGyv9g24vaDzf5koLOcVri1kYJIBD9UKiJWOWk4H5cFlcpTXQ+PilPmDq6A+X94Tt4MZHImmKsk6LLRPIwFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "20.3.3", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/core": { + "version": "20.3.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.3.tgz", + "integrity": "sha512-2T5mX2duLapZYPYmXUSUe9VW8Dhu10nVBVvEp31jSE6xvjbPM5mlsv6+fks1E4RjhzvaamY9bm3WgwYwNiEV5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics": { + "version": "20.3.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.3.3.tgz", + "integrity": "sha512-LDn39BjyQLAK/DaVamLElMtI0UoCZIs4jKcMEv8PJ/nnBmrYFHVavWPggeFWMycjeXsdX34Msiml88HZWlXypw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "20.3.3", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "8.2.0", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-eslint/builder": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-20.3.0.tgz", + "integrity": "sha512-3XpWLdh+/K4+r0ChkKW00SXWyBA7ShMpE+Pt1XUmIu4srJgGRnt8e+kC4Syi+s2t5QS7PjlwRaelB1KfSMXZ5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": ">= 0.2000.0 < 0.2100.0", + "@angular-devkit/core": ">= 20.0.0 < 21.0.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-20.3.0.tgz", + "integrity": "sha512-QwuNnmRNr/uNj89TxknPbGcs5snX1w7RoJJPNAsfb2QGcHzUTQovS8hqm9kaDZdpUJDPP7jt7B6F0+EjrPAXRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-eslint/eslint-plugin": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-20.3.0.tgz", + "integrity": "sha512-7ghzGTiExrgTetDQ6IPP5uXSa94Xhtzp2VHCIa58EcUb7oMv06HWZ1Uss3xgFmACsLpN+vayKJIdFiboqaGVRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "20.3.0", + "@angular-eslint/utils": "20.3.0", + "ts-api-utils": "^2.1.0" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/eslint-plugin-template": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-20.3.0.tgz", + "integrity": "sha512-WMJDJfybOLCiN4QrOyrLl+Zt5F+A/xoDYMWTdn+LgACheLs2tguVQiwf+oCgHnHGcsTsulPYlRHldKBGZMgs4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "20.3.0", + "@angular-eslint/utils": "20.3.0", + "aria-query": "5.3.2", + "axobject-query": "4.1.0" + }, + "peerDependencies": { + "@angular-eslint/template-parser": "20.3.0", + "@typescript-eslint/types": "^7.11.0 || ^8.0.0", + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/schematics": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-20.3.0.tgz", + "integrity": "sha512-4n92tHKIJm1PP+FjhnmO7AMpvKdRIoF+YgF38oUU7aMJqfZ3RXIhazMMxw2u3VU1MisKH766KSll++c4LgarVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": ">= 20.0.0 < 21.0.0", + "@angular-devkit/schematics": ">= 20.0.0 < 21.0.0", + "@angular-eslint/eslint-plugin": "20.3.0", + "@angular-eslint/eslint-plugin-template": "20.3.0", + "ignore": "7.0.5", + "semver": "7.7.2", + "strip-json-comments": "3.1.1" + } + }, + "node_modules/@angular-eslint/template-parser": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-20.3.0.tgz", + "integrity": "sha512-gB564h/kZ7siWvgHDETU++sk5e25qFfVaizLaa6KoBEYFP6dOCiedz15LTcA0TsXp0rGu6Z6zkl291iSM1qzDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "20.3.0", + "eslint-scope": "^8.0.2" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/utils": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-20.3.0.tgz", + "integrity": "sha512-7XOQeNXgyhznDwoP1TwPrCMq/uXKJHQgCVPFREkJGKbNf/jzNldB7iV1eqpBzUQIPEQFgfcDG67dexpMAq3N4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "20.3.0" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular/build": { + "version": "20.3.3", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.3.3.tgz", + "integrity": "sha512-WhwAbovHAxDbNeR5jB2IS/SVs+yQg9NETFeJ5f7T3n/414ULkGOhXn+29i1rzwJhf1uqM9lsedcv2tKn1N24/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.2003.3", + "@babel/core": "7.28.3", + "@babel/helper-annotate-as-pure": "7.27.3", + "@babel/helper-split-export-declaration": "7.24.7", + "@inquirer/confirm": "5.1.14", + "@vitejs/plugin-basic-ssl": "2.1.0", + "beasties": "0.3.5", + "browserslist": "^4.23.0", + "esbuild": "0.25.9", + "https-proxy-agent": "7.0.6", + "istanbul-lib-instrument": "6.0.3", + "jsonc-parser": "3.3.1", + "listr2": "9.0.1", + "magic-string": "0.30.17", + "mrmime": "2.0.1", + "parse5-html-rewriting-stream": "8.0.0", + "picomatch": "4.0.3", + "piscina": "5.1.3", + "rolldown": "1.0.0-beta.38", + "sass": "1.90.0", + "semver": "7.7.2", + "source-map-support": "0.5.21", + "tinyglobby": "0.2.14", + "vite": "7.1.5", + "watchpack": "2.4.4" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "lmdb": "3.4.2" + }, + "peerDependencies": { + "@angular/compiler": "^20.0.0", + "@angular/compiler-cli": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/localize": "^20.0.0", + "@angular/platform-browser": "^20.0.0", + "@angular/platform-server": "^20.0.0", + "@angular/service-worker": "^20.0.0", + "@angular/ssr": "^20.3.3", + "karma": "^6.4.0", + "less": "^4.2.0", + "ng-packagr": "^20.0.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "tslib": "^2.3.0", + "typescript": ">=5.8 <6.0", + "vitest": "^3.1.1" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + }, + "@angular/localize": { + "optional": true + }, + "@angular/platform-browser": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@angular/ssr": { + "optional": true + }, + "karma": { + "optional": true + }, + "less": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@angular/cli": { + "version": "20.3.3", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.3.3.tgz", + "integrity": "sha512-3c8xCklJ0C0T6ETSncAoXlOYNi3x7vLT3PS56rIaQ0jtlvD4Y+RQakd3+iffVAapvh/JB27WNor8pJRThLZ/jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": "0.2003.3", + "@angular-devkit/core": "20.3.3", + "@angular-devkit/schematics": "20.3.3", + "@inquirer/prompts": "7.8.2", + "@listr2/prompt-adapter-inquirer": "3.0.1", + "@modelcontextprotocol/sdk": "1.17.3", + "@schematics/angular": "20.3.3", + "@yarnpkg/lockfile": "1.1.0", + "algoliasearch": "5.35.0", + "ini": "5.0.0", + "jsonc-parser": "3.3.1", + "listr2": "9.0.1", + "npm-package-arg": "13.0.0", + "pacote": "21.0.0", + "resolve": "1.22.10", + "semver": "7.7.2", + "yargs": "18.0.0", + "zod": "3.25.76" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/common": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.3.2.tgz", + "integrity": "sha512-5V9AzLhCA1dNhF+mvihmdHoZHbEhIb1jNYRA1/JMheR+G7NR8Mznu6RmWaKSWZ4AJeSJN8rizWN2wpVPWTKjSQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/core": "20.3.2", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.3.2.tgz", + "integrity": "sha512-5fSzkPmRomZ9H43c82FJWLwdOi7MICMimP1y1oYJZcUh3jYRhXUrQvD0jifdRVkkgKNjaZYlMr0NkrYQFgFong==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@angular/compiler-cli": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.3.2.tgz", + "integrity": "sha512-rLox2THiALVQqYGUaxZ6YD8qUoXIOGTw3s0tim9/U65GuXGRtYgG0ZQWYp3yjEBes0Ksx2/15eFPp1Ol4FdEKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "7.28.3", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^4.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.2.0", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^18.0.0" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/compiler": "20.3.2", + "typescript": ">=5.8 <6.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@angular/core": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.3.2.tgz", + "integrity": "sha512-88uPgs5LjtnywnQaZE2ShBb1wa8IuD6jWs4nc4feo32QdBc55tjebTBFJSHbi3mUVAp0eS4wI6ITo0YIb01H4g==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/compiler": "20.3.2", + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.15.0" + }, + "peerDependenciesMeta": { + "@angular/compiler": { + "optional": true + }, + "zone.js": { + "optional": true + } + } + }, + "node_modules/@angular/forms": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.3.2.tgz", + "integrity": "sha512-ECIbtwc7n9fPbiZXZVaoZpSiOksgcNbZ27oUN9BT7EmoXRzBw6yDL2UX6Ig7pEKhQGyBkKB+TMerRwTDVkkCWg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/common": "20.3.2", + "@angular/core": "20.3.2", + "@angular/platform-browser": "20.3.2", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.3.2.tgz", + "integrity": "sha512-d9XcT2UuWZCc0UOtkCcPEnMcOFKNczahamT/Izg3H9jLS3IcT6l0ry23d/Xf0DRwhLYQdOZiG7l8HMZ1sWPMOg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/animations": "20.3.2", + "@angular/common": "20.3.2", + "@angular/core": "20.3.2" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-server": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-20.3.2.tgz", + "integrity": "sha512-D7tf5S5xxQQUDtw/dkMa2XePnxHwyZElN5FQP99ByiEy9PjT1iFjyKuP9jjHsI4Nmi+Juq0F1uo4azPfPaV/3w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0", + "xhr2": "^0.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/common": "20.3.2", + "@angular/compiler": "20.3.2", + "@angular/core": "20.3.2", + "@angular/platform-browser": "20.3.2", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/router": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.3.2.tgz", + "integrity": "sha512-+Crx6QpK00juoNU3A1vbVf4DQ7fduLe3DUdAob6a9Uj+IoWj2Ijd8zUWF8E0cfNNFotJ4Gost0lJORDvqKcC7A==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/common": "20.3.2", + "@angular/core": "20.3.2", + "@angular/platform-browser": "20.3.2", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/service-worker": { + "version": "20.3.2", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-20.3.2.tgz", + "integrity": "sha512-SdaJ61JrliZLHEQ7kY2L98FLsVcti9+GeKODJUsHpnS2dv9RVSmWKJSa01kLsdOY/6wc1h5EHwkTg1iGHK0aew==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "bin": { + "ngsw-config": "ngsw-config.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/core": "20.3.2", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/ssr": { + "version": "20.3.3", + "resolved": "https://registry.npmjs.org/@angular/ssr/-/ssr-20.3.3.tgz", + "integrity": "sha512-DdwpwfNcoiaiaPvcm3aL+k24JWB0OOTq8/oM8HY4gAZbGNTnn8n1gTbTq3qjLt8zFtCWWqVU0+ejBgHIEvmDOw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/platform-server": "^20.0.0", + "@angular/router": "^20.0.0" + }, + "peerDependenciesMeta": { + "@angular/platform-server": { + "optional": true + } + } + }, + "node_modules/@awesome.me/kit-2e7e02d1b1": { + "version": "1.0.6", + "resolved": "https://npm.fontawesome.com/@awesome.me/kit-2e7e02d1b1/-/kit-2e7e02d1b1-1.0.6.tgz", + "integrity": "sha512-FWcO0CIV+z+jzf/lSPPjPKeB5juAHl+E4tPSwoZ7SZbwrHS7J323KeuPY3FuPM8TICy1VoP586z8YLjvkp8pzA==", + "license": "UNLICENSED", + "dependencies": { + "@fortawesome/fontawesome-common-types": "^7.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@awesome.me/webawesome": { + "resolved": "../../../../../lib/webawesome", + "link": true + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", + "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.3", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@emnapi/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", + "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", + "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", + "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.2", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "7.1.0", + "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-7.1.0.tgz", + "integrity": "sha512-l/BQM7fYntsCI//du+6sEnHOP6a74UixFyOYUyz2DLMXKx+6DEhfR3F2NYGE45XH1JJuIamacb4IZs9S0ZOWLA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-free": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-7.0.1.tgz", + "integrity": "sha512-RLmb9U6H2rJDnGxEqXxzy7ANPrQz7WK2/eTjdZqyU9uRU5W+FkAec9uU5gTYzFBH7aoXIw2WTJSCJR4KPlReQw==", + "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)", + "engines": { + "node": ">=6" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.0.tgz", + "integrity": "sha512-JWaTfCxI1eTmJ1BIv86vUfjVatOdxwD0DAVKYevY8SazeUUZtW+tNbsdejVO1GYE0GXJW1N1ahmiC3TFd+7wZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.2.4.tgz", + "integrity": "sha512-2n9Vgf4HSciFq8ttKXk+qy+GsyTXPV1An6QAwe/8bkbbqvG4VW1I/ZY1pNu2rf+h9bdzMLPbRSfcNxkHBy/Ydw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.0", + "@inquirer/core": "^10.2.2", + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.14", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.14.tgz", + "integrity": "sha512-5yR4IBfe0kXe59r1YCTG8WXkUbl7Z35HK87Sw+WUyGD8wNUx7JvY7laahzeytyE1oLn74bQnL7hstctQxisQ8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.15", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.2.2.tgz", + "integrity": "sha512-yXq/4QUnk4sHMtmbd7irwiepjB8jXU0kkFRL4nr/aDBA2mDz13cMakEWdDwX3eSCTkk03kwcndD1zfRAIlELxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.0", + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.20", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.20.tgz", + "integrity": "sha512-7omh5y5bK672Q+Brk4HBbnHNowOZwrb/78IFXdrEB9PfdxL3GudQyDk8O9vQ188wj3xrEebS2M9n18BjJoI83g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.2", + "@inquirer/external-editor": "^1.0.2", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.20", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.20.tgz", + "integrity": "sha512-Dt9S+6qUg94fEvgn54F2Syf0Z3U8xmnBI9ATq2f5h9xt09fs2IJXSCIXyyVHwvggKWFXEY/7jATRo2K6Dkn6Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.2", + "@inquirer/type": "^3.0.8", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", + "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^2.1.0", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", + "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.4.tgz", + "integrity": "sha512-cwSGpLBMwpwcZZsc6s1gThm0J+it/KIJ+1qFL2euLmSKUMGumJ5TcbMgxEjMjNHRGadouIYbiIgruKoDZk7klw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.2", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.20.tgz", + "integrity": "sha512-bbooay64VD1Z6uMfNehED2A2YOPHSJnQLs9/4WNiV/EK+vXczf/R988itL2XLDGTgmhMF2KkiWZo+iEZmc4jqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.2", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.20", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.20.tgz", + "integrity": "sha512-nxSaPV2cPvvoOmRygQR+h0B+Av73B01cqYLcr7NXcGXhbmsYfUb8fDdw2Us1bI2YsX+VvY7I7upgFYsyf8+Nug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.0", + "@inquirer/core": "^10.2.2", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.8.2.tgz", + "integrity": "sha512-nqhDw2ZcAUrKNPwhjinJny903bRhI0rQhiDz1LksjeRxqa36i3l75+4iXbOy0rlDpLJGxqtgoPavQjmmyS5UJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.2.1", + "@inquirer/confirm": "^5.1.14", + "@inquirer/editor": "^4.2.17", + "@inquirer/expand": "^4.0.17", + "@inquirer/input": "^4.2.1", + "@inquirer/number": "^3.0.17", + "@inquirer/password": "^4.0.17", + "@inquirer/rawlist": "^4.1.5", + "@inquirer/search": "^3.1.0", + "@inquirer/select": "^4.3.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.8.tgz", + "integrity": "sha512-CQ2VkIASbgI2PxdzlkeeieLRmniaUU1Aoi5ggEdm6BIyqopE9GuDXdDOj9XiwOqK5qm72oI2i6J+Gnjaa26ejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.2", + "@inquirer/type": "^3.0.8", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.1.3.tgz", + "integrity": "sha512-D5T6ioybJJH0IiSUK/JXcoRrrm8sXwzrVMjibuPs+AgxmogKslaafy1oxFiorNI4s3ElSkeQZbhYQgLqiL8h6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.2.2", + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.3.4.tgz", + "integrity": "sha512-Qp20nySRmfbuJBBsgPU7E/cL62Hf250vMZRzYDcBHty2zdD1kKCnoDFWRr0WO2ZzaXp3R7a4esaVGJUx0E6zvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.0", + "@inquirer/core": "^10.2.2", + "@inquirer/figures": "^1.0.13", + "@inquirer/type": "^3.0.8", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.8.tgz", + "integrity": "sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@listr2/prompt-adapter-inquirer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-3.0.1.tgz", + "integrity": "sha512-3XFmGwm3u6ioREG+ynAQB7FoxfajgQnMhIu8wC5eo/Lsih4aKDg0VuIMGaOsYn7hJSJagSeaD4K8yfpkEoDEmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/type": "^3.0.7" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@inquirer/prompts": ">= 3 < 8", + "listr2": "9.0.1" + } + }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.4.2.tgz", + "integrity": "sha512-NK80WwDoODyPaSazKbzd3NEJ3ygePrkERilZshxBViBARNz21rmediktGHExoj9n5t9+ChlgLlxecdFKLCuCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.4.2.tgz", + "integrity": "sha512-zevaowQNmrp3U7Fz1s9pls5aIgpKRsKb3dZWDINtLiozh3jZI9fBrI19lYYBxqdyiIyNdlyiidPnwPShj4aK+w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.4.2.tgz", + "integrity": "sha512-OmHCULY17rkx/RoCoXlzU7LyR8xqrksgdYWwtYa14l/sseezZ8seKWXcogHcjulBddER5NnEFV4L/Jtr2nyxeg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.4.2.tgz", + "integrity": "sha512-ZBEfbNZdkneebvZs98Lq30jMY8V9IJzckVeigGivV7nTHJc+89Ctomp1kAIWKlwIG0ovCDrFI448GzFPORANYg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.4.2.tgz", + "integrity": "sha512-vL9nM17C77lohPYE4YaAQvfZCSVJSryE4fXdi8M7uWPBnU+9DJabgKVAeyDb84ZM2vcFseoBE4/AagVtJeRE7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-win32-arm64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.4.2.tgz", + "integrity": "sha512-SXWjdBfNDze4ZPeLtYIzsIeDJDJ/SdsA0pEXcUBayUIMO0FQBHfVZZyHXQjjHr4cvOAzANBgIiqaXRwfMhzmLw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.4.2.tgz", + "integrity": "sha512-IY+r3bxKW6Q6sIPiMC0L533DEfRJSXibjSI3Ft/w9Q8KQBNqEIvUFXt+09wV8S5BRk0a8uSF19YWxuRwEfI90g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.17.3.tgz", + "integrity": "sha512-JPwUKWSsbzx+DLFznf/QZ32Qa+ptfbUlHhRLrBQBAFu9iI1iYvizM4p+zhhRDceSsPutXp4z+R/HPVphlIiclg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.6", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@napi-rs/nice": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.1.1.tgz", + "integrity": "sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/nice-android-arm-eabi": "1.1.1", + "@napi-rs/nice-android-arm64": "1.1.1", + "@napi-rs/nice-darwin-arm64": "1.1.1", + "@napi-rs/nice-darwin-x64": "1.1.1", + "@napi-rs/nice-freebsd-x64": "1.1.1", + "@napi-rs/nice-linux-arm-gnueabihf": "1.1.1", + "@napi-rs/nice-linux-arm64-gnu": "1.1.1", + "@napi-rs/nice-linux-arm64-musl": "1.1.1", + "@napi-rs/nice-linux-ppc64-gnu": "1.1.1", + "@napi-rs/nice-linux-riscv64-gnu": "1.1.1", + "@napi-rs/nice-linux-s390x-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-musl": "1.1.1", + "@napi-rs/nice-openharmony-arm64": "1.1.1", + "@napi-rs/nice-win32-arm64-msvc": "1.1.1", + "@napi-rs/nice-win32-ia32-msvc": "1.1.1", + "@napi-rs/nice-win32-x64-msvc": "1.1.1" + } + }, + "node_modules/@napi-rs/nice-android-arm-eabi": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.1.1.tgz", + "integrity": "sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-android-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.1.1.tgz", + "integrity": "sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.1.1.tgz", + "integrity": "sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-x64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.1.1.tgz", + "integrity": "sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-freebsd-x64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.1.1.tgz", + "integrity": "sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.1.1.tgz", + "integrity": "sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.1.1.tgz", + "integrity": "sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-musl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.1.1.tgz", + "integrity": "sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-ppc64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.1.1.tgz", + "integrity": "sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-riscv64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.1.1.tgz", + "integrity": "sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-s390x-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.1.1.tgz", + "integrity": "sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.1.1.tgz", + "integrity": "sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-musl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.1.1.tgz", + "integrity": "sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-openharmony-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-openharmony-arm64/-/nice-openharmony-arm64-1.1.1.tgz", + "integrity": "sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-arm64-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.1.1.tgz", + "integrity": "sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-ia32-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.1.1.tgz", + "integrity": "sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-x64-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.1.1.tgz", + "integrity": "sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.5.tgz", + "integrity": "sha512-TBr9Cf9onSAS2LQ2+QHx6XcC6h9+RIzJgbqG3++9TUZSH204AwEy5jg3BTQ0VATsyoGj4ee49tN/y6rvaOOtcg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@tybys/wasm-util": "^0.10.1" + } + }, + "node_modules/@ngx-translate/core": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-17.0.0.tgz", + "integrity": "sha512-Rft2D5ns2pq4orLZjEtx1uhNuEBerUdpFUG1IcqtGuipj6SavgB8SkxtNQALNDA+EVlvsNCCjC2ewZVtUeN6rg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": ">=16", + "@angular/core": ">=16" + } + }, + "node_modules/@ngx-translate/http-loader": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-17.0.0.tgz", + "integrity": "sha512-hgS8sa0ARjH9ll3PhkLTufeVXNI2DNR2uFKDhBgq13siUXzzVr/a31M6zgecrtwbA34iaBV01hsTMbMS8V7iIw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": ">=16", + "@angular/core": ">=16" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", + "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/fs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", + "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/git": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz", + "integrity": "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^8.0.0", + "ini": "^5.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^10.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz", + "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz", + "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.2.0.tgz", + "integrity": "sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^6.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^8.0.0", + "json-parse-even-better-errors": "^4.0.0", + "proc-log": "^5.0.0", + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/package-json/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/promise-spawn": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.3.tgz", + "integrity": "sha512-Yb00SWaL4F8w+K8YGhQ55+xE4RUNdMHV43WZGsiTM92gS+lC0mGsn7I4hLug7pbao035S6bj3Y3w0cUNGLfmkg==", + "dev": true, + "license": "ISC", + "dependencies": { + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/redact": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.2.2.tgz", + "integrity": "sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.1.0.tgz", + "integrity": "sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "node-gyp": "^11.0.0", + "proc-log": "^5.0.0", + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.89.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.89.0.tgz", + "integrity": "sha512-yuo+ECPIW5Q9mSeNmCDC2im33bfKuwW18mwkaHMQh8KakHYDzj4ci/q7wxf2qS3dMlVVCIyrs3kFtH5LmnlYnw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/@parcel/watcher/node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.6.1.tgz", + "integrity": "sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.4.0", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.6.3", + "tar-fs": "^3.0.6", + "unbzip2-stream": "^1.4.3", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@puppeteer/browsers/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@puppeteer/browsers/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@puppeteer/browsers/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@puppeteer/browsers/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@puppeteer/browsers/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@puppeteer/browsers/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@puppeteer/browsers/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@puppeteer/browsers/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@puppeteer/browsers/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-beta.38.tgz", + "integrity": "sha512-AE3HFQrjWCKLFZD1Vpiy+qsqTRwwoil1oM5WsKPSmfQ5fif/A+ZtOZetF32erZdsR7qyvns6qHEteEsF6g6rsQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-beta.38.tgz", + "integrity": "sha512-RaoWOKc0rrFsVmKOjQpebMY6c6/I7GR1FBc25v7L/R7NlM0166mUotwGEv7vxu7ruXH4SJcFeVrfADFUUXUmmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-beta.38.tgz", + "integrity": "sha512-Ymojqc2U35iUc8NFU2XX1WQPfBRRHN6xHcrxAf9WS8BFFBn8pDrH5QPvH1tYs3lDkw6UGGbanr1RGzARqdUp1g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-beta.38.tgz", + "integrity": "sha512-0ermTQ//WzSI0nOL3z/LUWMNiE9xeM5cLGxjewPFEexqxV/0uM8/lNp9QageQ8jfc/VO1OURsGw34HYO5PaL8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-beta.38.tgz", + "integrity": "sha512-GADxzVUTCTp6EWI52831A29Tt7PukFe94nhg/SUsfkI33oTiNQtPxyLIT/3oRegizGuPSZSlrdBurkjDwxyEUQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-beta.38.tgz", + "integrity": "sha512-SKO7Exl5Yem/OSNoA5uLHzyrptUQ8Hg70kHDxuwEaH0+GUg+SQe9/7PWmc4hFKBMrJGdQtii8WZ0uIz9Dofg5Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-beta.38.tgz", + "integrity": "sha512-SOo6+WqhXPBaShLxLT0eCgH17d3Yu1lMAe4mFP0M9Bvr/kfMSOPQXuLxBcbBU9IFM9w3N6qP9xWOHO+oUJvi8Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-beta.38.tgz", + "integrity": "sha512-yvsQ3CyrodOX+lcoi+lejZGCOvJZa9xTsNB8OzpMDmHeZq3QzJfpYjXSAS6vie70fOkLVJb77UqYO193Cl8XBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-beta.38.tgz", + "integrity": "sha512-84qzKMwUwikfYeOuJ4Kxm/3z15rt0nFGGQArHYIQQNSTiQdxGHxOkqXtzPFqrVfBJUdxBAf+jYzR1pttFJuWyg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-beta.38.tgz", + "integrity": "sha512-QrNiWlce01DYH0rL8K3yUBu+lNzY+B0DyCbIc2Atan6/S6flxOL0ow5DLQvMamOI/oKhrJ4xG+9MkMb9dDHbLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-beta.38.tgz", + "integrity": "sha512-fnLtHyjwEsG4/aNV3Uv3Qd1ZbdH+CopwJNoV0RgBqrcQB8V6/Qdikd5JKvnO23kb3QvIpP+dAMGZMv1c2PJMzw==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.0.5" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-beta.38.tgz", + "integrity": "sha512-19cTfnGedem+RY+znA9J6ARBOCEFD4YSjnx0p5jiTm9tR6pHafRfFIfKlTXhun+NL0WWM/M0eb2IfPPYUa8+wg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-ia32-msvc": { + "version": "1.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.0.0-beta.38.tgz", + "integrity": "sha512-HcICm4YzFJZV+fI0O0bFLVVlsWvRNo/AB9EfUXvNYbtAxakCnQZ15oq22deFdz6sfi9Y4/SagH2kPU723dhCFA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-beta.38.tgz", + "integrity": "sha512-4Qx6cgEPXLb0XsCyLoQcUgYBpfL0sjugftob+zhUH0EOk/NVCAIT+h0NJhY+jn7pFpeKxhNMqhvTNx3AesxIAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.38.tgz", + "integrity": "sha512-N/ICGKleNhA5nc9XXQG/kkKHJ7S55u0x0XUJbbkmdCnFuoRkM1Il12q9q0eX19+M7KKUEPw/daUPIRnxhcxAIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.2.tgz", + "integrity": "sha512-o3pcKzJgSGt4d74lSZ+OCnHwkKBeAbFDmbEm5gg70eA8VkyCuC/zV9TwBnmw6VjDlRdF4Pshfb+WE9E6XY1PoQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.2.tgz", + "integrity": "sha512-cqFSWO5tX2vhC9hJTK8WAiPIm4Q8q/cU8j2HQA0L3E1uXvBYbOZMhE2oFL8n2pKB5sOCHY6bBuHaRwG7TkfJyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.2.tgz", + "integrity": "sha512-vngduywkkv8Fkh3wIZf5nFPXzWsNsVu1kvtLETWxTFf/5opZmflgVSeLgdHR56RQh71xhPhWoOkEBvbehwTlVA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.2.tgz", + "integrity": "sha512-h11KikYrUCYTrDj6h939hhMNlqU2fo/X4NB0OZcys3fya49o1hmFaczAiJWVAFgrM1NCP6RrO7lQKeVYSKBPSQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.2.tgz", + "integrity": "sha512-/eg4CI61ZUkLXxMHyVlmlGrSQZ34xqWlZNW43IAU4RmdzWEx0mQJ2mN/Cx4IHLVZFL6UBGAh+/GXhgvGb+nVxw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.2.tgz", + "integrity": "sha512-QOWgFH5X9+p+S1NAfOqc0z8qEpJIoUHf7OWjNUGOeW18Mx22lAUOiA9b6r2/vpzLdfxi/f+VWsYjUOMCcYh0Ng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.2.tgz", + "integrity": "sha512-kDWSPafToDd8LcBYd1t5jw7bD5Ojcu12S3uT372e5HKPzQt532vW+rGFFOaiR0opxePyUkHrwz8iWYEyH1IIQA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.2.tgz", + "integrity": "sha512-gKm7Mk9wCv6/rkzwCiUC4KnevYhlf8ztBrDRT9g/u//1fZLapSRc+eDZj2Eu2wpJ+0RzUKgtNijnVIB4ZxyL+w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.2.tgz", + "integrity": "sha512-66lA8vnj5mB/rtDNwPgrrKUOtCLVQypkyDa2gMfOefXK6rcZAxKLO9Fy3GkW8VkPnENv9hBkNOFfGLf6rNKGUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.2.tgz", + "integrity": "sha512-s+OPucLNdJHvuZHuIz2WwncJ+SfWHFEmlC5nKMUgAelUeBUnlB4wt7rXWiyG4Zn07uY2Dd+SGyVa9oyLkVGOjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.2.tgz", + "integrity": "sha512-8wTRM3+gVMDLLDdaT6tKmOE3lJyRy9NpJUS/ZRWmLCmOPIJhVyXwjBo+XbrrwtV33Em1/eCTd5TuGJm4+DmYjw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.2.tgz", + "integrity": "sha512-6yqEfgJ1anIeuP2P/zhtfBlDpXUb80t8DpbYwXQ3bQd95JMvUaqiX+fKqYqUwZXqdJDd8xdilNtsHM2N0cFm6A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.2.tgz", + "integrity": "sha512-sshYUiYVSEI2B6dp4jMncwxbrUqRdNApF2c3bhtLAU0qA8Lrri0p0NauOsTWh3yCCCDyBOjESHMExonp7Nzc0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.2.tgz", + "integrity": "sha512-duBLgd+3pqC4MMwBrKkFxaZerUxZcYApQVC5SdbF5/e/589GwVvlRUnyqMFbM8iUSb1BaoX/3fRL7hB9m2Pj8Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.2.tgz", + "integrity": "sha512-tzhYJJidDUVGMgVyE+PmxENPHlvvqm1KILjjZhB8/xHYqAGeizh3GBGf9u6WdJpZrz1aCpIIHG0LgJgH9rVjHQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.2.tgz", + "integrity": "sha512-opH8GSUuVcCSSyHHcl5hELrmnk4waZoVpgn/4FDao9iyE4WpQhyWJ5ryl5M3ocp4qkRuHfyXnGqg8M9oKCEKRA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.2.tgz", + "integrity": "sha512-LSeBHnGli1pPKVJ79ZVJgeZWWZXkEe/5o8kcn23M8eMKCUANejchJbF/JqzM4RRjOJfNRhKJk8FuqL1GKjF5oQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.2.tgz", + "integrity": "sha512-uPj7MQ6/s+/GOpolavm6BPo+6CbhbKYyZHUDvZ/SmJM7pfDBgdGisFX3bY/CBDMg2ZO4utfhlApkSfZ92yXw7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.2.tgz", + "integrity": "sha512-Z9MUCrSgIaUeeHAiNkm3cQyst2UhzjPraR3gYYfOjAuZI7tcFRTOD+4cHLPoS/3qinchth+V56vtqz1Tv+6KPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.2.tgz", + "integrity": "sha512-+GnYBmpjldD3XQd+HMejo+0gJGwYIOfFeoBQv32xF/RUIvccUz20/V6Otdv+57NE70D5pa8W/jVGDoGq0oON4A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.2.tgz", + "integrity": "sha512-ApXFKluSB6kDQkAqZOKXBjiaqdF1BlKi+/eqnYe9Ee7U2K3pUDKsIyr8EYm/QDHTJIM+4X+lI0gJc3TTRhd+dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.2.tgz", + "integrity": "sha512-ARz+Bs8kY6FtitYM96PqPEVvPXqEZmPZsSkXvyX19YzDqkCaIlhCieLLMI5hxO9SRZ2XtCtm8wxhy0iJ2jxNfw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@schematics/angular": { + "version": "20.3.3", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.3.3.tgz", + "integrity": "sha512-lqIP1pNKp8yaqd663R3graZWaTBjXH+Cl72BQl1Ghl7lFGReZJALr4GiSMiBR9r30Epklcw5TwOSi+Bs4UKmbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "20.3.3", + "@angular-devkit/schematics": "20.3.3", + "jsonc-parser": "3.3.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@sigstore/bundle": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz", + "integrity": "sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.4.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-2.0.0.tgz", + "integrity": "sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.3.tgz", + "integrity": "sha512-fk2zjD9117RL9BjqEwF7fwv7Q/P9yGsMV4MUJZ/DocaQJ6+3pKr+syBq1owU5Q5qGw5CUbXzm+4yJ2JVRDQeSA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.1.0.tgz", + "integrity": "sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.0", + "make-fetch-happen": "^14.0.2", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.1.tgz", + "integrity": "sha512-eFFvlcBIoGwVkkwmTi/vEQFSva3xs5Ot3WmBcjgjVdiaoelBLQaQ/ZBfhlG0MnG0cmTYScPpk7eDdGDWUcFUmg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.4.1", + "tuf-js": "^3.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/verify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.1.tgz", + "integrity": "sha512-hVJD77oT67aowHxwT4+M6PGOp+E2LtLdTK3+FC0lBO9T7sYwItDMXZ7Z07IDCvR1M717a4axbIWckrW67KMP/w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz", + "integrity": "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cors": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.3.tgz", + "integrity": "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz", + "integrity": "sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jasmine": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.9.tgz", + "integrity": "sha512-8t4HtkW4wxiPVedMpeZ63n3vlWxEIquo/zc1Tm8ElU+SqVV7+D3Na2PWaJUp179AzTragMWVwkMv7mvty0NfyQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.6.0.tgz", + "integrity": "sha512-F1CBxgqwOMc4GKJ7eY22hWhBVQuMYTtqI8L0FcszYcpYX0fzfDGpez22Xau8Mgm7O9fI+zA/TYIdq3tGWfweBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.13.0" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", + "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.45.0.tgz", + "integrity": "sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.45.0", + "@typescript-eslint/type-utils": "8.45.0", + "@typescript-eslint/utils": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.45.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.45.0.tgz", + "integrity": "sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.45.0", + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.45.0.tgz", + "integrity": "sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.45.0", + "@typescript-eslint/types": "^8.45.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.45.0.tgz", + "integrity": "sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.45.0.tgz", + "integrity": "sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.45.0.tgz", + "integrity": "sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0", + "@typescript-eslint/utils": "8.45.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.45.0.tgz", + "integrity": "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.45.0.tgz", + "integrity": "sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.45.0", + "@typescript-eslint/tsconfig-utils": "8.45.0", + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.45.0.tgz", + "integrity": "sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.45.0", + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.45.0.tgz", + "integrity": "sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.45.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.0.tgz", + "integrity": "sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0" + } + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/algoliasearch": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.35.0.tgz", + "integrity": "sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.1.0", + "@algolia/client-abtesting": "5.35.0", + "@algolia/client-analytics": "5.35.0", + "@algolia/client-common": "5.35.0", + "@algolia/client-insights": "5.35.0", + "@algolia/client-personalization": "5.35.0", + "@algolia/client-query-suggestions": "5.35.0", + "@algolia/client-search": "5.35.0", + "@algolia/ingestion": "1.35.0", + "@algolia/monitoring": "1.35.0", + "@algolia/recommend": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/angular-eslint": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-20.3.0.tgz", + "integrity": "sha512-MvmeFuPmJHRmfL1A9IMtZJEYaU6sF++saJgpsU7aOD6YDZCGJ0J6HxlJ/q7YRbWYuI1q+gF/qALxdnuwHYadSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": ">= 20.0.0 < 21.0.0", + "@angular-devkit/schematics": ">= 20.0.0 < 21.0.0", + "@angular-eslint/builder": "20.3.0", + "@angular-eslint/eslint-plugin": "20.3.0", + "@angular-eslint/eslint-plugin-template": "20.3.0", + "@angular-eslint/schematics": "20.3.0", + "@angular-eslint/template-parser": "20.3.0", + "@typescript-eslint/types": "^8.0.0", + "@typescript-eslint/utils": "^8.0.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*", + "typescript-eslint": "^8.0.0" + } + }, + "node_modules/ansi-escapes": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.1.1.tgz", + "integrity": "sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.1.0.tgz", + "integrity": "sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/b4a": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bare-events": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.1.tgz", + "integrity": "sha512-oxSAxTS1hRfnyit2CL5QpAOS5ixfBjj6ex3yTNvXyY/kE719jQ/IjuESJBK2w5v4wwQRAHGseVJXx9QBYOtFGQ==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/bare-fs": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.0.tgz", + "integrity": "sha512-GljgCjeupKZJNetTqxKaQArLK10vpmK28or0+RwWjEl5Rk+/xG3wkpmkv+WrcBm3q1BwHKlnhXzR8O37kcvkXQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", + "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", + "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.1.tgz", + "integrity": "sha512-v2yl0TnaZTdEnelkKtXZGnotiV6qATBlnNuUMrHl6v9Lmmrh9mw9RYyImPU7/4RahumSwQS1k2oKXcRfXcbjJw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-path": "^3.0.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.7.tgz", + "integrity": "sha512-bxxN2M3a4d1CRoQC//IqsR5XrLh0IJ8TCv2x6Y9N0nckNz/rTjZB3//GGscZziZOxmjP55rzxg/ze7usFI9FqQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/beasties": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.5.tgz", + "integrity": "sha512-NaWu+f4YrJxEttJSm16AzMIFtVldCvaJ68b1L098KpqXmxt9xOLtKoLkKxb8ekhOrLqEJAbvT6n6SEvB/sac7A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "css-select": "^6.0.0", + "css-what": "^7.0.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "htmlparser2": "^10.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.49", + "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/bootstrap": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", + "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "license": "MIT", + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.26.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz", + "integrity": "sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.3", + "caniuse-lite": "^1.0.30001741", + "electron-to-chromium": "^1.5.218", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", + "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^4.0.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/cacache/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/cacache/node_modules/tar": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", + "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cacache/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001745", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001745.tgz", + "integrity": "sha512-ywt6i8FzvdgrrrGbr1jZVObnVv6adj+0if2/omv9cmR2oiZs30zL4DIyaptKcbOrBdOIc74QTMoJvSE2QHh5UQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", + "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/chromium-bidi": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.11.0.tgz", + "integrity": "sha512-6CJWHkNRoyZyjV9Rwv2lYONZf1Xm0IuDyNq97nwSsxxP3wf5Bwy15K5rOvVKMtJ127jJBmxFUanSAOjgFRxgrA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "mitt": "3.0.1", + "zod": "3.23.8" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/chromium-bidi/node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/connect/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz", + "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^7.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "nth-check": "^2.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz", + "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", + "dev": true, + "license": "MIT" + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.1.tgz", + "integrity": "sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.1367902", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1367902.tgz", + "integrity": "sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", + "dev": true, + "license": "MIT" + }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.224", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.224.tgz", + "integrity": "sha512-kWAoUu/bwzvnhpdZSIc6KUyvkI1rbRXMT0Eq8pKReyOyaPZcctMli+EgvcN1PAvwVc7Tdo4Fxi2PsLNDU05mdg==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz", + "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/engine.io": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", + "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.2.tgz", + "integrity": "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "punycode": "^1.4.1", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", + "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.36.0", + "@eslint/plugin-kit": "^0.3.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.0.tgz", + "integrity": "sha512-gEf705MZLrDPkbbhi8PnoO4ZwYgKoNL+ISZ3AjZMht2r3N5tuTwncyDi6Fv2/qDnMmZxgs0yI8WDOyR8q3G+SQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^11.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-8.0.0.tgz", + "integrity": "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minimatch": "^10.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/immutable": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", + "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", + "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jasmine-core": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.11.0.tgz", + "integrity": "sha512-MPJ8L5yyNul0F2SuEsLASwESXQjJvBXnKu31JWFyRZSvuv2B79K4GDWN3pSqvLheUNh7Fyb6dXwd4rsz95O2Kg==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", + "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/karma": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", + "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.7.2", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-chrome-launcher": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", + "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "which": "^1.2.1" + } + }, + "node_modules/karma-chrome-launcher/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/karma-coverage": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", + "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.0.5", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/karma-coverage/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/karma-coverage/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma-coverage/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/karma-coverage/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/karma-jasmine": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", + "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "jasmine-core": "^4.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "karma": "^6.0.0" + } + }, + "node_modules/karma-jasmine-html-reporter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", + "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "jasmine-core": "^4.0.0 || ^5.0.0", + "karma": "^6.0.0", + "karma-jasmine": "^5.0.0" + } + }, + "node_modules/karma-jasmine/node_modules/jasmine-core": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.1.tgz", + "integrity": "sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/karma/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/karma/node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/karma/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/karma/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/karma/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/karma/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/karma/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/karma/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/karma/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/karma/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/karma/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/karma/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/karma/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/karma/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/karma/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/karma/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/karma/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/karma/node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/karma/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/karma/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/karma/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/karma/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/karma/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/karma/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.1.tgz", + "integrity": "sha512-SL0JY3DaxylDuo/MecFeiC+7pedM0zia33zl0vcjgwcq1q1FWWF1To9EIauPbl8GbMCU0R2e0uJ8bZunhYKD2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lmdb": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.4.2.tgz", + "integrity": "sha512-nwVGUfTBUwJKXd6lRV8pFNfnrCC1+l49ESJRM19t/tFb/97QfJEixe5DYRvug5JO7DSFKoKaVy7oGMt5rVqZvg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "msgpackr": "^1.11.2", + "node-addon-api": "^6.1.0", + "node-gyp-build-optional-packages": "5.2.2", + "ordered-binary": "^1.5.3", + "weak-lru-cache": "^1.2.2" + }, + "bin": { + "download-lmdb-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "3.4.2", + "@lmdb/lmdb-darwin-x64": "3.4.2", + "@lmdb/lmdb-linux-arm": "3.4.2", + "@lmdb/lmdb-linux-arm64": "3.4.2", + "@lmdb/lmdb-linux-x64": "3.4.2", + "@lmdb/lmdb-win32-arm64": "3.4.2", + "@lmdb/lmdb-win32-x64": "3.4.2" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-fetch-happen": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", + "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "ssri": "^12.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", + "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^3.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true, + "license": "MIT" + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/msgpackr": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.5.tgz", + "integrity": "sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==", + "dev": true, + "license": "MIT", + "optional": true, + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.2.2" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" + } + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-gyp": { + "version": "11.4.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.4.2.tgz", + "integrity": "sha512-3gD+6zsrLQH7DyYOUIutaauuXrcyxeTPyQuZQCQoNPZMHMMS5m4y0xclNpvYzoK3VNzuyxT6eF4mkIL4WSZ1eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^14.0.3", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "tar": "^7.4.3", + "tinyglobby": "^0.2.12", + "which": "^5.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/node-gyp/node_modules/tar": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", + "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/node-gyp/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/node-releases": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", + "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^3.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-bundled": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", + "integrity": "sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-install-checks": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.2.tgz", + "integrity": "sha512-z9HJBCYw9Zr8BqXcllKIs5nI+QggAImbBdHphOzVYrz2CB4iQ6FzWyKmlqDZua+51nAu7FcemlbTc9VgQN5XDQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", + "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-package-arg": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.0.tgz", + "integrity": "sha512-+t2etZAGcB7TbbLHfDwooV9ppB2LhhcT6A+L9cahsf9mEUAoQ6CktLEVvEnpD0N5CkX7zJqnPGaFtoQDy9EkHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^9.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-packlist": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.2.tgz", + "integrity": "sha512-DrIWNiWT0FTdDRjGOYfEEZUNe1IzaSZ+up7qBTKnrQDySpdmuOQvytrqQlpK5QrCA4IThMvL4wTumqaa1ZvVIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^8.0.0", + "proc-log": "^5.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz", + "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^7.1.0", + "npm-normalize-package-bin": "^4.0.0", + "npm-package-arg": "^12.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-pick-manifest/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-pick-manifest/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/npm-pick-manifest/node_modules/npm-package-arg": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "18.0.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz", + "integrity": "sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^3.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^14.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minizlib": "^3.0.1", + "npm-package-arg": "^12.0.0", + "proc-log": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/npm-registry-fetch/node_modules/npm-package-arg": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ordered-binary": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.0.tgz", + "integrity": "sha512-IQh2aMfMIDbPjI/8a3Edr+PiOpcsB7yo8NdW7aHWVaoR/pcDldunMvnnwbk/auPGqmKeAdxtZl7MHX/QmPwhvQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/pacote": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.0.0.tgz", + "integrity": "sha512-lcqexq73AMv6QNLo7SOpz0JJoaGdS3rBFgF122NZVl1bApo2mfu+XzUBU/X/XsiJu+iUmKpekRayqQYAs+PhkA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^6.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "@npmcli/run-script": "^9.0.0", + "cacache": "^19.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^12.0.0", + "npm-packlist": "^10.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^3.0.0", + "ssri": "^12.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "bin/index.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/pacote/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/pacote/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/pacote/node_modules/npm-package-arg": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", + "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-8.0.0.tgz", + "integrity": "sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0", + "parse5": "^8.0.0", + "parse5-sax-parser": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-8.0.0.tgz", + "integrity": "sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/piscina": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.1.3.tgz", + "integrity": "sha512-0u3N7H4+hbr40KjuVn2uNhOcthu/9usKhnw5vT3J7ply79v3D3M8naI00el9Klcy16x557VsEkkUQaHCWFXC/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.x" + }, + "optionalDependencies": { + "@napi-rs/nice": "^1.0.4" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/puppeteer": { + "version": "23.11.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-23.11.1.tgz", + "integrity": "sha512-53uIX3KR5en8l7Vd8n5DUv90Ae9QDQsyIthaUFVzwV6yU750RjqRznEtNMBT20VthqAdemnJN+hxVdmMHKt7Zw==", + "deprecated": "< 24.15.0 is no longer supported", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.6.1", + "chromium-bidi": "0.11.0", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1367902", + "puppeteer-core": "23.11.1", + "typed-query-selector": "^2.12.0" + }, + "bin": { + "puppeteer": "lib/cjs/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core": { + "version": "23.11.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.11.1.tgz", + "integrity": "sha512-3HZ2/7hdDKZvZQ7dhhITOUg4/wOrDRjyK2ZBllRB0ZCOi9u0cwq1ACHDjBB+nX+7+kltHjQvBRdeY7+W0T+7Gg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.6.1", + "chromium-bidi": "0.11.0", + "debug": "^4.4.0", + "devtools-protocol": "0.0.1367902", + "typed-query-selector": "^2.12.0", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core/node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz", + "integrity": "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.7.0", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rolldown": { + "version": "1.0.0-beta.38", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-beta.38.tgz", + "integrity": "sha512-58frPNX55Je1YsyrtPJv9rOSR3G5efUZpRqok94Efsj0EUa8dnqJV3BldShyI7A+bVPleucOtzXHwVpJRcR0kQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.89.0", + "@rolldown/pluginutils": "1.0.0-beta.38", + "ansis": "^4.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-beta.38", + "@rolldown/binding-darwin-arm64": "1.0.0-beta.38", + "@rolldown/binding-darwin-x64": "1.0.0-beta.38", + "@rolldown/binding-freebsd-x64": "1.0.0-beta.38", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.38", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.38", + "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.38", + "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.38", + "@rolldown/binding-linux-x64-musl": "1.0.0-beta.38", + "@rolldown/binding-openharmony-arm64": "1.0.0-beta.38", + "@rolldown/binding-wasm32-wasi": "1.0.0-beta.38", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.38", + "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.38", + "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.38" + } + }, + "node_modules/rollup": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.2.tgz", + "integrity": "sha512-I25/2QgoROE1vYV+NQ1En9T9UFB9Cmfm2CJ83zZOlaDpvz29wGQSZXWKw7MiNXau7wYgB/T9fVIdIuEQ+KbiiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.52.2", + "@rollup/rollup-android-arm64": "4.52.2", + "@rollup/rollup-darwin-arm64": "4.52.2", + "@rollup/rollup-darwin-x64": "4.52.2", + "@rollup/rollup-freebsd-arm64": "4.52.2", + "@rollup/rollup-freebsd-x64": "4.52.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.2", + "@rollup/rollup-linux-arm-musleabihf": "4.52.2", + "@rollup/rollup-linux-arm64-gnu": "4.52.2", + "@rollup/rollup-linux-arm64-musl": "4.52.2", + "@rollup/rollup-linux-loong64-gnu": "4.52.2", + "@rollup/rollup-linux-ppc64-gnu": "4.52.2", + "@rollup/rollup-linux-riscv64-gnu": "4.52.2", + "@rollup/rollup-linux-riscv64-musl": "4.52.2", + "@rollup/rollup-linux-s390x-gnu": "4.52.2", + "@rollup/rollup-linux-x64-gnu": "4.52.2", + "@rollup/rollup-linux-x64-musl": "4.52.2", + "@rollup/rollup-openharmony-arm64": "4.52.2", + "@rollup/rollup-win32-arm64-msvc": "4.52.2", + "@rollup/rollup-win32-ia32-msvc": "4.52.2", + "@rollup/rollup-win32-x64-gnu": "4.52.2", + "@rollup/rollup-win32-x64-msvc": "4.52.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.90.0.tgz", + "integrity": "sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sigstore": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.1.0.tgz", + "integrity": "sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.0", + "@sigstore/sign": "^3.1.0", + "@sigstore/tuf": "^3.1.0", + "@sigstore/verify": "^2.1.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socket.io": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.17.1" + } + }, + "node_modules/socket.io-adapter/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/ssri": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", + "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/streamx": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tuf-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.1.0.tgz", + "integrity": "sha512-3T3T04WzowbwV2FDiGXBbr81t64g1MUGGJRgT4x5o97N+8ArdhVCAF9IxFrxuSJmM3E5Asn7nKHkao0ibcZXAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "3.0.1", + "debug": "^4.4.1", + "make-fetch-happen": "^14.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-query-selector": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", + "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", + "dev": true, + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.45.0.tgz", + "integrity": "sha512-qzDmZw/Z5beNLUrXfd0HIW6MzIaAV5WNDxmMs9/3ojGOpYavofgNAAD/nC6tGV2PczIi0iw8vot2eAe/sBn7zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.45.0", + "@typescript-eslint/parser": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0", + "@typescript-eslint/utils": "8.45.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.41", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.41.tgz", + "integrity": "sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/undici-types": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.13.0.tgz", + "integrity": "sha512-Ov2Rr9Sx+fRgagJ5AX0qvItZG/JKKoBRAVITs1zk7IqZGTJUwgUr7qoYBpWwakpWilTZFM98rG/AFRocu10iIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unique-filename": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", + "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/unique-slug": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", + "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", + "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz", + "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.5.tgz", + "integrity": "sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xhr2": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.1.tgz", + "integrity": "sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.6", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", + "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + }, + "node_modules/zone.js": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz", + "integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==", + "license": "MIT" + } + } +} diff --git a/cmd/lthn-desktop/frontend.old/package.json b/cmd/lthn-desktop/frontend.old/package.json new file mode 100644 index 0000000..04a3ea8 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/package.json @@ -0,0 +1,60 @@ +{ + "name": "lthn.io", + "version": "20.3.2", + "scripts": { + "ng": "ng", + "dev": "ng serve --port 4200", + "start": "ng serve --port 4200", + "build": "ng build", + "watch": "ng build --watch --configuration development", + "preview": "http-server ./dist/lthn-dns-web/browser -o", + "puppeteer:install": "npx puppeteer browsers install chrome || true", + "test": "ng test", + "test:headless": "(export CHROME_BIN=\"$(node -e \"console.log(require('puppeteer').executablePath())\")\"; ng test --no-watch --code-coverage=false --browsers=ChromeHeadless) || (npm run puppeteer:install && export CHROME_BIN=\"$(node -e \"console.log(require('puppeteer').executablePath())\")\" && ng test --no-watch --code-coverage=false --browsers=ChromeHeadless)", + "coverage": "(export CHROME_BIN=\"$(node -e \"console.log(require('puppeteer').executablePath())\")\"; ng test --no-watch --code-coverage --browsers=ChromeHeadless) || (npm run puppeteer:install && export CHROME_BIN=\"$(node -e \"console.log(require('puppeteer').executablePath())\")\" && ng test --no-watch --code-coverage --browsers=ChromeHeadless)", + "lint": "ng lint", + "serve": "node dist/angular-starter/server/server.mjs" + }, + "private": true, + "dependencies": { + "@angular/common": "^20.3.2", + "@angular/compiler": "^20.3.2", + "@angular/core": "^20.3.2", + "@angular/forms": "^20.3.2", + "@angular/platform-browser": "^20.3.2", + "@angular/platform-server": "^20.3.2", + "@angular/router": "^20.3.2", + "@angular/service-worker": "^20.3.2", + "@angular/ssr": "^20.3.3", + "@awesome.me/kit-2e7e02d1b1": "^1.0.6", + "@awesome.me/webawesome": "file:~/Code/lib/webawesome", + "@fortawesome/fontawesome-free": "^7.0.1", + "@ngx-translate/core": "^17.0.0", + "@ngx-translate/http-loader": "^17.0.0", + "bootstrap": "^5.3.8", + "express": "^5.1.0", + "rxjs": "^7.8.2", + "tslib": "^2.8.1", + "uuid": "^13.0.0", + "zone.js": "^0.15.1" + }, + "devDependencies": { + "@angular/build": "^20.3.3", + "@angular/cli": "^20.3.3", + "@angular/compiler-cli": "^20.3.2", + "@types/express": "^5.0.3", + "@types/jasmine": "^5.1.9", + "@types/node": "^24.6.0", + "angular-eslint": "^20.3.0", + "eslint": "^9.36.0", + "jasmine-core": "^5.11.0", + "karma": "^6.4.4", + "karma-chrome-launcher": "^3.2.0", + "karma-coverage": "^2.2.1", + "karma-jasmine": "^5.1.0", + "karma-jasmine-html-reporter": "^2.1.0", + "puppeteer": "^23.7.0", + "typescript": "~5.8.3", + "typescript-eslint": "^8.45.0" + } +} diff --git a/cmd/lthn-desktop/frontend.old/public/favicon.ico b/cmd/lthn-desktop/frontend.old/public/favicon.ico new file mode 100644 index 0000000..57614f9 Binary files /dev/null and b/cmd/lthn-desktop/frontend.old/public/favicon.ico differ diff --git a/cmd/lthn-desktop/frontend.old/public/i18n/en.json b/cmd/lthn-desktop/frontend.old/public/i18n/en.json new file mode 100644 index 0000000..0ce1d3b --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/public/i18n/en.json @@ -0,0 +1,331 @@ +{ "app": { + "title": "Bob Wallet" +}, + "sidebar": { + "wallet": "Wallet", + "topLevelDomains": "Top Level Domains", + "miscellaneous": "Miscellaneous", + "portfolio": "Portfolio", + "send": "Send", + "receive": "Receive", + "domainManager": "Domain Manager", + "browseDomains": "Browse Domains", + "yourBids": "Your Bids", + "watching": "Watching", + "exchange": "Exchange", + "claimAirdrop": "Claim Airdrop", + "signMessage": "Sign Message", + "verifyMessage": "Verify Message", + "currentHeight": "Current Height", + "currentHash": "Current Hash" + }, + "topbar": { + "searchPlaceholder": "Search TLD", + "synced": "Synced", + "walletID": "Wallet ID", + "spendableBalance": "Spendable Balance", + "network": "Network", + "settings": "Settings", + "logout": "Logout" + }, + "home": { + "spendable": "Spendable", + "locked": "Locked", + "revealable": "Revealable", + "redeemable": "Redeemable", + "registerable": "Registerable", + "renewable": "Renewable", + "transferring": "Transferring", + "finalizable": "Finalizable", + "inBids": "In bids", + "bid": "bid", + "bids": "bids", + "revealAll": "Reveal All", + "redeemAll": "Redeem All", + "registerAll": "Register All", + "renewAll": "Renew All", + "finalizeAll": "Finalize All", + "bidsReadyToReveal": "{{count}} bids ready to reveal", + "bidsReadyToRedeem": "{{count}} bids ready to redeem", + "namesReadyToRegister": "{{count}} names ready to register", + "domainsExpiringSoon": "{{count}} domains expiring soon", + "domainsInTransfer": "{{count}} domains in transfer", + "transfersReadyToFinalize": "{{count}} transfers ready to finalize", + "transactionHistory": "Transaction History", + "noTransactions": "No transactions yet. Transaction history will appear here once you start using the wallet." + }, + "domainManager": { + "searchPlaceholder": "Search domains...", + "export": "Export", + "bulkTransfer": "Bulk Transfer", + "claimNamePayment": "Claim Name for Payment", + "emptyState": "You do not own any names yet.", + "browseDomainsLink": "Browse domains", + "toGetStarted": "to get started.", + "name": "Name", + "expires": "Expires", + "highestBid": "Highest Bid", + "showingDomains": "Showing {{count}} domains" + }, + "exchange": { + "listings": "Listings", + "fills": "Fills", + "auctions": "Auctions", + "yourListings": "Your Listings", + "yourFills": "Your Fills", + "marketplaceAuctions": "Marketplace Auctions", + "createListing": "Create Listing", + "refresh": "Refresh", + "noActiveListings": "You have no active listings.", + "noFilledOrders": "You have no filled orders.", + "noActiveAuctions": "No active auctions found.", + "listDomainsInfo": "List your domains for sale to other Handshake users via the Shakedex protocol.", + "completedPurchasesInfo": "Completed purchases will appear here.", + "browseAuctionsInfo": "Browse available domain auctions from other users." + }, + "searchTld": { + "searchPlaceholder": "Search for a name...", + "search": "Search", + "searching": "Searching...", + "enterNamePrompt": "Enter a name to search for availability and auction status.", + "available": "Available", + "inAuction": "In Auction", + "status": "Status", + "currentBid": "Current Bid", + "blocksUntilReveal": "Blocks until reveal", + "availableForBidding": "Available for bidding", + "auctionInProgress": "Auction in progress", + "placeBid": "Place Bid", + "watch": "Watch" + }, + "onboarding": { + "welcome": "Welcome to Bob Wallet", + "setupPrompt": "Set up your wallet to start managing Handshake names", + "createNewWallet": "Create New Wallet", + "importSeed": "Import Seed", + "connectLedger": "Connect Ledger", + "important": "Important:", + "seedPhraseWarning": "Write down your seed phrase and store it in a secure location. You will need it to recover your wallet.", + "copySeedPhrase": "Copy Seed Phrase", + "savedSeed": "I've Saved My Seed", + "importSeedPrompt": "Enter your 12 or 24 word seed phrase to restore an existing wallet.", + "seedPhrase": "Seed Phrase", + "seedPhrasePlaceholder": "Enter your seed phrase", + "importWallet": "Import Wallet", + "ledgerPrompt": "Connect your Ledger hardware wallet to manage your Handshake names securely.", + "instructions": "Instructions:", + "ledgerStep1": "Connect your Ledger device via USB", + "ledgerStep2": "Enter your PIN on the device", + "ledgerStep3": "Open the Handshake app on your Ledger", + "ledgerStep4": "Click \"Connect\" below", + "connectLedgerButton": "Connect Ledger" + }, + "settings": { + "general": "General", + "wallet": "Wallet", + "connection": "Connection", + "advanced": "Advanced", + "language": "Language", + "blockExplorer": "Block Explorer", + "theme": "Theme", + "light": "Light", + "dark": "Dark", + "system": "System", + "walletDirectory": "Wallet Directory", + "walletDirectoryInfo": "Location where wallet data is stored", + "changeDirectory": "Change Directory", + "backup": "Backup", + "backupInfo": "Export wallet seed phrase and settings", + "exportBackup": "Export Backup", + "rescanBlockchain": "Rescan Blockchain", + "rescanInfo": "Re-scan the blockchain for transactions", + "rescan": "Rescan", + "connectionType": "Connection Type", + "fullNode": "Full Node", + "spv": "SPV (Light)", + "customRPC": "Custom RPC", + "network": "Network", + "mainnet": "Mainnet", + "testnet": "Testnet", + "regtest": "Regtest", + "simnet": "Simnet", + "apiKey": "API Key", + "apiKeyInfo": "Node API authentication key", + "analytics": "Analytics", + "analyticsInfo": "Share anonymous usage data to improve Bob", + "developerOptions": "Developer Options", + "openDebugConsole": "Open Debug Console" + }, + "common": { + "hns": "HNS", + "usd": "USD", + "loading": "Loading...", + "save": "Save", + "cancel": "Cancel", + "close": "Close", + "confirm": "Confirm", + "continue": "Continue", + "back": "Back", + "next": "Next", + "done": "Done", + "error": "Error", + "success": "Success", + "warning": "Warning", + "info": "Info" + }, + "app.boot.download-check": "Checking for Updates", + "app.boot.folder-check": "Setup Check", + "app.boot.loaded-runtime": "Application Loaded", + "app.boot.server-check": "Checking Server", + "app.boot.start-runtime": "Starting Desktop", + "app.core.ui.search": "Search", + "app.lthn.chain.daemons.lethean-blockchain-export": "Blockchain Export", + "app.lthn.chain.daemons.lethean-blockchain-import": "Blockchain Import", + "app.lthn.chain.daemons.lethean-wallet-cli": "Wallet CLI", + "app.lthn.chain.daemons.lethean-wallet-rpc": "Wallet RPC", + "app.lthn.chain.daemons.lethean-wallet-vpn-rpc": "Exit Node Wallet", + "app.lthn.chain.daemons.letheand": "Blockchain Service", + "app.lthn.chain.desc.no_transactions": "There were no transactions included in this block", + "app.lthn.chain.description": "Lethean (LTHN) Blockchain Stats", + "app.lthn.chain.heading": "Lethean Blockchain Stats", + "app.lthn.chain.menu.blocks": "Blocks", + "app.lthn.chain.menu.configuration": "Configuration", + "app.lthn.chain.menu.raw_data": "Raw Block Data", + "app.lthn.chain.menu.stats": "Stats", + "app.lthn.chain.table.age": "Age", + "app.lthn.chain.table.depth": "Depth", + "app.lthn.chain.table.difficulty": "Difficulty", + "app.lthn.chain.table.height": "Height", + "app.lthn.chain.table.reward": "Reward", + "app.lthn.chain.table.time": "Time", + "app.lthn.chain.table.title.chain-status": "Blockchain Status", + "app.lthn.chain.table.title.recent-blocks": "Recently Created Blocks", + "app.lthn.chain.title": "Blockchain Explorer", + "app.lthn.chain.words.alt_blocks_count": "Alt Blocks", + "app.lthn.chain.words.block_size": "Block Size", + "app.lthn.chain.words.block_size_limit": "Block Size Limit", + "app.lthn.chain.words.chain_stat": "Chain Stats", + "app.lthn.chain.words.chain_stat_value": "Node Reported Value", + "app.lthn.chain.words.cumulative_difficulty": "Cumulative Difficulty", + "app.lthn.chain.words.depth": "Depth from Top Block", + "app.lthn.chain.words.difficulty": "Difficulty", + "app.lthn.chain.words.grey_peerlist_size": "P2P Grey Peers", + "app.lthn.chain.words.hash": "Hash", + "app.lthn.chain.words.height": "Height", + "app.lthn.chain.words.incoming_connections_count": "P2P Incoming", + "app.lthn.chain.words.install-blockchain": "Install Blockchain", + "app.lthn.chain.words.last_block_time": "Synchronised to Block:", + "app.lthn.chain.words.loading-data": "Loading Blockchain Data", + "app.lthn.chain.words.major_version": "Major Version", + "app.lthn.chain.words.miner_transaction": "Miner Transaction", + "app.lthn.chain.words.miner_tx": "POW Miner Transaction", + "app.lthn.chain.words.minor_version": "Minor Version", + "app.lthn.chain.words.nonce": "Block Solution", + "app.lthn.chain.words.orphan_status": "Valid Block", + "app.lthn.chain.words.outgoing_connections_count": "P2P Out", + "app.lthn.chain.words.reward": "Reward", + "app.lthn.chain.words.start_time": "Start Time", + "app.lthn.chain.words.status": "Status", + "app.lthn.chain.words.target": "Target", + "app.lthn.chain.words.target_height": "Target Height", + "app.lthn.chain.words.testnet": "Testnet", + "app.lthn.chain.words.timestamp": "Timestamp", + "app.lthn.chain.words.top_height": "Newest Block", + "app.lthn.chain.words.tx_count": "Total Transactions", + "app.lthn.chain.words.tx_pool_size": "Pending Transactions", + "app.lthn.chain.words.unlock_time": "Unlock Block", + "app.lthn.chain.words.valid": "Valid Block", + "app.lthn.chain.words.version": "Block Structure Version", + "app.lthn.chain.words.white_peerlist_size": "P2P Whitelist", + "app.lthn.console.title": "Console", + "app.lthn.wallet.button.create-wallet": "Create Wallet", + "app.lthn.wallet.button.restore-wallet": "Restore Wallet", + "app.lthn.wallet.button.unlock-wallet": "Unlock", + "app.lthn.wallet.label.address": "Address", + "app.lthn.wallet.label.autosave": "Save Open Wallet", + "app.lthn.wallet.label.filename": "Filename", + "app.lthn.wallet.label.restore-height": "Restore Height", + "app.lthn.wallet.label.spend-key": "Spend Key", + "app.lthn.wallet.label.view-key": "View Key", + "app.lthn.wallet.label.wallet-password": "Wallet Password", + "app.lthn.wallet.label.wallet-password-confirm": "Confirm Password", + "app.lthn.wallet.titles.new-wallet": "Make New Wallet", + "app.lthn.wallet.titles.restore-keys": "Restore From Keys", + "app.lthn.wallet.titles.restore-seed": "Restore From Seed", + "app.lthn.wallet.titles.unlock-wallet": "Unlock Wallet", + "app.lthn.wallet.titles.wallet-transactions": "Wallet Transactions", + "app.market.apps": "App Marketplace", + "app.market.dashboard": "Dashboard", + "app.market.installed": "Installed Apps", + "app.market.no-apps-installed": "You have no apps installed.", + "app.market.view-installable-apps": "View Installable Apps", + "app.title": "Lethean Desktop", + "charts.network-hashrate.subtitle": "Data Provided by", + "charts.network-hashrate.title": "Network Hash Rate", + "lang.de": "German", + "lang.en": "English", + "lang.es": "Spanish", + "lang.fr": "French", + "lang.ru": "Russian", + "lang.uk": "Ukrainian (Ukraine)", + "lang.zh": "Chinese", + "menu.about": "About", + "menu.activity": "Activity", + "menu.api": "api", + "menu.blockchain": "Blockchain", + "menu.build": "Build", + "menu.dashboard": "Dashboard", + "menu.docs": "Documentation", + "menu.documentation": "Documentation", + "menu.explorer": "Explorer", + "menu.help": "Help", + "menu.hub-admin": "Admin Hub", + "menu.hub-client": "Client Hub", + "menu.hub-developer": "Developer", + "menu.hub-gateway": "Gateway", + "menu.hub-server": "Server Hub", + "menu.info": "info", + "menu.logout": "Sign Out", + "menu.mining": "Mining", + "menu.settings": "Settings", + "menu.vpn": "VPN", + "menu.wallet": "Wallet", + "menu.your-profile": "Your Profile", + "view.dashboard.description": "Lethean (LTHN) Web app", + "view.dashboard.heading": "Lethean Dashboard", + "view.dashboard.title": "Lethean (LTHN)", + "view.wallets.description": "Crypto Wallet Manager", + "view.wallets.heading": "Wallet Manager", + "view.wallets.title": "Wallets", + "words.actions.add": "Add", + "words.actions.clone": "Clone", + "words.actions.edit": "Edit", + "words.actions.install": "Install", + "words.actions.new": "New", + "words.actions.remove": "Remove", + "words.actions.report": "Report", + "words.actions.save": "Save", + "words.states.installing": "Installing", + "words.states.installing_desc": "We are downloading the blockchain executables from GitHub to your Lethean user directory.", + "words.states.loading": "Loading", + "words.states.not_installed": "Not Installed", + "words.states.not_installed_desc": "Click Install Blockchain to download the latest Lethean Blockchain CLI", + "words.things.button": "Button", + "words.things.documentation": "Documentation", + "words.things.menu": "Menu", + "words.things.mining-pool": "Mining Pool", + "words.things.page": "Page", + "words.things.problem": "Problem", + "words.things.type": "Type", + "words.time.past.day": "a day ago", + "words.time.past.days": "days ago", + "words.time.past.hour": "an hour ago", + "words.time.past.hours": "hours ago", + "words.time.past.minute": "a minute ago", + "words.time.past.minutes": "minutes ago", + "words.time.past.month": "a month ago", + "words.time.past.months": " months ago", + "words.time.past.seconds": "a few seconds ago", + "words.time.past.year": "a year ago", + "words.time.past.years": "years ago" +} diff --git a/cmd/lthn-desktop/frontend.old/public/icons/icon-128x128.png b/cmd/lthn-desktop/frontend.old/public/icons/icon-128x128.png new file mode 100644 index 0000000..5a9a2cc Binary files /dev/null and b/cmd/lthn-desktop/frontend.old/public/icons/icon-128x128.png differ diff --git a/cmd/lthn-desktop/frontend.old/public/icons/icon-144x144.png b/cmd/lthn-desktop/frontend.old/public/icons/icon-144x144.png new file mode 100644 index 0000000..11702cd Binary files /dev/null and b/cmd/lthn-desktop/frontend.old/public/icons/icon-144x144.png differ diff --git a/cmd/lthn-desktop/frontend.old/public/icons/icon-152x152.png b/cmd/lthn-desktop/frontend.old/public/icons/icon-152x152.png new file mode 100644 index 0000000..ff4e06b Binary files /dev/null and b/cmd/lthn-desktop/frontend.old/public/icons/icon-152x152.png differ diff --git a/cmd/lthn-desktop/frontend.old/public/icons/icon-192x192.png b/cmd/lthn-desktop/frontend.old/public/icons/icon-192x192.png new file mode 100644 index 0000000..afd36a4 Binary files /dev/null and b/cmd/lthn-desktop/frontend.old/public/icons/icon-192x192.png differ diff --git a/cmd/lthn-desktop/frontend.old/public/icons/icon-384x384.png b/cmd/lthn-desktop/frontend.old/public/icons/icon-384x384.png new file mode 100644 index 0000000..613ac79 Binary files /dev/null and b/cmd/lthn-desktop/frontend.old/public/icons/icon-384x384.png differ diff --git a/cmd/lthn-desktop/frontend.old/public/icons/icon-512x512.png b/cmd/lthn-desktop/frontend.old/public/icons/icon-512x512.png new file mode 100644 index 0000000..7574990 Binary files /dev/null and b/cmd/lthn-desktop/frontend.old/public/icons/icon-512x512.png differ diff --git a/cmd/lthn-desktop/frontend.old/public/icons/icon-72x72.png b/cmd/lthn-desktop/frontend.old/public/icons/icon-72x72.png new file mode 100644 index 0000000..033724e Binary files /dev/null and b/cmd/lthn-desktop/frontend.old/public/icons/icon-72x72.png differ diff --git a/cmd/lthn-desktop/frontend.old/public/icons/icon-96x96.png b/cmd/lthn-desktop/frontend.old/public/icons/icon-96x96.png new file mode 100644 index 0000000..3090dc2 Binary files /dev/null and b/cmd/lthn-desktop/frontend.old/public/icons/icon-96x96.png differ diff --git a/cmd/lthn-desktop/frontend.old/public/manifest.webmanifest b/cmd/lthn-desktop/frontend.old/public/manifest.webmanifest new file mode 100644 index 0000000..eb768a0 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/public/manifest.webmanifest @@ -0,0 +1,57 @@ +{ + "name": "Core Framework", + "short_name": "Core", + "display": "standalone", + "scope": "./", + "start_url": "./", + "icons": [ + { + "src": "icons/icon-72x72.png", + "sizes": "72x72", + "type": "image/png", + "purpose": "maskable any" + }, + { + "src": "icons/icon-96x96.png", + "sizes": "96x96", + "type": "image/png", + "purpose": "maskable any" + }, + { + "src": "icons/icon-128x128.png", + "sizes": "128x128", + "type": "image/png", + "purpose": "maskable any" + }, + { + "src": "icons/icon-144x144.png", + "sizes": "144x144", + "type": "image/png", + "purpose": "maskable any" + }, + { + "src": "icons/icon-152x152.png", + "sizes": "152x152", + "type": "image/png", + "purpose": "maskable any" + }, + { + "src": "icons/icon-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable any" + }, + { + "src": "icons/icon-384x384.png", + "sizes": "384x384", + "type": "image/png", + "purpose": "maskable any" + }, + { + "src": "icons/icon-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable any" + } + ] +} diff --git a/cmd/lthn-desktop/frontend.old/public/robots.txt b/cmd/lthn-desktop/frontend.old/public/robots.txt new file mode 100644 index 0000000..bfa8dd7 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/public/robots.txt @@ -0,0 +1,3 @@ +User-agent: * +Disallow: +Sitemap: /sitemap.xml diff --git a/cmd/lthn-desktop/frontend.old/public/sitemap.xml b/cmd/lthn-desktop/frontend.old/public/sitemap.xml new file mode 100644 index 0000000..6379a77 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/public/sitemap.xml @@ -0,0 +1,76 @@ + + + + + + + https://angular.ganatan.com/ + 2023-12-08T12:51:22+00:00 + 1.00 + + + https://angular.ganatan.com/about + 2023-12-08T12:51:22+00:00 + 0.80 + + + https://angular.ganatan.com/contact + 2023-12-08T12:51:22+00:00 + 0.80 + + + https://angular.ganatan.com/bootstrap + 2023-12-08T12:51:22+00:00 + 0.80 + + + https://angular.ganatan.com/services + 2023-12-08T12:51:22+00:00 + 0.80 + + + https://angular.ganatan.com/components + 2023-12-08T12:51:22+00:00 + 0.80 + + + https://angular.ganatan.com/httpclient + 2023-12-08T12:51:22+00:00 + 0.80 + + + https://angular.ganatan.com/forms + 2023-12-08T12:51:22+00:00 + 0.80 + + + https://angular.ganatan.com/about/experience + 2023-12-08T12:51:22+00:00 + 0.64 + + + https://angular.ganatan.com/about/skill + 2023-12-08T12:51:22+00:00 + 0.64 + + + https://angular.ganatan.com/contact/mailing + 2023-12-08T12:51:22+00:00 + 0.64 + + + https://angular.ganatan.com/contact/mapping + 2023-12-08T12:51:22+00:00 + 0.64 + + + https://angular.ganatan.com/contact/website + 2023-12-08T12:51:22+00:00 + 0.64 + + + diff --git a/cmd/lthn-desktop/frontend.old/src/app/app.config.server.ts b/cmd/lthn-desktop/frontend.old/src/app/app.config.server.ts new file mode 100644 index 0000000..ffca419 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/app.config.server.ts @@ -0,0 +1,15 @@ +import { mergeApplicationConfig, ApplicationConfig } from '@angular/core'; +import { provideServerRendering, withRoutes } from '@angular/ssr'; +import { appConfig } from './app.config'; +import { serverRoutes } from './app.routes.server'; +import { TranslateLoader } from '@ngx-translate/core'; +import { TranslateServerLoader } from './translate-server.loader'; + +const serverConfig: ApplicationConfig = { + providers: [ + provideServerRendering(withRoutes(serverRoutes)), + { provide: TranslateLoader, useClass: TranslateServerLoader } + ] +}; + +export const config = mergeApplicationConfig(appConfig, serverConfig); diff --git a/cmd/lthn-desktop/frontend.old/src/app/app.config.ts b/cmd/lthn-desktop/frontend.old/src/app/app.config.ts new file mode 100644 index 0000000..d9dba88 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/app.config.ts @@ -0,0 +1,42 @@ +import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection, isDevMode, importProvidersFrom } from '@angular/core'; +import { provideRouter } from '@angular/router'; +import { HttpClient, provideHttpClient, withFetch } from '@angular/common/http'; +import { TranslateModule } from '@ngx-translate/core'; +import { provideTranslateHttpLoader } from '@ngx-translate/http-loader'; + +import { routes } from './app.routes'; +import { withInMemoryScrolling } from '@angular/router'; +import { provideClientHydration, withEventReplay } from '@angular/platform-browser'; +import { provideServiceWorker } from '@angular/service-worker'; + +export const appConfig: ApplicationConfig = { + providers: [ + provideHttpClient( + withFetch(), + ), + provideBrowserGlobalErrorListeners(), + provideZoneChangeDetection({ eventCoalescing: true }), + provideRouter(routes, + withInMemoryScrolling({ + scrollPositionRestoration: 'enabled', + anchorScrolling: 'enabled', + }), + ), + provideClientHydration(withEventReplay()), + provideServiceWorker('ngsw-worker.js', { + enabled: !isDevMode(), + registrationStrategy: 'registerWhenStable:30000' + }), + + // Add ngx-translate providers + importProvidersFrom( + TranslateModule.forRoot({ + fallbackLang: 'en' + }) + ), + provideTranslateHttpLoader({ + prefix: './i18n/', + suffix: '.json' + }) + ] +}; diff --git a/cmd/lthn-desktop/frontend.old/src/app/app.css b/cmd/lthn-desktop/frontend.old/src/app/app.css new file mode 100644 index 0000000..e69de29 diff --git a/cmd/lthn-desktop/frontend.old/src/app/app.html b/cmd/lthn-desktop/frontend.old/src/app/app.html new file mode 100644 index 0000000..f42f6e8 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/app.html @@ -0,0 +1,140 @@ + + + +
+ + + + + + + +
+ +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cmd/lthn-desktop/frontend.old/src/app/app.routes.server.ts b/cmd/lthn-desktop/frontend.old/src/app/app.routes.server.ts new file mode 100644 index 0000000..ffd37b1 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/app.routes.server.ts @@ -0,0 +1,8 @@ +import { RenderMode, ServerRoute } from '@angular/ssr'; + +export const serverRoutes: ServerRoute[] = [ + { + path: '**', + renderMode: RenderMode.Prerender + } +]; diff --git a/cmd/lthn-desktop/frontend.old/src/app/app.routes.ts b/cmd/lthn-desktop/frontend.old/src/app/app.routes.ts new file mode 100644 index 0000000..ddbd37b --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/app.routes.ts @@ -0,0 +1,25 @@ +import { Routes } from '@angular/router'; +import { HomePage } from './pages/home/home.page'; +import { SearchTldPage } from './pages/search-tld/search-tld.page'; +import { OnboardingPage } from './pages/onboarding/onboarding.page'; +import { SettingsPage } from './pages/settings/settings.page'; +import { DomainManagerPage } from './pages/domain-manager/domain-manager.page'; +import { ExchangePage } from './pages/exchange/exchange.page'; + +export const routes: Routes = [ + { path: '', redirectTo: '/account', pathMatch: 'full' }, + { path: 'account', component: HomePage, title: 'Portfolio • Bob Wallet' }, + { path: 'send', component: HomePage, title: 'Send • Bob Wallet' }, + { path: 'receive', component: HomePage, title: 'Receive • Bob Wallet' }, + { path: 'domain-manager', component: DomainManagerPage, title: 'Domain Manager • Bob Wallet' }, + { path: 'domains', component: SearchTldPage, title: 'Browse Domains • Bob Wallet' }, + { path: 'bids', component: HomePage, title: 'Your Bids • Bob Wallet' }, + { path: 'watching', component: HomePage, title: 'Watching • Bob Wallet' }, + { path: 'exchange', component: ExchangePage, title: 'Exchange • Bob Wallet' }, + { path: 'get-coins', component: HomePage, title: 'Claim Airdrop • Bob Wallet' }, + { path: 'sign-message', component: HomePage, title: 'Sign Message • Bob Wallet' }, + { path: 'verify-message', component: HomePage, title: 'Verify Message • Bob Wallet' }, + { path: 'settings', component: SettingsPage, title: 'Settings • Bob Wallet' }, + { path: 'onboarding', component: OnboardingPage, title: 'Onboarding • Bob Wallet' }, + { path: '**', redirectTo: '/account' } +]; diff --git a/cmd/lthn-desktop/frontend.old/src/app/app.spec.ts b/cmd/lthn-desktop/frontend.old/src/app/app.spec.ts new file mode 100644 index 0000000..aa2a763 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/app.spec.ts @@ -0,0 +1,24 @@ +import { TestBed } from '@angular/core/testing'; +import { App } from './app'; +import { ActivatedRoute } from '@angular/router'; + +describe('App', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [App], + providers: [ + { + provide: ActivatedRoute, + useValue: {} + } + ] + }).compileComponents(); + }); + + it('should create the app', () => { + const fixture = TestBed.createComponent(App); + const app = fixture.componentInstance; + expect(app).toBeTruthy(); + }); + +}); diff --git a/cmd/lthn-desktop/frontend.old/src/app/app.ts b/cmd/lthn-desktop/frontend.old/src/app/app.ts new file mode 100644 index 0000000..d479b79 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/app.ts @@ -0,0 +1,40 @@ +import { Component, OnInit, Inject, PLATFORM_ID, CUSTOM_ELEMENTS_SCHEMA, ViewChild, ElementRef } from '@angular/core'; +import { CommonModule, DOCUMENT, isPlatformBrowser } from '@angular/common'; +import {RouterLink, RouterOutlet} from '@angular/router'; +import { FooterComponent } from './shared/components/footer/footer.component'; +import { TranslateModule, TranslateService } from '@ngx-translate/core'; +import {Subscription} from 'rxjs'; + +@Component({ + selector: 'app-root', + imports: [ + CommonModule, + RouterOutlet, + FooterComponent, + TranslateModule, + RouterLink + ], + templateUrl: './app.html', + styleUrl: './app.css', + standalone: true, + schemas: [CUSTOM_ELEMENTS_SCHEMA], +}) +export class App { + @ViewChild('sidebar', { read: ElementRef, static: false }) sidebar?: ElementRef; + + sidebarOpen = false; + userMenuOpen = false; + currentRole = 'Developer'; + + time: string = ''; + + constructor( + @Inject(DOCUMENT) private document: Document, + @Inject(PLATFORM_ID) private platformId: object, + private translateService: TranslateService + ) { + // Set default language + this.translateService.use('en'); + } + +} diff --git a/cmd/lthn-desktop/frontend.old/src/app/core/services/seo/seo.service.spec.ts b/cmd/lthn-desktop/frontend.old/src/app/core/services/seo/seo.service.spec.ts new file mode 100644 index 0000000..eed57e9 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/core/services/seo/seo.service.spec.ts @@ -0,0 +1,63 @@ +import { TestBed } from '@angular/core/testing'; +import { Meta, Title } from '@angular/platform-browser'; +import { SeoService } from './seo.service'; +import { itGood, itBad, itUgly, trio } from 'src/testing/gbu'; + +describe('SeoService', () => { + let service: SeoService; + let metaSpy: jasmine.SpyObj; + let titleSpy: jasmine.SpyObj; + + beforeEach(() => { + metaSpy = jasmine.createSpyObj('Meta', ['updateTag']); + titleSpy = jasmine.createSpyObj('Title', ['setTitle']); + + TestBed.configureTestingModule({ + providers: [ + SeoService, + { provide: Meta, useValue: metaSpy }, + { provide: Title, useValue: titleSpy } + ] + }); + service = TestBed.inject(SeoService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); + + describe('setMetaTitle', () => { + trio('sets document title', { + good: () => { + service.setMetaTitle('Hello'); + expect(titleSpy.setTitle).toHaveBeenCalledOnceWith('Hello'); + }, + bad: () => { + service.setMetaTitle(''); + expect(titleSpy.setTitle).toHaveBeenCalledWith(''); + }, + ugly: () => { + // Force invalid via any cast; ensure we do not throw + expect(() => service.setMetaTitle(null as any)).not.toThrow(); + expect(titleSpy.setTitle).toHaveBeenCalledWith(null as any); + } + }); + }); + + describe('setMetaDescription', () => { + itGood('updates description meta tag', () => { + service.setMetaDescription('desc'); + expect(metaSpy.updateTag).toHaveBeenCalledWith({ name: 'description', content: 'desc' }); + }); + + itBad('handles empty description', () => { + service.setMetaDescription(''); + expect(metaSpy.updateTag).toHaveBeenCalledWith({ name: 'description', content: '' }); + }); + + itUgly('does not throw on invalid description', () => { + expect(() => service.setMetaDescription(null as any)).not.toThrow(); + expect(metaSpy.updateTag).toHaveBeenCalledWith({ name: 'description', content: null as any }); + }); + }); +}); diff --git a/cmd/lthn-desktop/frontend.old/src/app/core/services/seo/seo.service.ts b/cmd/lthn-desktop/frontend.old/src/app/core/services/seo/seo.service.ts new file mode 100644 index 0000000..2e98271 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/core/services/seo/seo.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { Meta, Title } from '@angular/platform-browser'; + +@Injectable({ + providedIn: 'root' +}) +export class SeoService { + + constructor( + private meta: Meta, + private titleService: Title) { + + } + + public setMetaDescription(content: string) { + + this.meta.updateTag( + { + name: 'description', + content: content + }); + } + + public setMetaTitle(title:string) { + + this.titleService.setTitle(title); + + } + +} diff --git a/cmd/lthn-desktop/frontend.old/src/app/custom-elements.module.ts b/cmd/lthn-desktop/frontend.old/src/app/custom-elements.module.ts new file mode 100644 index 0000000..e6bf0ca --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/custom-elements.module.ts @@ -0,0 +1,8 @@ +import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; +import { } from "@awesome.me/webawesome/dist/webawesome.loader.js" +// This module enables Angular to accept unknown custom elements (Web Awesome components) +// without throwing template parse errors. +@NgModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], +}) +export class CustomElementsModule {} diff --git a/cmd/lthn-desktop/frontend.old/src/app/pages/domain-manager/domain-manager.page.spec.ts b/cmd/lthn-desktop/frontend.old/src/app/pages/domain-manager/domain-manager.page.spec.ts new file mode 100644 index 0000000..b819f6c --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/pages/domain-manager/domain-manager.page.spec.ts @@ -0,0 +1,81 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { DomainManagerPage } from './domain-manager.page'; +import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; + +describe('DomainManagerPage', () => { + let component: DomainManagerPage; + let fixture: ComponentFixture<DomainManagerPage>; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [DomainManagerPage, RouterTestingModule], + schemas: [CUSTOM_ELEMENTS_SCHEMA] + }).compileComponents(); + + fixture = TestBed.createComponent(DomainManagerPage); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + // NEW: Verify component is an instance of DomainManagerPage + expect(component instanceof DomainManagerPage).toBe(true); + }); + + it('should initialize with empty searchQuery', () => { + expect(component.searchQuery).toBe(''); + // NEW: Verify searchQuery is a string type + expect(typeof component.searchQuery).toBe('string'); + }); + + it('should initialize with empty domains array', () => { + expect(component.domains).toEqual([]); + // NEW: Verify domains is an array + expect(Array.isArray(component.domains)).toBe(true); + }); + + it('should render domain manager header', () => { + const compiled = fixture.nativeElement as HTMLElement; + const header = compiled.querySelector('.domain-manager__header'); + expect(header).toBeTruthy(); + // NEW: Verify header contains actions section + const actions = header?.querySelector('.domain-manager__actions'); + expect(actions).toBeTruthy(); + }); + + it('should display search input', () => { + const compiled = fixture.nativeElement as HTMLElement; + const searchInput = compiled.querySelector('wa-input'); + expect(searchInput).toBeTruthy(); + // NEW: Verify search input has placeholder attribute + expect(searchInput?.hasAttribute('placeholder')).toBe(true); + }); + + it('should show empty state when no domains', () => { + const compiled = fixture.nativeElement as HTMLElement; + const emptyState = compiled.querySelector('.domain-manager__empty'); + expect(emptyState).toBeTruthy(); + expect(emptyState?.textContent).toContain('You do not own any names yet'); + // NEW: Verify empty state is within a callout + const callout = compiled.querySelector('wa-callout'); + expect(callout).toBeTruthy(); + }); + + it('should render action buttons in header', () => { + const compiled = fixture.nativeElement as HTMLElement; + const buttons = compiled.querySelectorAll('.domain-manager__actions wa-button'); + expect(buttons.length).toBeGreaterThan(0); + // NEW: Verify exactly 3 action buttons (Export, Bulk Transfer, Claim Name) + expect(buttons.length).toBe(3); + }); + + it('should have viewDomain method', () => { + spyOn(console, 'log'); + component.viewDomain('testdomain'); + expect(console.log).toHaveBeenCalledWith('View domain:', 'testdomain'); + // NEW: Verify viewDomain is a function + expect(typeof component.viewDomain).toBe('function'); + }); +}); diff --git a/cmd/lthn-desktop/frontend.old/src/app/pages/domain-manager/domain-manager.page.ts b/cmd/lthn-desktop/frontend.old/src/app/pages/domain-manager/domain-manager.page.ts new file mode 100644 index 0000000..0b76f2e --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/pages/domain-manager/domain-manager.page.ts @@ -0,0 +1,107 @@ +import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; + +import { FormsModule } from '@angular/forms'; +import { Router } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; + +@Component({ + selector: 'app-domain-manager-page', + imports: [FormsModule, TranslateModule], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + template: ` + <div class="domain-manager"> + <div class="domain-manager__header"> + <wa-input [placeholder]="'domainManager.searchPlaceholder' | translate" style="flex: 1; max-width: 400px;"> + <input slot="input" [(ngModel)]="searchQuery" /> + </wa-input> + + <div class="domain-manager__actions"> + <wa-button size="small" variant="neutral"> + <wa-icon slot="prefix" name="fa-solid fa-download"></wa-icon> + {{ 'domainManager.export' | translate }} + </wa-button> + <wa-button size="small" variant="neutral"> + <wa-icon slot="prefix" name="fa-solid fa-arrow-right-arrow-left"></wa-icon> + {{ 'domainManager.bulkTransfer' | translate }} + </wa-button> + <wa-button size="small" variant="primary"> + <wa-icon slot="prefix" name="fa-solid fa-receipt"></wa-icon> + {{ 'domainManager.claimNamePayment' | translate }} + </wa-button> + </div> + </div> + + @if (domains.length === 0) { + <div class="domain-manager__content"> + <wa-callout variant="neutral"> + <div class="domain-manager__empty"> + <wa-icon name="fa-solid fa-folder-open" style="font-size: 3rem; opacity: 0.3; margin-bottom: 1rem;"></wa-icon> + <p>{{ 'domainManager.emptyState' | translate }}</p> + <p style="margin-top: 0.5rem;"> + <a routerLink="/domains" style="color: var(--wa-color-primary-600); text-decoration: underline;">{{ 'domainManager.browseDomainsLink' | translate }}</a> {{ 'domainManager.toGetStarted' | translate }} + </p> + </div> + </wa-callout> + </div> + } + + @if (domains.length > 0) { + <div class="domain-manager__content"> + <div class="domain-manager__table"> + <div class="table-header"> + <div class="table-col">{{ 'domainManager.name' | translate }}</div> + <div class="table-col">{{ 'domainManager.expires' | translate }}</div> + <div class="table-col">{{ 'domainManager.highestBid' | translate }}</div> + </div> + @for (domain of domains; track domain) { + <div class="table-row" (click)="viewDomain(domain.name)"> + <div class="table-col">{{domain.name}}/</div> + <div class="table-col">{{domain.expires}}</div> + <div class="table-col">{{domain.highestBid}} {{ 'common.hns' | translate }}</div> + </div> + } + </div> + <div class="domain-manager__pagination"> + <wa-select size="small" value="10" style="width: 80px;"> + <wa-option value="5">5</wa-option> + <wa-option value="10">10</wa-option> + <wa-option value="20">20</wa-option> + <wa-option value="50">50</wa-option> + </wa-select> + <span class="pagination-info">{{ 'domainManager.showingDomains' | translate: {count: domains.length} }}</span> + </div> + </div> + } + </div> + `, + styles: [` + .domain-manager { display: flex; flex-direction: column; gap: 1.5rem; } + + .domain-manager__header { display: flex; gap: 1rem; align-items: center; flex-wrap: wrap; } + .domain-manager__actions { display: flex; gap: 0.5rem; } + + .domain-manager__content { } + .domain-manager__empty { text-align: center; padding: 2rem; } + .domain-manager__empty p { margin: 0; color: var(--wa-color-neutral-600, #4b5563); } + + .domain-manager__table { border: 1px solid var(--wa-color-neutral-200, #e5e7eb); border-radius: 0.5rem; overflow: hidden; } + .table-header { display: grid; grid-template-columns: 2fr 1fr 1fr; background: var(--wa-color-neutral-50, #fafafa); font-weight: 600; font-size: 0.875rem; } + .table-row { display: grid; grid-template-columns: 2fr 1fr 1fr; border-top: 1px solid var(--wa-color-neutral-200, #e5e7eb); cursor: pointer; transition: background 0.15s; } + .table-row:hover { background: var(--wa-color-neutral-50, #fafafa); } + .table-col { padding: 0.75rem 1rem; } + + .domain-manager__pagination { display: flex; align-items: center; gap: 1rem; margin-top: 1rem; } + .pagination-info { font-size: 0.875rem; color: var(--wa-color-neutral-600, #4b5563); } + `] +}) +export class DomainManagerPage { + searchQuery = ''; + domains: any[] = []; + + constructor(private router: Router) {} + + viewDomain(name: string) { + // Navigate to individual domain view + console.log('View domain:', name); + } +} diff --git a/cmd/lthn-desktop/frontend.old/src/app/pages/exchange/exchange.page.spec.ts b/cmd/lthn-desktop/frontend.old/src/app/pages/exchange/exchange.page.spec.ts new file mode 100644 index 0000000..a1c0c02 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/pages/exchange/exchange.page.spec.ts @@ -0,0 +1,117 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ExchangePage } from './exchange.page'; +import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; + +describe('ExchangePage', () => { + let component: ExchangePage; + let fixture: ComponentFixture<ExchangePage>; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ExchangePage], + schemas: [CUSTOM_ELEMENTS_SCHEMA] + }).compileComponents(); + + fixture = TestBed.createComponent(ExchangePage); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + // NEW: Verify component is an instance of ExchangePage + expect(component instanceof ExchangePage).toBe(true); + }); + + it('should render exchange container', () => { + const compiled = fixture.nativeElement as HTMLElement; + const exchange = compiled.querySelector('.exchange'); + expect(exchange).toBeTruthy(); + // NEW: Verify exchange container has tab group + const tabGroup = exchange?.querySelector('wa-tab-group'); + expect(tabGroup).toBeTruthy(); + }); + + it('should render tab group', () => { + const compiled = fixture.nativeElement as HTMLElement; + const tabGroup = compiled.querySelector('wa-tab-group'); + expect(tabGroup).toBeTruthy(); + // NEW: Verify tab group contains tabs + const tabs = tabGroup?.querySelectorAll('wa-tab'); + expect(tabs?.length).toBeGreaterThan(0); + }); + + it('should render three tabs', () => { + const compiled = fixture.nativeElement as HTMLElement; + const tabs = compiled.querySelectorAll('wa-tab'); + expect(tabs.length).toBe(3); + // NEW: Verify corresponding tab panels exist + const tabPanels = compiled.querySelectorAll('wa-tab-panel'); + expect(tabPanels.length).toBe(3); + }); + + it('should have Listings tab', () => { + const compiled = fixture.nativeElement as HTMLElement; + const tabs = Array.from(compiled.querySelectorAll('wa-tab')); + const listingsTab = tabs.find(tab => tab.textContent?.includes('Listings')); + expect(listingsTab).toBeTruthy(); + // NEW: Verify listings tab has correct panel attribute + expect(listingsTab?.getAttribute('panel')).toBe('listings'); + }); + + it('should have Fills tab', () => { + const compiled = fixture.nativeElement as HTMLElement; + const tabs = Array.from(compiled.querySelectorAll('wa-tab')); + const fillsTab = tabs.find(tab => tab.textContent?.includes('Fills')); + expect(fillsTab).toBeTruthy(); + // NEW: Verify fills tab has correct panel attribute + expect(fillsTab?.getAttribute('panel')).toBe('fills'); + }); + + it('should have Auctions tab', () => { + const compiled = fixture.nativeElement as HTMLElement; + const tabs = Array.from(compiled.querySelectorAll('wa-tab')); + const auctionsTab = tabs.find(tab => tab.textContent?.includes('Auctions')); + expect(auctionsTab).toBeTruthy(); + // NEW: Verify auctions tab has correct panel attribute + expect(auctionsTab?.getAttribute('panel')).toBe('auctions'); + }); + + it('should render three tab panels', () => { + const compiled = fixture.nativeElement as HTMLElement; + const tabPanels = compiled.querySelectorAll('wa-tab-panel'); + expect(tabPanels.length).toBe(3); + // NEW: Verify each panel has correct name attribute + const names = Array.from(tabPanels).map(p => p.getAttribute('name')); + expect(names).toContain('listings'); + expect(names).toContain('fills'); + expect(names).toContain('auctions'); + }); + + it('should display empty state for listings', () => { + const compiled = fixture.nativeElement as HTMLElement; + const listingsPanel = compiled.querySelector('wa-tab-panel[name="listings"]'); + expect(listingsPanel?.textContent).toContain('You have no active listings'); + // NEW: Verify listings panel has callout + const callout = listingsPanel?.querySelector('wa-callout'); + expect(callout).toBeTruthy(); + }); + + it('should display empty state for fills', () => { + const compiled = fixture.nativeElement as HTMLElement; + const fillsPanel = compiled.querySelector('wa-tab-panel[name="fills"]'); + expect(fillsPanel?.textContent).toContain('You have no filled orders'); + // NEW: Verify fills panel has empty state icon + const icon = fillsPanel?.querySelector('wa-icon'); + expect(icon).toBeTruthy(); + }); + + it('should display empty state for auctions', () => { + const compiled = fixture.nativeElement as HTMLElement; + const auctionsPanel = compiled.querySelector('wa-tab-panel[name="auctions"]'); + expect(auctionsPanel?.textContent).toContain('No active auctions found'); + // NEW: Verify auctions panel has refresh button + const button = auctionsPanel?.querySelector('wa-button'); + expect(button).toBeTruthy(); + }); +}); diff --git a/cmd/lthn-desktop/frontend.old/src/app/pages/exchange/exchange.page.ts b/cmd/lthn-desktop/frontend.old/src/app/pages/exchange/exchange.page.ts new file mode 100644 index 0000000..94a3105 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/pages/exchange/exchange.page.ts @@ -0,0 +1,91 @@ +import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; + +import { TranslateModule } from '@ngx-translate/core'; + +@Component({ + selector: 'app-exchange-page', + imports: [TranslateModule], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + template: ` + <div class="exchange"> + <wa-tab-group> + <wa-tab slot="nav" panel="listings">{{ 'exchange.listings' | translate }}</wa-tab> + <wa-tab slot="nav" panel="fills">{{ 'exchange.fills' | translate }}</wa-tab> + <wa-tab slot="nav" panel="auctions">{{ 'exchange.auctions' | translate }}</wa-tab> + + <wa-tab-panel name="listings"> + <div class="exchange__content"> + <div class="exchange__header"> + <h3 style="margin: 0;">{{ 'exchange.yourListings' | translate }}</h3> + <wa-button size="small" variant="primary"> + <wa-icon slot="prefix" name="fa-solid fa-plus"></wa-icon> + {{ 'exchange.createListing' | translate }} + </wa-button> + </div> + + <wa-callout variant="neutral"> + <div class="exchange__empty"> + <wa-icon name="fa-solid fa-store" style="font-size: 2.5rem; opacity: 0.3; margin-bottom: 1rem;"></wa-icon> + <p>{{ 'exchange.noActiveListings' | translate }}</p> + <p style="margin-top: 0.5rem; font-size: 0.875rem; color: var(--wa-color-neutral-600);"> + {{ 'exchange.listDomainsInfo' | translate }} + </p> + </div> + </wa-callout> + </div> + </wa-tab-panel> + + <wa-tab-panel name="fills"> + <div class="exchange__content"> + <div class="exchange__header"> + <h3 style="margin: 0;">{{ 'exchange.yourFills' | translate }}</h3> + </div> + + <wa-callout variant="neutral"> + <div class="exchange__empty"> + <wa-icon name="fa-solid fa-handshake" style="font-size: 2.5rem; opacity: 0.3; margin-bottom: 1rem;"></wa-icon> + <p>{{ 'exchange.noFilledOrders' | translate }}</p> + <p style="margin-top: 0.5rem; font-size: 0.875rem; color: var(--wa-color-neutral-600);"> + {{ 'exchange.completedPurchasesInfo' | translate }} + </p> + </div> + </wa-callout> + </div> + </wa-tab-panel> + + <wa-tab-panel name="auctions"> + <div class="exchange__content"> + <div class="exchange__header"> + <h3 style="margin: 0;">{{ 'exchange.marketplaceAuctions' | translate }}</h3> + <wa-button size="small" variant="neutral"> + <wa-icon slot="prefix" name="fa-solid fa-rotate"></wa-icon> + {{ 'exchange.refresh' | translate }} + </wa-button> + </div> + + <wa-callout variant="neutral"> + <div class="exchange__empty"> + <wa-icon name="fa-solid fa-gavel" style="font-size: 2.5rem; opacity: 0.3; margin-bottom: 1rem;"></wa-icon> + <p>{{ 'exchange.noActiveAuctions' | translate }}</p> + <p style="margin-top: 0.5rem; font-size: 0.875rem; color: var(--wa-color-neutral-600);"> + {{ 'exchange.browseAuctionsInfo' | translate }} + </p> + </div> + </wa-callout> + </div> + </wa-tab-panel> + </wa-tab-group> + </div> + `, + styles: [` + .exchange { } + + .exchange__content { padding: 1.5rem 0; } + + .exchange__header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1.5rem; } + + .exchange__empty { text-align: center; padding: 2rem 1rem; } + .exchange__empty p { margin: 0; color: var(--wa-color-neutral-700, #374151); } + `] +}) +export class ExchangePage {} diff --git a/cmd/lthn-desktop/frontend.old/src/app/pages/home/home.page.spec.ts b/cmd/lthn-desktop/frontend.old/src/app/pages/home/home.page.spec.ts new file mode 100644 index 0000000..d4c4859 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/pages/home/home.page.spec.ts @@ -0,0 +1,86 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { HomePage } from './home.page'; +import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; + +describe('HomePage', () => { + let component: HomePage; + let fixture: ComponentFixture<HomePage>; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [HomePage], + schemas: [CUSTOM_ELEMENTS_SCHEMA] + }).compileComponents(); + + fixture = TestBed.createComponent(HomePage); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + // NEW: Verify component is an instance of HomePage + expect(component instanceof HomePage).toBe(true); + }); + + it('should render account header with balance sections', () => { + const compiled = fixture.nativeElement as HTMLElement; + const header = compiled.querySelector('.account__header'); + expect(header).toBeTruthy(); + // NEW: Verify header has at least 2 sections (spendable and locked) + const sections = compiled.querySelectorAll('.account__header__section'); + expect(sections.length).toBeGreaterThanOrEqual(2); + }); + + it('should display spendable balance section', () => { + const compiled = fixture.nativeElement as HTMLElement; + const spendableLabel = compiled.querySelector('.label'); + expect(spendableLabel?.textContent).toContain('Spendable'); + // NEW: Verify there's an amount display + const amount = compiled.querySelector('.amount'); + expect(amount).toBeTruthy(); + }); + + it('should render actionable cards grid', () => { + const compiled = fixture.nativeElement as HTMLElement; + const cardsGrid = compiled.querySelector('.account__cards'); + expect(cardsGrid).toBeTruthy(); + // NEW: Verify grid contains wa-card elements + const cards = cardsGrid?.querySelectorAll('wa-card'); + expect(cards?.length).toBeGreaterThan(0); + }); + + it('should render six action cards', () => { + const compiled = fixture.nativeElement as HTMLElement; + const cards = compiled.querySelectorAll('wa-card'); + expect(cards.length).toBe(6); + // NEW: Verify each card has an icon + const icons = compiled.querySelectorAll('.account__card__icon'); + expect(icons.length).toBe(6); + }); + + it('should render transaction history section', () => { + const compiled = fixture.nativeElement as HTMLElement; + const transactions = compiled.querySelector('.account__transactions'); + expect(transactions).toBeTruthy(); + // NEW: Verify transactions section has a title + const title = transactions?.querySelector('.account__panel-title'); + expect(title).toBeTruthy(); + }); + + it('should display transaction history title', () => { + const compiled = fixture.nativeElement as HTMLElement; + const title = compiled.querySelector('.account__panel-title'); + expect(title?.textContent).toContain('Transaction History'); + // NEW: Verify title is not empty + expect(title?.textContent?.trim().length).toBeGreaterThan(0); + }); + + it('should show empty state for transactions', () => { + const compiled = fixture.nativeElement as HTMLElement; + const callout = compiled.querySelector('wa-callout'); + expect(callout?.textContent).toContain('No transactions yet'); + // NEW: Verify callout has neutral variant attribute + expect(callout?.getAttribute('variant')).toBe('neutral'); + }); +}); diff --git a/cmd/lthn-desktop/frontend.old/src/app/pages/home/home.page.ts b/cmd/lthn-desktop/frontend.old/src/app/pages/home/home.page.ts new file mode 100644 index 0000000..1ba757a --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/pages/home/home.page.ts @@ -0,0 +1,139 @@ +import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; + +import { TranslateModule } from '@ngx-translate/core'; + +@Component({ + selector: 'app-home-page', + imports: [TranslateModule], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + template: ` + <div class="account"> + <!-- Balance Header --> + <div class="account__header"> + <div class="account__header__section"> + <span class="label">{{ 'home.spendable' | translate }}</span> + <p class="amount">0.00 {{ 'common.hns' | translate }}</p> + <span class="subtext">~$0.00 {{ 'common.usd' | translate }}</span> + </div> + + <div class="account__header__section"> + <span class="label">{{ 'home.locked' | translate }}</span> + <p class="amount">0.00 {{ 'common.hns' | translate }}</p> + <span class="subtext">{{ 'home.inBids' | translate }} (0 {{ 'home.bids' | translate }})</span> + </div> + </div> + + <!-- Actionable Items Cards --> + <div class="account__cards"> + <wa-card class="account__card"> + <div slot="header" class="account__card__header"> + <wa-icon name="fa-solid fa-eye" class="account__card__icon"></wa-icon> + <span>{{ 'home.revealable' | translate }}</span> + </div> + <div class="account__card__content"> + <div class="account__card__amount">0.00 {{ 'common.hns' | translate }}</div> + <div class="account__card__detail">{{ 'home.bidsReadyToReveal' | translate: {count: 0} }}</div> + <div class="account__card__action"> + <wa-button size="small" disabled>{{ 'home.revealAll' | translate }}</wa-button> + </div> + </div> + </wa-card> + + <wa-card class="account__card"> + <div slot="header" class="account__card__header"> + <wa-icon name="fa-solid fa-gift" class="account__card__icon"></wa-icon> + <span>{{ 'home.redeemable' | translate }}</span> + </div> + <div class="account__card__content"> + <div class="account__card__amount">0.00 {{ 'common.hns' | translate }}</div> + <div class="account__card__detail">{{ 'home.bidsReadyToRedeem' | translate: {count: 0} }}</div> + <div class="account__card__action"> + <wa-button size="small" disabled>{{ 'home.redeemAll' | translate }}</wa-button> + </div> + </div> + </wa-card> + + <wa-card class="account__card"> + <div slot="header" class="account__card__header"> + <wa-icon name="fa-solid fa-pen-to-square" class="account__card__icon"></wa-icon> + <span>{{ 'home.registerable' | translate }}</span> + </div> + <div class="account__card__content"> + <div class="account__card__amount">0.00 {{ 'common.hns' | translate }}</div> + <div class="account__card__detail">{{ 'home.namesReadyToRegister' | translate: {count: 0} }}</div> + <div class="account__card__action"> + <wa-button size="small" disabled>{{ 'home.registerAll' | translate }}</wa-button> + </div> + </div> + </wa-card> + + <wa-card class="account__card"> + <div slot="header" class="account__card__header"> + <wa-icon name="fa-solid fa-clock-rotate-left" class="account__card__icon"></wa-icon> + <span>{{ 'home.renewable' | translate }}</span> + </div> + <div class="account__card__content"> + <div class="account__card__detail">{{ 'home.domainsExpiringSoon' | translate: {count: 0} }}</div> + <div class="account__card__action"> + <wa-button size="small" disabled>{{ 'home.renewAll' | translate }}</wa-button> + </div> + </div> + </wa-card> + + <wa-card class="account__card"> + <div slot="header" class="account__card__header"> + <wa-icon name="fa-solid fa-arrow-right-arrow-left" class="account__card__icon"></wa-icon> + <span>{{ 'home.transferring' | translate }}</span> + </div> + <div class="account__card__content"> + <div class="account__card__detail">{{ 'home.domainsInTransfer' | translate: {count: 0} }}</div> + </div> + </wa-card> + + <wa-card class="account__card"> + <div slot="header" class="account__card__header"> + <wa-icon name="fa-solid fa-check" class="account__card__icon"></wa-icon> + <span>{{ 'home.finalizable' | translate }}</span> + </div> + <div class="account__card__content"> + <div class="account__card__detail">{{ 'home.transfersReadyToFinalize' | translate: {count: 0} }}</div> + <div class="account__card__action"> + <wa-button size="small" disabled>{{ 'home.finalizeAll' | translate }}</wa-button> + </div> + </div> + </wa-card> + </div> + + <!-- Transaction History --> + <div class="account__transactions"> + <div class="account__panel-title">{{ 'home.transactionHistory' | translate }}</div> + <wa-callout variant="neutral"> + {{ 'home.noTransactions' | translate }} + </wa-callout> + </div> + </div> + `, + styles: [` + .account { display: flex; flex-direction: column; gap: 1.5rem; } + + .account__header { display: flex; gap: 1rem; flex-wrap: wrap; padding: 1.5rem; background: var(--wa-color-neutral-50, #fafafa); border-radius: 0.5rem; border: 1px solid var(--wa-color-neutral-200, #e5e7eb); } + .account__header__section { display: flex; flex-direction: column; padding: 0 1rem; } + .account__header__section:not(:last-child) { border-right: 1px solid var(--wa-color-neutral-300, #d1d5db); } + .account__header__section .label { font-size: 0.75rem; font-weight: 600; text-transform: uppercase; color: var(--wa-color-neutral-600, #4b5563); margin-bottom: 0.25rem; } + .account__header__section .amount { font-size: 1.875rem; font-weight: 700; color: var(--wa-color-neutral-900, #111827); margin: 0.25rem 0; } + .account__header__section .subtext { font-size: 0.875rem; color: var(--wa-color-neutral-500, #6b7280); } + + .account__cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 1rem; } + .account__card { height: 100%; } + .account__card__header { display: flex; align-items: center; gap: 0.5rem; font-weight: 600; padding: 1rem; } + .account__card__icon { font-size: 1.25rem; color: var(--wa-color-primary-600, #4f46e5); } + .account__card__content { padding: 0 1rem 1rem; } + .account__card__amount { font-size: 1.5rem; font-weight: 700; color: var(--wa-color-neutral-900, #111827); margin-bottom: 0.5rem; } + .account__card__detail { font-size: 0.875rem; color: var(--wa-color-neutral-600, #4b5563); margin-bottom: 0.75rem; } + .account__card__action { margin-top: 0.75rem; } + + .account__transactions { } + .account__panel-title { font-size: 1.25rem; font-weight: 600; margin-bottom: 1rem; } + `] +}) +export class HomePage {} diff --git a/cmd/lthn-desktop/frontend.old/src/app/pages/onboarding/onboarding.page.ts b/cmd/lthn-desktop/frontend.old/src/app/pages/onboarding/onboarding.page.ts new file mode 100644 index 0000000..d9f7fbb --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/pages/onboarding/onboarding.page.ts @@ -0,0 +1,126 @@ +import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; + + +@Component({ + selector: 'app-onboarding-page', + imports: [], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + template: ` + <div class="onboarding"> + <div class="onboarding__header"> + <h2 style="margin: 0;">Welcome to Bob Wallet</h2> + <p style="margin: 0.5rem 0 0 0; color: var(--wa-color-neutral-600);"> + Set up your wallet to start managing Handshake names + </p> + </div> + + <wa-tab-group> + <wa-tab slot="nav" panel="create">Create New Wallet</wa-tab> + <wa-tab slot="nav" panel="import">Import Seed</wa-tab> + <wa-tab slot="nav" panel="ledger">Connect Ledger</wa-tab> + + <wa-tab-panel name="create"> + <div class="onboarding__content"> + <wa-callout variant="info"> + <strong>Important:</strong> Write down your seed phrase and store it in a secure location. + You will need it to recover your wallet. + </wa-callout> + + <div class="seed-display"> + <div class="seed-words"> + <div class="seed-word">abandon</div> + <div class="seed-word">ability</div> + <div class="seed-word">able</div> + <div class="seed-word">about</div> + <div class="seed-word">above</div> + <div class="seed-word">absent</div> + <div class="seed-word">absorb</div> + <div class="seed-word">abstract</div> + <div class="seed-word">absurd</div> + <div class="seed-word">abuse</div> + <div class="seed-word">access</div> + <div class="seed-word">accident</div> + </div> + </div> + + <div class="onboarding__actions"> + <wa-button variant="primary"> + <wa-icon slot="prefix" name="fa-solid fa-copy"></wa-icon> + Copy Seed Phrase + </wa-button> + <wa-button variant="neutral"> + <wa-icon slot="prefix" name="fa-solid fa-check"></wa-icon> + I've Saved My Seed + </wa-button> + </div> + </div> + </wa-tab-panel> + + <wa-tab-panel name="import"> + <div class="onboarding__content"> + <wa-callout variant="neutral"> + Enter your 12 or 24 word seed phrase to restore an existing wallet. + </wa-callout> + + <div style="margin-top: 1.5rem;"> + <label style="display: block; font-weight: 600; margin-bottom: 0.5rem;">Seed Phrase</label> + <wa-input placeholder="Enter your seed phrase" style="width: 100%;"> + <textarea slot="input" rows="4" style="resize: vertical; font-family: monospace;"></textarea> + </wa-input> + </div> + + <div class="onboarding__actions"> + <wa-button variant="primary"> + <wa-icon slot="prefix" name="fa-solid fa-download"></wa-icon> + Import Wallet + </wa-button> + </div> + </div> + </wa-tab-panel> + + <wa-tab-panel name="ledger"> + <div class="onboarding__content"> + <wa-callout variant="info"> + Connect your Ledger hardware wallet to manage your Handshake names securely. + </wa-callout> + + <div class="ledger-instructions"> + <h4 style="margin: 1.5rem 0 1rem 0;">Instructions:</h4> + <ol style="margin: 0; padding-left: 1.5rem; color: var(--wa-color-neutral-700);"> + <li style="margin-bottom: 0.5rem;">Connect your Ledger device via USB</li> + <li style="margin-bottom: 0.5rem;">Enter your PIN on the device</li> + <li style="margin-bottom: 0.5rem;">Open the Handshake app on your Ledger</li> + <li style="margin-bottom: 0.5rem;">Click "Connect" below</li> + </ol> + </div> + + <div class="onboarding__actions"> + <wa-button variant="primary"> + <wa-icon slot="prefix" name="fa-solid fa-usb"></wa-icon> + Connect Ledger + </wa-button> + </div> + </div> + </wa-tab-panel> + </wa-tab-group> + </div> + `, + styles: [` + .onboarding { } + + .onboarding__header { margin-bottom: 2rem; } + + .onboarding__content { padding: 1.5rem 0; } + + .seed-display { margin: 1.5rem 0; padding: 1.5rem; background: var(--wa-color-neutral-50, #fafafa); border: 2px solid var(--wa-color-neutral-200, #e5e7eb); border-radius: 0.5rem; } + + .seed-words { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0.75rem; } + + .seed-word { padding: 0.75rem; background: white; border: 1px solid var(--wa-color-neutral-300, #d1d5db); border-radius: 0.375rem; font-family: monospace; font-size: 0.875rem; text-align: center; } + + .onboarding__actions { display: flex; gap: 0.75rem; margin-top: 1.5rem; } + + .ledger-instructions { margin-top: 1rem; } + `] +}) +export class OnboardingPage {} diff --git a/cmd/lthn-desktop/frontend.old/src/app/pages/search-tld/search-tld.page.ts b/cmd/lthn-desktop/frontend.old/src/app/pages/search-tld/search-tld.page.ts new file mode 100644 index 0000000..02b0ea9 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/pages/search-tld/search-tld.page.ts @@ -0,0 +1,127 @@ +import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; +import { FormsModule } from '@angular/forms'; + +import { Router } from '@angular/router'; + +@Component({ + selector: 'app-search-tld-page', + imports: [FormsModule], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + template: ` + <div class="search-tld"> + <div class="search-tld__header"> + <wa-input placeholder="Search for a name..." style="flex: 1;"> + <input slot="input" [(ngModel)]="query" (keyup.enter)="onSearch()" /> + </wa-input> + <wa-button variant="primary" (click)="onSearch()" [disabled]="loading || !query"> + <wa-icon slot="prefix" name="fa-solid fa-magnifying-glass"></wa-icon> + Search + </wa-button> + </div> + + @if (loading) { + <div class="search-tld__content"> + <wa-spinner></wa-spinner> + <p style="text-align: center; margin-top: 1rem;">Searching...</p> + </div> + } + + @if (!loading && !result) { + <div class="search-tld__content"> + <wa-callout variant="neutral"> + <div style="text-align: center; padding: 1rem;"> + <wa-icon name="fa-solid fa-search" style="font-size: 2.5rem; opacity: 0.3; margin-bottom: 1rem;"></wa-icon> + <p style="margin: 0;">Enter a name to search for availability and auction status.</p> + </div> + </wa-callout> + </div> + } + + @if (!loading && result) { + <div class="search-tld__content"> + <wa-card> + <div slot="header" style="display: flex; justify-content: space-between; align-items: center;"> + <h3 style="margin: 0; font-size: 1.5rem;">{{result.name}}/</h3> + <wa-badge [attr.variant]="result.available ? 'success' : 'warning'"> + {{result.available ? 'Available' : 'In Auction'}} + </wa-badge> + </div> + <div class="search-result"> + <div class="search-result__section"> + <div class="search-result__label">Status</div> + <div class="search-result__value">{{result.status}}</div> + </div> + @if (result.currentBid) { + <div class="search-result__section"> + <div class="search-result__label">Current Bid</div> + <div class="search-result__value">{{result.currentBid}} HNS</div> + </div> + } + @if (result.blocksUntil) { + <div class="search-result__section"> + <div class="search-result__label">{{result.blocksUntilLabel}}</div> + <div class="search-result__value">~{{result.blocksUntil}} blocks</div> + </div> + } + <div class="search-result__actions"> + <wa-button variant="primary" [disabled]="!result.available"> + <wa-icon slot="prefix" name="fa-solid fa-gavel"></wa-icon> + Place Bid + </wa-button> + <wa-button variant="neutral"> + <wa-icon slot="prefix" name="fa-solid fa-eye"></wa-icon> + Watch + </wa-button> + </div> + </div> + </wa-card> + </div> + } + </div> + `, + styles: [` + .search-tld { display: flex; flex-direction: column; gap: 1.5rem; } + + .search-tld__header { display: flex; gap: 1rem; align-items: center; } + + .search-tld__content { } + + .search-result { padding: 1rem 0; } + .search-result__section { display: flex; justify-content: space-between; padding: 0.75rem 0; border-bottom: 1px solid var(--wa-color-neutral-200, #e5e7eb); } + .search-result__section:last-of-type { border-bottom: none; } + .search-result__label { font-size: 0.875rem; font-weight: 600; color: var(--wa-color-neutral-600, #4b5563); } + .search-result__value { font-size: 0.875rem; color: var(--wa-color-neutral-900, #111827); font-weight: 500; } + .search-result__actions { display: flex; gap: 0.75rem; margin-top: 1.5rem; padding-top: 1rem; border-top: 1px solid var(--wa-color-neutral-200, #e5e7eb); } + `] +}) +export class SearchTldPage { + query = ''; + loading = false; + result: any = null; + + constructor(private router: Router) {} + + async onSearch() { + if (!this.query.trim()) return; + + this.loading = true; + this.result = null; + + // Simulate API call + await new Promise(r => setTimeout(r, 800)); + + const name = this.query.trim().replace('/', ''); + const available = Math.random() > 0.3; + + this.result = { + name, + available, + status: available ? 'Available for bidding' : 'Auction in progress', + currentBid: available ? null : (Math.random() * 100).toFixed(2), + blocksUntil: available ? null : Math.floor(Math.random() * 5000), + blocksUntilLabel: available ? null : 'Blocks until reveal' + }; + + this.loading = false; + } +} diff --git a/cmd/lthn-desktop/frontend.old/src/app/pages/settings/settings.page.spec.ts b/cmd/lthn-desktop/frontend.old/src/app/pages/settings/settings.page.spec.ts new file mode 100644 index 0000000..0761225 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/pages/settings/settings.page.spec.ts @@ -0,0 +1,95 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { SettingsPage } from './settings.page'; +import { FileDialogService } from '../../services/file-dialog.service'; +import { ClipboardService } from '../../services/clipboard.service'; +import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; + +describe('SettingsPage', () => { + let component: SettingsPage; + let fixture: ComponentFixture<SettingsPage>; + let fileDialogService: jasmine.SpyObj<FileDialogService>; + let clipboardService: jasmine.SpyObj<ClipboardService>; + + beforeEach(async () => { + const fileDialogSpy = jasmine.createSpyObj('FileDialogService', ['pickDirectory', 'openFile', 'saveFile']); + const clipboardSpy = jasmine.createSpyObj('ClipboardService', ['copyText']); + + await TestBed.configureTestingModule({ + imports: [SettingsPage], + providers: [ + { provide: FileDialogService, useValue: fileDialogSpy }, + { provide: ClipboardService, useValue: clipboardSpy } + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA] + }).compileComponents(); + + fileDialogService = TestBed.inject(FileDialogService) as jasmine.SpyObj<FileDialogService>; + clipboardService = TestBed.inject(ClipboardService) as jasmine.SpyObj<ClipboardService>; + + fixture = TestBed.createComponent(SettingsPage); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + // NEW: Verify component is an instance of SettingsPage + expect(component instanceof SettingsPage).toBe(true); + }); + + it('should initialize with default locale', () => { + expect(component.locale).toBe('en-US'); + // NEW: Verify msg is initialized as empty string + expect(component.msg).toBe(''); + }); + + it('should render settings tabs', () => { + const compiled = fixture.nativeElement as HTMLElement; + const tabGroup = compiled.querySelector('wa-tab-group'); + expect(tabGroup).toBeTruthy(); + // NEW: Verify tab group contains tab panels + const tabPanels = compiled.querySelectorAll('wa-tab-panel'); + expect(tabPanels.length).toBeGreaterThan(0); + }); + + it('should render four tab panels', () => { + const compiled = fixture.nativeElement as HTMLElement; + const tabs = compiled.querySelectorAll('wa-tab'); + expect(tabs.length).toBe(4); + // NEW: Verify corresponding tab panels exist + const tabPanels = compiled.querySelectorAll('wa-tab-panel'); + expect(tabPanels.length).toBe(4); + }); + + it('should call pickDirectory when change directory button clicked', async () => { + fileDialogService.pickDirectory.and.returnValue(Promise.resolve({ path: '/test/path' })); + await component.pickDir(); + expect(fileDialogService.pickDirectory).toHaveBeenCalled(); + // NEW: Verify pickedPath is updated + expect(component.pickedPath).toBe('/test/path'); + }); + + it('should call saveFile when export backup button clicked', async () => { + fileDialogService.saveFile.and.returnValue(Promise.resolve({ name: 'settings.json' } as any)); + await component.saveFile(); + expect(fileDialogService.saveFile).toHaveBeenCalled(); + // NEW: Verify pickedPath is updated with filename + expect(component.pickedPath).toBe('settings.json'); + }); + + it('should update message after saving locale', () => { + component.saveLocale(); + expect(component.msg).toContain('Saved locale'); + // NEW: Verify message includes the locale value + expect(component.msg).toContain('en-US'); + }); + + it('should copy locale to clipboard', async () => { + clipboardService.copyText.and.returnValue(Promise.resolve(true)); + await component.copyLocale(); + expect(clipboardService.copyText).toHaveBeenCalledWith(component.locale); + expect(component.msg).toContain('copied to clipboard'); + // NEW: Verify clipboard was called exactly once + expect(clipboardService.copyText).toHaveBeenCalledTimes(1); + }); +}); diff --git a/cmd/lthn-desktop/frontend.old/src/app/pages/settings/settings.page.ts b/cmd/lthn-desktop/frontend.old/src/app/pages/settings/settings.page.ts new file mode 100644 index 0000000..ee8923c --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/pages/settings/settings.page.ts @@ -0,0 +1,168 @@ +import { Component, CUSTOM_ELEMENTS_SCHEMA, inject } from '@angular/core'; + +import { FormsModule } from '@angular/forms'; +import { FileDialogService } from '../../services/file-dialog.service'; +import { ClipboardService } from '../../services/clipboard.service'; + +@Component({ + selector: 'app-settings-page', + imports: [FormsModule], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + template: ` + <div class="settings"> + <wa-tab-group> + <wa-tab slot="nav" panel="general">General</wa-tab> + <wa-tab slot="nav" panel="wallet">Wallet</wa-tab> + <wa-tab slot="nav" panel="connection">Connection</wa-tab> + <wa-tab slot="nav" panel="advanced">Advanced</wa-tab> + + <wa-tab-panel name="general"> + <div class="settings__section"> + <h3 class="settings__section-title">Language</h3> + <wa-select value="en-US" style="max-width: 300px;"> + <wa-option value="en-US">English (US)</wa-option> + <wa-option value="zh-CN">中文 (简体)</wa-option> + <wa-option value="es-ES">Español</wa-option> + </wa-select> + </div> + + <div class="settings__section"> + <h3 class="settings__section-title">Block Explorer</h3> + <wa-select value="hnsnetwork" style="max-width: 300px;"> + <wa-option value="hnsnetwork">HNS Network</wa-option> + <wa-option value="niami">Niami</wa-option> + <wa-option value="hnscan">HNScan</wa-option> + </wa-select> + </div> + + <div class="settings__section"> + <h3 class="settings__section-title">Theme</h3> + <wa-select value="light" style="max-width: 300px;"> + <wa-option value="light">Light</wa-option> + <wa-option value="dark">Dark</wa-option> + <wa-option value="system">System</wa-option> + </wa-select> + </div> + </wa-tab-panel> + + <wa-tab-panel name="wallet"> + <div class="settings__section"> + <h3 class="settings__section-title">Wallet Directory</h3> + <p class="settings__description">Location where wallet data is stored</p> + <wa-input value="~/.bob-wallet" readonly style="max-width: 500px;"> + <input slot="input" /> + </wa-input> + <div style="margin-top: 0.75rem;"> + <wa-button size="small" (click)="pickDir()">Change Directory</wa-button> + </div> + </div> + + <div class="settings__section"> + <h3 class="settings__section-title">Backup</h3> + <p class="settings__description">Export wallet seed phrase and settings</p> + <wa-button size="small" (click)="saveFile()"> + <wa-icon slot="prefix" name="fa-solid fa-download"></wa-icon> + Export Backup + </wa-button> + </div> + + <div class="settings__section"> + <h3 class="settings__section-title">Rescan Blockchain</h3> + <p class="settings__description">Re-scan the blockchain for transactions</p> + <wa-button size="small" variant="neutral">Rescan</wa-button> + </div> + </wa-tab-panel> + + <wa-tab-panel name="connection"> + <div class="settings__section"> + <h3 class="settings__section-title">Connection Type</h3> + <wa-select value="full-node" style="max-width: 300px;"> + <wa-option value="full-node">Full Node</wa-option> + <wa-option value="spv">SPV (Light)</wa-option> + <wa-option value="custom">Custom RPC</wa-option> + </wa-select> + </div> + + <div class="settings__section"> + <h3 class="settings__section-title">Network</h3> + <wa-select value="main" style="max-width: 300px;"> + <wa-option value="main">Mainnet</wa-option> + <wa-option value="testnet">Testnet</wa-option> + <wa-option value="regtest">Regtest</wa-option> + <wa-option value="simnet">Simnet</wa-option> + </wa-select> + </div> + </wa-tab-panel> + + <wa-tab-panel name="advanced"> + <div class="settings__section"> + <h3 class="settings__section-title">API Key</h3> + <p class="settings__description">Node API authentication key</p> + <wa-input type="password" style="max-width: 400px;"> + <input slot="input" type="password" /> + </wa-input> + </div> + + <div class="settings__section"> + <h3 class="settings__section-title">Analytics</h3> + <wa-checkbox checked>Share anonymous usage data to improve Bob</wa-checkbox> + </div> + + <div class="settings__section"> + <h3 class="settings__section-title">Developer Options</h3> + <wa-button size="small" variant="neutral"> + <wa-icon slot="prefix" name="fa-solid fa-bug"></wa-icon> + Open Debug Console + </wa-button> + </div> + </wa-tab-panel> + </wa-tab-group> + </div> + `, + styles: [` + .settings { } + + .settings__section { padding: 1.5rem 0; border-bottom: 1px solid var(--wa-color-neutral-200, #e5e7eb); } + .settings__section:last-child { border-bottom: none; } + + .settings__section-title { margin: 0 0 0.5rem 0; font-size: 1rem; font-weight: 600; } + + .settings__description { margin: 0 0 0.75rem 0; font-size: 0.875rem; color: var(--wa-color-neutral-600, #4b5563); } + `] +}) +export class SettingsPage { + private fileDialog = inject(FileDialogService); + private clipboard = inject(ClipboardService); + + locale = 'en-US'; + msg = ''; + pickedPath = ''; + + saveLocale() { + // TODO: connect to Setting.setLocale via IPC when available + this.msg = `Saved locale: ${this.locale}`; + setTimeout(() => (this.msg = ''), 1500); + } + + async copyLocale() { + await this.clipboard.copyText(this.locale); + this.msg = 'Locale copied to clipboard'; + setTimeout(() => (this.msg = ''), 1500); + } + + async pickDir() { + const res = await this.fileDialog.pickDirectory(); + this.pickedPath = res?.path || res?.name || ''; + } + + async pickFile() { + const res = await this.fileDialog.openFile({ multiple: false, accept: ['application/json'] }); + this.pickedPath = res?.[0]?.name || ''; + } + + async saveFile() { + const data = new Blob([JSON.stringify({ locale: this.locale }, null, 2)], { type: 'application/json' }); + const file = await this.fileDialog.saveFile({ suggestedName: 'settings.json', blob: data }); + this.pickedPath = file?.name || ''; + } +} diff --git a/cmd/lthn-desktop/frontend.old/src/app/services/clipboard.service.ts b/cmd/lthn-desktop/frontend.old/src/app/services/clipboard.service.ts new file mode 100644 index 0000000..9bfb531 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/services/clipboard.service.ts @@ -0,0 +1,31 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ providedIn: 'root' }) +export class ClipboardService { + async copyText(text: string): Promise<boolean> { + try { + if (navigator.clipboard && navigator.clipboard.writeText) { + await navigator.clipboard.writeText(text); + return true; + } + } catch (e) { + // fall back + } + + // Fallback using a hidden textarea + const ta = document.createElement('textarea'); + ta.value = text; + ta.style.position = 'fixed'; + ta.style.left = '-9999px'; + document.body.appendChild(ta); + ta.select(); + try { + document.execCommand('copy'); + return true; + } catch (e) { + return false; + } finally { + document.body.removeChild(ta); + } + } +} diff --git a/cmd/lthn-desktop/frontend.old/src/app/services/file-dialog.service.ts b/cmd/lthn-desktop/frontend.old/src/app/services/file-dialog.service.ts new file mode 100644 index 0000000..856a454 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/services/file-dialog.service.ts @@ -0,0 +1,85 @@ +import { Injectable } from '@angular/core'; + +// WAILS3 INTEGRATION: +// This service currently uses web-standard File System Access API. +// For Wails3, replace with Go service methods calling: +// - application.OpenFileDialog().PromptForSingleSelection() +// - application.SaveFileDialog().SetFilename().PromptForSelection() +// See WAILS3_INTEGRATION.md for complete examples. + +export interface OpenFileOptions { + multiple?: boolean; + accept?: string[]; // e.g., ["application/json", "text/plain"] +} + +export interface SaveFileOptions { + suggestedName?: string; + types?: { description?: string; accept?: Record<string, string[]> }[]; + blob: Blob; +} + +@Injectable({ providedIn: 'root' }) +export class FileDialogService { + // Directory picker using File System Access API when available + async pickDirectory(): Promise<any | null> { + const nav: any = window.navigator; + if ((window as any).showDirectoryPicker) { + try { + // @ts-ignore + const handle: any = await (window as any).showDirectoryPicker({ mode: 'readwrite' }); + return handle; + } catch (e) { + return null; + } + } + // Fallback: not supported in all browsers; inform the user + alert('Directory picker is not supported in this browser.'); + return null; + } + + // Open file(s) with <input type="file"> fallback if FS Access API not used + async openFile(opts: OpenFileOptions = {}): Promise<File[] | null> { + // Always supported fallback + return new Promise<File[] | null>((resolve) => { + const input = document.createElement('input'); + input.type = 'file'; + input.multiple = !!opts.multiple; + if (opts.accept && opts.accept.length) { + input.accept = opts.accept.join(','); + } + input.onchange = () => { + const files = input.files ? Array.from(input.files) : null; + resolve(files); + }; + input.click(); + }); + } + + // Save file using File System Access API if available, otherwise trigger a download + async saveFile(opts: SaveFileOptions): Promise<File | null> { + if ((window as any).showSaveFilePicker) { + try { + // @ts-ignore + const handle = await (window as any).showSaveFilePicker({ + suggestedName: opts.suggestedName, + types: opts.types + }); + const writable = await handle.createWritable(); + await writable.write(opts.blob); + await writable.close(); + return { name: handle.name } as any; + } catch (e) { + return null; + } + } + + // Fallback: download + const url = URL.createObjectURL(opts.blob); + const a = document.createElement('a'); + a.href = url; + a.download = opts.suggestedName || 'download'; + a.click(); + URL.revokeObjectURL(url); + return { name: opts.suggestedName || 'download' } as any; + } +} diff --git a/cmd/lthn-desktop/frontend.old/src/app/services/hardware-wallet.service.ts b/cmd/lthn-desktop/frontend.old/src/app/services/hardware-wallet.service.ts new file mode 100644 index 0000000..719dff1 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/services/hardware-wallet.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ providedIn: 'root' }) +export class HardwareWalletService { + // Placeholder for WebHID/WebUSB detection + get isWebHIDAvailable() { + return 'hid' in navigator; + } + + get isWebUSBAvailable() { + return 'usb' in navigator; + } + + async connectLedger(): Promise<void> { + // In a real implementation, prompt for a specific HID/USB device + // and establish transport (e.g., via @ledgerhq/hw-transport-webhid). + // This is a stub to document the integration point. + throw new Error('HardwareWalletService.connectLedger is not implemented in the web build.'); + } + + async getAppVersion(): Promise<string> { + // Should query the connected device/app for version information + throw new Error('HardwareWalletService.getAppVersion is not implemented in the web build.'); + } + + async disconnect(): Promise<void> { + // Close transport/session to the device + throw new Error('HardwareWalletService.disconnect is not implemented in the web build.'); + } +} diff --git a/cmd/lthn-desktop/frontend.old/src/app/services/ipc/stubs.ts b/cmd/lthn-desktop/frontend.old/src/app/services/ipc/stubs.ts new file mode 100644 index 0000000..22bc14c --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/services/ipc/stubs.ts @@ -0,0 +1,233 @@ +// IPC Stub classes mapping old Electron IPC services and methods. +// These stubs let the web build compile and run without native IPC. +// Each method throws a NotImplementedError to highlight what needs +// to be replaced in a native wrapper or future web-compatible API. +// +// WAILS3 INTEGRATION: +// These stubs will be replaced by Wails3 auto-generated bindings. +// See WAILS3_INTEGRATION.md for complete migration guide. +// +// Pattern: +// 1. Create Go service structs with exported methods (e.g., NodeService, WalletService) +// 2. Register services in Wails3 main.go: application.NewService(&NodeService{}) +// 3. Run `wails3 generate bindings` to create TypeScript bindings +// 4. Import generated bindings: import { GetInfo } from '../bindings/.../nodeservice' +// 5. Replace stub calls with binding calls: await GetInfo() instead of IPC.Node.getInfo() +// +// Each service below maps 1:1 to a Go service struct that will be created. + +export class NotImplementedError extends Error { + constructor(message: string) { + super(message); + this.name = 'NotImplementedError'; + } +} + +function notImplemented(service: string, method: string): never { + throw new NotImplementedError(`IPC ${service}.${method} is not implemented in the web build.`); +} + +function makeIpcStub<T extends Record<string, any>>(service: string, methods: string[]): T { + const obj: Record<string, any> = {}; + for (const m of methods) { + obj[m] = (..._args: any[]) => notImplemented(service, m); + } + return obj as T; +} + +// Services and their methods as defined in old/app/background/**/client.js +export const Node = makeIpcStub('Node', [ + 'start', + 'stop', + 'reset', + 'generateToAddress', + 'getAPIKey', + 'getNoDns', + 'getSpvMode', + 'getInfo', + 'getNameInfo', + 'getTXByAddresses', + 'getNameByHash', + 'getBlockByHeight', + 'getTx', + 'broadcastRawTx', + 'sendRawAirdrop', + 'getFees', + 'getAverageBlockTime', + 'getMTP', + 'getCoin', + 'verifyMessageWithName', + 'setNodeDir', + 'setAPIKey', + 'setNoDns', + 'setSpvMode', + 'getDir', + 'getHNSPrice', + 'testCustomRPCClient', + 'getDNSSECProof', + 'sendRawClaim', +]); + +export const Wallet = makeIpcStub('Wallet', [ + 'start', + 'getAPIKey', + 'setAPIKey', + 'getWalletInfo', + 'getAccountInfo', + 'getCoin', + 'getTX', + 'getNames', + 'createNewWallet', + 'importSeed', + 'generateReceivingAddress', + 'getAuctionInfo', + 'getTransactionHistory', + 'getPendingTransactions', + 'getBids', + 'getBlind', + 'getMasterHDKey', + 'hasAddress', + 'setPassphrase', + 'revealSeed', + 'estimateTxFee', + 'estimateMaxSend', + 'removeWalletById', + 'updateAccountDepth', + 'findNonce', + 'findNonceCancel', + 'encryptWallet', + 'backup', + 'rescan', + 'deepClean', + 'reset', + 'sendOpen', + 'sendBid', + 'sendRegister', + 'sendUpdate', + 'sendReveal', + 'sendRedeem', + 'sendRenewal', + 'sendRevealAll', + 'sendRedeemAll', + 'sendRegisterAll', + 'signMessageWithName', + 'transferMany', + 'finalizeAll', + 'finalizeMany', + 'renewAll', + 'renewMany', + 'sendTransfer', + 'cancelTransfer', + 'finalizeTransfer', + 'finalizeWithPayment', + 'claimPaidTransfer', + 'revokeName', + 'send', + 'lock', + 'unlock', + 'isLocked', + 'addSharedKey', + 'removeSharedKey', + 'getNonce', + 'importNonce', + 'zap', + 'importName', + 'rpcGetWalletInfo', + 'loadTransaction', + 'listWallets', + 'getStats', + 'isReady', + 'createClaim', + 'sendClaim', +]); + +export const Setting = makeIpcStub('Setting', [ + 'getExplorer', + 'setExplorer', + 'getLocale', + 'setLocale', + 'getCustomLocale', + 'setCustomLocale', + 'getLatestRelease', +]); + +export const Ledger = makeIpcStub('Ledger', [ + 'getXPub', + 'getAppVersion', +]); + +export const DB = makeIpcStub('DB', [ + 'open', + 'close', + 'put', + 'get', + 'del', + 'getUserDir', +]); + +export const Analytics = makeIpcStub('Analytics', [ + 'setOptIn', + 'getOptIn', + 'track', + 'screenView', +]); + +export const Connections = makeIpcStub('Connections', [ + 'getConnection', + 'setConnection', + 'setConnectionType', + 'getCustomRPC', +]); + +export const Shakedex = makeIpcStub('Shakedex', [ + 'fulfillSwap', + 'getFulfillments', + 'finalizeSwap', + 'transferLock', + 'transferCancel', + 'getListings', + 'finalizeLock', + 'finalizeCancel', + 'launchAuction', + 'downloadProofs', + 'restoreOneListing', + 'restoreOneFill', + 'getExchangeAuctions', + 'listAuction', + 'getFeeInfo', + 'getBestBid', +]); + +export const Claim = makeIpcStub('Claim', [ + 'airdropGenerateProofs', +]); + +export const Logger = makeIpcStub('Logger', [ + 'info', + 'warn', + 'error', + 'log', + 'download', +]); + +export const Hip2 = makeIpcStub('Hip2', [ + 'getPort', + 'setPort', + 'fetchAddress', + 'setServers', +]); + +// Aggregate facade to import from components/services if needed +export const IPC = { + Node, + Wallet, + Setting, + Ledger, + DB, + Analytics, + Connections, + Shakedex, + Claim, + Logger, + Hip2, +}; diff --git a/cmd/lthn-desktop/frontend.old/src/app/services/notifications.service.ts b/cmd/lthn-desktop/frontend.old/src/app/services/notifications.service.ts new file mode 100644 index 0000000..1bf0af5 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/services/notifications.service.ts @@ -0,0 +1,24 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ providedIn: 'root' }) +export class NotificationsService { + async requestPermission(): Promise<NotificationPermission> { + if (!('Notification' in window)) return 'denied'; + if (Notification.permission === 'default') { + try { + return await Notification.requestPermission(); + } catch { + return Notification.permission; + } + } + return Notification.permission; + } + + async show(title: string, options?: NotificationOptions): Promise<void> { + if (!('Notification' in window)) return; + const perm = await this.requestPermission(); + if (perm === 'granted') { + new Notification(title, options); + } + } +} diff --git a/cmd/lthn-desktop/frontend.old/src/app/services/storage.provider.ts b/cmd/lthn-desktop/frontend.old/src/app/services/storage.provider.ts new file mode 100644 index 0000000..a4c5694 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/services/storage.provider.ts @@ -0,0 +1,6 @@ +import { InjectionToken } from '@angular/core'; + +export const BROWSER_STORAGE = new InjectionToken<Storage>('Browser Storage', { + providedIn: 'root', + factory: () => localStorage +}); diff --git a/cmd/lthn-desktop/frontend.old/src/app/services/storage.service.ts b/cmd/lthn-desktop/frontend.old/src/app/services/storage.service.ts new file mode 100644 index 0000000..86561e2 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/services/storage.service.ts @@ -0,0 +1,34 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ providedIn: 'root' }) +export class StorageService { + private prefix = 'lthnDNS:'; + + setItem<T = unknown>(key: string, value: T): void { + try { + localStorage.setItem(this.prefix + key, JSON.stringify(value)); + } catch (e) { + // ignore quota or unsupported errors + } + } + + getItem<T = unknown>(key: string, fallback: T | null = null): T | null { + const raw = localStorage.getItem(this.prefix + key); + if (!raw) return fallback; + try { + return JSON.parse(raw) as T; + } catch { + return fallback; + } + } + + removeItem(key: string): void { + localStorage.removeItem(this.prefix + key); + } + + clearAll(): void { + Object.keys(localStorage) + .filter(k => k.startsWith(this.prefix)) + .forEach(k => localStorage.removeItem(k)); + } +} diff --git a/cmd/lthn-desktop/frontend.old/src/app/shared/components/checkbox/checkbox.component.css b/cmd/lthn-desktop/frontend.old/src/app/shared/components/checkbox/checkbox.component.css new file mode 100644 index 0000000..6946171 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/shared/components/checkbox/checkbox.component.css @@ -0,0 +1,65 @@ +.nga-form-check-input { + --bs-form-check-bg: var(--bs-body-bg); + width: 1em; + height: 1em; + margin-top: 0.25em; + vertical-align: top; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: var(--bs-form-check-bg); + background-image: var(--bs-form-check-bg-image); + background-repeat: no-repeat; + background-position: center; + background-size: contain; + border: var(--bs-border-width) solid var(--bs-border-color); +} + +.nga-form-check-input[type="checkbox"] { + border-radius: 0.25em; +} + +.nga-form-check-input[type="radio"] { + border-radius: 50%; +} + +.nga-form-check-input:active { + filter: brightness(90%); +} + +.nga-form-check-input:focus { + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} + +.nga-form-check-input:checked { + background-color: green; + border-color: green; +} + +.nga-form-check-input:checked[type="checkbox"] { + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e"); +} + +.nga-form-check-input:checked[type="radio"] { + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"); +} + +.nga-form-check-input[type="checkbox"]:indeterminate { + background-color: red; + border-color: red; + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); +} + +.nga-form-check-input:disabled { + pointer-events: none; + filter: none; + opacity: 0.5; +} + +.nga-form-check-input[disabled]~.form-check-label, +.form-check-input:disabled~.form-check-label { + cursor: default; + opacity: 0.5; +} diff --git a/cmd/lthn-desktop/frontend.old/src/app/shared/components/checkbox/checkbox.component.html b/cmd/lthn-desktop/frontend.old/src/app/shared/components/checkbox/checkbox.component.html new file mode 100644 index 0000000..8e8d937 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/shared/components/checkbox/checkbox.component.html @@ -0,0 +1,8 @@ +<input #checkbox + class="nga-form-check-input" + type="checkbox" + (click)="onSelect()" + id="checkbox" + value="" + [(ngModel)]="valueTmp" +/> diff --git a/cmd/lthn-desktop/frontend.old/src/app/shared/components/checkbox/checkbox.component.ts b/cmd/lthn-desktop/frontend.old/src/app/shared/components/checkbox/checkbox.component.ts new file mode 100644 index 0000000..b348889 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/shared/components/checkbox/checkbox.component.ts @@ -0,0 +1,115 @@ +import { CommonModule } from '@angular/common'; +import { + Component, EventEmitter, Output, forwardRef, + ElementRef, Renderer2, ViewChild +} from '@angular/core'; + +import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms'; + +@Component({ + selector: 'app-checkbox', + imports: [ + CommonModule, + FormsModule, + ], + templateUrl: './checkbox.component.html', + styleUrls: ['./checkbox.component.css'], + providers: [{ + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => CheckboxComponent), + multi: true + }] +}) +export class CheckboxComponent { + + + private innerValueTmp: any = ''; + + private onTouchedCallback = (): void => { + // Callback function intentionally left blank. + }; + + private onChangeCallback = (_value: unknown): void => { + // Callback function intentionally left blank. + }; + + @ViewChild('checkbox', { static: false }) checkbox!: ElementRef; + @Output() buttonclick: EventEmitter<number> = new EventEmitter<number>(); + + valueCheckbox: any; + indeterminate: any; + checked: any; + + constructor( + private renderer: Renderer2) { + this.valueCheckbox = null; + } + + onSelect() { + let value = this.checkbox.nativeElement.value; + switch (value) { + case "": + this.checked = true; + this.indeterminate = false; + value = "true"; + this.valueCheckbox = true; + break; + case "true": + this.checked = false; + this.indeterminate = true; + value = "false"; + this.valueCheckbox = false; + break; + case "false": + this.checked = null; + this.indeterminate = false; + value = ""; + this.valueCheckbox = ""; + break; + } + this.innerValueTmp = 4; + this.renderer.setAttribute(this.checkbox.nativeElement, 'value', value); + this.renderer.setProperty(this.checkbox.nativeElement, 'checked', this.checked); + this.renderer.setProperty(this.checkbox.nativeElement, 'indeterminate', this.indeterminate); + } + + onClickButton() { + const value = this.checkbox.nativeElement.getAttribute('value'); + // const indeterminate = this.checkbox.nativeElement.getProperty('indeterminate'); + this.buttonclick.emit(value); + } + + + get valueTmp(): any { + return this.innerValueTmp; + }; + + set valueTmp(value: any) { + if (value !== this.innerValueTmp) { + if (this.checked && !this.indeterminate) { value = true; } + if (!this.checked && this.indeterminate) { value = false; } + if ((this.checked === null) && !this.indeterminate) { value = null; } + this.innerValueTmp = value; + this.onChangeCallback(value); + } + } + + onBlur() { + this.onTouchedCallback(); + } + + writeValue(valueTmp: any) { + if (valueTmp !== this.innerValueTmp) { + this.innerValueTmp = valueTmp; + } + } + + registerOnChange(fn: any) { + this.onChangeCallback = fn; + } + + registerOnTouched(fn: any) { + this.onTouchedCallback = fn; + } + +} diff --git a/cmd/lthn-desktop/frontend.old/src/app/shared/components/footer/footer.component.css b/cmd/lthn-desktop/frontend.old/src/app/shared/components/footer/footer.component.css new file mode 100644 index 0000000..ba38452 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/shared/components/footer/footer.component.css @@ -0,0 +1,79 @@ +.nga-footer { + background-color: #212121; + color: white; +} + +.nga-footer a { + color: white; + text-decoration: none +} + +.nga-footer a:hover, +.nga-footer a:focus { + color: white; + text-decoration: underline; +} + +.nga-footer .nga-hint { + background-color: #1976d2; +} + +.nga-footer .nga-hint:hover { + opacity: 0.8; +} + +.nga-btn-social { + position: relative; + z-index: 1; + display: inline-block; + padding: 0; + margin: 10px; + overflow: hidden; + vertical-align: middle; + cursor: pointer; + border-radius: 50%; + -webkit-box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15); + box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + width: 47px; + height: 47px +} + +.nga-btn-social i { + font-size: 1.25rem; + line-height: 47px +} + +.nga-btn-social i { + display: inline-block; + width: inherit; + color: white; + text-align: center +} + +.nga-btn-social:hover { + -webkit-box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); + box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19) +} + +.nga-btn-social i:hover { + color: black; +} + +.nga-btn-github { + background-color: #333; +} + +.nga-btn-gitlab { + background-color: #ff4500; +} + +.nga-btn-linkedin { + background-color: #0082ca; +} + +.nga-btn-twitter { + background-color: #55acee; +} + diff --git a/cmd/lthn-desktop/frontend.old/src/app/shared/components/footer/footer.component.html b/cmd/lthn-desktop/frontend.old/src/app/shared/components/footer/footer.component.html new file mode 100644 index 0000000..616f55b --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/shared/components/footer/footer.component.html @@ -0,0 +1,62 @@ +<footer class="nga-footer"> + <div class="nga-hint"> + <div class="container"> + <div class="row p-4"></div> + </div> + </div> + <div class="container py-5 text-center text-lg-start"> + <div class="row"> + <div class="col-12 col-lg-5 mb-3"> + <h2 class="h5"> + <img class="mb-1 me-1" [src]="'./assets/params/images/logo/' + appInfo.logo + '-logo.png'" + [srcset]="'./assets/params/images/logo/' + appInfo.logo + '-logo.png, ./assets/params/images/logo/' + appInfo.logo + '-logo@2x.png 2x'" + width="25" height="25" [alt]="'Logo ' + appInfo.name"> + {{ appInfo.name }} + </h2> + <hr class="text-white mb-4 mt-0 d-inline-block" style="width: 120px;"> + <p>Web Application : Angular 17, Bootstrap 5</p> + <p>Routing, Lazy Loading, SSR, PWA, SEO</p> + <div> + <a type="button" class="nga-btn-social nga-btn-linkedin" + [href]="'https://www.linkedin.com/in/' + appInfo.linkedinnetwork" [attr.aria-label]="'Linkedin ' + appInfo.name"> + <i class="fab fa-linkedin-in"></i> + </a> + <a type="button" class="nga-btn-social nga-btn-twitter" [href]="'https://x.com/' + appInfo.xnetwork" + [attr.aria-label]="'Twitter ' + appInfo.name"> + <i class="fab fa-twitter"></i> + </a> + <a type="button" class="nga-btn-social nga-btn-github" [href]="'https://github.com/' + appInfo.network" + [attr.aria-label]="'Github ' + appInfo.name"> + <i class="fab fa-github"></i> + </a> + <a type="button" class="nga-btn-social nga-btn-gitlab" [href]="'https://gitlab.com/' + appInfo.network" + [attr.aria-label]="'Gitlab ' + appInfo.name"> + <i class="fab fa-gitlab"></i> + </a> + </div> + </div> + <div class="col-6 col-lg-3 mb-3"> + <h2 class="h5">Tools</h2> + <hr class="text-white mt-0 d-inline-block" style="width: 70px;"> + <ul class="list-unstyled"> + <li class="mb-2"><a href="https://angular.io/">Angular</a></li> + <li class="mb-2"><a href="https://getbootstrap.com/">Bootstrap</a></li> + <li class="mb-2"><a href="https://fontawesome.com/">Font Awesome</a></li> + </ul> + </div> + <div class="col-6 col-lg-3 mb-3"> + <h2 class="h5">Learn</h2> + <hr class="text-white mt-0 d-inline-block" style="width: 70px;"> + <ul class="list-unstyled"> + <li class="mb-2"><a [href]="'https://' + appInfo.website + '/tutorials'">Tutorials</a></li> + <li class="mb-2"><a [href]="'https://' + appInfo.website + '/about'">About</a></li> + </ul> + </div> + </div> + </div> + <div class="py-3 text-center" style="background-color: black;"> + <div class="container"> + <a [href]="'https://' + appInfo.website">{{ appInfo.website }}</a> + </div> + </div> +</footer> diff --git a/cmd/lthn-desktop/frontend.old/src/app/shared/components/footer/footer.component.ts b/cmd/lthn-desktop/frontend.old/src/app/shared/components/footer/footer.component.ts new file mode 100644 index 0000000..058e16e --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/shared/components/footer/footer.component.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core'; + +import { environment } from '../../../../environments/environment'; + +@Component({ + selector: 'app-footer', + templateUrl: './footer.component.html', + styleUrls: ['./footer.component.css'] +}) +export class FooterComponent { + + appInfo = environment.appInfo; +} diff --git a/cmd/lthn-desktop/frontend.old/src/app/shared/components/header/header.component.css b/cmd/lthn-desktop/frontend.old/src/app/shared/components/header/header.component.css new file mode 100644 index 0000000..80d289b --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/shared/components/header/header.component.css @@ -0,0 +1,38 @@ +.nga-nav-link { + color: white; + border-top: 1px solid #09238d; + border-bottom: 1px solid #09238d; + font-weight: 500; +} + +.nga-nav-link:hover { + color: yellow; + border-top: 1px solid yellow; + border-bottom: 1px solid yellow; +} + + +.nga-navbar { + -webkit-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 11px 10px 0 rgba(0, 0, 0, 0.12); + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 11px 10px 0 rgba(0, 0, 0, 0.12); + background-color: #09238d; +} + +.nga-logo { + font-weight: 500; +} + +.nga-logo:hover { + color: rgba(255, 255, 255, 0.75); +} + +.nga-btn-navbar { + --bs-btn-color: #fff; + --bs-btn-bg: #1976d2; + --bs-btn-border-color: #1976d2; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #0b5ed7; + --bs-btn-hover-border-color: #0a58ca; +} + + diff --git a/cmd/lthn-desktop/frontend.old/src/app/shared/components/header/header.component.html b/cmd/lthn-desktop/frontend.old/src/app/shared/components/header/header.component.html new file mode 100644 index 0000000..f0d4af0 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/shared/components/header/header.component.html @@ -0,0 +1,11 @@ +<header class="nga-navbar" style="position: sticky; top: 0; z-index: 1000;"> + <div class="topbar" style="display: flex; align-items: center; gap: 8px; padding: 8px 12px; border-bottom: 1px solid var(--sl-color-neutral-200, #e5e7eb); background: var(--sl-color-neutral-0, #fff);"> + <wa-button variant="text" size="small" (click)="onMenuClick()" aria-label="Toggle navigation"> + <i class="fas fa-bars"></i> + </wa-button> + + <a routerLink="/" class="brand" style="font-weight: 600; text-decoration: none; color: inherit;">Core Admin</a> + + <div style="margin-left: auto;"></div> + </div> +</header> diff --git a/cmd/lthn-desktop/frontend.old/src/app/shared/components/header/header.component.ts b/cmd/lthn-desktop/frontend.old/src/app/shared/components/header/header.component.ts new file mode 100644 index 0000000..a75a3e0 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/shared/components/header/header.component.ts @@ -0,0 +1,18 @@ +import {Component, CUSTOM_ELEMENTS_SCHEMA, EventEmitter, Output} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RouterLink } from '@angular/router'; + +@Component({ + selector: 'app-header', + imports: [CommonModule, RouterLink], + templateUrl: './header.component.html', + styleUrls: ['./header.component.css'], + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class HeaderComponent { + @Output() menuToggle = new EventEmitter<void>(); + + onMenuClick() { + this.menuToggle.emit(); + } +} diff --git a/cmd/lthn-desktop/frontend.old/src/app/shared/constants/sort.constants.ts b/cmd/lthn-desktop/frontend.old/src/app/shared/constants/sort.constants.ts new file mode 100644 index 0000000..58a9ea3 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/shared/constants/sort.constants.ts @@ -0,0 +1,4 @@ +export enum SortDirection { + ASC = 'asc', + DESC = 'desc' +} diff --git a/cmd/lthn-desktop/frontend.old/src/app/shared/pipes/date-format.pipe.ts b/cmd/lthn-desktop/frontend.old/src/app/shared/pipes/date-format.pipe.ts new file mode 100644 index 0000000..b3f5da3 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/shared/pipes/date-format.pipe.ts @@ -0,0 +1,30 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'dateFormat' +}) +export class DateFormatPipe implements PipeTransform { + transform(value: string | null | undefined): string { + if (!value) { + return ''; + } + + const regex = /^([0-2][0-9]|3[0-1])\/([0][1-9]|1[0-2])\/[0-9]{4} ([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/; + if (regex.test(value)) { + const [day, month, year] = value.split(/[/ ]/); + + return `${day}/${month}/${year}`; + } + + const date = new Date(value); + if (!isNaN(date.getTime())) { + const day = String(date.getDate()).padStart(2, '0'); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const year = date.getFullYear(); + + return `${day}/${month}/${year}`; + } + + return ''; + } +} diff --git a/cmd/lthn-desktop/frontend.old/src/app/shared/pipes/date-hour-format.pipe.ts b/cmd/lthn-desktop/frontend.old/src/app/shared/pipes/date-hour-format.pipe.ts new file mode 100644 index 0000000..cfea96b --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/shared/pipes/date-hour-format.pipe.ts @@ -0,0 +1,29 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'dateHourFormat' +}) +export class DateHourFormatPipe implements PipeTransform { + transform(value: string | null | undefined): string { + if (!value) { + return ''; + } + const regex = /^([0-2][0-9]|3[0-1])\/([0][1-9]|1[0-2])\/[0-9]{4} ([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/; + if (regex.test(value)) { + return value; + } + const date = new Date(value); + if (!isNaN(date.getTime())) { + const day = String(date.getDate()).padStart(2, '0'); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const year = date.getFullYear(); + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(date.getMinutes()).padStart(2, '0'); + const seconds = String(date.getSeconds()).padStart(2, '0'); + + return `${day}/${month}/${year} ${hours}:${minutes}:${seconds}`; + } + + return ''; + } +} diff --git a/cmd/lthn-desktop/frontend.old/src/app/shared/services/pagination/pagination.service.spec.ts b/cmd/lthn-desktop/frontend.old/src/app/shared/services/pagination/pagination.service.spec.ts new file mode 100644 index 0000000..e6a519d --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/shared/services/pagination/pagination.service.spec.ts @@ -0,0 +1,157 @@ +import { PaginationService } from './pagination.service'; +import { Pagination } from './pagination'; + +describe('PaginationService', () => { + let service: PaginationService; + + beforeEach(() => { + service = new PaginationService(); + }); + + it('should initialize a Pagination object correctly', () => { + // Arrange + const perPage = 5; + + // Act + const pagination: Pagination = service.initializePagination(perPage); + + // Assert + expect(pagination).toEqual({ + totalItems: 0, + currentPage: 1, + perPage, + totalPages: 0, + startPage: 1, + endPage: 1, + pages: [], + pageBrowser: false, + useful: false + }); + }); + + it('should handle the case where currentPage is greater than the total number of pages', () => { + // Arrange + const input = { + totalItems: 10, + currentPage: 5, + perPage: 5, + totalPages: 2, + startPage: 1, + endPage: 2, + pages: [1, 2], + pageBrowser: true, + useful: true + }; + + // Act + const pagination = service.getPagination(input); + + // Assert + expect(pagination.currentPage).toBe(1); + expect(pagination.totalPages).toBe(2); + }); + + it('should handle a small number of pages (≤ 7 pages) correctly', () => { + // Arrange + const input = { + totalItems: 25, + currentPage: 3, + perPage: 5, + totalPages: 5, + startPage: 1, + endPage: 5, + pages: [1, 2, 3, 4, 5], + pageBrowser: true, + useful: true + }; + + // Act + const pagination = service.getPagination(input); + + // Assert + expect(pagination.startPage).toBe(1); + expect(pagination.endPage).toBe(5); + expect(pagination.pages).toEqual([1, 2, 3, 4, 5]); + }); + + it('should handle the first pages with many total pages', () => { + // Arrange + const input = { + totalItems: 100, + currentPage: 3, + perPage: 5, + totalPages: 20, + startPage: 1, + endPage: 7, + pages: [1, 2, 3, 4, 5, 6, 7], + pageBrowser: true, + useful: true + }; + + // Act + const pagination = service.getPagination(input); + + // Assert + expect(pagination.startPage).toBe(1); + expect(pagination.endPage).toBe(7); + expect(pagination.pages.length).toBe(7); + }); + + it('should handle the last pages with many total pages', () => { + // Arrange + const input = { + totalItems: 100, + currentPage: 18, + perPage: 5, + totalPages: 20, + startPage: 14, + endPage: 20, + pages: [14, 15, 16, 17, 18, 19, 20], + pageBrowser: true, + useful: true + }; + + // Act + const pagination = service.getPagination(input); + + // Assert + expect(pagination.startPage).toBe(14); + expect(pagination.endPage).toBe(20); + expect(pagination.pages.length).toBe(7); + }); + + it('should handle middle pages with many total pages', () => { + // Arrange + const input = { + totalItems: 100, + currentPage: 10, + perPage: 5, + totalPages: 20, + startPage: 8, + endPage: 14, + pages: [8, 9, 10, 11, 12, 13, 14], + pageBrowser: true, + useful: true + }; + + // Act + const pagination = service.getPagination(input); + + // Assert + expect(pagination.startPage).toBe(8); + expect(pagination.endPage).toBe(14); + expect(pagination.pages.length).toBe(7); + }); + + it('should generate a correct array of numbers with range()', () => { + // Arrange + const start = 1; + const end = 5; + + // Act + const result = (service as any).range(start, end); + + // Assert + expect(result).toEqual([1, 2, 3, 4]); + }); +}); diff --git a/cmd/lthn-desktop/frontend.old/src/app/shared/services/pagination/pagination.service.ts b/cmd/lthn-desktop/frontend.old/src/app/shared/services/pagination/pagination.service.ts new file mode 100644 index 0000000..1efca09 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/shared/services/pagination/pagination.service.ts @@ -0,0 +1,72 @@ +import { Injectable } from "@angular/core"; +import { Pagination } from './pagination'; + +@Injectable() +export class PaginationService { + + private readonly MAX_PAGES_DISPLAYED = 7; + private readonly STARTING_PAGE = 1; + + range(start: number, end: number): number[] { + const length = end - start; + + return Array.from({ length }, (__, index) => start + index); + } + + getPagination(pagination: Pagination): Pagination { + const { totalItems, perPage } = pagination; + let currentPage = pagination.currentPage; + const totalPages = Math.ceil(totalItems / perPage); + + if (currentPage > totalPages) { + currentPage = this.STARTING_PAGE; + } + + const { startPage, endPage } = this.calculatePageRange(currentPage, totalPages); + + const pages = this.range(startPage, endPage + 1); + + return { + totalItems, + currentPage, + perPage, + totalPages, + startPage, + endPage, + pages, + pageBrowser: totalPages > 0, + useful: totalPages > 1 + }; + } + + private calculatePageRange(currentPage: number, totalPages: number): { startPage: number, endPage: number } { + if (totalPages <= this.MAX_PAGES_DISPLAYED) { + return { startPage: this.STARTING_PAGE, endPage: totalPages }; + } + + if (currentPage <= this.MAX_PAGES_DISPLAYED - 1) { + return { startPage: this.STARTING_PAGE, endPage: this.MAX_PAGES_DISPLAYED }; + } + + if (currentPage + 4 >= totalPages) { + return { startPage: totalPages - (this.MAX_PAGES_DISPLAYED - 1), endPage: totalPages }; + } + + return { startPage: currentPage - 2, endPage: currentPage + 4 }; + } + + initializePagination(perPage: number): Pagination { + return { + totalItems: 0, + currentPage: this.STARTING_PAGE, + perPage, + totalPages: 0, + startPage: this.STARTING_PAGE, + endPage: this.STARTING_PAGE, + pages: [], + pageBrowser: false, + useful: false + }; + } +} + diff --git a/cmd/lthn-desktop/frontend.old/src/app/shared/services/pagination/pagination.ts b/cmd/lthn-desktop/frontend.old/src/app/shared/services/pagination/pagination.ts new file mode 100644 index 0000000..ceb18e5 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/shared/services/pagination/pagination.ts @@ -0,0 +1,11 @@ +export interface Pagination { + totalItems: number; + currentPage: number, + perPage: number, + totalPages: number, + startPage: number, + endPage: number, + pages: number[], + pageBrowser: boolean, + useful: boolean, +} diff --git a/cmd/lthn-desktop/frontend.old/src/app/shared/utils/date-utils.ts b/cmd/lthn-desktop/frontend.old/src/app/shared/utils/date-utils.ts new file mode 100644 index 0000000..de4ab54 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/shared/utils/date-utils.ts @@ -0,0 +1,7 @@ +import { formatDate } from '@angular/common'; + +export function getCurrentDate(): string { + const now = new Date(); + + return formatDate(now, 'dd/MM/yyyy HH:mm:ss', 'fr-FR'); +} diff --git a/cmd/lthn-desktop/frontend.old/src/app/shared/utils/objects-utils.ts b/cmd/lthn-desktop/frontend.old/src/app/shared/utils/objects-utils.ts new file mode 100644 index 0000000..2c8598c --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/shared/utils/objects-utils.ts @@ -0,0 +1,8 @@ +export function areObjectsEqual(obj1: any, obj2: any) { + const keys1 = Object.keys(obj1); + const keys2 = Object.keys(obj2); + if (keys1.length !== keys2.length) return false; + + return keys1.every(key => obj1[key] === obj2[key]); +} + diff --git a/cmd/lthn-desktop/frontend.old/src/app/shared/utils/query-utils.ts b/cmd/lthn-desktop/frontend.old/src/app/shared/utils/query-utils.ts new file mode 100644 index 0000000..f65979f --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/shared/utils/query-utils.ts @@ -0,0 +1,5 @@ +export function addFilterParam(params: URLSearchParams, key: string, value: any): void { + if (value !== null && value !== undefined && value !== '') { + params.set(key, encodeURIComponent(value)); + } +} diff --git a/cmd/lthn-desktop/frontend.old/src/app/translate-server.loader.ts b/cmd/lthn-desktop/frontend.old/src/app/translate-server.loader.ts new file mode 100644 index 0000000..38db3c2 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/app/translate-server.loader.ts @@ -0,0 +1,14 @@ +import { join } from 'path'; +import { Observable, of } from 'rxjs'; +import { TranslateLoader } from '@ngx-translate/core'; +import * as fs from 'fs'; + +export class TranslateServerLoader implements TranslateLoader { + constructor(private prefix: string = 'i18n', private suffix: string = '.json') {} + + public getTranslation(lang: string): Observable<any> { + const path = join(process.cwd(), 'i18n', this.prefix, `${lang}${this.suffix}`); + const data = JSON.parse(fs.readFileSync(path, 'utf8')); + return of(data); + } +} diff --git a/cmd/lthn-desktop/frontend.old/src/environments/environment.common.ts b/cmd/lthn-desktop/frontend.old/src/environments/environment.common.ts new file mode 100644 index 0000000..3be1243 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/environments/environment.common.ts @@ -0,0 +1,18 @@ +export const appVersion = '250905-1502'; + +export const appInfo = { + name: 'Core', + logo: 'ganatan', + network: 'ganatan', + xnetwork: 'dannyganatan', + linkedinnetwork: 'dannyganatan', + website: 'www.ganatan.com', +}; + +export const applicationBase = { + name: 'angular-starter', + angular: 'Angular 20.3.2', + bootstrap: 'Bootstrap 5.3.8', + fontawesome: 'Font Awesome 7.0.1', +}; + diff --git a/cmd/lthn-desktop/frontend.old/src/environments/environment.development.ts b/cmd/lthn-desktop/frontend.old/src/environments/environment.development.ts new file mode 100644 index 0000000..237999f --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/environments/environment.development.ts @@ -0,0 +1,13 @@ +import { appInfo, applicationBase } from './environment.common'; + +export const environment = { + appInfo, + application: { + ...applicationBase, + angular: `${applicationBase.angular} DEV`, + }, + urlNews: './assets/params/json/mock/trailers.json', + urlMovies: './assets/params/json/mock/movies.json', + useMock: true, + backend: 'http://localhost:3000', +}; diff --git a/cmd/lthn-desktop/frontend.old/src/environments/environment.ts b/cmd/lthn-desktop/frontend.old/src/environments/environment.ts new file mode 100644 index 0000000..865bb20 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/environments/environment.ts @@ -0,0 +1,13 @@ +import { appInfo, applicationBase } from './environment.common'; + +export const environment = { + appInfo, + application: { + ...applicationBase, + angular: `${applicationBase.angular} PROD`, + }, + urlNews: './assets/params/json/mock/trailers.json', + urlMovies: './assets/params/json/mock/movies.json', + useMock: true, + backend: 'http://localhost:3000', +}; diff --git a/cmd/lthn-desktop/frontend.old/src/index.html b/cmd/lthn-desktop/frontend.old/src/index.html new file mode 100644 index 0000000..c35788c --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/index.html @@ -0,0 +1,21 @@ +<!doctype html> +<html lang="en" class="wa-theme-premium wa-palette-vogue wa-brand-indigo"> +<head> + <meta charset="utf-8"> + <title>LTHN - Layered Transmission Host Network + + + + + + + + + + + + + + + + diff --git a/cmd/lthn-desktop/frontend.old/src/main.server.ts b/cmd/lthn-desktop/frontend.old/src/main.server.ts new file mode 100644 index 0000000..723e001 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/main.server.ts @@ -0,0 +1,8 @@ +import { BootstrapContext, bootstrapApplication } from '@angular/platform-browser'; +import { App } from './app/app'; +import { config } from './app/app.config.server'; + +const bootstrap = (context: BootstrapContext) => + bootstrapApplication(App, config, context); + +export default bootstrap; diff --git a/cmd/lthn-desktop/frontend.old/src/main.ts b/cmd/lthn-desktop/frontend.old/src/main.ts new file mode 100644 index 0000000..a5bebef --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/main.ts @@ -0,0 +1,5 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { appConfig } from './app/app.config'; +import { App } from './app/app'; +bootstrapApplication(App, appConfig) + .catch((err) => console.error(err)); diff --git a/cmd/lthn-desktop/frontend.old/src/server.ts b/cmd/lthn-desktop/frontend.old/src/server.ts new file mode 100644 index 0000000..e6546c4 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/server.ts @@ -0,0 +1,68 @@ +import { + AngularNodeAppEngine, + createNodeRequestHandler, + isMainModule, + writeResponseToNodeResponse, +} from '@angular/ssr/node'; +import express from 'express'; +import { join } from 'node:path'; + +const browserDistFolder = join(import.meta.dirname, '../browser'); + +const app = express(); +const angularApp = new AngularNodeAppEngine(); + +/** + * Example Express Rest API endpoints can be defined here. + * Uncomment and define endpoints as necessary. + * + * Example: + * ```ts + * app.get('/api/{*splat}', (req, res) => { + * // Handle API request + * }); + * ``` + */ + +/** + * Serve static files from /browser + */ +app.use( + express.static(browserDistFolder, { + maxAge: '1y', + index: false, + redirect: false, + }), +); + +/** + * Handle all other requests by rendering the Angular application. + */ +app.use((req, res, next) => { + angularApp + .handle(req) + .then((response) => + response ? writeResponseToNodeResponse(response, res) : next(), + ) + .catch(next); +}); + +/** + * Start the server if this module is the main entry point. + * The server listens on the port defined by the `PORT` environment variable, or defaults to 4000. + */ +if (isMainModule(import.meta.url)) { + const port = process.env['PORT'] || 4000; + app.listen(port, (error) => { + if (error) { + throw error; + } + + console.log(`Node Express server listening on http://localhost:${port}`); + }); +} + +/** + * Request handler used by the Angular CLI (for dev-server and during build) or Firebase Cloud Functions. + */ +export const reqHandler = createNodeRequestHandler(app); diff --git a/cmd/lthn-desktop/frontend.old/src/styles.css b/cmd/lthn-desktop/frontend.old/src/styles.css new file mode 100644 index 0000000..0ce01c7 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/styles.css @@ -0,0 +1,13 @@ +@import "@awesome.me/webawesome/dist/styles/webawesome.css"; +@import "@awesome.me/webawesome/dist/styles/themes/premium.css"; +@import "@awesome.me/webawesome/dist/styles/native.css"; +@import "@awesome.me/webawesome/dist/styles/utilities.css"; +@import "@awesome.me/webawesome/dist/styles/color/palettes/vogue.css"; +html, +body { + min-height: 100%; + height: 100%; + padding: 0; + margin: 0; +} + diff --git a/cmd/lthn-desktop/frontend.old/src/test.ts b/cmd/lthn-desktop/frontend.old/src/test.ts new file mode 100644 index 0000000..9d201be --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/test.ts @@ -0,0 +1,38 @@ +import 'zone.js/testing'; +import { TestBed } from '@angular/core/testing'; +import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; +import { TranslateService, TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { Observable, of } from 'rxjs'; + +// Provide TranslateService mock globally for tests to avoid NG0201 in standalone components +(() => { + class FakeTranslateLoader implements TranslateLoader { + getTranslation(lang: string): Observable { return of({}); } + } + + const translateServiceMock: Partial = { + use: (() => ({ toPromise: async () => undefined })) as any, + instant: ((key: string) => key) as any, + get: (((key: any) => ({ subscribe: (fn: any) => fn(key) })) as any), + onLangChange: { subscribe: () => ({ unsubscribe() {} }) } as any, + } as Partial; + + // Patch TestBed.configureTestingModule to always include Translate support + const originalConfigure = TestBed.configureTestingModule.bind(TestBed); + (TestBed as any).configureTestingModule = (meta: any = {}) => { + // Ensure providers include TranslateService mock if not already provided + const providers = meta.providers ?? []; + const hasTranslateProvider = providers.some((p: any) => p && (p.provide === TranslateService)); + meta.providers = hasTranslateProvider ? providers : [...providers, { provide: TranslateService, useValue: translateServiceMock }]; + + // Ensure imports include TranslateModule.forRoot with a fake loader (brings internal _TranslateService) + const imports = meta.imports ?? []; + const hasTranslateModule = imports.some((imp: any) => imp && (imp === TranslateModule || (imp.ngModule && imp.ngModule === TranslateModule))); + if (!hasTranslateModule) { + imports.push(TranslateModule.forRoot({ loader: { provide: TranslateLoader, useClass: FakeTranslateLoader } })); + } + meta.imports = imports; + + return originalConfigure(meta); + }; +})(); diff --git a/cmd/lthn-desktop/frontend.old/src/testing/gbu.ts b/cmd/lthn-desktop/frontend.old/src/testing/gbu.ts new file mode 100644 index 0000000..baa66c5 --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/src/testing/gbu.ts @@ -0,0 +1,31 @@ +// Good/Bad/Ugly test helpers for Jasmine +// Usage: +// import { itGood, itBad, itUgly, trio } from 'src/testing/gbu'; +// itGood('does X', () => { /* ... */ }); +// trio('feature does Y', { +// good: () => { /* ... */ }, +// bad: () => { /* ... */ }, +// ugly: () => { /* ... */ }, +// }); + +export function suffix(base: string, tag: 'Good' | 'Bad' | 'Ugly'): string { + return `${base}_${tag}`; +} + +export function itGood(name: string, fn: jasmine.ImplementationCallback, timeout?: number): void { + it(suffix(name, 'Good'), fn, timeout as any); +} + +export function itBad(name: string, fn: jasmine.ImplementationCallback, timeout?: number): void { + it(suffix(name, 'Bad'), fn, timeout as any); +} + +export function itUgly(name: string, fn: jasmine.ImplementationCallback, timeout?: number): void { + it(suffix(name, 'Ugly'), fn, timeout as any); +} + +export function trio(name: string, impls: { good: () => void; bad: () => void; ugly: () => void; }): void { + itGood(name, impls.good); + itBad(name, impls.bad); + itUgly(name, impls.ugly); +} diff --git a/cmd/lthn-desktop/frontend.old/tsconfig.app.json b/cmd/lthn-desktop/frontend.old/tsconfig.app.json new file mode 100644 index 0000000..44b43fb --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/tsconfig.app.json @@ -0,0 +1,20 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [ + "node", + "./node_modules/@awesome.me/webawesome/dist/custom-elements-jsx.d.ts" + ] + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "src/**/*.spec.ts", + "src/testing/**/*.ts", + "src/test.ts" + ] +} diff --git a/cmd/lthn-desktop/frontend.old/tsconfig.json b/cmd/lthn-desktop/frontend.old/tsconfig.json new file mode 100644 index 0000000..731b0df --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/tsconfig.json @@ -0,0 +1,35 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "compileOnSave": false, + "lib": [ "ES2022", "DOM"], + "compilerOptions": { + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "skipLibCheck": true, + "isolatedModules": true, + "experimentalDecorators": true, + "importHelpers": true, + "target": "ES2022", + "module": "preserve", + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "typeCheckHostBindings": true, + "strictTemplates": true + }, + "files": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/cmd/lthn-desktop/frontend.old/tsconfig.spec.json b/cmd/lthn-desktop/frontend.old/tsconfig.spec.json new file mode 100644 index 0000000..a54039f --- /dev/null +++ b/cmd/lthn-desktop/frontend.old/tsconfig.spec.json @@ -0,0 +1,18 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine" + ], + "baseUrl": ".", + "paths": { + "src/*": ["src/*"] + } + }, + "include": [ + "src/**/*.ts" + ] +} diff --git a/cmd/lthn-desktop/frontend/.dockerignore b/cmd/lthn-desktop/frontend/.dockerignore new file mode 100644 index 0000000..b592cf4 --- /dev/null +++ b/cmd/lthn-desktop/frontend/.dockerignore @@ -0,0 +1,7 @@ +node_modules +npm-debug.log +Dockerfile +.dockerignore +.env +.git +.gitignore diff --git a/cmd/lthn-desktop/frontend/.editorconfig b/cmd/lthn-desktop/frontend/.editorconfig new file mode 100644 index 0000000..f166060 --- /dev/null +++ b/cmd/lthn-desktop/frontend/.editorconfig @@ -0,0 +1,17 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single +ij_typescript_use_double_quotes = false + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/cmd/lthn-desktop/frontend/.gitignore b/cmd/lthn-desktop/frontend/.gitignore new file mode 100644 index 0000000..192ab77 --- /dev/null +++ b/cmd/lthn-desktop/frontend/.gitignore @@ -0,0 +1,42 @@ +# See https://docs.github.com/get-started/getting-started-with-git/ignoring-files for more about ignoring files. +.npmrc +# Compiled output +/dist +/tmp +/out-tsc +/bazel-out + +# Node +/node_modules +npm-debug.log +yarn-error.log + +# IDEs and editors +.idea/ +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# Visual Studio Code +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# Miscellaneous +/.angular/cache +.sass-cache/ +/connect.lock +/coverage +/libpeerconnection.log +testem.log +/typings + +# System files +.DS_Store +Thumbs.db diff --git a/cmd/lthn-desktop/frontend/.postcssrc.json b/cmd/lthn-desktop/frontend/.postcssrc.json new file mode 100644 index 0000000..e092dc7 --- /dev/null +++ b/cmd/lthn-desktop/frontend/.postcssrc.json @@ -0,0 +1,5 @@ +{ + "plugins": { + "@tailwindcss/postcss": {} + } +} diff --git a/cmd/lthn-desktop/frontend/README.md b/cmd/lthn-desktop/frontend/README.md new file mode 100644 index 0000000..6d3eef0 --- /dev/null +++ b/cmd/lthn-desktop/frontend/README.md @@ -0,0 +1,59 @@ +# Frontend + +This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 20.3.6. + +## Development server + +To start a local development server, run: + +```bash +ng serve +``` + +Once the server is running, open your browser and navigate to `http://localhost:4200/`. The application will automatically reload whenever you modify any of the source files. + +## Code scaffolding + +Angular CLI includes powerful code scaffolding tools. To generate a new component, run: + +```bash +ng generate component component-name +``` + +For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run: + +```bash +ng generate --help +``` + +## Building + +To build the project run: + +```bash +ng build +``` + +This will compile your project and store the build artifacts in the `dist/` directory. By default, the production build optimizes your application for performance and speed. + +## Running unit tests + +To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command: + +```bash +ng test +``` + +## Running end-to-end tests + +For end-to-end (e2e) testing, run: + +```bash +ng e2e +``` + +Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs. + +## Additional Resources + +For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page. diff --git a/cmd/lthn-desktop/frontend/angular.json b/cmd/lthn-desktop/frontend/angular.json new file mode 100644 index 0000000..8dbe5d6 --- /dev/null +++ b/cmd/lthn-desktop/frontend/angular.json @@ -0,0 +1,126 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "frontend": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular/build:application", + "options": { + "browser": "src/main.ts", + "tsConfig": "tsconfig.app.json", + "polyfills": ["src/polyfills.ts"], + "inlineStyleLanguage": "scss", + "assets": [ + { + "glob": "**/*", + "input": "public" + }, + { + "glob": "fa-{brands,jelly,thin,light,regular,solid}*.woff2", + "input": "node_modules/@fortawesome/fontawesome-free/webfonts", + "output": "webfonts" + }, + { + "glob": "**/*.*", + "input": "node_modules/@awesome.me/webawesome/dist", + "output": "@awesome.me/webawesome" + }, + { + "glob": "**/*.*", + "input": "bindings", + "output": "/" + }, + { "glob": "**/*", "input": "node_modules/monaco-editor", "output": "/assets/monaco/" }, + { "glob": "**/*", "input": "../services/docs/static", "output": "docs" }, + { + "glob": "**/*.json", + "input": "../services/core/i18n/locales", + "output": "assets/i18n" + } + ], + "scripts": [ + "node_modules/@tailwindplus/elements/dist/index.js" + ], + "styles": [ + "src/styles.scss" + ] + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kB", + "maximumError": "1MB" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "4kB", + "maximumError": "8kB" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular/build:dev-server", + "configurations": { + "production": { + "buildTarget": "frontend:build:production" + }, + "development": { + "buildTarget": "frontend:build:development" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular/build:extract-i18n" + }, + "test": { + "builder": "@angular/build:karma", + "options": { + "tsConfig": "tsconfig.spec.json", + "inlineStyleLanguage": "scss", + "assets": [ + { + "glob": "**/*", + "input": "public" + } + ], + "styles": [ + "src/styles.scss" + ] + } + } + } + } + }, + "cli": { + "analytics": false + } +} diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/config/index.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/config/index.ts new file mode 100644 index 0000000..fd900b4 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/config/index.ts @@ -0,0 +1,7 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import * as Service from "./service.js"; +export { + Service +}; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/config/service.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/config/service.ts new file mode 100644 index 0000000..0b1168b --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/config/service.ts @@ -0,0 +1,226 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +/** + * Service provides access to the application's configuration. + * It handles loading, saving, and providing access to configuration values, + * abstracting away the details of file I/O and data serialization. + * The Service is designed to be a central point for all configuration-related + * operations within the application. + * + * The fields of the Service struct are automatically saved to and loaded from + * a JSON configuration file. The `json:"-"` tag on ServiceRuntime prevents + * it from being serialized. + * @module + */ + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as core$0 from "../core/models.js"; + +/** + * Config returns the registered Config service from the core application. + * This is a convenience method for accessing the application's configuration. + */ +export function Config(): $CancellablePromise { + return $Call.ByID(80156326); +} + +/** + * Core returns the central core instance, providing access to all registered services. + */ +export function Core(): $CancellablePromise { + return $Call.ByID(1678901799).then(($result: any) => { + return $$createType1($result); + }); +} + +/** + * DisableFeature disables a feature by removing it from the features list. + * If the feature is not enabled, this is a no-op. + * + * Example: + * + * err := cfg.DisableFeature("dark_mode") + * if err != nil { + * log.Printf("Failed to disable feature: %v", err) + * } + */ +export function DisableFeature(feature: string): $CancellablePromise { + return $Call.ByID(796720498, feature); +} + +/** + * EnableFeature enables a feature by adding it to the features list. + * If the feature is already enabled, this is a no-op. + * + * Example: + * + * err := cfg.EnableFeature("dark_mode") + * if err != nil { + * log.Printf("Failed to enable feature: %v", err) + * } + */ +export function EnableFeature(feature: string): $CancellablePromise { + return $Call.ByID(953595547, feature); +} + +/** + * Get retrieves a configuration value by its key. The key corresponds to the + * JSON tag of a field in the Service struct. The retrieved value is stored in + * the `out` parameter, which must be a non-nil pointer to a variable of the + * correct type. + * + * Example: + * + * var currentLanguage string + * err := cfg.Get("language", ¤tLanguage) + * if err != nil { + * log.Printf("Could not retrieve language setting: %v", err) + * } + * fmt.Println("Current language is:", currentLanguage) + */ +export function Get(key: string, out: any): $CancellablePromise { + return $Call.ByID(1987004372, key, out); +} + +/** + * HandleIPCEvents processes IPC messages for the config service. + */ +export function HandleIPCEvents(c: core$0.Core | null, msg: core$0.Message): $CancellablePromise { + return $Call.ByID(1015502349, c, msg); +} + +/** + * IsFeatureEnabled checks if a feature is enabled. + * + * Example: + * + * if cfg.IsFeatureEnabled("dark_mode") { + * // Apply dark mode styles + * } + */ +export function IsFeatureEnabled(feature: string): $CancellablePromise { + return $Call.ByID(1495993163, feature); +} + +/** + * LoadKeyValues loads a map of key-value pairs from a file in the config + * directory. The file format is determined by the extension of the `key` + * parameter. This allows for easy retrieval of data stored in various formats. + * + * Example: + * + * dbConfig, err := cfg.LoadKeyValues("database.yml") + * if err != nil { + * log.Printf("Error loading database config: %v", err) + * } + * port, ok := dbConfig["port"].(int) + * // ... + */ +export function LoadKeyValues(key: string): $CancellablePromise<{ [_: string]: any }> { + return $Call.ByID(1235871433, key).then(($result: any) => { + return $$createType2($result); + }); +} + +/** + * LoadStruct loads an arbitrary struct from a JSON file in the config directory. + * The `key` parameter specifies the filename (without the .json extension). The + * loaded data is unmarshaled into the `data` parameter, which must be a + * non-nil pointer to a struct. + * + * Example: + * + * var prefs UserPreferences + * err := cfg.LoadStruct("user_prefs", &prefs) + * if err != nil { + * log.Printf("Error loading user preferences: %v", err) + * } + * fmt.Printf("User theme is: %s", prefs.Theme) + */ +export function LoadStruct(key: string, data: any): $CancellablePromise { + return $Call.ByID(2823566133, key, data); +} + +/** + * Save writes the current configuration to a JSON file. The location of the file + * is determined by the ConfigPath field of the Service struct. This method is + * typically called automatically by Set, but can be used to explicitly save + * changes. + * + * Example: + * + * err := cfg.Save() + * if err != nil { + * log.Printf("Error saving configuration: %v", err) + * } + */ +export function Save(): $CancellablePromise { + return $Call.ByID(1923338053); +} + +/** + * SaveKeyValues saves a map of key-value pairs to a file in the config + * directory. The file format is determined by the extension of the `key` + * parameter. This method is a convenient way to store structured data in a + * format of choice. + * + * Example: + * + * data := map[string]interface{}{"host": "localhost", "port": 8080} + * err := cfg.SaveKeyValues("database.yml", data) + * if err != nil { + * log.Printf("Error saving database config: %v", err) + * } + */ +export function SaveKeyValues(key: string, data: { [_: string]: any }): $CancellablePromise { + return $Call.ByID(2830367426, key, data); +} + +/** + * SaveStruct saves an arbitrary struct to a JSON file in the config directory. + * This is useful for storing complex data that is not part of the main + * configuration. The `key` parameter is used as the filename (with a .json + * extension). + * + * Example: + * + * type UserPreferences struct { + * Theme string `json:"theme"` + * Notifications bool `json:"notifications"` + * } + * prefs := UserPreferences{Theme: "dark", Notifications: true} + * err := cfg.SaveStruct("user_prefs", prefs) + * if err != nil { + * log.Printf("Error saving user preferences: %v", err) + * } + */ +export function SaveStruct(key: string, data: any): $CancellablePromise { + return $Call.ByID(2819770048, key, data); +} + +/** + * Set updates a configuration value and saves the change to the configuration + * file. The key corresponds to the JSON tag of a field in the Service struct. + * The provided value `v` must be of a type that is assignable to the field. + * + * Example: + * + * err := cfg.Set("default_route", "/home") + * if err != nil { + * log.Printf("Failed to set default route: %v", err) + * } + */ +export function Set(key: string, v: any): $CancellablePromise { + return $Call.ByID(2438166024, key, v); +} + +// Private type creation functions +const $$createType0 = core$0.Core.createFrom; +const $$createType1 = $Create.Nullable($$createType0); +const $$createType2 = $Create.Map($Create.Any, $Create.Any); diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/core/index.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/core/index.ts new file mode 100644 index 0000000..f82fcea --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/core/index.ts @@ -0,0 +1,12 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export { + Core, + Features +} from "./models.js"; + +export type { + Config, + Message +} from "./models.js"; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/core/models.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/core/models.ts new file mode 100644 index 0000000..5eb0897 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/core/models.ts @@ -0,0 +1,96 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as application$0 from "../../../../wailsapp/wails/v3/pkg/application/models.js"; + +/** + * Config provides access to application configuration. + */ +export type Config = any; + +/** + * Core is the central application object that manages services, assets, and communication. + */ +export class Core { + "App": application$0.App | null; + "Features": Features | null; + + /** Creates a new Core instance. */ + constructor($$source: Partial = {}) { + if (!("App" in $$source)) { + this["App"] = null; + } + if (!("Features" in $$source)) { + this["Features"] = null; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new Core instance from a string or object. + */ + static createFrom($$source: any = {}): Core { + const $$createField0_0 = $$createType1; + const $$createField1_0 = $$createType3; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("App" in $$parsedSource) { + $$parsedSource["App"] = $$createField0_0($$parsedSource["App"]); + } + if ("Features" in $$parsedSource) { + $$parsedSource["Features"] = $$createField1_0($$parsedSource["Features"]); + } + return new Core($$parsedSource as Partial); + } +} + +/** + * Features provides a way to check if a feature is enabled. + * This is used for feature flagging and conditional logic. + */ +export class Features { + /** + * Flags is a list of enabled feature flags. + */ + "Flags": string[]; + + /** Creates a new Features instance. */ + constructor($$source: Partial = {}) { + if (!("Flags" in $$source)) { + this["Flags"] = []; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new Features instance from a string or object. + */ + static createFrom($$source: any = {}): Features { + const $$createField0_0 = $$createType4; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("Flags" in $$parsedSource) { + $$parsedSource["Flags"] = $$createField0_0($$parsedSource["Flags"]); + } + return new Features($$parsedSource as Partial); + } +} + +/** + * Message is the interface for all messages that can be sent through the Core's IPC system. + * Any struct can be a message, allowing for structured data to be passed between services. + */ +export type Message = any; + +// Private type creation functions +const $$createType0 = application$0.App.createFrom; +const $$createType1 = $Create.Nullable($$createType0); +const $$createType2 = Features.createFrom; +const $$createType3 = $Create.Nullable($$createType2); +const $$createType4 = $Create.Array($Create.Any); diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/crypt/index.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/crypt/index.ts new file mode 100644 index 0000000..17c9e39 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/crypt/index.ts @@ -0,0 +1,11 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import * as Service from "./service.js"; +export { + Service +}; + +export type { + HashType +} from "./models.js"; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/crypt/models.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/crypt/models.ts new file mode 100644 index 0000000..b40f958 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/crypt/models.ts @@ -0,0 +1,16 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as crypt$0 from "../../../Enchantrix/pkg/crypt/models.js"; + +/** + * HashType defines the supported hashing algorithms. + * Re-exported from Enchantrix for convenience. + */ +export type HashType = crypt$0.HashType; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/crypt/service.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/crypt/service.ts new file mode 100644 index 0000000..c313954 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/crypt/service.ts @@ -0,0 +1,169 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +/** + * Service provides cryptographic functions to the application. + * It delegates to Enchantrix for all cryptographic operations. + * @module + */ + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as core$0 from "../core/models.js"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as io$0 from "../../../../../io/models.js"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as $models from "./models.js"; + +/** + * Config returns the registered Config service from the core application. + * This is a convenience method for accessing the application's configuration. + */ +export function Config(): $CancellablePromise { + return $Call.ByID(4086601246); +} + +/** + * Core returns the central core instance, providing access to all registered services. + */ +export function Core(): $CancellablePromise { + return $Call.ByID(81428095).then(($result: any) => { + return $$createType1($result); + }); +} + +/** + * DecryptPGP decrypts a PGP message. + * Note: Enchantrix does not support passphrase-protected keys for decryption. + */ +export function DecryptPGP(privateKey: string, message: string): $CancellablePromise { + return $Call.ByID(583706276, privateKey, message); +} + +/** + * DecryptRSA decrypts data using an RSA private key. + * Takes PEM-encoded private key and ciphertext. + */ +export function DecryptRSA(privateKeyPEM: string, ciphertext: string): $CancellablePromise { + return $Call.ByID(1345539309, privateKeyPEM, ciphertext); +} + +/** + * EncryptPGP encrypts data for a recipient and writes to the provided writer. + */ +export function EncryptPGP(writer: io$0.Writer, recipientPublicKey: string, data: string): $CancellablePromise { + return $Call.ByID(2890283020, writer, recipientPublicKey, data); +} + +/** + * EncryptPGPToString encrypts data for a recipient and returns the ciphertext. + */ +export function EncryptPGPToString(recipientPublicKey: string, data: string): $CancellablePromise { + return $Call.ByID(165721080, recipientPublicKey, data); +} + +/** + * EncryptRSA encrypts data using an RSA public key. + * Takes PEM-encoded public key and returns base64-encoded ciphertext. + */ +export function EncryptRSA(publicKeyPEM: string, plaintext: string): $CancellablePromise { + return $Call.ByID(2625148021, publicKeyPEM, plaintext); +} + +/** + * Fletcher16 computes the Fletcher-16 checksum. + */ +export function Fletcher16(payload: string): $CancellablePromise { + return $Call.ByID(1946934332, payload); +} + +/** + * Fletcher32 computes the Fletcher-32 checksum. + */ +export function Fletcher32(payload: string): $CancellablePromise { + return $Call.ByID(134657290, payload); +} + +/** + * Fletcher64 computes the Fletcher-64 checksum. + */ +export function Fletcher64(payload: string): $CancellablePromise { + return $Call.ByID(4160741397, payload); +} + +/** + * GeneratePGPKeyPair generates a PGP key pair. + * Note: Enchantrix PGP keys are not passphrase-protected. The comment parameter + * is used instead of passphrase for key metadata. + */ +export function GeneratePGPKeyPair(name: string, email: string, comment: string): $CancellablePromise<[string, string]> { + return $Call.ByID(404306973, name, email, comment); +} + +/** + * GenerateRSAKeyPair generates an RSA key pair with the specified bit size. + * Returns PEM-encoded public and private keys. + */ +export function GenerateRSAKeyPair(bits: number): $CancellablePromise<[string, string]> { + return $Call.ByID(931266286, bits); +} + +/** + * HandleIPCEvents processes IPC messages for the crypt service. + */ +export function HandleIPCEvents(c: core$0.Core | null, msg: core$0.Message): $CancellablePromise { + return $Call.ByID(2172739989, c, msg); +} + +/** + * Hash computes a hash of the payload using the specified algorithm. + */ +export function Hash(lib: $models.HashType, payload: string): $CancellablePromise { + return $Call.ByID(2586228864, lib, payload); +} + +/** + * IsHashAlgo checks if the given string is a valid hash algorithm. + */ +export function IsHashAlgo(algo: string): $CancellablePromise { + return $Call.ByID(326857739, algo); +} + +/** + * Luhn validates a number using the Luhn algorithm. + */ +export function Luhn(payload: string): $CancellablePromise { + return $Call.ByID(2072043901, payload); +} + +/** + * SignPGP signs data with a PGP private key. + */ +export function SignPGP(privateKey: string, data: string): $CancellablePromise { + return $Call.ByID(1808182420, privateKey, data); +} + +/** + * SymmetricallyEncryptPGP encrypts data using a passphrase and writes to the provided writer. + */ +export function SymmetricallyEncryptPGP(writer: io$0.Writer, data: string, passphrase: string): $CancellablePromise { + return $Call.ByID(1965343785, writer, data, passphrase); +} + +/** + * VerifyPGP verifies a PGP signature. + */ +export function VerifyPGP(publicKey: string, data: string, signature: string): $CancellablePromise { + return $Call.ByID(2355577904, publicKey, data, signature); +} + +// Private type creation functions +const $$createType0 = core$0.Core.createFrom; +const $$createType1 = $Create.Nullable($$createType0); diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/display/index.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/display/index.ts new file mode 100644 index 0000000..9064bee --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/display/index.ts @@ -0,0 +1,34 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import * as Service from "./service.js"; +export { + Service +}; + +export { + CreateWindowOptions, + FileFilter, + Layout, + LayoutInfo, + NotificationOptions, + OpenDirectoryOptions, + OpenFileOptions, + SaveFileOptions, + ScreenInfo, + Service, + SnapPosition, + ThemeInfo, + TileMode, + TrayMenuItem, + WSEventManager, + Window, + WindowInfo, + WindowState, + WorkArea, + WorkflowType +} from "./models.js"; + +export type { + WindowOption +} from "./models.js"; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/display/models.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/display/models.ts new file mode 100644 index 0000000..933ffd4 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/display/models.ts @@ -0,0 +1,641 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as application$0 from "../../../../wailsapp/wails/v3/pkg/application/models.js"; + +/** + * CreateWindowOptions contains options for creating a new window. + */ +export class CreateWindowOptions { + "name": string; + "title"?: string; + "url"?: string; + "x"?: number; + "y"?: number; + "width"?: number; + "height"?: number; + + /** Creates a new CreateWindowOptions instance. */ + constructor($$source: Partial = {}) { + if (!("name" in $$source)) { + this["name"] = ""; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new CreateWindowOptions instance from a string or object. + */ + static createFrom($$source: any = {}): CreateWindowOptions { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new CreateWindowOptions($$parsedSource as Partial); + } +} + +/** + * FileFilter represents a file type filter for dialogs. + */ +export class FileFilter { + "displayName": string; + "pattern": string; + "extensions"?: string[]; + + /** Creates a new FileFilter instance. */ + constructor($$source: Partial = {}) { + if (!("displayName" in $$source)) { + this["displayName"] = ""; + } + if (!("pattern" in $$source)) { + this["pattern"] = ""; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new FileFilter instance from a string or object. + */ + static createFrom($$source: any = {}): FileFilter { + const $$createField2_0 = $$createType0; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("extensions" in $$parsedSource) { + $$parsedSource["extensions"] = $$createField2_0($$parsedSource["extensions"]); + } + return new FileFilter($$parsedSource as Partial); + } +} + +/** + * Layout represents a saved window arrangement. + */ +export class Layout { + "name": string; + "windows": { [_: string]: WindowState }; + "createdAt": number; + "updatedAt": number; + + /** Creates a new Layout instance. */ + constructor($$source: Partial = {}) { + if (!("name" in $$source)) { + this["name"] = ""; + } + if (!("windows" in $$source)) { + this["windows"] = {}; + } + if (!("createdAt" in $$source)) { + this["createdAt"] = 0; + } + if (!("updatedAt" in $$source)) { + this["updatedAt"] = 0; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new Layout instance from a string or object. + */ + static createFrom($$source: any = {}): Layout { + const $$createField1_0 = $$createType2; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("windows" in $$parsedSource) { + $$parsedSource["windows"] = $$createField1_0($$parsedSource["windows"]); + } + return new Layout($$parsedSource as Partial); + } +} + +/** + * LayoutInfo contains summary information about a layout. + */ +export class LayoutInfo { + "name": string; + "windowCount": number; + "createdAt": number; + "updatedAt": number; + + /** Creates a new LayoutInfo instance. */ + constructor($$source: Partial = {}) { + if (!("name" in $$source)) { + this["name"] = ""; + } + if (!("windowCount" in $$source)) { + this["windowCount"] = 0; + } + if (!("createdAt" in $$source)) { + this["createdAt"] = 0; + } + if (!("updatedAt" in $$source)) { + this["updatedAt"] = 0; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new LayoutInfo instance from a string or object. + */ + static createFrom($$source: any = {}): LayoutInfo { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new LayoutInfo($$parsedSource as Partial); + } +} + +/** + * NotificationOptions contains options for showing a notification. + */ +export class NotificationOptions { + "id"?: string; + "title": string; + "message": string; + "subtitle"?: string; + + /** Creates a new NotificationOptions instance. */ + constructor($$source: Partial = {}) { + if (!("title" in $$source)) { + this["title"] = ""; + } + if (!("message" in $$source)) { + this["message"] = ""; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new NotificationOptions instance from a string or object. + */ + static createFrom($$source: any = {}): NotificationOptions { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new NotificationOptions($$parsedSource as Partial); + } +} + +/** + * OpenDirectoryOptions contains options for the directory picker. + */ +export class OpenDirectoryOptions { + "title"?: string; + "defaultDirectory"?: string; + "allowMultiple"?: boolean; + + /** Creates a new OpenDirectoryOptions instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new OpenDirectoryOptions instance from a string or object. + */ + static createFrom($$source: any = {}): OpenDirectoryOptions { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new OpenDirectoryOptions($$parsedSource as Partial); + } +} + +/** + * OpenFileOptions contains options for the open file dialog. + */ +export class OpenFileOptions { + "title"?: string; + "defaultDirectory"?: string; + "defaultFilename"?: string; + "filters"?: FileFilter[]; + "allowMultiple"?: boolean; + + /** Creates a new OpenFileOptions instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new OpenFileOptions instance from a string or object. + */ + static createFrom($$source: any = {}): OpenFileOptions { + const $$createField3_0 = $$createType4; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("filters" in $$parsedSource) { + $$parsedSource["filters"] = $$createField3_0($$parsedSource["filters"]); + } + return new OpenFileOptions($$parsedSource as Partial); + } +} + +/** + * SaveFileOptions contains options for the save file dialog. + */ +export class SaveFileOptions { + "title"?: string; + "defaultDirectory"?: string; + "defaultFilename"?: string; + "filters"?: FileFilter[]; + + /** Creates a new SaveFileOptions instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new SaveFileOptions instance from a string or object. + */ + static createFrom($$source: any = {}): SaveFileOptions { + const $$createField3_0 = $$createType4; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("filters" in $$parsedSource) { + $$parsedSource["filters"] = $$createField3_0($$parsedSource["filters"]); + } + return new SaveFileOptions($$parsedSource as Partial); + } +} + +/** + * ScreenInfo contains information about a display screen. + */ +export class ScreenInfo { + "id": string; + "name": string; + "x": number; + "y": number; + "width": number; + "height": number; + "primary": boolean; + + /** Creates a new ScreenInfo instance. */ + constructor($$source: Partial = {}) { + if (!("id" in $$source)) { + this["id"] = ""; + } + if (!("name" in $$source)) { + this["name"] = ""; + } + if (!("x" in $$source)) { + this["x"] = 0; + } + if (!("y" in $$source)) { + this["y"] = 0; + } + if (!("width" in $$source)) { + this["width"] = 0; + } + if (!("height" in $$source)) { + this["height"] = 0; + } + if (!("primary" in $$source)) { + this["primary"] = false; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new ScreenInfo instance from a string or object. + */ + static createFrom($$source: any = {}): ScreenInfo { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new ScreenInfo($$parsedSource as Partial); + } +} + +/** + * Service manages windowing, dialogs, and other visual elements. + * It is the primary interface for interacting with the UI. + */ +export class Service { + + /** Creates a new Service instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new Service instance from a string or object. + */ + static createFrom($$source: any = {}): Service { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new Service($$parsedSource as Partial); + } +} + +/** + * SnapPosition represents positions for snapping windows. + */ +export enum SnapPosition { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = "", + + SnapLeft = "left", + SnapRight = "right", + SnapTop = "top", + SnapBottom = "bottom", + SnapTopLeft = "top-left", + SnapTopRight = "top-right", + SnapBottomLeft = "bottom-left", + SnapBottomRight = "bottom-right", + SnapCenter = "center", +}; + +/** + * ThemeInfo contains information about the current theme. + */ +export class ThemeInfo { + "isDark": boolean; + + /** + * "dark" or "light" + */ + "theme": string; + + /** + * Whether following system theme + */ + "system": boolean; + + /** Creates a new ThemeInfo instance. */ + constructor($$source: Partial = {}) { + if (!("isDark" in $$source)) { + this["isDark"] = false; + } + if (!("theme" in $$source)) { + this["theme"] = ""; + } + if (!("system" in $$source)) { + this["system"] = false; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new ThemeInfo instance from a string or object. + */ + static createFrom($$source: any = {}): ThemeInfo { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new ThemeInfo($$parsedSource as Partial); + } +} + +/** + * TileMode represents different tiling arrangements. + */ +export enum TileMode { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = "", + + TileModeLeft = "left", + TileModeRight = "right", + TileModeTop = "top", + TileModeBottom = "bottom", + TileModeTopLeft = "top-left", + TileModeTopRight = "top-right", + TileModeBottomLeft = "bottom-left", + TileModeBottomRight = "bottom-right", + TileModeGrid = "grid", +}; + +/** + * TrayMenuItem represents a menu item for the system tray. + */ +export class TrayMenuItem { + "label": string; + + /** + * "normal", "separator", "checkbox", "radio" + */ + "type"?: string; + + /** + * for checkbox/radio items + */ + "checked"?: boolean; + "disabled"?: boolean; + "tooltip"?: string; + "submenu"?: TrayMenuItem[]; + + /** + * ID for callback + */ + "actionId"?: string; + + /** Creates a new TrayMenuItem instance. */ + constructor($$source: Partial = {}) { + if (!("label" in $$source)) { + this["label"] = ""; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new TrayMenuItem instance from a string or object. + */ + static createFrom($$source: any = {}): TrayMenuItem { + const $$createField5_0 = $$createType6; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("submenu" in $$parsedSource) { + $$parsedSource["submenu"] = $$createField5_0($$parsedSource["submenu"]); + } + return new TrayMenuItem($$parsedSource as Partial); + } +} + +/** + * WSEventManager manages WebSocket connections and event subscriptions. + */ +export class WSEventManager { + + /** Creates a new WSEventManager instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new WSEventManager instance from a string or object. + */ + static createFrom($$source: any = {}): WSEventManager { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new WSEventManager($$parsedSource as Partial); + } +} + +export const Window = application$0.WebviewWindowOptions; +export type Window = application$0.WebviewWindowOptions; + +/** + * WindowInfo contains information about a window for MCP. + */ +export class WindowInfo { + "name": string; + "x": number; + "y": number; + "width": number; + "height": number; + "maximized": boolean; + + /** Creates a new WindowInfo instance. */ + constructor($$source: Partial = {}) { + if (!("name" in $$source)) { + this["name"] = ""; + } + if (!("x" in $$source)) { + this["x"] = 0; + } + if (!("y" in $$source)) { + this["y"] = 0; + } + if (!("width" in $$source)) { + this["width"] = 0; + } + if (!("height" in $$source)) { + this["height"] = 0; + } + if (!("maximized" in $$source)) { + this["maximized"] = false; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new WindowInfo instance from a string or object. + */ + static createFrom($$source: any = {}): WindowInfo { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new WindowInfo($$parsedSource as Partial); + } +} + +export type WindowOption = any; + +/** + * WindowState holds the persisted state of a window. + */ +export class WindowState { + "x": number; + "y": number; + "width": number; + "height": number; + "maximized": boolean; + + /** + * Screen identifier for multi-monitor + */ + "screen"?: string; + + /** + * Last URL/route + */ + "url"?: string; + "updatedAt": number; + + /** Creates a new WindowState instance. */ + constructor($$source: Partial = {}) { + if (!("x" in $$source)) { + this["x"] = 0; + } + if (!("y" in $$source)) { + this["y"] = 0; + } + if (!("width" in $$source)) { + this["width"] = 0; + } + if (!("height" in $$source)) { + this["height"] = 0; + } + if (!("maximized" in $$source)) { + this["maximized"] = false; + } + if (!("updatedAt" in $$source)) { + this["updatedAt"] = 0; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new WindowState instance from a string or object. + */ + static createFrom($$source: any = {}): WindowState { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new WindowState($$parsedSource as Partial); + } +} + +/** + * WorkArea represents usable screen space (excluding dock, menubar, etc). + */ +export class WorkArea { + "screenId": string; + "x": number; + "y": number; + "width": number; + "height": number; + + /** Creates a new WorkArea instance. */ + constructor($$source: Partial = {}) { + if (!("screenId" in $$source)) { + this["screenId"] = ""; + } + if (!("x" in $$source)) { + this["x"] = 0; + } + if (!("y" in $$source)) { + this["y"] = 0; + } + if (!("width" in $$source)) { + this["width"] = 0; + } + if (!("height" in $$source)) { + this["height"] = 0; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new WorkArea instance from a string or object. + */ + static createFrom($$source: any = {}): WorkArea { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new WorkArea($$parsedSource as Partial); + } +} + +/** + * WorkflowType represents predefined workflow layouts. + */ +export enum WorkflowType { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = "", + + WorkflowCoding = "coding", + WorkflowDebugging = "debugging", + WorkflowPresenting = "presenting", + WorkflowSideBySide = "side-by-side", +}; + +// Private type creation functions +const $$createType0 = $Create.Array($Create.Any); +const $$createType1 = WindowState.createFrom; +const $$createType2 = $Create.Map($Create.Any, $$createType1); +const $$createType3 = FileFilter.createFrom; +const $$createType4 = $Create.Array($$createType3); +const $$createType5 = TrayMenuItem.createFrom; +const $$createType6 = $Create.Array($$createType5); diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/display/service.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/display/service.ts new file mode 100644 index 0000000..378c8bd --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/display/service.ts @@ -0,0 +1,618 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +/** + * Service manages windowing, dialogs, and other visual elements. + * It is the primary interface for interacting with the UI. + * @module + */ + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as core$0 from "../core/models.js"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as application$0 from "../../../../wailsapp/wails/v3/pkg/application/models.js"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as notifications$0 from "../../../../wailsapp/wails/v3/pkg/services/notifications/models.js"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as $models from "./models.js"; + +/** + * ApplyWorkflowLayout applies a predefined layout for a specific workflow. + */ +export function ApplyWorkflowLayout(workflow: $models.WorkflowType): $CancellablePromise { + return $Call.ByID(476043825, workflow); +} + +/** + * CheckNotificationPermission checks if notifications are authorized. + */ +export function CheckNotificationPermission(): $CancellablePromise { + return $Call.ByID(3457032254); +} + +/** + * ClearClipboard clears the clipboard by setting empty text. + */ +export function ClearClipboard(): $CancellablePromise { + return $Call.ByID(841655875); +} + +/** + * CloseWindow closes a window by name. + */ +export function CloseWindow(name: string): $CancellablePromise { + return $Call.ByID(3433483506, name); +} + +/** + * Config returns the registered Config service from the core application. + * This is a convenience method for accessing the application's configuration. + */ +export function Config(): $CancellablePromise { + return $Call.ByID(2232242108); +} + +/** + * ConfirmDialog shows a confirmation dialog and returns the user's choice. + */ +export function ConfirmDialog(title: string, message: string): $CancellablePromise { + return $Call.ByID(3496660522, title, message); +} + +/** + * Core returns the central core instance, providing access to all registered services. + */ +export function Core(): $CancellablePromise { + return $Call.ByID(1945729093).then(($result: any) => { + return $$createType1($result); + }); +} + +/** + * CreateWindow creates a new window with the specified options. + */ +export function CreateWindow(opts: $models.CreateWindowOptions): $CancellablePromise<$models.WindowInfo | null> { + return $Call.ByID(2268870170, opts).then(($result: any) => { + return $$createType3($result); + }); +} + +/** + * DeleteLayout removes a saved layout by name. + */ +export function DeleteLayout(name: string): $CancellablePromise { + return $Call.ByID(431293335, name); +} + +/** + * FocusWindow brings a window to the front. + */ +export function FocusWindow(name: string): $CancellablePromise { + return $Call.ByID(3679876474, name); +} + +/** + * GetEventManager returns the event manager for WebSocket event subscriptions. + */ +export function GetEventManager(): $CancellablePromise<$models.WSEventManager | null> { + return $Call.ByID(4088339441).then(($result: any) => { + return $$createType5($result); + }); +} + +/** + * GetFocusedWindow returns the name of the currently focused window, or empty if none. + */ +export function GetFocusedWindow(): $CancellablePromise { + return $Call.ByID(4250461515); +} + +/** + * GetLayout returns a specific layout by name. + */ +export function GetLayout(name: string): $CancellablePromise<$models.Layout | null> { + return $Call.ByID(2300207048, name).then(($result: any) => { + return $$createType7($result); + }); +} + +/** + * GetPrimaryScreen returns information about the primary screen. + */ +export function GetPrimaryScreen(): $CancellablePromise<$models.ScreenInfo | null> { + return $Call.ByID(1543157204).then(($result: any) => { + return $$createType9($result); + }); +} + +/** + * GetSavedWindowStates returns all saved window states. + */ +export function GetSavedWindowStates(): $CancellablePromise<{ [_: string]: $models.WindowState | null }> { + return $Call.ByID(959704111).then(($result: any) => { + return $$createType12($result); + }); +} + +/** + * GetScreen returns information about a specific screen by ID. + */ +export function GetScreen(id: string): $CancellablePromise<$models.ScreenInfo | null> { + return $Call.ByID(461483954, id).then(($result: any) => { + return $$createType9($result); + }); +} + +/** + * GetScreenAtPoint returns the screen containing a specific point. + */ +export function GetScreenAtPoint(x: number, y: number): $CancellablePromise<$models.ScreenInfo | null> { + return $Call.ByID(1700073503, x, y).then(($result: any) => { + return $$createType9($result); + }); +} + +/** + * GetScreenForWindow returns the screen containing a specific window. + */ +export function GetScreenForWindow(name: string): $CancellablePromise<$models.ScreenInfo | null> { + return $Call.ByID(835390401, name).then(($result: any) => { + return $$createType9($result); + }); +} + +/** + * GetScreens returns information about all available screens. + */ +export function GetScreens(): $CancellablePromise<$models.ScreenInfo[]> { + return $Call.ByID(237481171).then(($result: any) => { + return $$createType13($result); + }); +} + +/** + * GetSystemTheme returns the system's theme preference. + * This is the same as GetTheme since Wails follows the system theme. + */ +export function GetSystemTheme(): $CancellablePromise<$models.ThemeInfo> { + return $Call.ByID(3150417360).then(($result: any) => { + return $$createType14($result); + }); +} + +/** + * GetTheme returns the current application theme. + */ +export function GetTheme(): $CancellablePromise<$models.ThemeInfo> { + return $Call.ByID(4073748231).then(($result: any) => { + return $$createType14($result); + }); +} + +/** + * GetTrayInfo returns information about the current tray state. + */ +export function GetTrayInfo(): $CancellablePromise<{ [_: string]: any }> { + return $Call.ByID(3859382794).then(($result: any) => { + return $$createType15($result); + }); +} + +/** + * GetWindowInfo returns information about a window by name. + */ +export function GetWindowInfo(name: string): $CancellablePromise<$models.WindowInfo | null> { + return $Call.ByID(349034490, name).then(($result: any) => { + return $$createType3($result); + }); +} + +/** + * GetWindowTitle returns the title of a window by name. + * Note: Wails v3 doesn't expose a title getter, so we track it ourselves or return the name. + */ +export function GetWindowTitle(name: string): $CancellablePromise { + return $Call.ByID(2943922308, name); +} + +/** + * GetWorkAreas returns the usable work area for all screens. + */ +export function GetWorkAreas(): $CancellablePromise<$models.WorkArea[]> { + return $Call.ByID(2006398407).then(($result: any) => { + return $$createType17($result); + }); +} + +/** + * HasClipboard checks if the clipboard has content. + */ +export function HasClipboard(): $CancellablePromise { + return $Call.ByID(2739125668); +} + +/** + * ListLayouts returns all saved layout names with metadata. + */ +export function ListLayouts(): $CancellablePromise<$models.LayoutInfo[]> { + return $Call.ByID(1178398225).then(($result: any) => { + return $$createType19($result); + }); +} + +/** + * ListWindowInfos returns information about all windows. + */ +export function ListWindowInfos(): $CancellablePromise<$models.WindowInfo[]> { + return $Call.ByID(1417409467).then(($result: any) => { + return $$createType20($result); + }); +} + +/** + * MaximizeWindow maximizes a window. + */ +export function MaximizeWindow(name: string): $CancellablePromise { + return $Call.ByID(3409085844, name); +} + +/** + * MinimizeWindow minimizes a window. + */ +export function MinimizeWindow(name: string): $CancellablePromise { + return $Call.ByID(282422382, name); +} + +/** + * NewWithOptions creates a new window by applying a series of options. + */ +export function NewWithOptions(...opts: $models.WindowOption[]): $CancellablePromise { + return $Call.ByID(2933522506, opts).then(($result: any) => { + return $$createType22($result); + }); +} + +/** + * NewWithStruct creates a new window using the provided options and returns its handle. + */ +export function NewWithStruct(options: $models.Window | null): $CancellablePromise { + return $Call.ByID(51896165, options).then(($result: any) => { + return $$createType22($result); + }); +} + +/** + * NewWithURL creates a new default window pointing to the specified URL. + */ +export function NewWithURL(url: string): $CancellablePromise { + return $Call.ByID(1128847469, url).then(($result: any) => { + return $$createType22($result); + }); +} + +/** + * OpenDirectoryDialog shows a directory picker. + */ +export function OpenDirectoryDialog(opts: $models.OpenDirectoryOptions): $CancellablePromise { + return $Call.ByID(2018109069, opts); +} + +/** + * OpenFileDialog shows a file open dialog and returns selected path(s). + */ +export function OpenFileDialog(opts: $models.OpenFileOptions): $CancellablePromise { + return $Call.ByID(1105329884, opts).then(($result: any) => { + return $$createType23($result); + }); +} + +/** + * OpenSingleFileDialog shows a file open dialog for a single file. + */ +export function OpenSingleFileDialog(opts: $models.OpenFileOptions): $CancellablePromise { + return $Call.ByID(2818039508, opts); +} + +/** + * OpenWindow creates a new window with the given options. If no options are + * provided, it will use the default options. + * + * example: + * + * err := displayService.OpenWindow( + * display.WithName("my-window"), + * display.WithTitle("My Window"), + * display.WithWidth(800), + * display.WithHeight(600), + * ) + * if err != nil { + * log.Fatal(err) + * } + */ +export function OpenWindow(...opts: $models.WindowOption[]): $CancellablePromise { + return $Call.ByID(1872737238, opts); +} + +/** + * PromptDialog shows an input prompt dialog. + * Note: Wails v3 doesn't have a native prompt dialog, so this uses a question dialog. + */ +export function PromptDialog(title: string, message: string): $CancellablePromise<[string, boolean]> { + return $Call.ByID(3860540752, title, message); +} + +/** + * ReadClipboard reads text content from the system clipboard. + */ +export function ReadClipboard(): $CancellablePromise { + return $Call.ByID(353696084); +} + +/** + * RegisterTrayMenuCallback registers a callback for a tray menu action ID. + */ +export function RegisterTrayMenuCallback(actionID: string, callback: any): $CancellablePromise { + return $Call.ByID(2238034275, actionID, callback); +} + +/** + * RequestNotificationPermission requests permission for native notifications. + */ +export function RequestNotificationPermission(): $CancellablePromise { + return $Call.ByID(1315305223); +} + +/** + * ResetWindowState clears saved window positions. + */ +export function ResetWindowState(): $CancellablePromise { + return $Call.ByID(610344254); +} + +/** + * RestoreLayout applies a saved layout, positioning all windows. + */ +export function RestoreLayout(name: string): $CancellablePromise { + return $Call.ByID(2529654318, name); +} + +/** + * RestoreWindow restores a maximized/minimized window. + */ +export function RestoreWindow(name: string): $CancellablePromise { + return $Call.ByID(2762972996, name); +} + +/** + * SaveFileDialog shows a save file dialog and returns the selected path. + */ +export function SaveFileDialog(opts: $models.SaveFileOptions): $CancellablePromise { + return $Call.ByID(3969587317, opts); +} + +/** + * SaveLayout saves the current window arrangement as a named layout. + */ +export function SaveLayout(name: string): $CancellablePromise { + return $Call.ByID(1426429509, name); +} + +/** + * SelectDirectory opens a directory selection dialog and returns the selected path. + */ +export function SelectDirectory(): $CancellablePromise { + return $Call.ByID(968138697); +} + +/** + * SetNotifier sets the notifications service for native notifications. + */ +export function SetNotifier(notifier: notifications$0.NotificationService | null): $CancellablePromise { + return $Call.ByID(4060884340, notifier); +} + +/** + * SetTrayIcon sets the system tray icon from raw PNG data. + */ +export function SetTrayIcon(iconData: string): $CancellablePromise { + return $Call.ByID(888726123, iconData); +} + +/** + * SetTrayLabel sets the system tray label text. + */ +export function SetTrayLabel(label: string): $CancellablePromise { + return $Call.ByID(3980670180, label); +} + +/** + * SetTrayMenu sets the system tray menu from a list of menu items. + */ +export function SetTrayMenu(items: $models.TrayMenuItem[]): $CancellablePromise { + return $Call.ByID(3981223617, items); +} + +/** + * SetTrayTooltip sets the system tray tooltip text. + */ +export function SetTrayTooltip(tooltip: string): $CancellablePromise { + return $Call.ByID(85856277, tooltip); +} + +/** + * SetWindowAlwaysOnTop sets whether a window stays on top of other windows. + */ +export function SetWindowAlwaysOnTop(name: string, alwaysOnTop: boolean): $CancellablePromise { + return $Call.ByID(2197119377, name, alwaysOnTop); +} + +/** + * SetWindowBackgroundColour sets the background color of a window with alpha for transparency. + * Note: On Windows, only alpha 0 or 255 are supported. Other values treated as 255. + */ +export function SetWindowBackgroundColour(name: string, r: number, g: number, b: number, a: number): $CancellablePromise { + return $Call.ByID(3749517962, name, r, g, b, a); +} + +/** + * SetWindowBounds sets both position and size of a window. + */ +export function SetWindowBounds(name: string, x: number, y: number, width: number, height: number): $CancellablePromise { + return $Call.ByID(2084950575, name, x, y, width, height); +} + +/** + * SetWindowFullscreen sets a window to fullscreen mode. + */ +export function SetWindowFullscreen(name: string, fullscreen: boolean): $CancellablePromise { + return $Call.ByID(4232233979, name, fullscreen); +} + +/** + * SetWindowPosition moves a window to the specified position. + */ +export function SetWindowPosition(name: string, x: number, y: number): $CancellablePromise { + return $Call.ByID(3018518601, name, x, y); +} + +/** + * SetWindowSize resizes a window. + */ +export function SetWindowSize(name: string, width: number, height: number): $CancellablePromise { + return $Call.ByID(2987817615, name, width, height); +} + +/** + * SetWindowTitle changes a window's title. + */ +export function SetWindowTitle(name: string, title: string): $CancellablePromise { + return $Call.ByID(3349151432, name, title); +} + +/** + * SetWindowVisibility shows or hides a window. + */ +export function SetWindowVisibility(name: string, visible: boolean): $CancellablePromise { + return $Call.ByID(121431198, name, visible); +} + +/** + * ShowEnvironmentDialog displays a dialog containing detailed information about + * the application's runtime environment. This is useful for debugging and + * understanding the context in which the application is running. + * + * example: + * + * displayService.ShowEnvironmentDialog() + */ +export function ShowEnvironmentDialog(): $CancellablePromise { + return $Call.ByID(3261510832); +} + +/** + * ShowErrorNotification shows an error notification. + */ +export function ShowErrorNotification(title: string, message: string): $CancellablePromise { + return $Call.ByID(1228262280, title, message); +} + +/** + * ShowInfoNotification shows an info notification with a simple message. + */ +export function ShowInfoNotification(title: string, message: string): $CancellablePromise { + return $Call.ByID(2419366044, title, message); +} + +/** + * ShowNotification displays a native system notification. + * Falls back to dialog if notifier is not available. + */ +export function ShowNotification(opts: $models.NotificationOptions): $CancellablePromise { + return $Call.ByID(2416075800, opts); +} + +/** + * ShowWarningNotification shows a warning notification. + */ +export function ShowWarningNotification(title: string, message: string): $CancellablePromise { + return $Call.ByID(200899338, title, message); +} + +/** + * SnapWindow snaps a window to a screen edge or corner. + */ +export function SnapWindow(name: string, position: $models.SnapPosition): $CancellablePromise { + return $Call.ByID(3088366266, name, position); +} + +/** + * StackWindows arranges windows in a cascade (stacked) pattern. + * Each window is offset by the given amount from the previous one. + */ +export function StackWindows(windowNames: string[], offsetX: number, offsetY: number): $CancellablePromise { + return $Call.ByID(3309040327, windowNames, offsetX, offsetY); +} + +/** + * Startup is called when the app starts. It initializes the display service + * and sets up the main application window and system tray. + * + * err := displayService.Startup(ctx) + * if err != nil { + * log.Fatal(err) + * } + */ +export function Startup(): $CancellablePromise { + return $Call.ByID(1664741927); +} + +/** + * TileWindows arranges windows in a tiled layout. + * mode can be: left, right, top, bottom, top-left, top-right, bottom-left, bottom-right, grid + * If windowNames is empty, tiles all windows. + */ +export function TileWindows(mode: $models.TileMode, windowNames: string[]): $CancellablePromise { + return $Call.ByID(1638500379, mode, windowNames); +} + +/** + * WriteClipboard writes text content to the system clipboard. + */ +export function WriteClipboard(text: string): $CancellablePromise { + return $Call.ByID(2577466505, text); +} + +// Private type creation functions +const $$createType0 = core$0.Core.createFrom; +const $$createType1 = $Create.Nullable($$createType0); +const $$createType2 = $models.WindowInfo.createFrom; +const $$createType3 = $Create.Nullable($$createType2); +const $$createType4 = $models.WSEventManager.createFrom; +const $$createType5 = $Create.Nullable($$createType4); +const $$createType6 = $models.Layout.createFrom; +const $$createType7 = $Create.Nullable($$createType6); +const $$createType8 = $models.ScreenInfo.createFrom; +const $$createType9 = $Create.Nullable($$createType8); +const $$createType10 = $models.WindowState.createFrom; +const $$createType11 = $Create.Nullable($$createType10); +const $$createType12 = $Create.Map($Create.Any, $$createType11); +const $$createType13 = $Create.Array($$createType8); +const $$createType14 = $models.ThemeInfo.createFrom; +const $$createType15 = $Create.Map($Create.Any, $Create.Any); +const $$createType16 = $models.WorkArea.createFrom; +const $$createType17 = $Create.Array($$createType16); +const $$createType18 = $models.LayoutInfo.createFrom; +const $$createType19 = $Create.Array($$createType18); +const $$createType20 = $Create.Array($$createType2); +const $$createType21 = application$0.WebviewWindow.createFrom; +const $$createType22 = $Create.Nullable($$createType21); +const $$createType23 = $Create.Array($Create.Any); diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/docs/index.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/docs/index.ts new file mode 100644 index 0000000..fd900b4 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/docs/index.ts @@ -0,0 +1,7 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import * as Service from "./service.js"; +export { + Service +}; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/docs/service.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/docs/service.ts new file mode 100644 index 0000000..6493ff9 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/docs/service.ts @@ -0,0 +1,37 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +/** + * Service manages documentation windows. + * @module + */ + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as core$0 from "../core/models.js"; + +/** + * OpenDocsWindow opens a documentation window at the specified path. + * The path is appended to the base URL to form the full documentation URL. + */ +export function OpenDocsWindow(path: string): $CancellablePromise { + return $Call.ByID(2514509460, path); +} + +/** + * SetBaseURL sets the base URL for documentation. + */ +export function SetBaseURL(url: string): $CancellablePromise { + return $Call.ByID(1851990453, url); +} + +/** + * SetCore sets the core reference for accessing other services. + */ +export function SetCore(c: core$0.Core | null): $CancellablePromise { + return $Call.ByID(527529290, c); +} diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/help/index.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/help/index.ts new file mode 100644 index 0000000..60e9dac --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/help/index.ts @@ -0,0 +1,12 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import * as Service from "./service.js"; +export { + Service +}; + +export type { + Core, + Display +} from "./models.js"; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/help/models.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/help/models.ts new file mode 100644 index 0000000..870f934 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/help/models.ts @@ -0,0 +1,20 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +/** + * Core defines the interface for the core runtime functionalities that the + * help service depends on. This typically includes methods for performing + * actions and accessing the application context. + */ +export type Core = any; + +/** + * Display defines the interface for a display service. The help service + * uses this interface to check for the presence of a display module, + * allowing it to function as an optional dependency. + */ +export type Display = any; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/help/service.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/help/service.ts new file mode 100644 index 0000000..27f822d --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/help/service.ts @@ -0,0 +1,48 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +/** + * Service manages the in-app help system. It handles the initialization + * of the help content, interaction with the core runtime, and display + * of the help window. + * @module + */ + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as $models from "./models.js"; + +/** + * Init initializes the service with its core dependencies. This method is + * intended to be called by the dependency injection system of the application + * to provide the necessary `Core` and `Display` implementations. + */ +export function Init(c: $models.Core, d: $models.Display): $CancellablePromise { + return $Call.ByID(2251945077, c, d); +} + +/** + * Show displays the main help window. If a `Display` service is available, + * it sends an action to the core runtime to open the window. Otherwise, it + * falls back to using the `wails3` application instance to create a new + * window. This ensures that the help functionality is available even when + * the `Snider/display` module is not in use. + */ +export function Show(): $CancellablePromise { + return $Call.ByID(401579614); +} + +/** + * ShowAt displays a specific section of the help documentation, identified + * by an anchor. Similar to `Show`, it uses the `Display` service if available, + * or falls back to a direct `wails3` implementation. The anchor is appended + * to the URL, allowing the help window to open directly to the relevant + * section. + */ +export function ShowAt(anchor: string): $CancellablePromise { + return $Call.ByID(3303047483, anchor); +} diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/i18n/index.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/i18n/index.ts new file mode 100644 index 0000000..fd900b4 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/i18n/index.ts @@ -0,0 +1,7 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import * as Service from "./service.js"; +export { + Service +}; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/i18n/service.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/i18n/service.ts new file mode 100644 index 0000000..e731b9e --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/i18n/service.ts @@ -0,0 +1,65 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +/** + * Service provides internationalization and localization. + * It is the primary entrypoint for the i18n package. + * @module + */ + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as i18n$0 from "../../../../nicksnyder/go-i18n/v2/i18n/models.js"; + +/** + * AvailableLanguages returns a list of available language codes. + */ +export function AvailableLanguages(): $CancellablePromise { + return $Call.ByID(3797911080).then(($result: any) => { + return $$createType0($result); + }); +} + +/** + * GetAllMessages returns all translation messages for the specified language. + * The keys are message IDs and values are the translated strings. + * If lang is empty, it uses the current language. + */ +export function GetAllMessages(lang: string): $CancellablePromise<{ [_: string]: string }> { + return $Call.ByID(497958721, lang).then(($result: any) => { + return $$createType1($result); + }); +} + +/** + * SetBundle is a test helper to inject a bundle. + */ +export function SetBundle(bundle: i18n$0.Bundle | null): $CancellablePromise { + return $Call.ByID(2373446086, bundle); +} + +/** + * SetLanguage sets the language for the i18n service. + * The language tag should be a valid BCP 47 language tag (e.g., "en", "en-US"). + * If the language is not supported, an error is returned. + */ +export function SetLanguage(lang: string): $CancellablePromise { + return $Call.ByID(1882213732, lang); +} + +/** + * Translate translates a message by its ID. + * It accepts an optional template data argument to interpolate into the translation. + * If the message is not found, the message ID is returned. + */ +export function Translate(messageID: string, ...args: any[]): $CancellablePromise { + return $Call.ByID(1625170060, messageID, args); +} + +// Private type creation functions +const $$createType0 = $Create.Array($Create.Any); +const $$createType1 = $Create.Map($Create.Any, $Create.Any); diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/ide/index.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/ide/index.ts new file mode 100644 index 0000000..fdc5393 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/ide/index.ts @@ -0,0 +1,13 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import * as Service from "./service.js"; +export { + Service +}; + +export { + DirectoryEntry, + FileInfo, + LanguageInfo +} from "./models.js"; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/ide/models.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/ide/models.ts new file mode 100644 index 0000000..d406c52 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/ide/models.ts @@ -0,0 +1,121 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +/** + * DirectoryEntry represents a file or directory in a listing. + */ +export class DirectoryEntry { + "name": string; + "path": string; + "isDir": boolean; + "size": number; + + /** Creates a new DirectoryEntry instance. */ + constructor($$source: Partial = {}) { + if (!("name" in $$source)) { + this["name"] = ""; + } + if (!("path" in $$source)) { + this["path"] = ""; + } + if (!("isDir" in $$source)) { + this["isDir"] = false; + } + if (!("size" in $$source)) { + this["size"] = 0; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new DirectoryEntry instance from a string or object. + */ + static createFrom($$source: any = {}): DirectoryEntry { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new DirectoryEntry($$parsedSource as Partial); + } +} + +/** + * FileInfo represents information about a file for the editor. + */ +export class FileInfo { + "path": string; + "name": string; + "content": string; + "language": string; + "isNew": boolean; + + /** Creates a new FileInfo instance. */ + constructor($$source: Partial = {}) { + if (!("path" in $$source)) { + this["path"] = ""; + } + if (!("name" in $$source)) { + this["name"] = ""; + } + if (!("content" in $$source)) { + this["content"] = ""; + } + if (!("language" in $$source)) { + this["language"] = ""; + } + if (!("isNew" in $$source)) { + this["isNew"] = false; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new FileInfo instance from a string or object. + */ + static createFrom($$source: any = {}): FileInfo { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new FileInfo($$parsedSource as Partial); + } +} + +/** + * LanguageInfo describes a supported programming language. + */ +export class LanguageInfo { + "id": string; + "name": string; + "extensions": string[]; + + /** Creates a new LanguageInfo instance. */ + constructor($$source: Partial = {}) { + if (!("id" in $$source)) { + this["id"] = ""; + } + if (!("name" in $$source)) { + this["name"] = ""; + } + if (!("extensions" in $$source)) { + this["extensions"] = []; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new LanguageInfo instance from a string or object. + */ + static createFrom($$source: any = {}): LanguageInfo { + const $$createField2_0 = $$createType0; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("extensions" in $$parsedSource) { + $$parsedSource["extensions"] = $$createField2_0($$parsedSource["extensions"]); + } + return new LanguageInfo($$parsedSource as Partial); + } +} + +// Private type creation functions +const $$createType0 = $Create.Array($Create.Any); diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/ide/service.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/ide/service.ts new file mode 100644 index 0000000..02998c0 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/ide/service.ts @@ -0,0 +1,130 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +/** + * Service provides IDE functionality for code editing, file management, and project operations. + * @module + */ + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as core$0 from "../core/models.js"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as $models from "./models.js"; + +/** + * Config returns the registered Config service from the core application. + * This is a convenience method for accessing the application's configuration. + */ +export function Config(): $CancellablePromise { + return $Call.ByID(2256800318); +} + +/** + * Core returns the central core instance, providing access to all registered services. + */ +export function Core(): $CancellablePromise { + return $Call.ByID(2000663455).then(($result: any) => { + return $$createType1($result); + }); +} + +/** + * CreateDirectory creates a new directory at the given path. + */ +export function CreateDirectory(path: string): $CancellablePromise { + return $Call.ByID(4108527007, path); +} + +/** + * DeleteFile removes a file at the given path. + */ +export function DeleteFile(path: string): $CancellablePromise { + return $Call.ByID(1778361797, path); +} + +/** + * DetectLanguage returns the Monaco editor language for a given file path. + */ +export function DetectLanguage(path: string): $CancellablePromise { + return $Call.ByID(1446649409, path); +} + +/** + * FileExists checks if a file exists at the given path. + */ +export function FileExists(path: string): $CancellablePromise { + return $Call.ByID(2444049838, path); +} + +/** + * GetSupportedLanguages returns a list of languages supported by the editor. + */ +export function GetSupportedLanguages(): $CancellablePromise<$models.LanguageInfo[]> { + return $Call.ByID(948137385).then(($result: any) => { + return $$createType3($result); + }); +} + +/** + * ListDirectory returns a list of files and directories in the given path. + */ +export function ListDirectory(path: string): $CancellablePromise<$models.DirectoryEntry[]> { + return $Call.ByID(2978024379, path).then(($result: any) => { + return $$createType5($result); + }); +} + +/** + * NewFile creates a new untitled file with the specified language. + */ +export function NewFile(language: string): $CancellablePromise<$models.FileInfo> { + return $Call.ByID(354339848, language).then(($result: any) => { + return $$createType6($result); + }); +} + +/** + * OpenFile reads a file from disk and returns its content with language detection. + */ +export function OpenFile(path: string): $CancellablePromise<$models.FileInfo> { + return $Call.ByID(1563991886, path).then(($result: any) => { + return $$createType6($result); + }); +} + +/** + * ReadFile reads content from a file without additional metadata. + */ +export function ReadFile(path: string): $CancellablePromise { + return $Call.ByID(1836122514, path); +} + +/** + * RenameFile renames/moves a file from oldPath to newPath. + */ +export function RenameFile(oldPath: string, newPath: string): $CancellablePromise { + return $Call.ByID(128270740, oldPath, newPath); +} + +/** + * SaveFile saves content to the specified path. + */ +export function SaveFile(path: string, content: string): $CancellablePromise { + return $Call.ByID(1229744459, path, content); +} + +// Private type creation functions +const $$createType0 = core$0.Core.createFrom; +const $$createType1 = $Create.Nullable($$createType0); +const $$createType2 = $models.LanguageInfo.createFrom; +const $$createType3 = $Create.Array($$createType2); +const $$createType4 = $models.DirectoryEntry.createFrom; +const $$createType5 = $Create.Array($$createType4); +const $$createType6 = $models.FileInfo.createFrom; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/mcp/index.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/mcp/index.ts new file mode 100644 index 0000000..f47f133 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/mcp/index.ts @@ -0,0 +1,6 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export { + Service +} from "./models.js"; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/mcp/models.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/mcp/models.ts new file mode 100644 index 0000000..9809f71 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/mcp/models.ts @@ -0,0 +1,26 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +/** + * Service provides an MCP server that exposes Core functionality. + */ +export class Service { + + /** Creates a new Service instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new Service instance from a string or object. + */ + static createFrom($$source: any = {}): Service { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new Service($$parsedSource as Partial); + } +} diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/module/index.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/module/index.ts new file mode 100644 index 0000000..30cdf0a --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/module/index.ts @@ -0,0 +1,23 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import * as Service from "./service.js"; +export { + Service +}; + +export { + APIEndpoint, + AppConfig, + AppHook, + BinaryInfo, + Config, + Context, + Downloads, + MenuItem, + ModuleType, + PlatformBinaries, + Registry, + Route, + UIConfig +} from "./models.js"; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/module/models.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/module/models.ts new file mode 100644 index 0000000..acbcfab --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/module/models.ts @@ -0,0 +1,577 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +/** + * APIEndpoint declares an API endpoint the module provides. + */ +export class APIEndpoint { + /** + * GET, POST, etc. + */ + "method": string; + + /** + * Relative to /api/{namespace}/{code} + */ + "path": string; + "description"?: string; + + /** Creates a new APIEndpoint instance. */ + constructor($$source: Partial = {}) { + if (!("method" in $$source)) { + this["method"] = ""; + } + if (!("path" in $$source)) { + this["path"] = ""; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new APIEndpoint instance from a string or object. + */ + static createFrom($$source: any = {}): APIEndpoint { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new APIEndpoint($$parsedSource as Partial); + } +} + +/** + * AppConfig defines web app specific configuration. + */ +export class AppConfig { + "url"?: string; + + /** + * spa, iframe, etc. + */ + "type"?: string; + "hooks"?: AppHook[]; + + /** Creates a new AppConfig instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new AppConfig instance from a string or object. + */ + static createFrom($$source: any = {}): AppConfig { + const $$createField2_0 = $$createType1; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("hooks" in $$parsedSource) { + $$parsedSource["hooks"] = $$createField2_0($$parsedSource["hooks"]); + } + return new AppConfig($$parsedSource as Partial); + } +} + +/** + * AppHook defines app lifecycle hooks. + */ +export class AppHook { + /** + * rename, copy, etc. + */ + "type": string; + "from"?: string; + "to"?: string; + "data"?: { [_: string]: any }; + + /** Creates a new AppHook instance. */ + constructor($$source: Partial = {}) { + if (!("type" in $$source)) { + this["type"] = ""; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new AppHook instance from a string or object. + */ + static createFrom($$source: any = {}): AppHook { + const $$createField3_0 = $$createType2; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("data" in $$parsedSource) { + $$parsedSource["data"] = $$createField3_0($$parsedSource["data"]); + } + return new AppHook($$parsedSource as Partial); + } +} + +/** + * BinaryInfo contains download info for a binary. + */ +export class BinaryInfo { + "url": string; + "checksum"?: string; + + /** Creates a new BinaryInfo instance. */ + constructor($$source: Partial = {}) { + if (!("url" in $$source)) { + this["url"] = ""; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new BinaryInfo instance from a string or object. + */ + static createFrom($$source: any = {}): BinaryInfo { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new BinaryInfo($$parsedSource as Partial); + } +} + +/** + * Config is the .itw3.json format for module registration. + * This is the boundary format between Core and external modules. + */ +export class Config { + /** + * Unique identifier + */ + "code": string; + + /** + * core, app, bin + */ + "type": ModuleType; + + /** + * Display name + */ + "name": string; + + /** + * Semantic version + */ + "version": string; + + /** + * API/config namespace + */ + "namespace": string; + + /** + * Human description + */ + "description"?: string; + "author"?: string; + + /** + * UI menu contributions + */ + "menu"?: MenuItem[]; + + /** + * UI route contributions + */ + "routes"?: Route[]; + + /** + * Which contexts this module supports + */ + "contexts"?: Context[]; + + /** + * Platform binaries + */ + "downloads"?: Downloads | null; + + /** + * Web app config + */ + "app"?: AppConfig | null; + + /** + * Module dependencies + */ + "depends"?: string[]; + + /** + * API endpoint declarations + */ + "api"?: APIEndpoint[]; + + /** + * Default configuration + */ + "config"?: { [_: string]: any }; + + /** Creates a new Config instance. */ + constructor($$source: Partial = {}) { + if (!("code" in $$source)) { + this["code"] = ""; + } + if (!("type" in $$source)) { + this["type"] = ModuleType.$zero; + } + if (!("name" in $$source)) { + this["name"] = ""; + } + if (!("version" in $$source)) { + this["version"] = ""; + } + if (!("namespace" in $$source)) { + this["namespace"] = ""; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new Config instance from a string or object. + */ + static createFrom($$source: any = {}): Config { + const $$createField7_0 = $$createType4; + const $$createField8_0 = $$createType6; + const $$createField9_0 = $$createType7; + const $$createField10_0 = $$createType9; + const $$createField11_0 = $$createType11; + const $$createField12_0 = $$createType12; + const $$createField13_0 = $$createType14; + const $$createField14_0 = $$createType2; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("menu" in $$parsedSource) { + $$parsedSource["menu"] = $$createField7_0($$parsedSource["menu"]); + } + if ("routes" in $$parsedSource) { + $$parsedSource["routes"] = $$createField8_0($$parsedSource["routes"]); + } + if ("contexts" in $$parsedSource) { + $$parsedSource["contexts"] = $$createField9_0($$parsedSource["contexts"]); + } + if ("downloads" in $$parsedSource) { + $$parsedSource["downloads"] = $$createField10_0($$parsedSource["downloads"]); + } + if ("app" in $$parsedSource) { + $$parsedSource["app"] = $$createField11_0($$parsedSource["app"]); + } + if ("depends" in $$parsedSource) { + $$parsedSource["depends"] = $$createField12_0($$parsedSource["depends"]); + } + if ("api" in $$parsedSource) { + $$parsedSource["api"] = $$createField13_0($$parsedSource["api"]); + } + if ("config" in $$parsedSource) { + $$parsedSource["config"] = $$createField14_0($$parsedSource["config"]); + } + return new Config($$parsedSource as Partial); + } +} + +/** + * Context represents the UI context (developer, retail, miner, etc.) + */ +export enum Context { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = "", + + ContextDefault = "default", + ContextDeveloper = "developer", + ContextRetail = "retail", + ContextMiner = "miner", +}; + +/** + * Downloads defines platform-specific binary downloads. + */ +export class Downloads { + /** + * Web app archive + */ + "app"?: string; + "x86_64"?: PlatformBinaries | null; + "aarch64"?: PlatformBinaries | null; + + /** Creates a new Downloads instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new Downloads instance from a string or object. + */ + static createFrom($$source: any = {}): Downloads { + const $$createField1_0 = $$createType16; + const $$createField2_0 = $$createType16; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("x86_64" in $$parsedSource) { + $$parsedSource["x86_64"] = $$createField1_0($$parsedSource["x86_64"]); + } + if ("aarch64" in $$parsedSource) { + $$parsedSource["aarch64"] = $$createField2_0($$parsedSource["aarch64"]); + } + return new Downloads($$parsedSource as Partial); + } +} + +/** + * MenuItem represents a menu item contribution. + */ +export class MenuItem { + "id": string; + "label": string; + "icon"?: string; + + /** + * Event name to emit + */ + "action"?: string; + + /** + * Frontend route + */ + "route"?: string; + + /** + * Keyboard shortcut + */ + "accelerator"?: string; + + /** + * Show in these contexts + */ + "contexts"?: Context[]; + + /** + * Submenu items + */ + "children"?: MenuItem[]; + + /** + * Sort order + */ + "order"?: number; + "separator"?: boolean; + + /** Creates a new MenuItem instance. */ + constructor($$source: Partial = {}) { + if (!("id" in $$source)) { + this["id"] = ""; + } + if (!("label" in $$source)) { + this["label"] = ""; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new MenuItem instance from a string or object. + */ + static createFrom($$source: any = {}): MenuItem { + const $$createField6_0 = $$createType7; + const $$createField7_0 = $$createType4; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("contexts" in $$parsedSource) { + $$parsedSource["contexts"] = $$createField6_0($$parsedSource["contexts"]); + } + if ("children" in $$parsedSource) { + $$parsedSource["children"] = $$createField7_0($$parsedSource["children"]); + } + return new MenuItem($$parsedSource as Partial); + } +} + +/** + * ModuleType defines the type of module. + */ +export enum ModuleType { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = "", + + /** + * Built-in core module + */ + TypeCore = "core", + + /** + * External application + */ + TypeApp = "app", + + /** + * Binary/daemon wrapper + */ + TypeBin = "bin", +}; + +/** + * PlatformBinaries defines OS-specific binary URLs. + */ +export class PlatformBinaries { + "darwin"?: BinaryInfo | null; + "linux"?: BinaryInfo | null; + "windows"?: BinaryInfo | null; + + /** Creates a new PlatformBinaries instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new PlatformBinaries instance from a string or object. + */ + static createFrom($$source: any = {}): PlatformBinaries { + const $$createField0_0 = $$createType18; + const $$createField1_0 = $$createType18; + const $$createField2_0 = $$createType18; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("darwin" in $$parsedSource) { + $$parsedSource["darwin"] = $$createField0_0($$parsedSource["darwin"]); + } + if ("linux" in $$parsedSource) { + $$parsedSource["linux"] = $$createField1_0($$parsedSource["linux"]); + } + if ("windows" in $$parsedSource) { + $$parsedSource["windows"] = $$createField2_0($$parsedSource["windows"]); + } + return new PlatformBinaries($$parsedSource as Partial); + } +} + +/** + * Registry manages module registration and provides unified API routing + UI assembly. + */ +export class Registry { + + /** Creates a new Registry instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new Registry instance from a string or object. + */ + static createFrom($$source: any = {}): Registry { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new Registry($$parsedSource as Partial); + } +} + +/** + * Route represents a UI route contribution. + */ +export class Route { + "path": string; + + /** + * Custom element or component + */ + "component": string; + "title"?: string; + "icon"?: string; + "contexts"?: Context[]; + + /** Creates a new Route instance. */ + constructor($$source: Partial = {}) { + if (!("path" in $$source)) { + this["path"] = ""; + } + if (!("component" in $$source)) { + this["component"] = ""; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new Route instance from a string or object. + */ + static createFrom($$source: any = {}): Route { + const $$createField4_0 = $$createType7; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("contexts" in $$parsedSource) { + $$parsedSource["contexts"] = $$createField4_0($$parsedSource["contexts"]); + } + return new Route($$parsedSource as Partial); + } +} + +/** + * UIConfig is the complete UI configuration for frontends. + */ +export class UIConfig { + "context": Context; + "menus": MenuItem[]; + "routes": Route[]; + "modules": Config[]; + + /** Creates a new UIConfig instance. */ + constructor($$source: Partial = {}) { + if (!("context" in $$source)) { + this["context"] = Context.$zero; + } + if (!("menus" in $$source)) { + this["menus"] = []; + } + if (!("routes" in $$source)) { + this["routes"] = []; + } + if (!("modules" in $$source)) { + this["modules"] = []; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new UIConfig instance from a string or object. + */ + static createFrom($$source: any = {}): UIConfig { + const $$createField1_0 = $$createType4; + const $$createField2_0 = $$createType6; + const $$createField3_0 = $$createType20; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("menus" in $$parsedSource) { + $$parsedSource["menus"] = $$createField1_0($$parsedSource["menus"]); + } + if ("routes" in $$parsedSource) { + $$parsedSource["routes"] = $$createField2_0($$parsedSource["routes"]); + } + if ("modules" in $$parsedSource) { + $$parsedSource["modules"] = $$createField3_0($$parsedSource["modules"]); + } + return new UIConfig($$parsedSource as Partial); + } +} + +// Private type creation functions +const $$createType0 = AppHook.createFrom; +const $$createType1 = $Create.Array($$createType0); +const $$createType2 = $Create.Map($Create.Any, $Create.Any); +const $$createType3 = MenuItem.createFrom; +const $$createType4 = $Create.Array($$createType3); +const $$createType5 = Route.createFrom; +const $$createType6 = $Create.Array($$createType5); +const $$createType7 = $Create.Array($Create.Any); +const $$createType8 = Downloads.createFrom; +const $$createType9 = $Create.Nullable($$createType8); +const $$createType10 = AppConfig.createFrom; +const $$createType11 = $Create.Nullable($$createType10); +const $$createType12 = $Create.Array($Create.Any); +const $$createType13 = APIEndpoint.createFrom; +const $$createType14 = $Create.Array($$createType13); +const $$createType15 = PlatformBinaries.createFrom; +const $$createType16 = $Create.Nullable($$createType15); +const $$createType17 = BinaryInfo.createFrom; +const $$createType18 = $Create.Nullable($$createType17); +const $$createType19 = Config.createFrom; +const $$createType20 = $Create.Array($$createType19); diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/module/service.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/module/service.ts new file mode 100644 index 0000000..4f8d62b --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/module/service.ts @@ -0,0 +1,142 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +/** + * Service wraps Registry for Wails service registration. + * @module + */ + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as core$0 from "../core/models.js"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as $models from "./models.js"; + +/** + * Config returns the registered Config service from the core application. + * This is a convenience method for accessing the application's configuration. + */ +export function Config(): $CancellablePromise { + return $Call.ByID(2666037348); +} + +/** + * Core returns the central core instance, providing access to all registered services. + */ +export function Core(): $CancellablePromise { + return $Call.ByID(2667999981).then(($result: any) => { + return $$createType1($result); + }); +} + +/** + * GetAvailableContexts returns all available contexts. + */ +export function GetAvailableContexts(): $CancellablePromise { + return $Call.ByID(581350213).then(($result: any) => { + return $$createType2($result); + }); +} + +/** + * GetContext returns the current context. + */ +export function GetContext(): $CancellablePromise { + return $Call.ByID(2851668817); +} + +/** + * GetMenus returns menus for the current context. + */ +export function GetMenus(): $CancellablePromise<$models.MenuItem[]> { + return $Call.ByID(2772432318).then(($result: any) => { + return $$createType4($result); + }); +} + +/** + * GetModule returns a specific module by code. + */ +export function GetModule(code: string): $CancellablePromise<[$models.Config, boolean]> { + return $Call.ByID(2941496402, code).then(($result: any) => { + $result[0] = $$createType5($result[0]); + return $result; + }); +} + +/** + * GetModules returns all registered modules. + */ +export function GetModules(): $CancellablePromise<$models.Config[]> { + return $Call.ByID(565704691).then(($result: any) => { + return $$createType6($result); + }); +} + +/** + * GetRoutes returns routes for the current context. + */ +export function GetRoutes(): $CancellablePromise<$models.Route[]> { + return $Call.ByID(2452947460).then(($result: any) => { + return $$createType8($result); + }); +} + +/** + * GetUIConfig returns complete UI config for the current context. + */ +export function GetUIConfig(): $CancellablePromise<$models.UIConfig> { + return $Call.ByID(1850432430).then(($result: any) => { + return $$createType9($result); + }); +} + +/** + * RegisterModule registers a module from JSON config string. + */ +export function RegisterModule(jsonConfig: string): $CancellablePromise { + return $Call.ByID(3476381919, jsonConfig); +} + +/** + * Registry returns the underlying registry for direct access. + */ +export function Registry(): $CancellablePromise<$models.Registry | null> { + return $Call.ByID(406000161).then(($result: any) => { + return $$createType11($result); + }); +} + +/** + * SetContext changes the active UI context. + */ +export function SetContext(ctx: string): $CancellablePromise { + return $Call.ByID(2231690805, ctx); +} + +/** + * UnregisterModule removes a module by code. + */ +export function UnregisterModule(code: string): $CancellablePromise { + return $Call.ByID(514107996, code); +} + +// Private type creation functions +const $$createType0 = core$0.Core.createFrom; +const $$createType1 = $Create.Nullable($$createType0); +const $$createType2 = $Create.Array($Create.Any); +const $$createType3 = $models.MenuItem.createFrom; +const $$createType4 = $Create.Array($$createType3); +const $$createType5 = $models.Config.createFrom; +const $$createType6 = $Create.Array($$createType5); +const $$createType7 = $models.Route.createFrom; +const $$createType8 = $Create.Array($$createType7); +const $$createType9 = $models.UIConfig.createFrom; +const $$createType10 = $models.Registry.createFrom; +const $$createType11 = $Create.Nullable($$createType10); diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/plugin/index.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/plugin/index.ts new file mode 100644 index 0000000..2c5eddf --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/plugin/index.ts @@ -0,0 +1,15 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import * as Router from "./router.js"; +export { + Router +}; + +export { + PluginInfo +} from "./models.js"; + +export type { + Plugin +} from "./models.js"; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/plugin/models.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/plugin/models.ts new file mode 100644 index 0000000..99922ea --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/plugin/models.ts @@ -0,0 +1,66 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +/** + * Plugin defines the interface that all plugins must implement. + */ +export type Plugin = any; + +/** + * PluginInfo contains metadata about a registered plugin. + */ +export class PluginInfo { + "Name": string; + "Namespace": string; + "Description": string; + "Version": string; + "Author": string; + + /** + * List of sub-routes this plugin handles + */ + "Routes": string[]; + + /** Creates a new PluginInfo instance. */ + constructor($$source: Partial = {}) { + if (!("Name" in $$source)) { + this["Name"] = ""; + } + if (!("Namespace" in $$source)) { + this["Namespace"] = ""; + } + if (!("Description" in $$source)) { + this["Description"] = ""; + } + if (!("Version" in $$source)) { + this["Version"] = ""; + } + if (!("Author" in $$source)) { + this["Author"] = ""; + } + if (!("Routes" in $$source)) { + this["Routes"] = []; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new PluginInfo instance from a string or object. + */ + static createFrom($$source: any = {}): PluginInfo { + const $$createField5_0 = $$createType0; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("Routes" in $$parsedSource) { + $$parsedSource["Routes"] = $$createField5_0($$parsedSource["Routes"]); + } + return new PluginInfo($$parsedSource as Partial); + } +} + +// Private type creation functions +const $$createType0 = $Create.Array($Create.Any); diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/plugin/router.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/plugin/router.ts new file mode 100644 index 0000000..d42aeb2 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/plugin/router.ts @@ -0,0 +1,100 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +/** + * Router manages plugin registration and provides a Gin-based HTTP router. + * It implements http.Handler and can be used as the Wails asset handler middleware. + * @module + */ + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as gin$0 from "../../../../gin-gonic/gin/models.js"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as application$0 from "../../../../wailsapp/wails/v3/pkg/application/models.js"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as http$0 from "../../../../../net/http/models.js"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as $models from "./models.js"; + +/** + * Engine returns the underlying Gin engine for advanced configuration. + */ +export function Engine(): $CancellablePromise { + return $Call.ByID(2071121571).then(($result: any) => { + return $$createType1($result); + }); +} + +/** + * Get returns a plugin by namespace and name. + */ +export function Get($namespace: string, name: string): $CancellablePromise<[$models.Plugin, boolean]> { + return $Call.ByID(2263988351, $namespace, name); +} + +/** + * List returns info about all registered plugins. + */ +export function List(): $CancellablePromise<$models.PluginInfo[]> { + return $Call.ByID(1465721241).then(($result: any) => { + return $$createType3($result); + }); +} + +/** + * ListByNamespace returns all plugins in a namespace. + */ +export function ListByNamespace($namespace: string): $CancellablePromise<$models.Plugin[]> { + return $Call.ByID(3303695111, $namespace).then(($result: any) => { + return $$createType4($result); + }); +} + +/** + * Register adds a plugin to the router. + */ +export function Register(p: $models.Plugin): $CancellablePromise { + return $Call.ByID(1142024616, p); +} + +/** + * ServiceOptions returns the Wails service options for the router. + */ +export function ServiceOptions(): $CancellablePromise { + return $Call.ByID(1034114530).then(($result: any) => { + return $$createType5($result); + }); +} + +/** + * SetAssetHandler sets the fallback handler for non-API routes (Wails assets). + */ +export function SetAssetHandler(h: http$0.Handler): $CancellablePromise { + return $Call.ByID(417441915, h); +} + +/** + * Unregister removes a plugin from the router. + * Note: Gin doesn't support removing routes, so this only removes from our registry. + * A restart is required for route changes to take effect. + */ +export function Unregister($namespace: string, name: string): $CancellablePromise { + return $Call.ByID(2047711931, $namespace, name); +} + +// Private type creation functions +const $$createType0 = gin$0.Engine.createFrom; +const $$createType1 = $Create.Nullable($$createType0); +const $$createType2 = $models.PluginInfo.createFrom; +const $$createType3 = $Create.Array($$createType2); +const $$createType4 = $Create.Array($Create.Any); +const $$createType5 = application$0.ServiceOptions.createFrom; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/webview/index.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/webview/index.ts new file mode 100644 index 0000000..f47f133 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/webview/index.ts @@ -0,0 +1,6 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export { + Service +} from "./models.js"; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/webview/models.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/webview/models.ts new file mode 100644 index 0000000..410186e --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/webview/models.ts @@ -0,0 +1,26 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +/** + * Service provides WebView interaction capabilities. + */ +export class Service { + + /** Creates a new Service instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new Service instance from a string or object. + */ + static createFrom($$source: any = {}): Service { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new Service($$parsedSource as Partial); + } +} diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/workspace/index.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/workspace/index.ts new file mode 100644 index 0000000..ca4fea6 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/workspace/index.ts @@ -0,0 +1,11 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import * as Service from "./service.js"; +export { + Service +}; + +export { + Workspace +} from "./models.js"; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/workspace/models.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/workspace/models.ts new file mode 100644 index 0000000..2f6d54e --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/workspace/models.ts @@ -0,0 +1,34 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +/** + * Workspace represents a user's workspace. + */ +export class Workspace { + "Name": string; + "Path": string; + + /** Creates a new Workspace instance. */ + constructor($$source: Partial = {}) { + if (!("Name" in $$source)) { + this["Name"] = ""; + } + if (!("Path" in $$source)) { + this["Path"] = ""; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new Workspace instance from a string or object. + */ + static createFrom($$source: any = {}): Workspace { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new Workspace($$parsedSource as Partial); + } +} diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/workspace/service.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/workspace/service.ts new file mode 100644 index 0000000..f3b531e --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Core/pkg/workspace/service.ts @@ -0,0 +1,96 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +/** + * Service manages user workspaces. + * @module + */ + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as core$0 from "../core/models.js"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as $models from "./models.js"; + +/** + * ActiveWorkspace returns the currently active workspace, or nil if none is active. + */ +export function ActiveWorkspace(): $CancellablePromise<$models.Workspace | null> { + return $Call.ByID(1950953690).then(($result: any) => { + return $$createType1($result); + }); +} + +/** + * Config returns the registered Config service from the core application. + * This is a convenience method for accessing the application's configuration. + */ +export function Config(): $CancellablePromise { + return $Call.ByID(1263760661); +} + +/** + * Core returns the central core instance, providing access to all registered services. + */ +export function Core(): $CancellablePromise { + return $Call.ByID(235692716).then(($result: any) => { + return $$createType3($result); + }); +} + +/** + * CreateWorkspace creates a new, obfuscated workspace on the local medium. + */ +export function CreateWorkspace(identifier: string, password: string): $CancellablePromise { + return $Call.ByID(1795228612, identifier, password); +} + +/** + * HandleIPCEvents processes IPC messages, including injecting dependencies on startup. + */ +export function HandleIPCEvents(c: core$0.Core | null, msg: core$0.Message): $CancellablePromise { + return $Call.ByID(2170147968, c, msg); +} + +/** + * ListWorkspaces returns the list of workspace IDs. + */ +export function ListWorkspaces(): $CancellablePromise { + return $Call.ByID(539524341).then(($result: any) => { + return $$createType4($result); + }); +} + +/** + * SwitchWorkspace changes the active workspace. + */ +export function SwitchWorkspace(name: string): $CancellablePromise { + return $Call.ByID(3125647852, name); +} + +/** + * WorkspaceFileGet retrieves a file from the active workspace. + */ +export function WorkspaceFileGet(filename: string): $CancellablePromise { + return $Call.ByID(3718387990, filename); +} + +/** + * WorkspaceFileSet writes a file to the active workspace. + */ +export function WorkspaceFileSet(filename: string, content: string): $CancellablePromise { + return $Call.ByID(1806719962, filename, content); +} + +// Private type creation functions +const $$createType0 = $models.Workspace.createFrom; +const $$createType1 = $Create.Nullable($$createType0); +const $$createType2 = core$0.Core.createFrom; +const $$createType3 = $Create.Nullable($$createType2); +const $$createType4 = $Create.Array($Create.Any); diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Enchantrix/pkg/crypt/index.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Enchantrix/pkg/crypt/index.ts new file mode 100644 index 0000000..addf62d --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Enchantrix/pkg/crypt/index.ts @@ -0,0 +1,6 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export { + HashType +} from "./models.js"; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Enchantrix/pkg/crypt/models.ts b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Enchantrix/pkg/crypt/models.ts new file mode 100644 index 0000000..e52f977 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/Snider/Enchantrix/pkg/crypt/models.ts @@ -0,0 +1,41 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +/** + * HashType defines the supported hashing algorithms. + */ +export enum HashType { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = "", + + /** + * LTHN is a custom quasi-salted hashing algorithm. + */ + LTHN = "lthn", + + /** + * SHA512 is the SHA-512 hashing algorithm. + */ + SHA512 = "sha512", + + /** + * SHA256 is the SHA-256 hashing algorithm. + */ + SHA256 = "sha256", + + /** + * SHA1 is the SHA-1 hashing algorithm. + */ + SHA1 = "sha1", + + /** + * MD5 is the MD5 hashing algorithm. + */ + MD5 = "md5", +}; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/gin-gonic/gin/index.ts b/cmd/lthn-desktop/frontend/bindings/github.com/gin-gonic/gin/index.ts new file mode 100644 index 0000000..9305413 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/gin-gonic/gin/index.ts @@ -0,0 +1,11 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export { + Engine +} from "./models.js"; + +export type { + HandlerFunc, + HandlersChain +} from "./models.js"; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/gin-gonic/gin/models.ts b/cmd/lthn-desktop/frontend/bindings/github.com/gin-gonic/gin/models.ts new file mode 100644 index 0000000..f38a25e --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/gin-gonic/gin/models.ts @@ -0,0 +1,220 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as render$0 from "./render/models.js"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as template$0 from "../../../html/template/models.js"; + +/** + * Engine is the framework's instance, it contains the muxer, middleware and configuration settings. + * Create an instance of Engine, by using New() or Default() + */ +export class Engine { + "Handlers": HandlersChain; + + /** + * RedirectTrailingSlash enables automatic redirection if the current route can't be matched but a + * handler for the path with (without) the trailing slash exists. + * For example if /foo/ is requested but a route only exists for /foo, the + * client is redirected to /foo with http status code 301 for GET requests + * and 307 for all other request methods. + */ + "RedirectTrailingSlash": boolean; + + /** + * RedirectFixedPath if enabled, the router tries to fix the current request path, if no + * handle is registered for it. + * First superfluous path elements like ../ or // are removed. + * Afterwards the router does a case-insensitive lookup of the cleaned path. + * If a handle can be found for this route, the router makes a redirection + * to the corrected path with status code 301 for GET requests and 307 for + * all other request methods. + * For example /FOO and /..//Foo could be redirected to /foo. + * RedirectTrailingSlash is independent of this option. + */ + "RedirectFixedPath": boolean; + + /** + * HandleMethodNotAllowed if enabled, the router checks if another method is allowed for the + * current route, if the current request can not be routed. + * If this is the case, the request is answered with 'Method Not Allowed' + * and HTTP status code 405. + * If no other Method is allowed, the request is delegated to the NotFound + * handler. + */ + "HandleMethodNotAllowed": boolean; + + /** + * ForwardedByClientIP if enabled, client IP will be parsed from the request's headers that + * match those stored at `(*gin.Engine).RemoteIPHeaders`. If no IP was + * fetched, it falls back to the IP obtained from + * `(*gin.Context).Request.RemoteAddr`. + */ + "ForwardedByClientIP": boolean; + + /** + * AppEngine was deprecated. + * Deprecated: USE `TrustedPlatform` WITH VALUE `gin.PlatformGoogleAppEngine` INSTEAD + * #726 #755 If enabled, it will trust some headers starting with + * 'X-AppEngine...' for better integration with that PaaS. + */ + "AppEngine": boolean; + + /** + * UseRawPath if enabled, the url.RawPath will be used to find parameters. + */ + "UseRawPath": boolean; + + /** + * UnescapePathValues if true, the path value will be unescaped. + * If UseRawPath is false (by default), the UnescapePathValues effectively is true, + * as url.Path gonna be used, which is already unescaped. + */ + "UnescapePathValues": boolean; + + /** + * RemoveExtraSlash a parameter can be parsed from the URL even with extra slashes. + * See the PR #1817 and issue #1644 + */ + "RemoveExtraSlash": boolean; + + /** + * RemoteIPHeaders list of headers used to obtain the client IP when + * `(*gin.Engine).ForwardedByClientIP` is `true` and + * `(*gin.Context).Request.RemoteAddr` is matched by at least one of the + * network origins of list defined by `(*gin.Engine).SetTrustedProxies()`. + */ + "RemoteIPHeaders": string[]; + + /** + * TrustedPlatform if set to a constant of value gin.Platform*, trusts the headers set by + * that platform, for example to determine the client IP + */ + "TrustedPlatform": string; + + /** + * MaxMultipartMemory value of 'maxMemory' param that is given to http.Request's ParseMultipartForm + * method call. + */ + "MaxMultipartMemory": number; + + /** + * UseH2C enable h2c support. + */ + "UseH2C": boolean; + + /** + * ContextWithFallback enable fallback Context.Deadline(), Context.Done(), Context.Err() and Context.Value() when Context.Request.Context() is not nil. + */ + "ContextWithFallback": boolean; + "HTMLRender": render$0.HTMLRender; + "FuncMap": template$0.FuncMap; + + /** Creates a new Engine instance. */ + constructor($$source: Partial = {}) { + if (!("Handlers" in $$source)) { + this["Handlers"] = []; + } + if (!("RedirectTrailingSlash" in $$source)) { + this["RedirectTrailingSlash"] = false; + } + if (!("RedirectFixedPath" in $$source)) { + this["RedirectFixedPath"] = false; + } + if (!("HandleMethodNotAllowed" in $$source)) { + this["HandleMethodNotAllowed"] = false; + } + if (!("ForwardedByClientIP" in $$source)) { + this["ForwardedByClientIP"] = false; + } + if (!("AppEngine" in $$source)) { + this["AppEngine"] = false; + } + if (!("UseRawPath" in $$source)) { + this["UseRawPath"] = false; + } + if (!("UnescapePathValues" in $$source)) { + this["UnescapePathValues"] = false; + } + if (!("RemoveExtraSlash" in $$source)) { + this["RemoveExtraSlash"] = false; + } + if (!("RemoteIPHeaders" in $$source)) { + this["RemoteIPHeaders"] = []; + } + if (!("TrustedPlatform" in $$source)) { + this["TrustedPlatform"] = ""; + } + if (!("MaxMultipartMemory" in $$source)) { + this["MaxMultipartMemory"] = 0; + } + if (!("UseH2C" in $$source)) { + this["UseH2C"] = false; + } + if (!("ContextWithFallback" in $$source)) { + this["ContextWithFallback"] = false; + } + if (!("HTMLRender" in $$source)) { + this["HTMLRender"] = null; + } + if (!("FuncMap" in $$source)) { + this["FuncMap"] = {}; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new Engine instance from a string or object. + */ + static createFrom($$source: any = {}): Engine { + const $$createField0_0 = $$createType0; + const $$createField9_0 = $$createType2; + const $$createField15_0 = $$createType3; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("Handlers" in $$parsedSource) { + $$parsedSource["Handlers"] = $$createField0_0($$parsedSource["Handlers"]); + } + if ("RemoteIPHeaders" in $$parsedSource) { + $$parsedSource["RemoteIPHeaders"] = $$createField9_0($$parsedSource["RemoteIPHeaders"]); + } + if ("FuncMap" in $$parsedSource) { + $$parsedSource["FuncMap"] = $$createField15_0($$parsedSource["FuncMap"]); + } + return new Engine($$parsedSource as Partial); + } +} + +/** + * HandlerFunc defines the handler used by gin middleware as return value. + */ +export type HandlerFunc = any; + +/** + * HandlersChain defines a HandlerFunc slice. + */ +export type HandlersChain = HandlerFunc[]; + +// Private type creation functions +var $$createType0 = (function $$initCreateType0(...args: any[]): any { + if ($$createType0 === $$initCreateType0) { + $$createType0 = $$createType1; + } + return $$createType0(...args); +}); +const $$createType1 = $Create.Array($Create.Any); +const $$createType2 = $Create.Array($Create.Any); +var $$createType3 = (function $$initCreateType3(...args: any[]): any { + if ($$createType3 === $$initCreateType3) { + $$createType3 = $$createType4; + } + return $$createType3(...args); +}); +const $$createType4 = $Create.Map($Create.Any, $Create.Any); diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/gin-gonic/gin/render/index.ts b/cmd/lthn-desktop/frontend/bindings/github.com/gin-gonic/gin/render/index.ts new file mode 100644 index 0000000..c4ad421 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/gin-gonic/gin/render/index.ts @@ -0,0 +1,6 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export type { + HTMLRender +} from "./models.js"; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/gin-gonic/gin/render/models.ts b/cmd/lthn-desktop/frontend/bindings/github.com/gin-gonic/gin/render/models.ts new file mode 100644 index 0000000..07b0af3 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/gin-gonic/gin/render/models.ts @@ -0,0 +1,11 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +/** + * HTMLRender interface is to be implemented by HTMLProduction and HTMLDebug. + */ +export type HTMLRender = any; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/leaanthony/u/index.ts b/cmd/lthn-desktop/frontend/bindings/github.com/leaanthony/u/index.ts new file mode 100644 index 0000000..69f881f --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/leaanthony/u/index.ts @@ -0,0 +1,7 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export { + Bool, + Var +} from "./models.js"; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/leaanthony/u/models.ts b/cmd/lthn-desktop/frontend/bindings/github.com/leaanthony/u/models.ts new file mode 100644 index 0000000..4801261 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/leaanthony/u/models.ts @@ -0,0 +1,40 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +/** + * Var is a variable that can be set, unset and queried for its state. + */ +export class Var { + + /** Creates a new Var instance. */ + constructor($$source: Partial> = {}) { + + Object.assign(this, $$source); + } + + /** + * Given creation functions for each type parameter, + * returns a creation function for a concrete instance + * of the generic class Var. + */ + static createFrom($$createParamT: (source: any) => T): ($$source?: any) => Var { + return ($$source: any = {}) => { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new Var($$parsedSource as Partial>); + }; + } +} + +/** + * Bool is a `bool` that can be unset + */ +export const Bool = Var; + +/** + * Bool is a `bool` that can be unset + */ +export type Bool = Var; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/nicksnyder/go-i18n/v2/i18n/index.ts b/cmd/lthn-desktop/frontend/bindings/github.com/nicksnyder/go-i18n/v2/i18n/index.ts new file mode 100644 index 0000000..5510dfa --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/nicksnyder/go-i18n/v2/i18n/index.ts @@ -0,0 +1,6 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export { + Bundle +} from "./models.js"; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/nicksnyder/go-i18n/v2/i18n/models.ts b/cmd/lthn-desktop/frontend/bindings/github.com/nicksnyder/go-i18n/v2/i18n/models.ts new file mode 100644 index 0000000..8d8eaf6 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/nicksnyder/go-i18n/v2/i18n/models.ts @@ -0,0 +1,30 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +/** + * Bundle stores a set of messages and pluralization rules. + * Most applications only need a single bundle + * that is initialized early in the application's lifecycle. + * It is not goroutine safe to modify the bundle while Localizers + * are reading from it. + */ +export class Bundle { + + /** Creates a new Bundle instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new Bundle instance from a string or object. + */ + static createFrom($$source: any = {}): Bundle { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new Bundle($$parsedSource as Partial); + } +} diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/internal/eventcreate.ts b/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/internal/eventcreate.ts new file mode 100644 index 0000000..1ea1058 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/internal/eventcreate.ts @@ -0,0 +1,9 @@ +//@ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +Object.freeze($Create.Events); diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/internal/eventdata.d.ts b/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/internal/eventdata.d.ts new file mode 100644 index 0000000..3dd1807 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/internal/eventdata.d.ts @@ -0,0 +1,2 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/pkg/application/index.ts b/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/pkg/application/index.ts new file mode 100644 index 0000000..0f5cf56 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/pkg/application/index.ts @@ -0,0 +1,47 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export { + App, + BackdropType, + BackgroundType, + BrowserManager, + ButtonState, + ClipboardManager, + ContextMenuManager, + CoreWebView2PermissionState, + DialogManager, + DragEffect, + EnvironmentManager, + EventManager, + KeyBindingManager, + LinuxWindow, + MacAppearanceType, + MacBackdrop, + MacLiquidGlass, + MacLiquidGlassStyle, + MacTitleBar, + MacToolbarStyle, + MacWebviewPreferences, + MacWindow, + MacWindowLevel, + Menu, + MenuBarTheme, + MenuManager, + NSVisualEffectMaterial, + RGBA, + ScreenManager, + ServiceOptions, + SystemTrayManager, + TextTheme, + Theme, + ThemeSettings, + WebviewGpuPolicy, + WebviewWindow, + WebviewWindowOptions, + WindowManager, + WindowStartPosition, + WindowState, + WindowTheme, + WindowsWindow +} from "./models.js"; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/pkg/application/models.ts b/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/pkg/application/models.ts new file mode 100644 index 0000000..59c28a4 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/pkg/application/models.ts @@ -0,0 +1,2051 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as u$0 from "../../../../../leaanthony/u/models.js"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as events$0 from "../events/models.js"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as slog$0 from "../../../../../../log/slog/models.js"; + +export class App { + /** + * Manager pattern for organized API + */ + "Window": WindowManager | null; + "ContextMenu": ContextMenuManager | null; + "KeyBinding": KeyBindingManager | null; + "Browser": BrowserManager | null; + "Env": EnvironmentManager | null; + "Dialog": DialogManager | null; + "Event": EventManager | null; + "Menu": MenuManager | null; + "Screen": ScreenManager | null; + "Clipboard": ClipboardManager | null; + "SystemTray": SystemTrayManager | null; + "Logger": slog$0.Logger | null; + + /** Creates a new App instance. */ + constructor($$source: Partial = {}) { + if (!("Window" in $$source)) { + this["Window"] = null; + } + if (!("ContextMenu" in $$source)) { + this["ContextMenu"] = null; + } + if (!("KeyBinding" in $$source)) { + this["KeyBinding"] = null; + } + if (!("Browser" in $$source)) { + this["Browser"] = null; + } + if (!("Env" in $$source)) { + this["Env"] = null; + } + if (!("Dialog" in $$source)) { + this["Dialog"] = null; + } + if (!("Event" in $$source)) { + this["Event"] = null; + } + if (!("Menu" in $$source)) { + this["Menu"] = null; + } + if (!("Screen" in $$source)) { + this["Screen"] = null; + } + if (!("Clipboard" in $$source)) { + this["Clipboard"] = null; + } + if (!("SystemTray" in $$source)) { + this["SystemTray"] = null; + } + if (!("Logger" in $$source)) { + this["Logger"] = null; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new App instance from a string or object. + */ + static createFrom($$source: any = {}): App { + const $$createField0_0 = $$createType1; + const $$createField1_0 = $$createType3; + const $$createField2_0 = $$createType5; + const $$createField3_0 = $$createType7; + const $$createField4_0 = $$createType9; + const $$createField5_0 = $$createType11; + const $$createField6_0 = $$createType13; + const $$createField7_0 = $$createType15; + const $$createField8_0 = $$createType17; + const $$createField9_0 = $$createType19; + const $$createField10_0 = $$createType21; + const $$createField11_0 = $$createType23; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("Window" in $$parsedSource) { + $$parsedSource["Window"] = $$createField0_0($$parsedSource["Window"]); + } + if ("ContextMenu" in $$parsedSource) { + $$parsedSource["ContextMenu"] = $$createField1_0($$parsedSource["ContextMenu"]); + } + if ("KeyBinding" in $$parsedSource) { + $$parsedSource["KeyBinding"] = $$createField2_0($$parsedSource["KeyBinding"]); + } + if ("Browser" in $$parsedSource) { + $$parsedSource["Browser"] = $$createField3_0($$parsedSource["Browser"]); + } + if ("Env" in $$parsedSource) { + $$parsedSource["Env"] = $$createField4_0($$parsedSource["Env"]); + } + if ("Dialog" in $$parsedSource) { + $$parsedSource["Dialog"] = $$createField5_0($$parsedSource["Dialog"]); + } + if ("Event" in $$parsedSource) { + $$parsedSource["Event"] = $$createField6_0($$parsedSource["Event"]); + } + if ("Menu" in $$parsedSource) { + $$parsedSource["Menu"] = $$createField7_0($$parsedSource["Menu"]); + } + if ("Screen" in $$parsedSource) { + $$parsedSource["Screen"] = $$createField8_0($$parsedSource["Screen"]); + } + if ("Clipboard" in $$parsedSource) { + $$parsedSource["Clipboard"] = $$createField9_0($$parsedSource["Clipboard"]); + } + if ("SystemTray" in $$parsedSource) { + $$parsedSource["SystemTray"] = $$createField10_0($$parsedSource["SystemTray"]); + } + if ("Logger" in $$parsedSource) { + $$parsedSource["Logger"] = $$createField11_0($$parsedSource["Logger"]); + } + return new App($$parsedSource as Partial); + } +} + +export enum BackdropType { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + Auto = 0, + None = 1, + Mica = 2, + Acrylic = 3, + Tabbed = 4, +}; + +export enum BackgroundType { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + BackgroundTypeSolid = 0, + BackgroundTypeTransparent = 1, + BackgroundTypeTranslucent = 2, +}; + +/** + * BrowserManager manages browser-related operations + */ +export class BrowserManager { + + /** Creates a new BrowserManager instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new BrowserManager instance from a string or object. + */ + static createFrom($$source: any = {}): BrowserManager { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new BrowserManager($$parsedSource as Partial); + } +} + +export enum ButtonState { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + ButtonEnabled = 0, + ButtonDisabled = 1, + ButtonHidden = 2, +}; + +/** + * ClipboardManager manages clipboard operations + */ +export class ClipboardManager { + + /** Creates a new ClipboardManager instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new ClipboardManager instance from a string or object. + */ + static createFrom($$source: any = {}): ClipboardManager { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new ClipboardManager($$parsedSource as Partial); + } +} + +/** + * ContextMenuManager manages all context menu operations + */ +export class ContextMenuManager { + + /** Creates a new ContextMenuManager instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new ContextMenuManager instance from a string or object. + */ + static createFrom($$source: any = {}): ContextMenuManager { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new ContextMenuManager($$parsedSource as Partial); + } +} + +export enum CoreWebView2PermissionState { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + CoreWebView2PermissionStateDefault = 0, + CoreWebView2PermissionStateAllow = 1, + CoreWebView2PermissionStateDeny = 2, +}; + +/** + * DialogManager manages dialog-related operations + */ +export class DialogManager { + + /** Creates a new DialogManager instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new DialogManager instance from a string or object. + */ + static createFrom($$source: any = {}): DialogManager { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new DialogManager($$parsedSource as Partial); + } +} + +export enum DragEffect { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + /** + * DragEffectNone is used to indicate that the drop target cannot accept the data. + */ + DragEffectNone = 1, + + /** + * DragEffectCopy is used to indicate that the data is copied to the drop target. + */ + DragEffectCopy = 2, + + /** + * DragEffectMove is used to indicate that the data is removed from the drag source. + */ + DragEffectMove = 3, + + /** + * DragEffectLink is used to indicate that a link to the original data is established. + */ + DragEffectLink = 4, +}; + +/** + * EnvironmentManager manages environment-related operations + */ +export class EnvironmentManager { + + /** Creates a new EnvironmentManager instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new EnvironmentManager instance from a string or object. + */ + static createFrom($$source: any = {}): EnvironmentManager { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new EnvironmentManager($$parsedSource as Partial); + } +} + +/** + * EventManager manages event-related operations + */ +export class EventManager { + + /** Creates a new EventManager instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new EventManager instance from a string or object. + */ + static createFrom($$source: any = {}): EventManager { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new EventManager($$parsedSource as Partial); + } +} + +/** + * KeyBindingManager manages all key binding operations + */ +export class KeyBindingManager { + + /** Creates a new KeyBindingManager instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new KeyBindingManager instance from a string or object. + */ + static createFrom($$source: any = {}): KeyBindingManager { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new KeyBindingManager($$parsedSource as Partial); + } +} + +/** + * LinuxWindow specific to Linux windows + */ +export class LinuxWindow { + /** + * Icon Sets up the icon representing the window. This icon is used when the window is minimized + * (also known as iconified). + */ + "Icon": string; + + /** + * WindowIsTranslucent sets the window's background to transparent when enabled. + */ + "WindowIsTranslucent": boolean; + + /** + * WebviewGpuPolicy used for determining the hardware acceleration policy for the webview. + * - WebviewGpuPolicyAlways + * - WebviewGpuPolicyOnDemand + * - WebviewGpuPolicyNever + * + * Due to https://github.com/wailsapp/wails/issues/2977, if options.Linux is nil + * in the call to wails.Run(), WebviewGpuPolicy is set by default to WebviewGpuPolicyNever. + * Client code may override this behavior by passing a non-nil Options and set + * WebviewGpuPolicy as needed. + */ + "WebviewGpuPolicy": WebviewGpuPolicy; + + /** + * WindowDidMoveDebounceMS is the debounce time in milliseconds for the WindowDidMove event + */ + "WindowDidMoveDebounceMS": number; + + /** + * Menu is the window's menu + */ + "Menu": Menu | null; + + /** Creates a new LinuxWindow instance. */ + constructor($$source: Partial = {}) { + if (!("Icon" in $$source)) { + this["Icon"] = ""; + } + if (!("WindowIsTranslucent" in $$source)) { + this["WindowIsTranslucent"] = false; + } + if (!("WebviewGpuPolicy" in $$source)) { + this["WebviewGpuPolicy"] = WebviewGpuPolicy.$zero; + } + if (!("WindowDidMoveDebounceMS" in $$source)) { + this["WindowDidMoveDebounceMS"] = 0; + } + if (!("Menu" in $$source)) { + this["Menu"] = null; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new LinuxWindow instance from a string or object. + */ + static createFrom($$source: any = {}): LinuxWindow { + const $$createField0_0 = $Create.ByteSlice; + const $$createField4_0 = $$createType25; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("Icon" in $$parsedSource) { + $$parsedSource["Icon"] = $$createField0_0($$parsedSource["Icon"]); + } + if ("Menu" in $$parsedSource) { + $$parsedSource["Menu"] = $$createField4_0($$parsedSource["Menu"]); + } + return new LinuxWindow($$parsedSource as Partial); + } +} + +/** + * MacAppearanceType is a type of Appearance for Cocoa windows + */ +export enum MacAppearanceType { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = "", + + /** + * DefaultAppearance uses the default system value + */ + DefaultAppearance = "", + + /** + * NSAppearanceNameAqua - The standard light system appearance. + */ + NSAppearanceNameAqua = "NSAppearanceNameAqua", + + /** + * NSAppearanceNameDarkAqua - The standard dark system appearance. + */ + NSAppearanceNameDarkAqua = "NSAppearanceNameDarkAqua", + + /** + * NSAppearanceNameVibrantLight - The light vibrant appearance + */ + NSAppearanceNameVibrantLight = "NSAppearanceNameVibrantLight", + + /** + * NSAppearanceNameAccessibilityHighContrastAqua - A high-contrast version of the standard light system appearance. + */ + NSAppearanceNameAccessibilityHighContrastAqua = "NSAppearanceNameAccessibilityHighContrastAqua", + + /** + * NSAppearanceNameAccessibilityHighContrastDarkAqua - A high-contrast version of the standard dark system appearance. + */ + NSAppearanceNameAccessibilityHighContrastDarkAqua = "NSAppearanceNameAccessibilityHighContrastDarkAqua", + + /** + * NSAppearanceNameAccessibilityHighContrastVibrantLight - A high-contrast version of the light vibrant appearance. + */ + NSAppearanceNameAccessibilityHighContrastVibrantLight = "NSAppearanceNameAccessibilityHighContrastVibrantLight", + + /** + * NSAppearanceNameAccessibilityHighContrastVibrantDark - A high-contrast version of the dark vibrant appearance. + */ + NSAppearanceNameAccessibilityHighContrastVibrantDark = "NSAppearanceNameAccessibilityHighContrastVibrantDark", +}; + +/** + * MacBackdrop is the backdrop type for macOS + */ +export enum MacBackdrop { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + /** + * MacBackdropNormal - The default value. The window will have a normal opaque background. + */ + MacBackdropNormal = 0, + + /** + * MacBackdropTransparent - The window will have a transparent background, with the content underneath it being visible + */ + MacBackdropTransparent = 1, + + /** + * MacBackdropTranslucent - The window will have a translucent background, with the content underneath it being "fuzzy" or "frosted" + */ + MacBackdropTranslucent = 2, + + /** + * MacBackdropLiquidGlass - The window will use Apple's Liquid Glass effect (macOS 15.0+ with fallback to translucent) + */ + MacBackdropLiquidGlass = 3, +}; + +/** + * MacLiquidGlass contains configuration for the Liquid Glass effect + */ +export class MacLiquidGlass { + /** + * Style of the glass effect + */ + "Style": MacLiquidGlassStyle; + + /** + * Material to use for NSVisualEffectView (when NSGlassEffectView is not available) + * Set to NSVisualEffectMaterialAuto to use automatic selection based on Style + */ + "Material": NSVisualEffectMaterial; + + /** + * Corner radius for the glass effect (0 for square corners) + */ + "CornerRadius": number; + + /** + * Tint color for the glass (optional, nil for no tint) + */ + "TintColor": RGBA | null; + + /** + * Group identifier for merging multiple glass windows + */ + "GroupID": string; + + /** + * Spacing between grouped glass elements (in points) + */ + "GroupSpacing": number; + + /** Creates a new MacLiquidGlass instance. */ + constructor($$source: Partial = {}) { + if (!("Style" in $$source)) { + this["Style"] = MacLiquidGlassStyle.$zero; + } + if (!("Material" in $$source)) { + this["Material"] = NSVisualEffectMaterial.$zero; + } + if (!("CornerRadius" in $$source)) { + this["CornerRadius"] = 0; + } + if (!("TintColor" in $$source)) { + this["TintColor"] = null; + } + if (!("GroupID" in $$source)) { + this["GroupID"] = ""; + } + if (!("GroupSpacing" in $$source)) { + this["GroupSpacing"] = 0; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new MacLiquidGlass instance from a string or object. + */ + static createFrom($$source: any = {}): MacLiquidGlass { + const $$createField3_0 = $$createType27; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("TintColor" in $$parsedSource) { + $$parsedSource["TintColor"] = $$createField3_0($$parsedSource["TintColor"]); + } + return new MacLiquidGlass($$parsedSource as Partial); + } +} + +/** + * MacLiquidGlassStyle defines the style of the Liquid Glass effect + */ +export enum MacLiquidGlassStyle { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + /** + * LiquidGlassStyleAutomatic - System determines the best style + */ + LiquidGlassStyleAutomatic = 0, + + /** + * LiquidGlassStyleLight - Light glass appearance + */ + LiquidGlassStyleLight = 1, + + /** + * LiquidGlassStyleDark - Dark glass appearance + */ + LiquidGlassStyleDark = 2, + + /** + * LiquidGlassStyleVibrant - Vibrant glass with enhanced effects + */ + LiquidGlassStyleVibrant = 3, +}; + +/** + * MacTitleBar contains options for the Mac titlebar + */ +export class MacTitleBar { + /** + * AppearsTransparent will make the titlebar transparent + */ + "AppearsTransparent": boolean; + + /** + * Hide will hide the titlebar + */ + "Hide": boolean; + + /** + * HideTitle will hide the title + */ + "HideTitle": boolean; + + /** + * FullSizeContent will extend the window content to the full size of the window + */ + "FullSizeContent": boolean; + + /** + * UseToolbar will use a toolbar instead of a titlebar + */ + "UseToolbar": boolean; + + /** + * HideToolbarSeparator will hide the toolbar separator + */ + "HideToolbarSeparator": boolean; + + /** + * ShowToolbarWhenFullscreen will keep the toolbar visible when the window is in fullscreen mode + */ + "ShowToolbarWhenFullscreen": boolean; + + /** + * ToolbarStyle is the style of toolbar to use + */ + "ToolbarStyle": MacToolbarStyle; + + /** Creates a new MacTitleBar instance. */ + constructor($$source: Partial = {}) { + if (!("AppearsTransparent" in $$source)) { + this["AppearsTransparent"] = false; + } + if (!("Hide" in $$source)) { + this["Hide"] = false; + } + if (!("HideTitle" in $$source)) { + this["HideTitle"] = false; + } + if (!("FullSizeContent" in $$source)) { + this["FullSizeContent"] = false; + } + if (!("UseToolbar" in $$source)) { + this["UseToolbar"] = false; + } + if (!("HideToolbarSeparator" in $$source)) { + this["HideToolbarSeparator"] = false; + } + if (!("ShowToolbarWhenFullscreen" in $$source)) { + this["ShowToolbarWhenFullscreen"] = false; + } + if (!("ToolbarStyle" in $$source)) { + this["ToolbarStyle"] = MacToolbarStyle.$zero; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new MacTitleBar instance from a string or object. + */ + static createFrom($$source: any = {}): MacTitleBar { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new MacTitleBar($$parsedSource as Partial); + } +} + +/** + * MacToolbarStyle is the style of toolbar for macOS + */ +export enum MacToolbarStyle { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + /** + * MacToolbarStyleAutomatic - The default value. The style will be determined by the window's given configuration + */ + MacToolbarStyleAutomatic = 0, + + /** + * MacToolbarStyleExpanded - The toolbar will appear below the window title + */ + MacToolbarStyleExpanded = 1, + + /** + * MacToolbarStylePreference - The toolbar will appear below the window title and the items in the toolbar will attempt to have equal widths when possible + */ + MacToolbarStylePreference = 2, + + /** + * MacToolbarStyleUnified - The window title will appear inline with the toolbar when visible + */ + MacToolbarStyleUnified = 3, + + /** + * MacToolbarStyleUnifiedCompact - Same as MacToolbarStyleUnified, but with reduced margins in the toolbar allowing more focus to be on the contents of the window + */ + MacToolbarStyleUnifiedCompact = 4, +}; + +/** + * MacWebviewPreferences contains preferences for the Mac webview + */ +export class MacWebviewPreferences { + /** + * TabFocusesLinks will enable tabbing to links + */ + "TabFocusesLinks": u$0.Bool; + + /** + * TextInteractionEnabled will enable text interaction + */ + "TextInteractionEnabled": u$0.Bool; + + /** + * FullscreenEnabled will enable fullscreen + */ + "FullscreenEnabled": u$0.Bool; + + /** + * AllowsBackForwardNavigationGestures enables horizontal swipe gestures for back/forward navigation + */ + "AllowsBackForwardNavigationGestures": u$0.Bool; + + /** Creates a new MacWebviewPreferences instance. */ + constructor($$source: Partial = {}) { + if (!("TabFocusesLinks" in $$source)) { + this["TabFocusesLinks"] = (new u$0.Bool()); + } + if (!("TextInteractionEnabled" in $$source)) { + this["TextInteractionEnabled"] = (new u$0.Bool()); + } + if (!("FullscreenEnabled" in $$source)) { + this["FullscreenEnabled"] = (new u$0.Bool()); + } + if (!("AllowsBackForwardNavigationGestures" in $$source)) { + this["AllowsBackForwardNavigationGestures"] = (new u$0.Bool()); + } + + Object.assign(this, $$source); + } + + /** + * Creates a new MacWebviewPreferences instance from a string or object. + */ + static createFrom($$source: any = {}): MacWebviewPreferences { + const $$createField0_0 = $$createType28; + const $$createField1_0 = $$createType28; + const $$createField2_0 = $$createType28; + const $$createField3_0 = $$createType28; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("TabFocusesLinks" in $$parsedSource) { + $$parsedSource["TabFocusesLinks"] = $$createField0_0($$parsedSource["TabFocusesLinks"]); + } + if ("TextInteractionEnabled" in $$parsedSource) { + $$parsedSource["TextInteractionEnabled"] = $$createField1_0($$parsedSource["TextInteractionEnabled"]); + } + if ("FullscreenEnabled" in $$parsedSource) { + $$parsedSource["FullscreenEnabled"] = $$createField2_0($$parsedSource["FullscreenEnabled"]); + } + if ("AllowsBackForwardNavigationGestures" in $$parsedSource) { + $$parsedSource["AllowsBackForwardNavigationGestures"] = $$createField3_0($$parsedSource["AllowsBackForwardNavigationGestures"]); + } + return new MacWebviewPreferences($$parsedSource as Partial); + } +} + +/** + * MacWindow contains macOS specific options for Webview Windows + */ +export class MacWindow { + /** + * Backdrop is the backdrop type for the window + */ + "Backdrop": MacBackdrop; + + /** + * DisableShadow will disable the window shadow + */ + "DisableShadow": boolean; + + /** + * TitleBar contains options for the Mac titlebar + */ + "TitleBar": MacTitleBar; + + /** + * Appearance is the appearance type for the window + */ + "Appearance": MacAppearanceType; + + /** + * InvisibleTitleBarHeight defines the height of an invisible titlebar which responds to dragging + */ + "InvisibleTitleBarHeight": number; + + /** + * Maps events from platform specific to common event types + */ + "EventMapping": { [_: `${number}`]: events$0.WindowEventType }; + + /** + * EnableFraudulentWebsiteWarnings will enable warnings for fraudulent websites. + * Default: false + */ + "EnableFraudulentWebsiteWarnings": boolean; + + /** + * WebviewPreferences contains preferences for the webview + */ + "WebviewPreferences": MacWebviewPreferences; + + /** + * WindowLevel sets the window level to control the order of windows in the screen + */ + "WindowLevel": MacWindowLevel; + + /** + * LiquidGlass contains configuration for the Liquid Glass effect + */ + "LiquidGlass": MacLiquidGlass; + + /** Creates a new MacWindow instance. */ + constructor($$source: Partial = {}) { + if (!("Backdrop" in $$source)) { + this["Backdrop"] = MacBackdrop.$zero; + } + if (!("DisableShadow" in $$source)) { + this["DisableShadow"] = false; + } + if (!("TitleBar" in $$source)) { + this["TitleBar"] = (new MacTitleBar()); + } + if (!("Appearance" in $$source)) { + this["Appearance"] = MacAppearanceType.$zero; + } + if (!("InvisibleTitleBarHeight" in $$source)) { + this["InvisibleTitleBarHeight"] = 0; + } + if (!("EventMapping" in $$source)) { + this["EventMapping"] = {}; + } + if (!("EnableFraudulentWebsiteWarnings" in $$source)) { + this["EnableFraudulentWebsiteWarnings"] = false; + } + if (!("WebviewPreferences" in $$source)) { + this["WebviewPreferences"] = (new MacWebviewPreferences()); + } + if (!("WindowLevel" in $$source)) { + this["WindowLevel"] = MacWindowLevel.$zero; + } + if (!("LiquidGlass" in $$source)) { + this["LiquidGlass"] = (new MacLiquidGlass()); + } + + Object.assign(this, $$source); + } + + /** + * Creates a new MacWindow instance from a string or object. + */ + static createFrom($$source: any = {}): MacWindow { + const $$createField2_0 = $$createType29; + const $$createField5_0 = $$createType30; + const $$createField7_0 = $$createType31; + const $$createField9_0 = $$createType32; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("TitleBar" in $$parsedSource) { + $$parsedSource["TitleBar"] = $$createField2_0($$parsedSource["TitleBar"]); + } + if ("EventMapping" in $$parsedSource) { + $$parsedSource["EventMapping"] = $$createField5_0($$parsedSource["EventMapping"]); + } + if ("WebviewPreferences" in $$parsedSource) { + $$parsedSource["WebviewPreferences"] = $$createField7_0($$parsedSource["WebviewPreferences"]); + } + if ("LiquidGlass" in $$parsedSource) { + $$parsedSource["LiquidGlass"] = $$createField9_0($$parsedSource["LiquidGlass"]); + } + return new MacWindow($$parsedSource as Partial); + } +} + +export enum MacWindowLevel { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = "", + + MacWindowLevelNormal = "normal", + MacWindowLevelFloating = "floating", + MacWindowLevelTornOffMenu = "tornOffMenu", + MacWindowLevelModalPanel = "modalPanel", + MacWindowLevelMainMenu = "mainMenu", + MacWindowLevelStatus = "status", + MacWindowLevelPopUpMenu = "popUpMenu", + MacWindowLevelScreenSaver = "screenSaver", +}; + +export class Menu { + + /** Creates a new Menu instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new Menu instance from a string or object. + */ + static createFrom($$source: any = {}): Menu { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new Menu($$parsedSource as Partial); + } +} + +export class MenuBarTheme { + /** + * Default is the default theme + */ + "Default": TextTheme | null; + + /** + * Hover defines the theme to use when the menu item is hovered + */ + "Hover": TextTheme | null; + + /** + * Selected defines the theme to use when the menu item is selected + */ + "Selected": TextTheme | null; + + /** Creates a new MenuBarTheme instance. */ + constructor($$source: Partial = {}) { + if (!("Default" in $$source)) { + this["Default"] = null; + } + if (!("Hover" in $$source)) { + this["Hover"] = null; + } + if (!("Selected" in $$source)) { + this["Selected"] = null; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new MenuBarTheme instance from a string or object. + */ + static createFrom($$source: any = {}): MenuBarTheme { + const $$createField0_0 = $$createType34; + const $$createField1_0 = $$createType34; + const $$createField2_0 = $$createType34; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("Default" in $$parsedSource) { + $$parsedSource["Default"] = $$createField0_0($$parsedSource["Default"]); + } + if ("Hover" in $$parsedSource) { + $$parsedSource["Hover"] = $$createField1_0($$parsedSource["Hover"]); + } + if ("Selected" in $$parsedSource) { + $$parsedSource["Selected"] = $$createField2_0($$parsedSource["Selected"]); + } + return new MenuBarTheme($$parsedSource as Partial); + } +} + +/** + * MenuManager manages menu-related operations + */ +export class MenuManager { + + /** Creates a new MenuManager instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new MenuManager instance from a string or object. + */ + static createFrom($$source: any = {}): MenuManager { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new MenuManager($$parsedSource as Partial); + } +} + +/** + * NSVisualEffectMaterial represents the NSVisualEffectMaterial enum for macOS + */ +export enum NSVisualEffectMaterial { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + /** + * NSVisualEffectMaterial values from macOS SDK + */ + NSVisualEffectMaterialAppearanceBased = 0, + NSVisualEffectMaterialLight = 1, + NSVisualEffectMaterialDark = 2, + NSVisualEffectMaterialTitlebar = 3, + NSVisualEffectMaterialSelection = 4, + NSVisualEffectMaterialMenu = 5, + NSVisualEffectMaterialPopover = 6, + NSVisualEffectMaterialSidebar = 7, + NSVisualEffectMaterialHeaderView = 10, + NSVisualEffectMaterialSheet = 11, + NSVisualEffectMaterialWindowBackground = 12, + NSVisualEffectMaterialHUDWindow = 13, + NSVisualEffectMaterialFullScreenUI = 15, + NSVisualEffectMaterialToolTip = 17, + NSVisualEffectMaterialContentBackground = 18, + NSVisualEffectMaterialUnderWindowBackground = 21, + NSVisualEffectMaterialUnderPageBackground = 22, + + /** + * Use auto-selection based on Style + */ + NSVisualEffectMaterialAuto = -1, +}; + +export class RGBA { + "Red": number; + "Green": number; + "Blue": number; + "Alpha": number; + + /** Creates a new RGBA instance. */ + constructor($$source: Partial = {}) { + if (!("Red" in $$source)) { + this["Red"] = 0; + } + if (!("Green" in $$source)) { + this["Green"] = 0; + } + if (!("Blue" in $$source)) { + this["Blue"] = 0; + } + if (!("Alpha" in $$source)) { + this["Alpha"] = 0; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new RGBA instance from a string or object. + */ + static createFrom($$source: any = {}): RGBA { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new RGBA($$parsedSource as Partial); + } +} + +export class ScreenManager { + + /** Creates a new ScreenManager instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new ScreenManager instance from a string or object. + */ + static createFrom($$source: any = {}): ScreenManager { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new ScreenManager($$parsedSource as Partial); + } +} + +/** + * ServiceOptions provides optional parameters for calls to [NewService]. + */ +export class ServiceOptions { + /** + * Name can be set to override the name of the service + * for logging and debugging purposes. + * + * If empty, it will default + * either to the value obtained through the [ServiceName] interface, + * or to the type name. + */ + "Name": string; + + /** + * If the service instance implements [http.Handler], + * it will be mounted on the internal asset server + * at the prefix specified by Route. + */ + "Route": string; + + /** + * MarshalError will be called if non-nil + * to marshal to JSON the error values returned by this service's methods. + * + * MarshalError is not allowed to fail, + * but it may return a nil slice to fall back + * to the globally configured error handler. + * + * If the returned slice is not nil, it must contain valid JSON. + */ + "MarshalError": any; + + /** Creates a new ServiceOptions instance. */ + constructor($$source: Partial = {}) { + if (!("Name" in $$source)) { + this["Name"] = ""; + } + if (!("Route" in $$source)) { + this["Route"] = ""; + } + if (!("MarshalError" in $$source)) { + this["MarshalError"] = null; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new ServiceOptions instance from a string or object. + */ + static createFrom($$source: any = {}): ServiceOptions { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new ServiceOptions($$parsedSource as Partial); + } +} + +/** + * SystemTrayManager manages system tray-related operations + */ +export class SystemTrayManager { + + /** Creates a new SystemTrayManager instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new SystemTrayManager instance from a string or object. + */ + static createFrom($$source: any = {}): SystemTrayManager { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new SystemTrayManager($$parsedSource as Partial); + } +} + +export class TextTheme { + /** + * Text is the colour of the text + */ + "Text": number | null; + + /** + * Background is the background colour of the text + */ + "Background": number | null; + + /** Creates a new TextTheme instance. */ + constructor($$source: Partial = {}) { + if (!("Text" in $$source)) { + this["Text"] = null; + } + if (!("Background" in $$source)) { + this["Background"] = null; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new TextTheme instance from a string or object. + */ + static createFrom($$source: any = {}): TextTheme { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new TextTheme($$parsedSource as Partial); + } +} + +export enum Theme { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + /** + * SystemDefault will use whatever the system theme is. The application will follow system theme changes. + */ + SystemDefault = 0, + + /** + * Dark Mode + */ + Dark = 1, + + /** + * Light Mode + */ + Light = 2, +}; + +/** + * ThemeSettings defines custom colours to use in dark or light mode. + * They may be set using the hex values: 0x00BBGGRR + */ +export class ThemeSettings { + /** + * Dark mode active window + */ + "DarkModeActive": WindowTheme | null; + + /** + * Dark mode inactive window + */ + "DarkModeInactive": WindowTheme | null; + + /** + * Light mode active window + */ + "LightModeActive": WindowTheme | null; + + /** + * Light mode inactive window + */ + "LightModeInactive": WindowTheme | null; + + /** + * Dark mode MenuBar + */ + "DarkModeMenuBar": MenuBarTheme | null; + + /** + * Light mode MenuBar + */ + "LightModeMenuBar": MenuBarTheme | null; + + /** Creates a new ThemeSettings instance. */ + constructor($$source: Partial = {}) { + if (!("DarkModeActive" in $$source)) { + this["DarkModeActive"] = null; + } + if (!("DarkModeInactive" in $$source)) { + this["DarkModeInactive"] = null; + } + if (!("LightModeActive" in $$source)) { + this["LightModeActive"] = null; + } + if (!("LightModeInactive" in $$source)) { + this["LightModeInactive"] = null; + } + if (!("DarkModeMenuBar" in $$source)) { + this["DarkModeMenuBar"] = null; + } + if (!("LightModeMenuBar" in $$source)) { + this["LightModeMenuBar"] = null; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new ThemeSettings instance from a string or object. + */ + static createFrom($$source: any = {}): ThemeSettings { + const $$createField0_0 = $$createType36; + const $$createField1_0 = $$createType36; + const $$createField2_0 = $$createType36; + const $$createField3_0 = $$createType36; + const $$createField4_0 = $$createType38; + const $$createField5_0 = $$createType38; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("DarkModeActive" in $$parsedSource) { + $$parsedSource["DarkModeActive"] = $$createField0_0($$parsedSource["DarkModeActive"]); + } + if ("DarkModeInactive" in $$parsedSource) { + $$parsedSource["DarkModeInactive"] = $$createField1_0($$parsedSource["DarkModeInactive"]); + } + if ("LightModeActive" in $$parsedSource) { + $$parsedSource["LightModeActive"] = $$createField2_0($$parsedSource["LightModeActive"]); + } + if ("LightModeInactive" in $$parsedSource) { + $$parsedSource["LightModeInactive"] = $$createField3_0($$parsedSource["LightModeInactive"]); + } + if ("DarkModeMenuBar" in $$parsedSource) { + $$parsedSource["DarkModeMenuBar"] = $$createField4_0($$parsedSource["DarkModeMenuBar"]); + } + if ("LightModeMenuBar" in $$parsedSource) { + $$parsedSource["LightModeMenuBar"] = $$createField5_0($$parsedSource["LightModeMenuBar"]); + } + return new ThemeSettings($$parsedSource as Partial); + } +} + +/** + * WebviewGpuPolicy values used for determining the webview's hardware acceleration policy. + */ +export enum WebviewGpuPolicy { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + /** + * WebviewGpuPolicyAlways Hardware acceleration is always enabled. + */ + WebviewGpuPolicyAlways = 0, + + /** + * WebviewGpuPolicyOnDemand Hardware acceleration is enabled/disabled as request by web contents. + */ + WebviewGpuPolicyOnDemand = 1, + + /** + * WebviewGpuPolicyNever Hardware acceleration is always disabled. + */ + WebviewGpuPolicyNever = 2, +}; + +export class WebviewWindow { + + /** Creates a new WebviewWindow instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new WebviewWindow instance from a string or object. + */ + static createFrom($$source: any = {}): WebviewWindow { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new WebviewWindow($$parsedSource as Partial); + } +} + +export class WebviewWindowOptions { + /** + * Name is a unique identifier that can be given to a window. + */ + "Name": string; + + /** + * Title is the title of the window. + */ + "Title": string; + + /** + * Width is the starting width of the window. + */ + "Width": number; + + /** + * Height is the starting height of the window. + */ + "Height": number; + + /** + * AlwaysOnTop will make the window float above other windows. + */ + "AlwaysOnTop": boolean; + + /** + * URL is the URL to load in the window. + */ + "URL": string; + + /** + * DisableResize will disable the ability to resize the window. + */ + "DisableResize": boolean; + + /** + * Frameless will remove the window frame. + */ + "Frameless": boolean; + + /** + * MinWidth is the minimum width of the window. + */ + "MinWidth": number; + + /** + * MinHeight is the minimum height of the window. + */ + "MinHeight": number; + + /** + * MaxWidth is the maximum width of the window. + */ + "MaxWidth": number; + + /** + * MaxHeight is the maximum height of the window. + */ + "MaxHeight": number; + + /** + * StartState indicates the state of the window when it is first shown. + * Default: WindowStateNormal + */ + "StartState": WindowState; + + /** + * BackgroundType is the type of background to use for the window. + * Default: BackgroundTypeSolid + */ + "BackgroundType": BackgroundType; + + /** + * BackgroundColour is the colour to use for the window background. + */ + "BackgroundColour": RGBA; + + /** + * HTML is the HTML to load in the window. + */ + "HTML": string; + + /** + * JS is the JavaScript to load in the window. + */ + "JS": string; + + /** + * CSS is the CSS to load in the window. + */ + "CSS": string; + + /** + * Initial Position + */ + "InitialPosition": WindowStartPosition; + + /** + * X is the starting X position of the window. + */ + "X": number; + + /** + * Y is the starting Y position of the window. + */ + "Y": number; + + /** + * Hidden will hide the window when it is first created. + */ + "Hidden": boolean; + + /** + * Zoom is the zoom level of the window. + */ + "Zoom": number; + + /** + * ZoomControlEnabled will enable the zoom control. + */ + "ZoomControlEnabled": boolean; + + /** + * EnableDragAndDrop will enable drag and drop. + */ + "EnableDragAndDrop": boolean; + + /** + * OpenInspectorOnStartup will open the inspector when the window is first shown. + */ + "OpenInspectorOnStartup": boolean; + + /** + * Mac options + */ + "Mac": MacWindow; + + /** + * Windows options + */ + "Windows": WindowsWindow; + + /** + * Linux options + */ + "Linux": LinuxWindow; + + /** + * Toolbar button states + */ + "MinimiseButtonState": ButtonState; + "MaximiseButtonState": ButtonState; + "CloseButtonState": ButtonState; + + /** + * If true, the window's devtools will be available (default true in builds without the `production` build tag) + */ + "DevToolsEnabled": boolean; + + /** + * If true, the window's default context menu will be disabled (default false) + */ + "DefaultContextMenuDisabled": boolean; + + /** + * KeyBindings is a map of key bindings to functions + */ + "KeyBindings": { [_: string]: any }; + + /** + * IgnoreMouseEvents will ignore mouse events in the window (Windows + Mac only) + */ + "IgnoreMouseEvents": boolean; + + /** + * ContentProtectionEnabled specifies whether content protection is enabled, preventing screen capture and recording. + * Effective on Windows and macOS only; no-op on Linux. + * Best-effort protection with platform-specific caveats (see docs). + */ + "ContentProtectionEnabled": boolean; + + /** Creates a new WebviewWindowOptions instance. */ + constructor($$source: Partial = {}) { + if (!("Name" in $$source)) { + this["Name"] = ""; + } + if (!("Title" in $$source)) { + this["Title"] = ""; + } + if (!("Width" in $$source)) { + this["Width"] = 0; + } + if (!("Height" in $$source)) { + this["Height"] = 0; + } + if (!("AlwaysOnTop" in $$source)) { + this["AlwaysOnTop"] = false; + } + if (!("URL" in $$source)) { + this["URL"] = ""; + } + if (!("DisableResize" in $$source)) { + this["DisableResize"] = false; + } + if (!("Frameless" in $$source)) { + this["Frameless"] = false; + } + if (!("MinWidth" in $$source)) { + this["MinWidth"] = 0; + } + if (!("MinHeight" in $$source)) { + this["MinHeight"] = 0; + } + if (!("MaxWidth" in $$source)) { + this["MaxWidth"] = 0; + } + if (!("MaxHeight" in $$source)) { + this["MaxHeight"] = 0; + } + if (!("StartState" in $$source)) { + this["StartState"] = WindowState.$zero; + } + if (!("BackgroundType" in $$source)) { + this["BackgroundType"] = BackgroundType.$zero; + } + if (!("BackgroundColour" in $$source)) { + this["BackgroundColour"] = (new RGBA()); + } + if (!("HTML" in $$source)) { + this["HTML"] = ""; + } + if (!("JS" in $$source)) { + this["JS"] = ""; + } + if (!("CSS" in $$source)) { + this["CSS"] = ""; + } + if (!("InitialPosition" in $$source)) { + this["InitialPosition"] = WindowStartPosition.$zero; + } + if (!("X" in $$source)) { + this["X"] = 0; + } + if (!("Y" in $$source)) { + this["Y"] = 0; + } + if (!("Hidden" in $$source)) { + this["Hidden"] = false; + } + if (!("Zoom" in $$source)) { + this["Zoom"] = 0; + } + if (!("ZoomControlEnabled" in $$source)) { + this["ZoomControlEnabled"] = false; + } + if (!("EnableDragAndDrop" in $$source)) { + this["EnableDragAndDrop"] = false; + } + if (!("OpenInspectorOnStartup" in $$source)) { + this["OpenInspectorOnStartup"] = false; + } + if (!("Mac" in $$source)) { + this["Mac"] = (new MacWindow()); + } + if (!("Windows" in $$source)) { + this["Windows"] = (new WindowsWindow()); + } + if (!("Linux" in $$source)) { + this["Linux"] = (new LinuxWindow()); + } + if (!("MinimiseButtonState" in $$source)) { + this["MinimiseButtonState"] = ButtonState.$zero; + } + if (!("MaximiseButtonState" in $$source)) { + this["MaximiseButtonState"] = ButtonState.$zero; + } + if (!("CloseButtonState" in $$source)) { + this["CloseButtonState"] = ButtonState.$zero; + } + if (!("DevToolsEnabled" in $$source)) { + this["DevToolsEnabled"] = false; + } + if (!("DefaultContextMenuDisabled" in $$source)) { + this["DefaultContextMenuDisabled"] = false; + } + if (!("KeyBindings" in $$source)) { + this["KeyBindings"] = {}; + } + if (!("IgnoreMouseEvents" in $$source)) { + this["IgnoreMouseEvents"] = false; + } + if (!("ContentProtectionEnabled" in $$source)) { + this["ContentProtectionEnabled"] = false; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new WebviewWindowOptions instance from a string or object. + */ + static createFrom($$source: any = {}): WebviewWindowOptions { + const $$createField14_0 = $$createType26; + const $$createField26_0 = $$createType39; + const $$createField27_0 = $$createType40; + const $$createField28_0 = $$createType41; + const $$createField34_0 = $$createType42; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("BackgroundColour" in $$parsedSource) { + $$parsedSource["BackgroundColour"] = $$createField14_0($$parsedSource["BackgroundColour"]); + } + if ("Mac" in $$parsedSource) { + $$parsedSource["Mac"] = $$createField26_0($$parsedSource["Mac"]); + } + if ("Windows" in $$parsedSource) { + $$parsedSource["Windows"] = $$createField27_0($$parsedSource["Windows"]); + } + if ("Linux" in $$parsedSource) { + $$parsedSource["Linux"] = $$createField28_0($$parsedSource["Linux"]); + } + if ("KeyBindings" in $$parsedSource) { + $$parsedSource["KeyBindings"] = $$createField34_0($$parsedSource["KeyBindings"]); + } + return new WebviewWindowOptions($$parsedSource as Partial); + } +} + +/** + * WindowManager manages all window-related operations + */ +export class WindowManager { + + /** Creates a new WindowManager instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new WindowManager instance from a string or object. + */ + static createFrom($$source: any = {}): WindowManager { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new WindowManager($$parsedSource as Partial); + } +} + +export enum WindowStartPosition { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + WindowCentered = 0, + WindowXY = 1, +}; + +export enum WindowState { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + WindowStateNormal = 0, + WindowStateMinimised = 1, + WindowStateMaximised = 2, + WindowStateFullscreen = 3, +}; + +export class WindowTheme { + /** + * BorderColour is the colour of the window border + */ + "BorderColour": number | null; + + /** + * TitleBarColour is the colour of the window title bar + */ + "TitleBarColour": number | null; + + /** + * TitleTextColour is the colour of the window title text + */ + "TitleTextColour": number | null; + + /** Creates a new WindowTheme instance. */ + constructor($$source: Partial = {}) { + if (!("BorderColour" in $$source)) { + this["BorderColour"] = null; + } + if (!("TitleBarColour" in $$source)) { + this["TitleBarColour"] = null; + } + if (!("TitleTextColour" in $$source)) { + this["TitleTextColour"] = null; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new WindowTheme instance from a string or object. + */ + static createFrom($$source: any = {}): WindowTheme { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new WindowTheme($$parsedSource as Partial); + } +} + +export class WindowsWindow { + /** + * Select the type of translucent backdrop. Requires Windows 11 22621 or later. + * Only used when window's `BackgroundType` is set to `BackgroundTypeTranslucent`. + * Default: Auto + */ + "BackdropType": BackdropType; + + /** + * Disable the icon in the titlebar + * Default: false + */ + "DisableIcon": boolean; + + /** + * Theme (Dark / Light / SystemDefault) + * Default: SystemDefault - The application will follow system theme changes. + */ + "Theme": Theme; + + /** + * Specify custom colours to use for dark/light mode + * Default: nil + */ + "CustomTheme": ThemeSettings; + + /** + * Disable all window decorations in Frameless mode, which means no "Aero Shadow" and no "Rounded Corner" will be shown. + * "Rounded Corners" are only available on Windows 11. + * Default: false + */ + "DisableFramelessWindowDecorations": boolean; + + /** + * WindowMask is used to set the window shape. Use a PNG with an alpha channel to create a custom shape. + * Default: nil + */ + "WindowMask": string; + + /** + * WindowMaskDraggable is used to make the window draggable by clicking on the window mask. + * Default: false + */ + "WindowMaskDraggable": boolean; + + /** + * ResizeDebounceMS is the amount of time to debounce redraws of webview2 + * when resizing the window + * Default: 0 + */ + "ResizeDebounceMS": number; + + /** + * WindowDidMoveDebounceMS is the amount of time to debounce the WindowDidMove event + * when moving the window + * Default: 0 + */ + "WindowDidMoveDebounceMS": number; + + /** + * Event mapping for the window. This allows you to define a translation from one event to another. + * Default: nil + */ + "EventMapping": { [_: `${number}`]: events$0.WindowEventType }; + + /** + * HiddenOnTaskbar hides the window from the taskbar + * Default: false + */ + "HiddenOnTaskbar": boolean; + + /** + * EnableSwipeGestures enables swipe gestures for the window + * Default: false + */ + "EnableSwipeGestures": boolean; + + /** + * Menu is the menu to use for the window. + */ + "Menu": Menu | null; + + /** + * Drag Cursor Effects + */ + "OnEnterEffect": DragEffect; + "OnOverEffect": DragEffect; + + /** + * Permissions map for WebView2. If empty, default permissions will be granted. + */ + "Permissions": { [_: `${number}`]: CoreWebView2PermissionState }; + + /** + * ExStyle is the extended window style + */ + "ExStyle": number; + + /** + * GeneralAutofillEnabled enables general autofill + */ + "GeneralAutofillEnabled": boolean; + + /** + * PasswordAutosaveEnabled enables autosaving passwords + */ + "PasswordAutosaveEnabled": boolean; + + /** + * EnabledFeatures, DisabledFeatures and AdditionalLaunchArgs are used to enable or disable specific features in the WebView2 browser. + * Available flags: https://learn.microsoft.com/en-us/microsoft-edge/webview2/concepts/webview-features-flags?tabs=dotnetcsharp#available-webview2-browser-flags + * WARNING: Apps in production shouldn't use WebView2 browser flags, + * because these flags might be removed or altered at any time, + * and aren't necessarily supported long-term. + * AdditionalLaunchArgs should always be preceded by "--" + */ + "EnabledFeatures": string[]; + "DisabledFeatures": string[]; + "AdditionalLaunchArgs": string[]; + + /** Creates a new WindowsWindow instance. */ + constructor($$source: Partial = {}) { + if (!("BackdropType" in $$source)) { + this["BackdropType"] = BackdropType.$zero; + } + if (!("DisableIcon" in $$source)) { + this["DisableIcon"] = false; + } + if (!("Theme" in $$source)) { + this["Theme"] = Theme.$zero; + } + if (!("CustomTheme" in $$source)) { + this["CustomTheme"] = (new ThemeSettings()); + } + if (!("DisableFramelessWindowDecorations" in $$source)) { + this["DisableFramelessWindowDecorations"] = false; + } + if (!("WindowMask" in $$source)) { + this["WindowMask"] = ""; + } + if (!("WindowMaskDraggable" in $$source)) { + this["WindowMaskDraggable"] = false; + } + if (!("ResizeDebounceMS" in $$source)) { + this["ResizeDebounceMS"] = 0; + } + if (!("WindowDidMoveDebounceMS" in $$source)) { + this["WindowDidMoveDebounceMS"] = 0; + } + if (!("EventMapping" in $$source)) { + this["EventMapping"] = {}; + } + if (!("HiddenOnTaskbar" in $$source)) { + this["HiddenOnTaskbar"] = false; + } + if (!("EnableSwipeGestures" in $$source)) { + this["EnableSwipeGestures"] = false; + } + if (!("Menu" in $$source)) { + this["Menu"] = null; + } + if (!("OnEnterEffect" in $$source)) { + this["OnEnterEffect"] = DragEffect.$zero; + } + if (!("OnOverEffect" in $$source)) { + this["OnOverEffect"] = DragEffect.$zero; + } + if (!("Permissions" in $$source)) { + this["Permissions"] = {}; + } + if (!("ExStyle" in $$source)) { + this["ExStyle"] = 0; + } + if (!("GeneralAutofillEnabled" in $$source)) { + this["GeneralAutofillEnabled"] = false; + } + if (!("PasswordAutosaveEnabled" in $$source)) { + this["PasswordAutosaveEnabled"] = false; + } + if (!("EnabledFeatures" in $$source)) { + this["EnabledFeatures"] = []; + } + if (!("DisabledFeatures" in $$source)) { + this["DisabledFeatures"] = []; + } + if (!("AdditionalLaunchArgs" in $$source)) { + this["AdditionalLaunchArgs"] = []; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new WindowsWindow instance from a string or object. + */ + static createFrom($$source: any = {}): WindowsWindow { + const $$createField3_0 = $$createType43; + const $$createField5_0 = $Create.ByteSlice; + const $$createField9_0 = $$createType30; + const $$createField12_0 = $$createType25; + const $$createField15_0 = $$createType44; + const $$createField19_0 = $$createType45; + const $$createField20_0 = $$createType45; + const $$createField21_0 = $$createType45; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("CustomTheme" in $$parsedSource) { + $$parsedSource["CustomTheme"] = $$createField3_0($$parsedSource["CustomTheme"]); + } + if ("WindowMask" in $$parsedSource) { + $$parsedSource["WindowMask"] = $$createField5_0($$parsedSource["WindowMask"]); + } + if ("EventMapping" in $$parsedSource) { + $$parsedSource["EventMapping"] = $$createField9_0($$parsedSource["EventMapping"]); + } + if ("Menu" in $$parsedSource) { + $$parsedSource["Menu"] = $$createField12_0($$parsedSource["Menu"]); + } + if ("Permissions" in $$parsedSource) { + $$parsedSource["Permissions"] = $$createField15_0($$parsedSource["Permissions"]); + } + if ("EnabledFeatures" in $$parsedSource) { + $$parsedSource["EnabledFeatures"] = $$createField19_0($$parsedSource["EnabledFeatures"]); + } + if ("DisabledFeatures" in $$parsedSource) { + $$parsedSource["DisabledFeatures"] = $$createField20_0($$parsedSource["DisabledFeatures"]); + } + if ("AdditionalLaunchArgs" in $$parsedSource) { + $$parsedSource["AdditionalLaunchArgs"] = $$createField21_0($$parsedSource["AdditionalLaunchArgs"]); + } + return new WindowsWindow($$parsedSource as Partial); + } +} + +// Private type creation functions +const $$createType0 = WindowManager.createFrom; +const $$createType1 = $Create.Nullable($$createType0); +const $$createType2 = ContextMenuManager.createFrom; +const $$createType3 = $Create.Nullable($$createType2); +const $$createType4 = KeyBindingManager.createFrom; +const $$createType5 = $Create.Nullable($$createType4); +const $$createType6 = BrowserManager.createFrom; +const $$createType7 = $Create.Nullable($$createType6); +const $$createType8 = EnvironmentManager.createFrom; +const $$createType9 = $Create.Nullable($$createType8); +const $$createType10 = DialogManager.createFrom; +const $$createType11 = $Create.Nullable($$createType10); +const $$createType12 = EventManager.createFrom; +const $$createType13 = $Create.Nullable($$createType12); +const $$createType14 = MenuManager.createFrom; +const $$createType15 = $Create.Nullable($$createType14); +const $$createType16 = ScreenManager.createFrom; +const $$createType17 = $Create.Nullable($$createType16); +const $$createType18 = ClipboardManager.createFrom; +const $$createType19 = $Create.Nullable($$createType18); +const $$createType20 = SystemTrayManager.createFrom; +const $$createType21 = $Create.Nullable($$createType20); +const $$createType22 = slog$0.Logger.createFrom; +const $$createType23 = $Create.Nullable($$createType22); +const $$createType24 = Menu.createFrom; +const $$createType25 = $Create.Nullable($$createType24); +const $$createType26 = RGBA.createFrom; +const $$createType27 = $Create.Nullable($$createType26); +const $$createType28 = u$0.Var.createFrom($Create.Any); +const $$createType29 = MacTitleBar.createFrom; +const $$createType30 = $Create.Map($Create.Any, $Create.Any); +const $$createType31 = MacWebviewPreferences.createFrom; +const $$createType32 = MacLiquidGlass.createFrom; +const $$createType33 = TextTheme.createFrom; +const $$createType34 = $Create.Nullable($$createType33); +const $$createType35 = WindowTheme.createFrom; +const $$createType36 = $Create.Nullable($$createType35); +const $$createType37 = MenuBarTheme.createFrom; +const $$createType38 = $Create.Nullable($$createType37); +const $$createType39 = MacWindow.createFrom; +const $$createType40 = WindowsWindow.createFrom; +const $$createType41 = LinuxWindow.createFrom; +const $$createType42 = $Create.Map($Create.Any, $Create.Any); +const $$createType43 = ThemeSettings.createFrom; +const $$createType44 = $Create.Map($Create.Any, $Create.Any); +const $$createType45 = $Create.Array($Create.Any); diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/pkg/events/index.ts b/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/pkg/events/index.ts new file mode 100644 index 0000000..64958d6 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/pkg/events/index.ts @@ -0,0 +1,6 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export type { + WindowEventType +} from "./models.js"; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/pkg/events/models.ts b/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/pkg/events/models.ts new file mode 100644 index 0000000..f14a4a1 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/pkg/events/models.ts @@ -0,0 +1,8 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +export type WindowEventType = number; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/index.ts b/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/index.ts new file mode 100644 index 0000000..2c4a6cc --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/index.ts @@ -0,0 +1,14 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import * as NotificationService from "./notificationservice.js"; +export { + NotificationService +}; + +export { + NotificationAction, + NotificationCategory, + NotificationOptions, + NotificationService +} from "./models.js"; diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.ts b/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.ts new file mode 100644 index 0000000..efc61d7 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/models.ts @@ -0,0 +1,127 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +/** + * NotificationAction represents an action button for a notification. + */ +export class NotificationAction { + "id"?: string; + "title"?: string; + + /** + * (macOS-specific) + */ + "destructive"?: boolean; + + /** Creates a new NotificationAction instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new NotificationAction instance from a string or object. + */ + static createFrom($$source: any = {}): NotificationAction { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new NotificationAction($$parsedSource as Partial); + } +} + +/** + * NotificationCategory groups actions for notifications. + */ +export class NotificationCategory { + "id"?: string; + "actions"?: NotificationAction[]; + "hasReplyField"?: boolean; + "replyPlaceholder"?: string; + "replyButtonTitle"?: string; + + /** Creates a new NotificationCategory instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new NotificationCategory instance from a string or object. + */ + static createFrom($$source: any = {}): NotificationCategory { + const $$createField1_0 = $$createType1; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("actions" in $$parsedSource) { + $$parsedSource["actions"] = $$createField1_0($$parsedSource["actions"]); + } + return new NotificationCategory($$parsedSource as Partial); + } +} + +/** + * NotificationOptions contains configuration for a notification + */ +export class NotificationOptions { + "id": string; + "title": string; + + /** + * (macOS and Linux only) + */ + "subtitle"?: string; + "body"?: string; + "categoryId"?: string; + "data"?: { [_: string]: any }; + + /** Creates a new NotificationOptions instance. */ + constructor($$source: Partial = {}) { + if (!("id" in $$source)) { + this["id"] = ""; + } + if (!("title" in $$source)) { + this["title"] = ""; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new NotificationOptions instance from a string or object. + */ + static createFrom($$source: any = {}): NotificationOptions { + const $$createField5_0 = $$createType2; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("data" in $$parsedSource) { + $$parsedSource["data"] = $$createField5_0($$parsedSource["data"]); + } + return new NotificationOptions($$parsedSource as Partial); + } +} + +/** + * Service represents the notifications service + */ +export class NotificationService { + + /** Creates a new NotificationService instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new NotificationService instance from a string or object. + */ + static createFrom($$source: any = {}): NotificationService { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new NotificationService($$parsedSource as Partial); + } +} + +// Private type creation functions +const $$createType0 = NotificationAction.createFrom; +const $$createType1 = $Create.Array($$createType0); +const $$createType2 = $Create.Map($Create.Any, $Create.Any); diff --git a/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/notificationservice.ts b/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/notificationservice.ts new file mode 100644 index 0000000..859f357 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/github.com/wailsapp/wails/v3/pkg/services/notifications/notificationservice.ts @@ -0,0 +1,62 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +/** + * Service represents the notifications service + * @module + */ + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as $models from "./models.js"; + +export function CheckNotificationAuthorization(): $CancellablePromise { + return $Call.ByID(2216952893); +} + +export function RegisterNotificationCategory(category: $models.NotificationCategory): $CancellablePromise { + return $Call.ByID(2917562919, category); +} + +export function RemoveAllDeliveredNotifications(): $CancellablePromise { + return $Call.ByID(3956282340); +} + +export function RemoveAllPendingNotifications(): $CancellablePromise { + return $Call.ByID(108821341); +} + +export function RemoveDeliveredNotification(identifier: string): $CancellablePromise { + return $Call.ByID(975691940, identifier); +} + +export function RemoveNotification(identifier: string): $CancellablePromise { + return $Call.ByID(3966653866, identifier); +} + +export function RemoveNotificationCategory(categoryID: string): $CancellablePromise { + return $Call.ByID(2032615554, categoryID); +} + +export function RemovePendingNotification(identifier: string): $CancellablePromise { + return $Call.ByID(3729049703, identifier); +} + +/** + * Public methods that delegate to the implementation. + */ +export function RequestNotificationAuthorization(): $CancellablePromise { + return $Call.ByID(3933442950); +} + +export function SendNotification(options: $models.NotificationOptions): $CancellablePromise { + return $Call.ByID(3968228732, options); +} + +export function SendNotificationWithActions(options: $models.NotificationOptions): $CancellablePromise { + return $Call.ByID(1886542847, options); +} diff --git a/cmd/lthn-desktop/frontend/bindings/html/template/index.ts b/cmd/lthn-desktop/frontend/bindings/html/template/index.ts new file mode 100644 index 0000000..6bf5d69 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/html/template/index.ts @@ -0,0 +1,6 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export type { + FuncMap +} from "./models.js"; diff --git a/cmd/lthn-desktop/frontend/bindings/html/template/models.ts b/cmd/lthn-desktop/frontend/bindings/html/template/models.ts new file mode 100644 index 0000000..6cec6cb --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/html/template/models.ts @@ -0,0 +1,12 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as template$0 from "../../text/template/models.js"; + +export type FuncMap = template$0.FuncMap; diff --git a/cmd/lthn-desktop/frontend/bindings/io/index.ts b/cmd/lthn-desktop/frontend/bindings/io/index.ts new file mode 100644 index 0000000..b370ee0 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/io/index.ts @@ -0,0 +1,6 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export type { + Writer +} from "./models.js"; diff --git a/cmd/lthn-desktop/frontend/bindings/io/models.ts b/cmd/lthn-desktop/frontend/bindings/io/models.ts new file mode 100644 index 0000000..035bada --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/io/models.ts @@ -0,0 +1,19 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +/** + * Writer is the interface that wraps the basic Write method. + * + * Write writes len(p) bytes from p to the underlying data stream. + * It returns the number of bytes written from p (0 <= n <= len(p)) + * and any error encountered that caused the write to stop early. + * Write must return a non-nil error if it returns n < len(p). + * Write must not modify the slice data, even temporarily. + * + * Implementations must not retain p. + */ +export type Writer = any; diff --git a/cmd/lthn-desktop/frontend/bindings/log/slog/index.ts b/cmd/lthn-desktop/frontend/bindings/log/slog/index.ts new file mode 100644 index 0000000..28f9022 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/log/slog/index.ts @@ -0,0 +1,6 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export { + Logger +} from "./models.js"; diff --git a/cmd/lthn-desktop/frontend/bindings/log/slog/models.ts b/cmd/lthn-desktop/frontend/bindings/log/slog/models.ts new file mode 100644 index 0000000..ef606c6 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/log/slog/models.ts @@ -0,0 +1,31 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +/** + * A Logger records structured information about each call to its + * Log, Debug, Info, Warn, and Error methods. + * For each call, it creates a [Record] and passes it to a [Handler]. + * + * To create a new Logger, call [New] or a Logger method + * that begins "With". + */ +export class Logger { + + /** Creates a new Logger instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new Logger instance from a string or object. + */ + static createFrom($$source: any = {}): Logger { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new Logger($$parsedSource as Partial); + } +} diff --git a/cmd/lthn-desktop/frontend/bindings/lthn-desktop/index.ts b/cmd/lthn-desktop/frontend/bindings/lthn-desktop/index.ts new file mode 100644 index 0000000..6ed5d05 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/lthn-desktop/index.ts @@ -0,0 +1,7 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import * as MCPBridge from "./mcpbridge.js"; +export { + MCPBridge +}; diff --git a/cmd/lthn-desktop/frontend/bindings/lthn-desktop/mcpbridge.ts b/cmd/lthn-desktop/frontend/bindings/lthn-desktop/mcpbridge.ts new file mode 100644 index 0000000..bf5209e --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/lthn-desktop/mcpbridge.ts @@ -0,0 +1,57 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +/** + * MCPBridge wires together MCP, WebView, Display and WebSocket services + * and starts the MCP HTTP server after Wails initializes. + * @module + */ + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as display$0 from "../github.com/Snider/Core/pkg/display/models.js"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as mcp$0 from "../github.com/Snider/Core/pkg/mcp/models.js"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as webview$0 from "../github.com/Snider/Core/pkg/webview/models.js"; + +/** + * GetDisplay returns the Display service. + */ +export function GetDisplay(): $CancellablePromise { + return $Call.ByID(3763799861).then(($result: any) => { + return $$createType1($result); + }); +} + +/** + * GetMCPService returns the MCP service for direct access. + */ +export function GetMCPService(): $CancellablePromise { + return $Call.ByID(4133944486).then(($result: any) => { + return $$createType3($result); + }); +} + +/** + * GetWebView returns the WebView service. + */ +export function GetWebView(): $CancellablePromise { + return $Call.ByID(903939500).then(($result: any) => { + return $$createType5($result); + }); +} + +// Private type creation functions +const $$createType0 = display$0.Service.createFrom; +const $$createType1 = $Create.Nullable($$createType0); +const $$createType2 = mcp$0.Service.createFrom; +const $$createType3 = $Create.Nullable($$createType2); +const $$createType4 = webview$0.Service.createFrom; +const $$createType5 = $Create.Nullable($$createType4); diff --git a/cmd/lthn-desktop/frontend/bindings/net/http/index.ts b/cmd/lthn-desktop/frontend/bindings/net/http/index.ts new file mode 100644 index 0000000..dd70b92 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/net/http/index.ts @@ -0,0 +1,6 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export type { + Handler +} from "./models.js"; diff --git a/cmd/lthn-desktop/frontend/bindings/net/http/models.ts b/cmd/lthn-desktop/frontend/bindings/net/http/models.ts new file mode 100644 index 0000000..6b222d0 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/net/http/models.ts @@ -0,0 +1,34 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +/** + * A Handler responds to an HTTP request. + * + * [Handler.ServeHTTP] should write reply headers and data to the [ResponseWriter] + * and then return. Returning signals that the request is finished; it + * is not valid to use the [ResponseWriter] or read from the + * [Request.Body] after or concurrently with the completion of the + * ServeHTTP call. + * + * Depending on the HTTP client software, HTTP protocol version, and + * any intermediaries between the client and the Go server, it may not + * be possible to read from the [Request.Body] after writing to the + * [ResponseWriter]. Cautious handlers should read the [Request.Body] + * first, and then reply. + * + * Except for reading the body, handlers should not modify the + * provided Request. + * + * If ServeHTTP panics, the server (the caller of ServeHTTP) assumes + * that the effect of the panic was isolated to the active request. + * It recovers the panic, logs a stack trace to the server error log, + * and either closes the network connection or sends an HTTP/2 + * RST_STREAM, depending on the HTTP protocol. To abort a handler so + * the client sees an interrupted response but the server doesn't log + * an error, panic with the value [ErrAbortHandler]. + */ +export type Handler = any; diff --git a/cmd/lthn-desktop/frontend/bindings/text/template/index.ts b/cmd/lthn-desktop/frontend/bindings/text/template/index.ts new file mode 100644 index 0000000..6bf5d69 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/text/template/index.ts @@ -0,0 +1,6 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export type { + FuncMap +} from "./models.js"; diff --git a/cmd/lthn-desktop/frontend/bindings/text/template/models.ts b/cmd/lthn-desktop/frontend/bindings/text/template/models.ts new file mode 100644 index 0000000..5ec3376 --- /dev/null +++ b/cmd/lthn-desktop/frontend/bindings/text/template/models.ts @@ -0,0 +1,24 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +/** + * FuncMap is the type of the map defining the mapping from names to functions. + * Each function must have either a single return value, or two return values of + * which the second has type error. In that case, if the second (error) + * return value evaluates to non-nil during execution, execution terminates and + * Execute returns that error. + * + * Errors returned by Execute wrap the underlying error; call [errors.As] to + * unwrap them. + * + * When template execution invokes a function with an argument list, that list + * must be assignable to the function's parameter types. Functions meant to + * apply to arguments of arbitrary type can use parameters of type interface{} or + * of type [reflect.Value]. Similarly, functions meant to return a result of arbitrary + * type can return interface{} or [reflect.Value]. + */ +export type FuncMap = { [_: string]: any }; diff --git a/cmd/lthn-desktop/frontend/eslint.config.js b/cmd/lthn-desktop/frontend/eslint.config.js new file mode 100644 index 0000000..225b05e --- /dev/null +++ b/cmd/lthn-desktop/frontend/eslint.config.js @@ -0,0 +1,63 @@ +// @ts-check +const eslint = require("@eslint/js"); +const tseslint = require("typescript-eslint"); +const angular = require("angular-eslint"); + +module.exports = tseslint.config( + { + files: ["**/*.ts"], + extends: [ + eslint.configs.recommended, + ...tseslint.configs.recommended, + ...tseslint.configs.stylistic, + ...angular.configs.tsRecommended, + ], + processor: angular.processInlineTemplates, + rules: { + "@angular-eslint/directive-selector": [ + "error", + { + type: "attribute", + prefix: "app", + style: "camelCase", + }, + ], + "@angular-eslint/component-selector": [ + "error", + { + type: "element", + prefix: "app", + style: "kebab-case", + }, + ], + "@angular-eslint/component-class-suffix": [ + "error", + { + suffixes: ["", "Component"] + } + ], + "@angular-eslint/prefer-inject": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-unused-vars": [ + "error", + { "argsIgnorePattern": "^_", "varsIgnorePattern": "^_" } + ], + "no-undefined": "off", + "no-var": "error", + "prefer-const": "error", + "func-names": "error", + "id-length": "error", + "newline-before-return": "error", + "space-before-blocks": "error", + "no-alert": "error" + }, + }, + { + files: ["**/*.html"], + extends: [ + ...angular.configs.templateRecommended, + ...angular.configs.templateAccessibility, + ], + rules: {}, + } +); diff --git a/cmd/lthn-desktop/frontend/karma.conf.js b/cmd/lthn-desktop/frontend/karma.conf.js new file mode 100644 index 0000000..d5d1ab2 --- /dev/null +++ b/cmd/lthn-desktop/frontend/karma.conf.js @@ -0,0 +1,61 @@ +process.env.CHROME_BIN = process.env.CHROME_BIN || (function() { + try { return require('puppeteer').executablePath(); } catch { return undefined; } +})(); + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + jasmine: { + // you can add configuration options for Jasmine here + // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html + // for example, you can disable the random execution order + random: true + }, + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + jasmineHtmlReporter: { + suppressAll: true // removes the duplicated traces + }, + coverageReporter: { + dir: require('path').join(__dirname, './coverage/angular-starter'), + subdir: '.', + reporters: [ + { type: 'html' }, + { type: 'text-summary' } + ], + check: { + global: { + statements: 80, + branches: 70, + functions: 80, + lines: 80 + } + } + }, + reporters: ['progress', 'kjhtml'], + browsers: ['Chrome'], + customLaunchers: { + ChromeHeadless: { + base: 'Chrome', + flags: [ + '--headless', + '--disable-gpu', + '--no-sandbox', + '--disable-dev-shm-usage', + '--disable-web-security', + '--remote-debugging-port=9222' + ] + } + }, + restartOnFileChange: true + }); +}; diff --git a/cmd/lthn-desktop/frontend/ngsw-config.json b/cmd/lthn-desktop/frontend/ngsw-config.json new file mode 100644 index 0000000..69edd28 --- /dev/null +++ b/cmd/lthn-desktop/frontend/ngsw-config.json @@ -0,0 +1,30 @@ +{ + "$schema": "./node_modules/@angular/service-worker/config/schema.json", + "index": "/index.html", + "assetGroups": [ + { + "name": "app", + "installMode": "prefetch", + "resources": { + "files": [ + "/favicon.ico", + "/index.csr.html", + "/index.html", + "/manifest.webmanifest", + "/*.css", + "/*.js" + ] + } + }, + { + "name": "assets", + "installMode": "lazy", + "updateMode": "prefetch", + "resources": { + "files": [ + "/**/*.(svg|cur|jpg|jpeg|png|apng|webp|avif|gif|otf|ttf|woff|woff2)" + ] + } + } + ] +} diff --git a/cmd/lthn-desktop/frontend/package-lock.json b/cmd/lthn-desktop/frontend/package-lock.json new file mode 100644 index 0000000..2df357c --- /dev/null +++ b/cmd/lthn-desktop/frontend/package-lock.json @@ -0,0 +1,10631 @@ +{ + "name": "frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontend", + "version": "0.0.0", + "dependencies": { + "@angular/common": "^20.3.16", + "@angular/compiler": "^20.3.16", + "@angular/core": "^20.3.16", + "@angular/forms": "^20.3.16", + "@angular/platform-browser": "^20.3.16", + "@angular/router": "^20.3.16", + "@awesome.me/webawesome": "^3.0.0", + "@fortawesome/fontawesome-free": "^7.0.1", + "@ngx-translate/core": "^17.0.0", + "@ngx-translate/http-loader": "^17.0.0", + "@tailwindplus/elements": "^1.0.18", + "@wailsio/runtime": "^3.0.0-alpha.72", + "highcharts": "^12.4.0", + "highcharts-angular": "^5.1.0", + "monaco-editor": "^0.52.2", + "ngx-monaco-editor-v2": "^20.3.0", + "rxjs": "~7.8.0", + "tslib": "^2.3.0", + "zone.js": "^0.15.1" + }, + "devDependencies": { + "@angular/build": "^20.3.14", + "@angular/cli": "^20.3.6", + "@angular/compiler-cli": "^20.3.16", + "@tailwindcss/postcss": "^4.1.14", + "@types/jasmine": "~5.1.0", + "autoprefixer": "^10.4.21", + "jasmine-core": "~5.9.0", + "karma": "~6.4.0", + "karma-chrome-launcher": "~3.2.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.1.0", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.14", + "typescript": "~5.9.2" + } + }, + "bindings/github.com/letheanVPN/desktop/services/core": { + "extraneous": true + }, + "node_modules/@algolia/abtesting": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.1.0.tgz", + "integrity": "sha512-sEyWjw28a/9iluA37KLGu8vjxEIlb60uxznfTUmXImy7H5NvbpSO6yYgmgH5KiD7j+zTUUihiST0jEP12IoXow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.35.0.tgz", + "integrity": "sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.35.0.tgz", + "integrity": "sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.35.0.tgz", + "integrity": "sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.35.0.tgz", + "integrity": "sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.35.0.tgz", + "integrity": "sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.35.0.tgz", + "integrity": "sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.35.0.tgz", + "integrity": "sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.35.0.tgz", + "integrity": "sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.35.0.tgz", + "integrity": "sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.35.0.tgz", + "integrity": "sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.35.0.tgz", + "integrity": "sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.35.0.tgz", + "integrity": "sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.35.0.tgz", + "integrity": "sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.2003.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2003.14.tgz", + "integrity": "sha512-dVlWqaYu0PIgHTBu16uYUS6lJOIpXCpOYhPWuYwqdo7a4x2HcagPQ+omUZJTA6kukh7ROpKcRoiy/DsO/DgvUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "20.3.14", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/core": { + "version": "20.3.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.14.tgz", + "integrity": "sha512-hWQVi73aGdIRInJqNia79Yi6SzqEThkfLug3AdZiNuNvYMaxAI347yPQz4f3Dr/i0QuiqRq/T8zfqbr46tfCqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.3", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics": { + "version": "20.3.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.3.14.tgz", + "integrity": "sha512-+Al9QojzTucccSUnJI+9x64Nnuev82eIgIlb1Ov9hLR572SNtjhV7zIXIalphFghEy+SPvynRuvOSc69Otp3Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "20.3.14", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "8.2.0", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/build": { + "version": "20.3.14", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.3.14.tgz", + "integrity": "sha512-ajFJqTqyI2N9PYcWVxUfb6YEUQsZ13jsBzI/kDpeEZZCGadLJGSMZVNwkX7n9Csw7gzertpenGBXsSTxUjd8TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.2003.14", + "@babel/core": "7.28.3", + "@babel/helper-annotate-as-pure": "7.27.3", + "@babel/helper-split-export-declaration": "7.24.7", + "@inquirer/confirm": "5.1.14", + "@vitejs/plugin-basic-ssl": "2.1.0", + "beasties": "0.3.5", + "browserslist": "^4.23.0", + "esbuild": "0.25.9", + "https-proxy-agent": "7.0.6", + "istanbul-lib-instrument": "6.0.3", + "jsonc-parser": "3.3.1", + "listr2": "9.0.1", + "magic-string": "0.30.17", + "mrmime": "2.0.1", + "parse5-html-rewriting-stream": "8.0.0", + "picomatch": "4.0.3", + "piscina": "5.1.3", + "rollup": "4.52.3", + "sass": "1.90.0", + "semver": "7.7.2", + "source-map-support": "0.5.21", + "tinyglobby": "0.2.14", + "vite": "7.1.11", + "watchpack": "2.4.4" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "lmdb": "3.4.2" + }, + "peerDependencies": { + "@angular/compiler": "^20.0.0", + "@angular/compiler-cli": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/localize": "^20.0.0", + "@angular/platform-browser": "^20.0.0", + "@angular/platform-server": "^20.0.0", + "@angular/service-worker": "^20.0.0", + "@angular/ssr": "^20.3.14", + "karma": "^6.4.0", + "less": "^4.2.0", + "ng-packagr": "^20.0.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "tslib": "^2.3.0", + "typescript": ">=5.8 <6.0", + "vitest": "^3.1.1" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + }, + "@angular/localize": { + "optional": true + }, + "@angular/platform-browser": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@angular/ssr": { + "optional": true + }, + "karma": { + "optional": true + }, + "less": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@angular/cli": { + "version": "20.3.14", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.3.14.tgz", + "integrity": "sha512-vlvnxyUtPnETl5az+creSPOrcnrZC5mhD5hSGl2WoqhYeyWdyUwsC9KLSy8/5gCH/4TNwtjqeX3Pw0KaAJUoCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": "0.2003.14", + "@angular-devkit/core": "20.3.14", + "@angular-devkit/schematics": "20.3.14", + "@inquirer/prompts": "7.8.2", + "@listr2/prompt-adapter-inquirer": "3.0.1", + "@modelcontextprotocol/sdk": "1.25.2", + "@schematics/angular": "20.3.14", + "@yarnpkg/lockfile": "1.1.0", + "algoliasearch": "5.35.0", + "ini": "5.0.0", + "jsonc-parser": "3.3.1", + "listr2": "9.0.1", + "npm-package-arg": "13.0.0", + "pacote": "21.0.0", + "resolve": "1.22.10", + "semver": "7.7.2", + "yargs": "18.0.0", + "zod": "4.1.13" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/common": { + "version": "20.3.16", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.3.16.tgz", + "integrity": "sha512-GRAziNlntwdnJy3F+8zCOvDdy7id0gITjDnM6P9+n2lXvtDuBLGJKU3DWBbvxcCjtD6JK/g/rEX5fbCxbUHkQQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/core": "20.3.16", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "20.3.16", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.3.16.tgz", + "integrity": "sha512-Pt9Ms9GwTThgzdxWBwMfN8cH1JEtQ2DK5dc2yxYtPSaD+WKmG9AVL1PrzIYQEbaKcWk2jxASUHpEWSlNiwo8uw==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@angular/compiler-cli": { + "version": "20.3.16", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.3.16.tgz", + "integrity": "sha512-l3xF/fXfJAl/UrNnH9Ufkr79myjMgXdHq1mmmph2UnpeqilRB1b8lC9sLBV9MipQHVn3dwocxMIvtrcryfOaXw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "7.28.3", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^4.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.2.0", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^18.0.0" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/compiler": "20.3.16", + "typescript": ">=5.8 <6.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@angular/core": { + "version": "20.3.16", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.3.16.tgz", + "integrity": "sha512-KSFPKvOmWWLCJBbEO+CuRUXfecX2FRuO0jNi9c54ptXMOPHlK1lIojUnyXmMNzjdHgRug8ci9qDuftvC2B7MKg==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/compiler": "20.3.16", + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.15.0" + }, + "peerDependenciesMeta": { + "@angular/compiler": { + "optional": true + }, + "zone.js": { + "optional": true + } + } + }, + "node_modules/@angular/forms": { + "version": "20.3.16", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.3.16.tgz", + "integrity": "sha512-1yzbXpExTqATpVcqA3wGrq4ACFIP3mRxA4pbso5KoJU+/4JfzNFwLsDaFXKpm5uxwchVnj8KM2vPaDOkvtp7NA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/common": "20.3.16", + "@angular/core": "20.3.16", + "@angular/platform-browser": "20.3.16", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "20.3.16", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.3.16.tgz", + "integrity": "sha512-YsrLS6vyS77i4pVHg4gdSBW74qvzHjpQRTVQ5Lv/OxIjJdYYYkMmjNalCNgy1ZuyY6CaLIB11ccxhrNnxfKGOQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/animations": "20.3.16", + "@angular/common": "20.3.16", + "@angular/core": "20.3.16" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/router": { + "version": "20.3.16", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.3.16.tgz", + "integrity": "sha512-e1LiQFZaajKqc00cY5FboIrWJZSMnZ64GDp5R0UejritYrqorQQQNOqP1W85BMuY2owibMmxVfX+dJg/Mc8PuQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/common": "20.3.16", + "@angular/core": "20.3.16", + "@angular/platform-browser": "20.3.16", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@awesome.me/webawesome": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@awesome.me/webawesome/-/webawesome-3.0.0.tgz", + "integrity": "sha512-KLxAiSV9hH+bB8OkpaZUA9zNgBu6G1cXirsE0VWmdS/jtpup1Wf1aC7yGYjPSi/61BVUqk8geA4oylt4oLdmlQ==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "4.1.0", + "@floating-ui/dom": "^1.6.13", + "@lit/react": "^1.0.8", + "@shoelace-style/animations": "^1.2.0", + "@shoelace-style/localize": "^3.2.1", + "composed-offset-position": "^0.0.6", + "lit": "^3.2.1", + "nanoid": "^5.1.5", + "qr-creator": "^1.0.0" + }, + "engines": { + "node": ">=14.17.0" + } + }, + "node_modules/@awesome.me/webawesome/node_modules/nanoid": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz", + "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", + "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.3", + "@babel/parser": "^7.28.3", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.1.0.tgz", + "integrity": "sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT", + "peer": true + }, + "node_modules/@fortawesome/fontawesome-free": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-7.0.1.tgz", + "integrity": "sha512-RLmb9U6H2rJDnGxEqXxzy7ANPrQz7WK2/eTjdZqyU9uRU5W+FkAec9uU5gTYzFBH7aoXIw2WTJSCJR4KPlReQw==", + "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)", + "engines": { + "node": ">=6" + } + }, + "node_modules/@hono/node-server": { + "version": "1.19.9", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", + "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.1.tgz", + "integrity": "sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.0.tgz", + "integrity": "sha512-5+Q3PKH35YsnoPTh75LucALdAxom6xh5D1oeY561x4cqBuH24ZFVyFREPe14xgnrtmGu3EEt1dIi60wRVSnGCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.1", + "@inquirer/core": "^10.3.0", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.14", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.14.tgz", + "integrity": "sha512-5yR4IBfe0kXe59r1YCTG8WXkUbl7Z35HK87Sw+WUyGD8wNUx7JvY7laahzeytyE1oLn74bQnL7hstctQxisQ8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.15", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.0.tgz", + "integrity": "sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.1", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.21", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.21.tgz", + "integrity": "sha512-MjtjOGjr0Kh4BciaFShYpZ1s9400idOdvQ5D7u7lE6VztPFoyLcVNE5dXBmEEIQq5zi4B9h2kU+q7AVBxJMAkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/external-editor": "^1.0.2", + "@inquirer/type": "^3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.21", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.21.tgz", + "integrity": "sha512-+mScLhIcbPFmuvU3tAGBed78XvYHSvCl6dBiYMlzCLhpr0bzGzd8tfivMMeqND6XZiaZ1tgusbUHJEfc6YzOdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", + "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^2.1.0", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.14.tgz", + "integrity": "sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.5.tgz", + "integrity": "sha512-7GoWev7P6s7t0oJbenH0eQ0ThNdDJbEAEtVt9vsrYZ9FulIokvd823yLyhQlWHJPGce1wzP53ttfdCZmonMHyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.21.tgz", + "integrity": "sha512-5QWs0KGaNMlhbdhOSCFfKsW+/dcAVC2g4wT/z2MCiZM47uLgatC5N20kpkDQf7dHx+XFct/MJvvNGy6aYJn4Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.21", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.21.tgz", + "integrity": "sha512-xxeW1V5SbNFNig2pLfetsDb0svWlKuhmr7MPJZMYuDnCTkpVBI+X/doudg4pznc1/U+yYmWFFOi4hNvGgUo7EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.1", + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.8.2.tgz", + "integrity": "sha512-nqhDw2ZcAUrKNPwhjinJny903bRhI0rQhiDz1LksjeRxqa36i3l75+4iXbOy0rlDpLJGxqtgoPavQjmmyS5UJw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@inquirer/checkbox": "^4.2.1", + "@inquirer/confirm": "^5.1.14", + "@inquirer/editor": "^4.2.17", + "@inquirer/expand": "^4.0.17", + "@inquirer/input": "^4.2.1", + "@inquirer/number": "^3.0.17", + "@inquirer/password": "^4.0.17", + "@inquirer/rawlist": "^4.1.5", + "@inquirer/search": "^3.1.0", + "@inquirer/select": "^4.3.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.9.tgz", + "integrity": "sha512-AWpxB7MuJrRiSfTKGJ7Y68imYt8P9N3Gaa7ySdkFj1iWjr6WfbGAhdZvw/UnhFXTHITJzxGUI9k8IX7akAEBCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.0.tgz", + "integrity": "sha512-a5SzB/qrXafDX1Z4AZW3CsVoiNxcIYCzYP7r9RzrfMpaLpB+yWi5U8BWagZyLmwR0pKbbL5umnGRd0RzGVI8bQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.0.tgz", + "integrity": "sha512-kaC3FHsJZvVyIjYBs5Ih8y8Bj4P/QItQWrZW22WJax7zTN+ZPXVGuOM55vzbdCP9zKUiBd9iEJVdesujfF+cAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.1", + "@inquirer/core": "^10.3.0", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.9.tgz", + "integrity": "sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@listr2/prompt-adapter-inquirer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-3.0.1.tgz", + "integrity": "sha512-3XFmGwm3u6ioREG+ynAQB7FoxfajgQnMhIu8wC5eo/Lsih4aKDg0VuIMGaOsYn7hJSJagSeaD4K8yfpkEoDEmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/type": "^3.0.7" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@inquirer/prompts": ">= 3 < 8", + "listr2": "9.0.1" + } + }, + "node_modules/@lit-labs/ssr-dom-shim": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.5.1.tgz", + "integrity": "sha512-Aou5UdlSpr5whQe8AA/bZG0jMj96CoJIWbGfZ91qieWu5AWUMKw8VR/pAkQkJYvBNhmCcWnZlyyk5oze8JIqYA==", + "license": "BSD-3-Clause" + }, + "node_modules/@lit/react": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@lit/react/-/react-1.0.8.tgz", + "integrity": "sha512-p2+YcF+JE67SRX3mMlJ1TKCSTsgyOVdAwd/nxp3NuV1+Cb6MWALbN6nT7Ld4tpmYofcE5kcaSY1YBB9erY+6fw==", + "license": "BSD-3-Clause", + "peerDependencies": { + "@types/react": "17 || 18 || 19" + } + }, + "node_modules/@lit/reactive-element": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.2.tgz", + "integrity": "sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.5.0" + } + }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.4.2.tgz", + "integrity": "sha512-NK80WwDoODyPaSazKbzd3NEJ3ygePrkERilZshxBViBARNz21rmediktGHExoj9n5t9+ChlgLlxecdFKLCuCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.4.2.tgz", + "integrity": "sha512-zevaowQNmrp3U7Fz1s9pls5aIgpKRsKb3dZWDINtLiozh3jZI9fBrI19lYYBxqdyiIyNdlyiidPnwPShj4aK+w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.4.2.tgz", + "integrity": "sha512-OmHCULY17rkx/RoCoXlzU7LyR8xqrksgdYWwtYa14l/sseezZ8seKWXcogHcjulBddER5NnEFV4L/Jtr2nyxeg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.4.2.tgz", + "integrity": "sha512-ZBEfbNZdkneebvZs98Lq30jMY8V9IJzckVeigGivV7nTHJc+89Ctomp1kAIWKlwIG0ovCDrFI448GzFPORANYg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.4.2.tgz", + "integrity": "sha512-vL9nM17C77lohPYE4YaAQvfZCSVJSryE4fXdi8M7uWPBnU+9DJabgKVAeyDb84ZM2vcFseoBE4/AagVtJeRE7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-win32-arm64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.4.2.tgz", + "integrity": "sha512-SXWjdBfNDze4ZPeLtYIzsIeDJDJ/SdsA0pEXcUBayUIMO0FQBHfVZZyHXQjjHr4cvOAzANBgIiqaXRwfMhzmLw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.4.2.tgz", + "integrity": "sha512-IY+r3bxKW6Q6sIPiMC0L533DEfRJSXibjSI3Ft/w9Q8KQBNqEIvUFXt+09wV8S5BRk0a8uSF19YWxuRwEfI90g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.25.2", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.25.2.tgz", + "integrity": "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.19.7", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "jose": "^6.1.1", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@napi-rs/nice": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.1.1.tgz", + "integrity": "sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/nice-android-arm-eabi": "1.1.1", + "@napi-rs/nice-android-arm64": "1.1.1", + "@napi-rs/nice-darwin-arm64": "1.1.1", + "@napi-rs/nice-darwin-x64": "1.1.1", + "@napi-rs/nice-freebsd-x64": "1.1.1", + "@napi-rs/nice-linux-arm-gnueabihf": "1.1.1", + "@napi-rs/nice-linux-arm64-gnu": "1.1.1", + "@napi-rs/nice-linux-arm64-musl": "1.1.1", + "@napi-rs/nice-linux-ppc64-gnu": "1.1.1", + "@napi-rs/nice-linux-riscv64-gnu": "1.1.1", + "@napi-rs/nice-linux-s390x-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-musl": "1.1.1", + "@napi-rs/nice-openharmony-arm64": "1.1.1", + "@napi-rs/nice-win32-arm64-msvc": "1.1.1", + "@napi-rs/nice-win32-ia32-msvc": "1.1.1", + "@napi-rs/nice-win32-x64-msvc": "1.1.1" + } + }, + "node_modules/@napi-rs/nice-android-arm-eabi": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.1.1.tgz", + "integrity": "sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-android-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.1.1.tgz", + "integrity": "sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.1.1.tgz", + "integrity": "sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-x64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.1.1.tgz", + "integrity": "sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-freebsd-x64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.1.1.tgz", + "integrity": "sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.1.1.tgz", + "integrity": "sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.1.1.tgz", + "integrity": "sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-musl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.1.1.tgz", + "integrity": "sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-ppc64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.1.1.tgz", + "integrity": "sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-riscv64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.1.1.tgz", + "integrity": "sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-s390x-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.1.1.tgz", + "integrity": "sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.1.1.tgz", + "integrity": "sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-musl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.1.1.tgz", + "integrity": "sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-openharmony-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-openharmony-arm64/-/nice-openharmony-arm64-1.1.1.tgz", + "integrity": "sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-arm64-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.1.1.tgz", + "integrity": "sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-ia32-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.1.1.tgz", + "integrity": "sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-x64-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.1.1.tgz", + "integrity": "sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ngx-translate/core": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-17.0.0.tgz", + "integrity": "sha512-Rft2D5ns2pq4orLZjEtx1uhNuEBerUdpFUG1IcqtGuipj6SavgB8SkxtNQALNDA+EVlvsNCCjC2ewZVtUeN6rg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": ">=16", + "@angular/core": ">=16" + } + }, + "node_modules/@ngx-translate/http-loader": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-17.0.0.tgz", + "integrity": "sha512-hgS8sa0ARjH9ll3PhkLTufeVXNI2DNR2uFKDhBgq13siUXzzVr/a31M6zgecrtwbA34iaBV01hsTMbMS8V7iIw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": ">=16", + "@angular/core": ">=16" + } + }, + "node_modules/@npmcli/agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", + "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/fs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", + "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/git": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz", + "integrity": "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^8.0.0", + "ini": "^5.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^10.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz", + "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz", + "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.2.0.tgz", + "integrity": "sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^6.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^8.0.0", + "json-parse-even-better-errors": "^4.0.0", + "proc-log": "^5.0.0", + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/package-json/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/package-json/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.3.tgz", + "integrity": "sha512-Yb00SWaL4F8w+K8YGhQ55+xE4RUNdMHV43WZGsiTM92gS+lC0mGsn7I4hLug7pbao035S6bj3Y3w0cUNGLfmkg==", + "dev": true, + "license": "ISC", + "dependencies": { + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/redact": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.2.2.tgz", + "integrity": "sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.1.0.tgz", + "integrity": "sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "node-gyp": "^11.0.0", + "proc-log": "^5.0.0", + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/@parcel/watcher/node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.3.tgz", + "integrity": "sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.3.tgz", + "integrity": "sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.3.tgz", + "integrity": "sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.3.tgz", + "integrity": "sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.3.tgz", + "integrity": "sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.3.tgz", + "integrity": "sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.3.tgz", + "integrity": "sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.3.tgz", + "integrity": "sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.3.tgz", + "integrity": "sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.3.tgz", + "integrity": "sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.3.tgz", + "integrity": "sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.3.tgz", + "integrity": "sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.3.tgz", + "integrity": "sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.3.tgz", + "integrity": "sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.3.tgz", + "integrity": "sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.3.tgz", + "integrity": "sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.3.tgz", + "integrity": "sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.3.tgz", + "integrity": "sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.3.tgz", + "integrity": "sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.3.tgz", + "integrity": "sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.3.tgz", + "integrity": "sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.3.tgz", + "integrity": "sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@schematics/angular": { + "version": "20.3.14", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.3.14.tgz", + "integrity": "sha512-JO37puMXFWN8YWqZZJ/URs8vPJNszZXcIyBnYdKDWTGaAnbOZMu0nzQlOC+h5NM7R5cPQtOpJv0wxEnY6EYI4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "20.3.14", + "@angular-devkit/schematics": "20.3.14", + "jsonc-parser": "3.3.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@shoelace-style/animations": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@shoelace-style/animations/-/animations-1.2.0.tgz", + "integrity": "sha512-avvo1xxkLbv2dgtabdewBbqcJfV0e0zCwFqkPMnHFGbJbBHorRFfMAHh1NG9ymmXn0jW95ibUVH03E1NYXD6Gw==", + "license": "MIT", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/claviska" + } + }, + "node_modules/@shoelace-style/localize": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@shoelace-style/localize/-/localize-3.2.1.tgz", + "integrity": "sha512-r4C9C/5kSfMBIr0D9imvpRdCNXtUNgyYThc4YlS6K5Hchv1UyxNQ9mxwj+BTRH2i1Neits260sR3OjKMnplsFA==", + "license": "MIT" + }, + "node_modules/@sigstore/bundle": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz", + "integrity": "sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.4.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-2.0.0.tgz", + "integrity": "sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.3.tgz", + "integrity": "sha512-fk2zjD9117RL9BjqEwF7fwv7Q/P9yGsMV4MUJZ/DocaQJ6+3pKr+syBq1owU5Q5qGw5CUbXzm+4yJ2JVRDQeSA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.1.0.tgz", + "integrity": "sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.0", + "make-fetch-happen": "^14.0.2", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.1.tgz", + "integrity": "sha512-eFFvlcBIoGwVkkwmTi/vEQFSva3xs5Ot3WmBcjgjVdiaoelBLQaQ/ZBfhlG0MnG0cmTYScPpk7eDdGDWUcFUmg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.4.1", + "tuf-js": "^3.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/verify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.1.tgz", + "integrity": "sha512-hVJD77oT67aowHxwT4+M6PGOp+E2LtLdTK3+FC0lBO9T7sYwItDMXZ7Z07IDCvR1M717a4axbIWckrW67KMP/w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.14.tgz", + "integrity": "sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.0", + "lightningcss": "1.30.1", + "magic-string": "^0.30.19", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.14" + } + }, + "node_modules/@tailwindcss/node/node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.14.tgz", + "integrity": "sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.5.1" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.14", + "@tailwindcss/oxide-darwin-arm64": "4.1.14", + "@tailwindcss/oxide-darwin-x64": "4.1.14", + "@tailwindcss/oxide-freebsd-x64": "4.1.14", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.14", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.14", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.14", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.14", + "@tailwindcss/oxide-linux-x64-musl": "4.1.14", + "@tailwindcss/oxide-wasm32-wasi": "4.1.14", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.14", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.14" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.14.tgz", + "integrity": "sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.14.tgz", + "integrity": "sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.14.tgz", + "integrity": "sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.14.tgz", + "integrity": "sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.14.tgz", + "integrity": "sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.14.tgz", + "integrity": "sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.14.tgz", + "integrity": "sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.14.tgz", + "integrity": "sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.14.tgz", + "integrity": "sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.14.tgz", + "integrity": "sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.0.5", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.14.tgz", + "integrity": "sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.14.tgz", + "integrity": "sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@tailwindcss/oxide/node_modules/tar": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", + "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@tailwindcss/oxide/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.14.tgz", + "integrity": "sha512-BdMjIxy7HUNThK87C7BC8I1rE8BVUsfNQSI5siQ4JK3iIa3w0XyVvVL9SXLWO//CtYTcp1v7zci0fYwJOjB+Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.14", + "@tailwindcss/oxide": "4.1.14", + "postcss": "^8.4.41", + "tailwindcss": "4.1.14" + } + }, + "node_modules/@tailwindplus/elements": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/@tailwindplus/elements/-/elements-1.0.18.tgz", + "integrity": "sha512-JvqwL+6LwDIxC5zV9kAcI1wttpkUhgkGr7bcuYGH7fxnmgvVJglBERqlgPGGDXWB+lpuFgjgkvtK3pMm/7MvTA==", + "license": "SEE LICENSE IN LICENSE.md" + }, + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz", + "integrity": "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@tufjs/models/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@types/cors": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jasmine": { + "version": "5.1.12", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.12.tgz", + "integrity": "sha512-1BzPxNsFDLDfj9InVR3IeY0ZVf4o9XV+4mDqoCfyPkbsA7dYyKAPAb2co6wLFlHcvxPlt1wShm7zQdV7uTfLGA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.8.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.8.1.tgz", + "integrity": "sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "undici-types": "~7.14.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.8.tgz", + "integrity": "sha512-3MbSL37jEchWZz2p2mjntRZtPt837ij10ApxKfgmXCTuHWagYg7iA5bqPw6C8BMPfwidlvfPI/fxOc42HLhcyg==", + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.0.tgz", + "integrity": "sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0" + } + }, + "node_modules/@wailsio/runtime": { + "version": "3.0.0-alpha.72", + "resolved": "https://registry.npmjs.org/@wailsio/runtime/-/runtime-3.0.0-alpha.72.tgz", + "integrity": "sha512-VJjDa0GBG7tp7WBMlytzLvsZ4gBQVBftIwiJ+dSg2C4e11N6JonJZp9iHT2xgK35rewKdwbX1vMDyrcBcyZYoA==", + "license": "MIT" + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/algoliasearch": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.35.0.tgz", + "integrity": "sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.1.0", + "@algolia/client-abtesting": "5.35.0", + "@algolia/client-analytics": "5.35.0", + "@algolia/client-common": "5.35.0", + "@algolia/client-insights": "5.35.0", + "@algolia/client-personalization": "5.35.0", + "@algolia/client-query-suggestions": "5.35.0", + "@algolia/client-search": "5.35.0", + "@algolia/ingestion": "1.35.0", + "@algolia/monitoring": "1.35.0", + "@algolia/recommend": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/ansi-escapes": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.1.1.tgz", + "integrity": "sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.18", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.18.tgz", + "integrity": "sha512-UYmTpOBwgPScZpS4A+YbapwWuBwasxvO/2IOHArSsAhL/+ZdmATBXTex3t+l2hXwLVYK382ibr/nKoY9GKe86w==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/beasties": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.5.tgz", + "integrity": "sha512-NaWu+f4YrJxEttJSm16AzMIFtVldCvaJ68b1L098KpqXmxt9xOLtKoLkKxb8ekhOrLqEJAbvT6n6SEvB/sac7A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "css-select": "^6.0.0", + "css-what": "^7.0.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "htmlparser2": "^10.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.49", + "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.26.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", + "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^4.0.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/tar": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", + "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cacache/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001751", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", + "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", + "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/composed-offset-position": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/composed-offset-position/-/composed-offset-position-0.0.6.tgz", + "integrity": "sha512-Q7dLompI6lUwd7LWyIcP66r4WcS9u7AL2h8HaeipiRfCRPLMWqRx8fYsjb4OHi6UQFifO7XtNC2IlEJ1ozIFxw==", + "license": "MIT", + "peerDependencies": { + "@floating-ui/utils": "^0.2.5" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/connect/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz", + "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^7.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "nth-check": "^2.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz", + "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", + "dev": true, + "license": "MIT" + }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", + "dev": true, + "license": "MIT" + }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.237", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.237.tgz", + "integrity": "sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/engine.io": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", + "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.2.tgz", + "integrity": "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "punycode": "^1.4.1", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/highcharts": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/highcharts/-/highcharts-12.4.0.tgz", + "integrity": "sha512-o6UxxfChSUrvrZUbWrAuqL1HO/+exhAUPcZY6nnqLsadZQlnP16d082sg7DnXKZCk1gtfkyfkp6g3qkIZ9miZg==", + "license": "https://www.highcharts.com/license", + "peer": true + }, + "node_modules/highcharts-angular": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/highcharts-angular/-/highcharts-angular-5.1.0.tgz", + "integrity": "sha512-CtPpxagfmscUiXdlcRNyKa9VxVy+OMxja9FngmK6OoKpXZyTP8r/u9WbyoA0vSq/VOHQnxHP8wBrBVXUHBFTrg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/common": ">=19.0.0", + "@angular/core": ">=19.0.0", + "highcharts": ">=12.2.0" + } + }, + "node_modules/hono": { + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.4.tgz", + "integrity": "sha512-U7tt8JsyrxSRKspfhtLET79pU8K+tInj5QZXs1jSugO1Vq5dFj3kmZsRldo29mTBfcjDRVRXrEZ6LS63Cog9ZA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/hosted-git-info": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz", + "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^11.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ignore-walk": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-8.0.0.tgz", + "integrity": "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minimatch": "^10.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/immutable": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz", + "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", + "dev": true, + "license": "MIT" + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", + "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jasmine-core": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.9.0.tgz", + "integrity": "sha512-OMUvF1iI6+gSRYOhMrH4QYothVLN9C3EJ6wm4g7zLJlnaTl8zbaPOr0bTw70l7QxkoM7sVFOWo83u9B2Fe2Zng==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jose": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", + "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", + "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/karma": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", + "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.7.2", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-chrome-launcher": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", + "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "which": "^1.2.1" + } + }, + "node_modules/karma-chrome-launcher/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/karma-coverage": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", + "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.0.5", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/karma-coverage/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma-coverage/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/karma-jasmine": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", + "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "jasmine-core": "^4.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "karma": "^6.0.0" + } + }, + "node_modules/karma-jasmine-html-reporter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", + "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "jasmine-core": "^4.0.0 || ^5.0.0", + "karma": "^6.0.0", + "karma-jasmine": "^5.0.0" + } + }, + "node_modules/karma-jasmine/node_modules/jasmine-core": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.1.tgz", + "integrity": "sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/karma/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/karma/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/karma/node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/karma/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/karma/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/karma/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/karma/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/karma/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/karma/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/karma/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/karma/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/karma/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/karma/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/karma/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/karma/node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/karma/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/karma/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/karma/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/karma/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/karma/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/karma/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "dev": true, + "license": "MPL-2.0", + "peer": true, + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/listr2": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.1.tgz", + "integrity": "sha512-SL0JY3DaxylDuo/MecFeiC+7pedM0zia33zl0vcjgwcq1q1FWWF1To9EIauPbl8GbMCU0R2e0uJ8bZunhYKD2g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lit": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.2.tgz", + "integrity": "sha512-NF9zbsP79l4ao2SNrH3NkfmFgN/hBYSQo90saIVI1o5GpjAdCPVstVzO1MrLOakHoEhYkrtRjPK6Ob521aoYWQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit/reactive-element": "^2.1.0", + "lit-element": "^4.2.0", + "lit-html": "^3.3.0" + } + }, + "node_modules/lit-element": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.2.tgz", + "integrity": "sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.5.0", + "@lit/reactive-element": "^2.1.0", + "lit-html": "^3.3.0" + } + }, + "node_modules/lit-html": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.2.tgz", + "integrity": "sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw==", + "license": "BSD-3-Clause", + "dependencies": { + "@types/trusted-types": "^2.0.2" + } + }, + "node_modules/lmdb": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.4.2.tgz", + "integrity": "sha512-nwVGUfTBUwJKXd6lRV8pFNfnrCC1+l49ESJRM19t/tFb/97QfJEixe5DYRvug5JO7DSFKoKaVy7oGMt5rVqZvg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "msgpackr": "^1.11.2", + "node-addon-api": "^6.1.0", + "node-gyp-build-optional-packages": "5.2.2", + "ordered-binary": "^1.5.3", + "weak-lru-cache": "^1.2.2" + }, + "bin": { + "download-lmdb-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "3.4.2", + "@lmdb/lmdb-darwin-x64": "3.4.2", + "@lmdb/lmdb-linux-arm": "3.4.2", + "@lmdb/lmdb-linux-arm64": "3.4.2", + "@lmdb/lmdb-linux-x64": "3.4.2", + "@lmdb/lmdb-win32-arm64": "3.4.2", + "@lmdb/lmdb-win32-x64": "3.4.2" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-fetch-happen": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", + "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "ssri": "^12.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", + "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^3.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/monaco-editor": { + "version": "0.52.2", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", + "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", + "license": "MIT", + "peer": true + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/msgpackr": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.5.tgz", + "integrity": "sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==", + "dev": true, + "license": "MIT", + "optional": true, + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.2.2" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" + } + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ngx-monaco-editor-v2": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/ngx-monaco-editor-v2/-/ngx-monaco-editor-v2-20.3.0.tgz", + "integrity": "sha512-j6zZIOYdSSUnbo58RWox2ZMEzIlA3lN/QchJREb1j734kUeJM1aW9RMz6FpkKt/UW1okdCTGZCnAavtKGou/2Q==", + "license": "MIT", + "dependencies": { + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@angular/common": "^20.3.2", + "@angular/core": "^20.3.2", + "monaco-editor": "^0.52.2" + } + }, + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-gyp": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.5.0.tgz", + "integrity": "sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^14.0.3", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "tar": "^7.4.3", + "tinyglobby": "^0.2.12", + "which": "^5.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/node-gyp/node_modules/tar": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", + "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/node-gyp/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/node-releases": { + "version": "2.0.25", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.25.tgz", + "integrity": "sha512-4auku8B/vw5psvTiiN9j1dAOsXvMoGqJuKJcR+dTdqiXEK20mMTk1UEo3HS16LeGQsVG6+qKTPM9u/qQ2LqATA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^3.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-bundled": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", + "integrity": "sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-install-checks": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.2.tgz", + "integrity": "sha512-z9HJBCYw9Zr8BqXcllKIs5nI+QggAImbBdHphOzVYrz2CB4iQ6FzWyKmlqDZua+51nAu7FcemlbTc9VgQN5XDQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", + "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-package-arg": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.0.tgz", + "integrity": "sha512-+t2etZAGcB7TbbLHfDwooV9ppB2LhhcT6A+L9cahsf9mEUAoQ6CktLEVvEnpD0N5CkX7zJqnPGaFtoQDy9EkHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^9.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-packlist": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.2.tgz", + "integrity": "sha512-DrIWNiWT0FTdDRjGOYfEEZUNe1IzaSZ+up7qBTKnrQDySpdmuOQvytrqQlpK5QrCA4IThMvL4wTumqaa1ZvVIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^8.0.0", + "proc-log": "^5.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz", + "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^7.1.0", + "npm-normalize-package-bin": "^4.0.0", + "npm-package-arg": "^12.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-pick-manifest/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-pick-manifest/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/npm-pick-manifest/node_modules/npm-package-arg": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "18.0.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz", + "integrity": "sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^3.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^14.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minizlib": "^3.0.1", + "npm-package-arg": "^12.0.0", + "proc-log": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/npm-registry-fetch/node_modules/npm-package-arg": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ordered-binary": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.0.tgz", + "integrity": "sha512-IQh2aMfMIDbPjI/8a3Edr+PiOpcsB7yo8NdW7aHWVaoR/pcDldunMvnnwbk/auPGqmKeAdxtZl7MHX/QmPwhvQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/p-map": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/pacote": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.0.0.tgz", + "integrity": "sha512-lcqexq73AMv6QNLo7SOpz0JJoaGdS3rBFgF122NZVl1bApo2mfu+XzUBU/X/XsiJu+iUmKpekRayqQYAs+PhkA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^6.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "@npmcli/run-script": "^9.0.0", + "cacache": "^19.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^12.0.0", + "npm-packlist": "^10.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^3.0.0", + "ssri": "^12.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "bin/index.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/pacote/node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/pacote/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/pacote/node_modules/npm-package-arg": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", + "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-8.0.0.tgz", + "integrity": "sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0", + "parse5": "^8.0.0", + "parse5-sax-parser": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-8.0.0.tgz", + "integrity": "sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/piscina": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.1.3.tgz", + "integrity": "sha512-0u3N7H4+hbr40KjuVn2uNhOcthu/9usKhnw5vT3J7ply79v3D3M8naI00el9Klcy16x557VsEkkUQaHCWFXC/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.x" + }, + "optionalDependencies": { + "@napi-rs/nice": "^1.0.4" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qr-creator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/qr-creator/-/qr-creator-1.0.0.tgz", + "integrity": "sha512-C0cqfbS1P5hfqN4NhsYsUXePlk9BO+a45bAQ3xLYjBL3bOIFzoVEjs79Fado9u9BPBD3buHi3+vY+C8tHh4qMQ==", + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.3.tgz", + "integrity": "sha512-RIDh866U8agLgiIcdpB+COKnlCreHJLfIhWC3LVflku5YHfpnsIKigRZeFfMfCc4dVcqNVfQQ5gO/afOck064A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.52.3", + "@rollup/rollup-android-arm64": "4.52.3", + "@rollup/rollup-darwin-arm64": "4.52.3", + "@rollup/rollup-darwin-x64": "4.52.3", + "@rollup/rollup-freebsd-arm64": "4.52.3", + "@rollup/rollup-freebsd-x64": "4.52.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.3", + "@rollup/rollup-linux-arm-musleabihf": "4.52.3", + "@rollup/rollup-linux-arm64-gnu": "4.52.3", + "@rollup/rollup-linux-arm64-musl": "4.52.3", + "@rollup/rollup-linux-loong64-gnu": "4.52.3", + "@rollup/rollup-linux-ppc64-gnu": "4.52.3", + "@rollup/rollup-linux-riscv64-gnu": "4.52.3", + "@rollup/rollup-linux-riscv64-musl": "4.52.3", + "@rollup/rollup-linux-s390x-gnu": "4.52.3", + "@rollup/rollup-linux-x64-gnu": "4.52.3", + "@rollup/rollup-linux-x64-musl": "4.52.3", + "@rollup/rollup-openharmony-arm64": "4.52.3", + "@rollup/rollup-win32-arm64-msvc": "4.52.3", + "@rollup/rollup-win32-ia32-msvc": "4.52.3", + "@rollup/rollup-win32-x64-gnu": "4.52.3", + "@rollup/rollup-win32-x64-msvc": "4.52.3", + "fsevents": "~2.3.2" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.90.0.tgz", + "integrity": "sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sigstore": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.1.0.tgz", + "integrity": "sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.0", + "@sigstore/sign": "^3.1.0", + "@sigstore/tuf": "^3.1.0", + "@sigstore/verify": "^2.1.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socket.io": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.17.1" + } + }, + "node_modules/socket.io-adapter/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/ssri": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", + "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.14.tgz", + "integrity": "sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "peer": true + }, + "node_modules/tuf-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.1.0.tgz", + "integrity": "sha512-3T3T04WzowbwV2FDiGXBbr81t64g1MUGGJRgT4x5o97N+8ArdhVCAF9IxFrxuSJmM3E5Asn7nKHkao0ibcZXAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "3.0.1", + "debug": "^4.4.1", + "make-fetch-happen": "^14.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.41", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.41.tgz", + "integrity": "sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/undici-types": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", + "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", + "dev": true, + "license": "MIT" + }, + "node_modules/unique-filename": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", + "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/unique-slug": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", + "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz", + "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "7.1.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.11.tgz", + "integrity": "sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", + "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.25 || ^4" + } + }, + "node_modules/zone.js": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz", + "integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==", + "license": "MIT", + "peer": true + } + } +} diff --git a/cmd/lthn-desktop/frontend/package.json b/cmd/lthn-desktop/frontend/package.json new file mode 100644 index 0000000..571dfb9 --- /dev/null +++ b/cmd/lthn-desktop/frontend/package.json @@ -0,0 +1,66 @@ +{ + "name": "frontend", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "dev": "ng serve --configuration development", + "build": "ng build", + "build:dev": "ng build --configuration development", + "watch": "ng build --watch --configuration development", + "test": "ng test", + "wa-link": "cd ~/Code/lib/webawesome && npm link && cd - && npm link @awesome.me/webawesome", + "fa-link": "cd ~/Code/lib/fontawesome/npm && npm link && cd - && npm link @fortawesome/fontawesome-free" + }, + "prettier": { + "printWidth": 100, + "singleQuote": true, + "overrides": [ + { + "files": "*.html", + "options": { + "parser": "angular" + } + } + ] + }, + "private": true, + "dependencies": { + "@angular/common": "^20.3.16", + "@angular/compiler": "^20.3.16", + "@angular/core": "^20.3.16", + "@angular/forms": "^20.3.16", + "@angular/platform-browser": "^20.3.16", + "@angular/router": "^20.3.16", + "@awesome.me/webawesome": "^3.0.0", + "@fortawesome/fontawesome-free": "^7.0.1", + "@ngx-translate/core": "^17.0.0", + "@ngx-translate/http-loader": "^17.0.0", + "@tailwindplus/elements": "^1.0.18", + "@wailsio/runtime": "^3.0.0-alpha.72", + "highcharts": "^12.4.0", + "highcharts-angular": "^5.1.0", + "monaco-editor": "^0.52.2", + "ngx-monaco-editor-v2": "^20.3.0", + "rxjs": "~7.8.0", + "tslib": "^2.3.0", + "zone.js": "^0.15.1" + }, + "devDependencies": { + "@angular/build": "^20.3.14", + "@angular/cli": "^20.3.6", + "@angular/compiler-cli": "^20.3.16", + "@tailwindcss/postcss": "^4.1.14", + "@types/jasmine": "~5.1.0", + "autoprefixer": "^10.4.21", + "jasmine-core": "~5.9.0", + "karma": "~6.4.0", + "karma-chrome-launcher": "~3.2.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.1.0", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.14", + "typescript": "~5.9.2" + } +} diff --git a/cmd/lthn-desktop/frontend/public/assets/i18n/en.json b/cmd/lthn-desktop/frontend/public/assets/i18n/en.json new file mode 100644 index 0000000..0f05175 --- /dev/null +++ b/cmd/lthn-desktop/frontend/public/assets/i18n/en.json @@ -0,0 +1,15 @@ +{ + "menu.dashboard": "Dashboard", + "menu.mining": "Mining", + "menu.blockchain": "Blockchain", + "Developer": "Developer", + "Networking": "Networking", + "Settings": "Settings", + "menu.hub-client": "Client Hub", + "menu.hub-server": "Server Hub", + "menu.hub-developer": "Developer Hub", + "menu.hub-gateway": "Gateway Hub", + "menu.hub-admin": "Admin Hub", + "menu.your-profile": "Your Profile", + "menu.logout": "Logout" +} diff --git a/cmd/lthn-desktop/frontend/public/avatar.png b/cmd/lthn-desktop/frontend/public/avatar.png new file mode 100644 index 0000000..b60581d Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/avatar.png differ diff --git a/cmd/lthn-desktop/frontend/public/favicon.ico b/cmd/lthn-desktop/frontend/public/favicon.ico new file mode 100644 index 0000000..57614f9 Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/favicon.ico differ diff --git a/cmd/lthn-desktop/frontend/public/i18n/en.json b/cmd/lthn-desktop/frontend/public/i18n/en.json new file mode 100644 index 0000000..0ce1d3b --- /dev/null +++ b/cmd/lthn-desktop/frontend/public/i18n/en.json @@ -0,0 +1,331 @@ +{ "app": { + "title": "Bob Wallet" +}, + "sidebar": { + "wallet": "Wallet", + "topLevelDomains": "Top Level Domains", + "miscellaneous": "Miscellaneous", + "portfolio": "Portfolio", + "send": "Send", + "receive": "Receive", + "domainManager": "Domain Manager", + "browseDomains": "Browse Domains", + "yourBids": "Your Bids", + "watching": "Watching", + "exchange": "Exchange", + "claimAirdrop": "Claim Airdrop", + "signMessage": "Sign Message", + "verifyMessage": "Verify Message", + "currentHeight": "Current Height", + "currentHash": "Current Hash" + }, + "topbar": { + "searchPlaceholder": "Search TLD", + "synced": "Synced", + "walletID": "Wallet ID", + "spendableBalance": "Spendable Balance", + "network": "Network", + "settings": "Settings", + "logout": "Logout" + }, + "home": { + "spendable": "Spendable", + "locked": "Locked", + "revealable": "Revealable", + "redeemable": "Redeemable", + "registerable": "Registerable", + "renewable": "Renewable", + "transferring": "Transferring", + "finalizable": "Finalizable", + "inBids": "In bids", + "bid": "bid", + "bids": "bids", + "revealAll": "Reveal All", + "redeemAll": "Redeem All", + "registerAll": "Register All", + "renewAll": "Renew All", + "finalizeAll": "Finalize All", + "bidsReadyToReveal": "{{count}} bids ready to reveal", + "bidsReadyToRedeem": "{{count}} bids ready to redeem", + "namesReadyToRegister": "{{count}} names ready to register", + "domainsExpiringSoon": "{{count}} domains expiring soon", + "domainsInTransfer": "{{count}} domains in transfer", + "transfersReadyToFinalize": "{{count}} transfers ready to finalize", + "transactionHistory": "Transaction History", + "noTransactions": "No transactions yet. Transaction history will appear here once you start using the wallet." + }, + "domainManager": { + "searchPlaceholder": "Search domains...", + "export": "Export", + "bulkTransfer": "Bulk Transfer", + "claimNamePayment": "Claim Name for Payment", + "emptyState": "You do not own any names yet.", + "browseDomainsLink": "Browse domains", + "toGetStarted": "to get started.", + "name": "Name", + "expires": "Expires", + "highestBid": "Highest Bid", + "showingDomains": "Showing {{count}} domains" + }, + "exchange": { + "listings": "Listings", + "fills": "Fills", + "auctions": "Auctions", + "yourListings": "Your Listings", + "yourFills": "Your Fills", + "marketplaceAuctions": "Marketplace Auctions", + "createListing": "Create Listing", + "refresh": "Refresh", + "noActiveListings": "You have no active listings.", + "noFilledOrders": "You have no filled orders.", + "noActiveAuctions": "No active auctions found.", + "listDomainsInfo": "List your domains for sale to other Handshake users via the Shakedex protocol.", + "completedPurchasesInfo": "Completed purchases will appear here.", + "browseAuctionsInfo": "Browse available domain auctions from other users." + }, + "searchTld": { + "searchPlaceholder": "Search for a name...", + "search": "Search", + "searching": "Searching...", + "enterNamePrompt": "Enter a name to search for availability and auction status.", + "available": "Available", + "inAuction": "In Auction", + "status": "Status", + "currentBid": "Current Bid", + "blocksUntilReveal": "Blocks until reveal", + "availableForBidding": "Available for bidding", + "auctionInProgress": "Auction in progress", + "placeBid": "Place Bid", + "watch": "Watch" + }, + "onboarding": { + "welcome": "Welcome to Bob Wallet", + "setupPrompt": "Set up your wallet to start managing Handshake names", + "createNewWallet": "Create New Wallet", + "importSeed": "Import Seed", + "connectLedger": "Connect Ledger", + "important": "Important:", + "seedPhraseWarning": "Write down your seed phrase and store it in a secure location. You will need it to recover your wallet.", + "copySeedPhrase": "Copy Seed Phrase", + "savedSeed": "I've Saved My Seed", + "importSeedPrompt": "Enter your 12 or 24 word seed phrase to restore an existing wallet.", + "seedPhrase": "Seed Phrase", + "seedPhrasePlaceholder": "Enter your seed phrase", + "importWallet": "Import Wallet", + "ledgerPrompt": "Connect your Ledger hardware wallet to manage your Handshake names securely.", + "instructions": "Instructions:", + "ledgerStep1": "Connect your Ledger device via USB", + "ledgerStep2": "Enter your PIN on the device", + "ledgerStep3": "Open the Handshake app on your Ledger", + "ledgerStep4": "Click \"Connect\" below", + "connectLedgerButton": "Connect Ledger" + }, + "settings": { + "general": "General", + "wallet": "Wallet", + "connection": "Connection", + "advanced": "Advanced", + "language": "Language", + "blockExplorer": "Block Explorer", + "theme": "Theme", + "light": "Light", + "dark": "Dark", + "system": "System", + "walletDirectory": "Wallet Directory", + "walletDirectoryInfo": "Location where wallet data is stored", + "changeDirectory": "Change Directory", + "backup": "Backup", + "backupInfo": "Export wallet seed phrase and settings", + "exportBackup": "Export Backup", + "rescanBlockchain": "Rescan Blockchain", + "rescanInfo": "Re-scan the blockchain for transactions", + "rescan": "Rescan", + "connectionType": "Connection Type", + "fullNode": "Full Node", + "spv": "SPV (Light)", + "customRPC": "Custom RPC", + "network": "Network", + "mainnet": "Mainnet", + "testnet": "Testnet", + "regtest": "Regtest", + "simnet": "Simnet", + "apiKey": "API Key", + "apiKeyInfo": "Node API authentication key", + "analytics": "Analytics", + "analyticsInfo": "Share anonymous usage data to improve Bob", + "developerOptions": "Developer Options", + "openDebugConsole": "Open Debug Console" + }, + "common": { + "hns": "HNS", + "usd": "USD", + "loading": "Loading...", + "save": "Save", + "cancel": "Cancel", + "close": "Close", + "confirm": "Confirm", + "continue": "Continue", + "back": "Back", + "next": "Next", + "done": "Done", + "error": "Error", + "success": "Success", + "warning": "Warning", + "info": "Info" + }, + "app.boot.download-check": "Checking for Updates", + "app.boot.folder-check": "Setup Check", + "app.boot.loaded-runtime": "Application Loaded", + "app.boot.server-check": "Checking Server", + "app.boot.start-runtime": "Starting Desktop", + "app.core.ui.search": "Search", + "app.lthn.chain.daemons.lethean-blockchain-export": "Blockchain Export", + "app.lthn.chain.daemons.lethean-blockchain-import": "Blockchain Import", + "app.lthn.chain.daemons.lethean-wallet-cli": "Wallet CLI", + "app.lthn.chain.daemons.lethean-wallet-rpc": "Wallet RPC", + "app.lthn.chain.daemons.lethean-wallet-vpn-rpc": "Exit Node Wallet", + "app.lthn.chain.daemons.letheand": "Blockchain Service", + "app.lthn.chain.desc.no_transactions": "There were no transactions included in this block", + "app.lthn.chain.description": "Lethean (LTHN) Blockchain Stats", + "app.lthn.chain.heading": "Lethean Blockchain Stats", + "app.lthn.chain.menu.blocks": "Blocks", + "app.lthn.chain.menu.configuration": "Configuration", + "app.lthn.chain.menu.raw_data": "Raw Block Data", + "app.lthn.chain.menu.stats": "Stats", + "app.lthn.chain.table.age": "Age", + "app.lthn.chain.table.depth": "Depth", + "app.lthn.chain.table.difficulty": "Difficulty", + "app.lthn.chain.table.height": "Height", + "app.lthn.chain.table.reward": "Reward", + "app.lthn.chain.table.time": "Time", + "app.lthn.chain.table.title.chain-status": "Blockchain Status", + "app.lthn.chain.table.title.recent-blocks": "Recently Created Blocks", + "app.lthn.chain.title": "Blockchain Explorer", + "app.lthn.chain.words.alt_blocks_count": "Alt Blocks", + "app.lthn.chain.words.block_size": "Block Size", + "app.lthn.chain.words.block_size_limit": "Block Size Limit", + "app.lthn.chain.words.chain_stat": "Chain Stats", + "app.lthn.chain.words.chain_stat_value": "Node Reported Value", + "app.lthn.chain.words.cumulative_difficulty": "Cumulative Difficulty", + "app.lthn.chain.words.depth": "Depth from Top Block", + "app.lthn.chain.words.difficulty": "Difficulty", + "app.lthn.chain.words.grey_peerlist_size": "P2P Grey Peers", + "app.lthn.chain.words.hash": "Hash", + "app.lthn.chain.words.height": "Height", + "app.lthn.chain.words.incoming_connections_count": "P2P Incoming", + "app.lthn.chain.words.install-blockchain": "Install Blockchain", + "app.lthn.chain.words.last_block_time": "Synchronised to Block:", + "app.lthn.chain.words.loading-data": "Loading Blockchain Data", + "app.lthn.chain.words.major_version": "Major Version", + "app.lthn.chain.words.miner_transaction": "Miner Transaction", + "app.lthn.chain.words.miner_tx": "POW Miner Transaction", + "app.lthn.chain.words.minor_version": "Minor Version", + "app.lthn.chain.words.nonce": "Block Solution", + "app.lthn.chain.words.orphan_status": "Valid Block", + "app.lthn.chain.words.outgoing_connections_count": "P2P Out", + "app.lthn.chain.words.reward": "Reward", + "app.lthn.chain.words.start_time": "Start Time", + "app.lthn.chain.words.status": "Status", + "app.lthn.chain.words.target": "Target", + "app.lthn.chain.words.target_height": "Target Height", + "app.lthn.chain.words.testnet": "Testnet", + "app.lthn.chain.words.timestamp": "Timestamp", + "app.lthn.chain.words.top_height": "Newest Block", + "app.lthn.chain.words.tx_count": "Total Transactions", + "app.lthn.chain.words.tx_pool_size": "Pending Transactions", + "app.lthn.chain.words.unlock_time": "Unlock Block", + "app.lthn.chain.words.valid": "Valid Block", + "app.lthn.chain.words.version": "Block Structure Version", + "app.lthn.chain.words.white_peerlist_size": "P2P Whitelist", + "app.lthn.console.title": "Console", + "app.lthn.wallet.button.create-wallet": "Create Wallet", + "app.lthn.wallet.button.restore-wallet": "Restore Wallet", + "app.lthn.wallet.button.unlock-wallet": "Unlock", + "app.lthn.wallet.label.address": "Address", + "app.lthn.wallet.label.autosave": "Save Open Wallet", + "app.lthn.wallet.label.filename": "Filename", + "app.lthn.wallet.label.restore-height": "Restore Height", + "app.lthn.wallet.label.spend-key": "Spend Key", + "app.lthn.wallet.label.view-key": "View Key", + "app.lthn.wallet.label.wallet-password": "Wallet Password", + "app.lthn.wallet.label.wallet-password-confirm": "Confirm Password", + "app.lthn.wallet.titles.new-wallet": "Make New Wallet", + "app.lthn.wallet.titles.restore-keys": "Restore From Keys", + "app.lthn.wallet.titles.restore-seed": "Restore From Seed", + "app.lthn.wallet.titles.unlock-wallet": "Unlock Wallet", + "app.lthn.wallet.titles.wallet-transactions": "Wallet Transactions", + "app.market.apps": "App Marketplace", + "app.market.dashboard": "Dashboard", + "app.market.installed": "Installed Apps", + "app.market.no-apps-installed": "You have no apps installed.", + "app.market.view-installable-apps": "View Installable Apps", + "app.title": "Lethean Desktop", + "charts.network-hashrate.subtitle": "Data Provided by", + "charts.network-hashrate.title": "Network Hash Rate", + "lang.de": "German", + "lang.en": "English", + "lang.es": "Spanish", + "lang.fr": "French", + "lang.ru": "Russian", + "lang.uk": "Ukrainian (Ukraine)", + "lang.zh": "Chinese", + "menu.about": "About", + "menu.activity": "Activity", + "menu.api": "api", + "menu.blockchain": "Blockchain", + "menu.build": "Build", + "menu.dashboard": "Dashboard", + "menu.docs": "Documentation", + "menu.documentation": "Documentation", + "menu.explorer": "Explorer", + "menu.help": "Help", + "menu.hub-admin": "Admin Hub", + "menu.hub-client": "Client Hub", + "menu.hub-developer": "Developer", + "menu.hub-gateway": "Gateway", + "menu.hub-server": "Server Hub", + "menu.info": "info", + "menu.logout": "Sign Out", + "menu.mining": "Mining", + "menu.settings": "Settings", + "menu.vpn": "VPN", + "menu.wallet": "Wallet", + "menu.your-profile": "Your Profile", + "view.dashboard.description": "Lethean (LTHN) Web app", + "view.dashboard.heading": "Lethean Dashboard", + "view.dashboard.title": "Lethean (LTHN)", + "view.wallets.description": "Crypto Wallet Manager", + "view.wallets.heading": "Wallet Manager", + "view.wallets.title": "Wallets", + "words.actions.add": "Add", + "words.actions.clone": "Clone", + "words.actions.edit": "Edit", + "words.actions.install": "Install", + "words.actions.new": "New", + "words.actions.remove": "Remove", + "words.actions.report": "Report", + "words.actions.save": "Save", + "words.states.installing": "Installing", + "words.states.installing_desc": "We are downloading the blockchain executables from GitHub to your Lethean user directory.", + "words.states.loading": "Loading", + "words.states.not_installed": "Not Installed", + "words.states.not_installed_desc": "Click Install Blockchain to download the latest Lethean Blockchain CLI", + "words.things.button": "Button", + "words.things.documentation": "Documentation", + "words.things.menu": "Menu", + "words.things.mining-pool": "Mining Pool", + "words.things.page": "Page", + "words.things.problem": "Problem", + "words.things.type": "Type", + "words.time.past.day": "a day ago", + "words.time.past.days": "days ago", + "words.time.past.hour": "an hour ago", + "words.time.past.hours": "hours ago", + "words.time.past.minute": "a minute ago", + "words.time.past.minutes": "minutes ago", + "words.time.past.month": "a month ago", + "words.time.past.months": " months ago", + "words.time.past.seconds": "a few seconds ago", + "words.time.past.year": "a year ago", + "words.time.past.years": "years ago" +} diff --git a/cmd/lthn-desktop/frontend/public/icons/icon-128x128.png b/cmd/lthn-desktop/frontend/public/icons/icon-128x128.png new file mode 100644 index 0000000..5a9a2cc Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/icons/icon-128x128.png differ diff --git a/cmd/lthn-desktop/frontend/public/icons/icon-144x144.png b/cmd/lthn-desktop/frontend/public/icons/icon-144x144.png new file mode 100644 index 0000000..11702cd Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/icons/icon-144x144.png differ diff --git a/cmd/lthn-desktop/frontend/public/icons/icon-152x152.png b/cmd/lthn-desktop/frontend/public/icons/icon-152x152.png new file mode 100644 index 0000000..ff4e06b Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/icons/icon-152x152.png differ diff --git a/cmd/lthn-desktop/frontend/public/icons/icon-192x192.png b/cmd/lthn-desktop/frontend/public/icons/icon-192x192.png new file mode 100644 index 0000000..afd36a4 Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/icons/icon-192x192.png differ diff --git a/cmd/lthn-desktop/frontend/public/icons/icon-384x384.png b/cmd/lthn-desktop/frontend/public/icons/icon-384x384.png new file mode 100644 index 0000000..613ac79 Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/icons/icon-384x384.png differ diff --git a/cmd/lthn-desktop/frontend/public/icons/icon-512x512.png b/cmd/lthn-desktop/frontend/public/icons/icon-512x512.png new file mode 100644 index 0000000..7574990 Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/icons/icon-512x512.png differ diff --git a/cmd/lthn-desktop/frontend/public/icons/icon-72x72.png b/cmd/lthn-desktop/frontend/public/icons/icon-72x72.png new file mode 100644 index 0000000..033724e Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/icons/icon-72x72.png differ diff --git a/cmd/lthn-desktop/frontend/public/icons/icon-96x96.png b/cmd/lthn-desktop/frontend/public/icons/icon-96x96.png new file mode 100644 index 0000000..3090dc2 Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/icons/icon-96x96.png differ diff --git a/cmd/lthn-desktop/frontend/public/logo/lthn/bg-logo-black.png b/cmd/lthn-desktop/frontend/public/logo/lthn/bg-logo-black.png new file mode 100644 index 0000000..cb739a5 Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/logo/lthn/bg-logo-black.png differ diff --git a/cmd/lthn-desktop/frontend/public/logo/lthn/bg-logo-gradient.png b/cmd/lthn-desktop/frontend/public/logo/lthn/bg-logo-gradient.png new file mode 100644 index 0000000..1aefd93 Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/logo/lthn/bg-logo-gradient.png differ diff --git a/cmd/lthn-desktop/frontend/public/logo/lthn/bg-logo-white.png b/cmd/lthn-desktop/frontend/public/logo/lthn/bg-logo-white.png new file mode 100644 index 0000000..7956256 Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/logo/lthn/bg-logo-white.png differ diff --git a/cmd/lthn-desktop/frontend/public/logo/lthn/hoplite-icon-128.png b/cmd/lthn-desktop/frontend/public/logo/lthn/hoplite-icon-128.png new file mode 100644 index 0000000..29922ee Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/logo/lthn/hoplite-icon-128.png differ diff --git a/cmd/lthn-desktop/frontend/public/logo/lthn/hoplite-icon-256.png b/cmd/lthn-desktop/frontend/public/logo/lthn/hoplite-icon-256.png new file mode 100644 index 0000000..0778fc6 Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/logo/lthn/hoplite-icon-256.png differ diff --git a/cmd/lthn-desktop/frontend/public/logo/lthn/hoplite-icon-512.png b/cmd/lthn-desktop/frontend/public/logo/lthn/hoplite-icon-512.png new file mode 100644 index 0000000..044035d Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/logo/lthn/hoplite-icon-512.png differ diff --git a/cmd/lthn-desktop/frontend/public/logo/lthn/hoplite-icon-64.png b/cmd/lthn-desktop/frontend/public/logo/lthn/hoplite-icon-64.png new file mode 100644 index 0000000..72870ff Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/logo/lthn/hoplite-icon-64.png differ diff --git a/cmd/lthn-desktop/frontend/public/logo/lthn/hoplite-icon-black.png b/cmd/lthn-desktop/frontend/public/logo/lthn/hoplite-icon-black.png new file mode 100644 index 0000000..add6511 Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/logo/lthn/hoplite-icon-black.png differ diff --git a/cmd/lthn-desktop/frontend/public/logo/lthn/hoplite-icon-gradient.png b/cmd/lthn-desktop/frontend/public/logo/lthn/hoplite-icon-gradient.png new file mode 100644 index 0000000..12924af Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/logo/lthn/hoplite-icon-gradient.png differ diff --git a/cmd/lthn-desktop/frontend/public/logo/lthn/hoplite-icon-white.png b/cmd/lthn-desktop/frontend/public/logo/lthn/hoplite-icon-white.png new file mode 100644 index 0000000..9a05941 Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/logo/lthn/hoplite-icon-white.png differ diff --git a/cmd/lthn-desktop/frontend/public/logo/lthn/logo-full-black.png b/cmd/lthn-desktop/frontend/public/logo/lthn/logo-full-black.png new file mode 100644 index 0000000..9c82d40 Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/logo/lthn/logo-full-black.png differ diff --git a/cmd/lthn-desktop/frontend/public/logo/lthn/logo-full-gradient.png b/cmd/lthn-desktop/frontend/public/logo/lthn/logo-full-gradient.png new file mode 100644 index 0000000..d3b7ac3 Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/logo/lthn/logo-full-gradient.png differ diff --git a/cmd/lthn-desktop/frontend/public/logo/lthn/logo-full-white.png b/cmd/lthn-desktop/frontend/public/logo/lthn/logo-full-white.png new file mode 100644 index 0000000..c2fc479 Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/logo/lthn/logo-full-white.png differ diff --git a/cmd/lthn-desktop/frontend/public/logo/lthn/logo-icon-black.png b/cmd/lthn-desktop/frontend/public/logo/lthn/logo-icon-black.png new file mode 100644 index 0000000..3a65582 Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/logo/lthn/logo-icon-black.png differ diff --git a/cmd/lthn-desktop/frontend/public/logo/lthn/logo-icon-gradient.png b/cmd/lthn-desktop/frontend/public/logo/lthn/logo-icon-gradient.png new file mode 100644 index 0000000..3a14b0d Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/logo/lthn/logo-icon-gradient.png differ diff --git a/cmd/lthn-desktop/frontend/public/logo/lthn/logo-icon-white.png b/cmd/lthn-desktop/frontend/public/logo/lthn/logo-icon-white.png new file mode 100644 index 0000000..58d343f Binary files /dev/null and b/cmd/lthn-desktop/frontend/public/logo/lthn/logo-icon-white.png differ diff --git a/cmd/lthn-desktop/frontend/public/manifest.webmanifest b/cmd/lthn-desktop/frontend/public/manifest.webmanifest new file mode 100644 index 0000000..eb768a0 --- /dev/null +++ b/cmd/lthn-desktop/frontend/public/manifest.webmanifest @@ -0,0 +1,57 @@ +{ + "name": "Core Framework", + "short_name": "Core", + "display": "standalone", + "scope": "./", + "start_url": "./", + "icons": [ + { + "src": "icons/icon-72x72.png", + "sizes": "72x72", + "type": "image/png", + "purpose": "maskable any" + }, + { + "src": "icons/icon-96x96.png", + "sizes": "96x96", + "type": "image/png", + "purpose": "maskable any" + }, + { + "src": "icons/icon-128x128.png", + "sizes": "128x128", + "type": "image/png", + "purpose": "maskable any" + }, + { + "src": "icons/icon-144x144.png", + "sizes": "144x144", + "type": "image/png", + "purpose": "maskable any" + }, + { + "src": "icons/icon-152x152.png", + "sizes": "152x152", + "type": "image/png", + "purpose": "maskable any" + }, + { + "src": "icons/icon-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable any" + }, + { + "src": "icons/icon-384x384.png", + "sizes": "384x384", + "type": "image/png", + "purpose": "maskable any" + }, + { + "src": "icons/icon-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable any" + } + ] +} diff --git a/cmd/lthn-desktop/frontend/public/robots.txt b/cmd/lthn-desktop/frontend/public/robots.txt new file mode 100644 index 0000000..bfa8dd7 --- /dev/null +++ b/cmd/lthn-desktop/frontend/public/robots.txt @@ -0,0 +1,3 @@ +User-agent: * +Disallow: +Sitemap: /sitemap.xml diff --git a/cmd/lthn-desktop/frontend/public/sitemap.xml b/cmd/lthn-desktop/frontend/public/sitemap.xml new file mode 100644 index 0000000..6379a77 --- /dev/null +++ b/cmd/lthn-desktop/frontend/public/sitemap.xml @@ -0,0 +1,76 @@ + + + + + + + https://angular.ganatan.com/ + 2023-12-08T12:51:22+00:00 + 1.00 + + + https://angular.ganatan.com/about + 2023-12-08T12:51:22+00:00 + 0.80 + + + https://angular.ganatan.com/contact + 2023-12-08T12:51:22+00:00 + 0.80 + + + https://angular.ganatan.com/bootstrap + 2023-12-08T12:51:22+00:00 + 0.80 + + + https://angular.ganatan.com/services + 2023-12-08T12:51:22+00:00 + 0.80 + + + https://angular.ganatan.com/components + 2023-12-08T12:51:22+00:00 + 0.80 + + + https://angular.ganatan.com/httpclient + 2023-12-08T12:51:22+00:00 + 0.80 + + + https://angular.ganatan.com/forms + 2023-12-08T12:51:22+00:00 + 0.80 + + + https://angular.ganatan.com/about/experience + 2023-12-08T12:51:22+00:00 + 0.64 + + + https://angular.ganatan.com/about/skill + 2023-12-08T12:51:22+00:00 + 0.64 + + + https://angular.ganatan.com/contact/mailing + 2023-12-08T12:51:22+00:00 + 0.64 + + + https://angular.ganatan.com/contact/mapping + 2023-12-08T12:51:22+00:00 + 0.64 + + + https://angular.ganatan.com/contact/website + 2023-12-08T12:51:22+00:00 + 0.64 + + + diff --git a/cmd/lthn-desktop/frontend/src/app/app.component.ts b/cmd/lthn-desktop/frontend/src/app/app.component.ts new file mode 100644 index 0000000..eb2c7d9 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/app.component.ts @@ -0,0 +1,14 @@ +import {Component, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import { RouterOutlet } from '@angular/router'; +import { setBasePath } from '@awesome.me/webawesome'; +setBasePath('@awesome.me/webawesome/dist'); +@Component({ + selector: 'app-root', + standalone: true, + imports: [RouterOutlet], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + template: '', +}) +export class AppComponent { + +} diff --git a/cmd/lthn-desktop/frontend/src/app/app.config.server.ts b/cmd/lthn-desktop/frontend/src/app/app.config.server.ts new file mode 100644 index 0000000..ffca419 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/app.config.server.ts @@ -0,0 +1,15 @@ +import { mergeApplicationConfig, ApplicationConfig } from '@angular/core'; +import { provideServerRendering, withRoutes } from '@angular/ssr'; +import { appConfig } from './app.config'; +import { serverRoutes } from './app.routes.server'; +import { TranslateLoader } from '@ngx-translate/core'; +import { TranslateServerLoader } from './translate-server.loader'; + +const serverConfig: ApplicationConfig = { + providers: [ + provideServerRendering(withRoutes(serverRoutes)), + { provide: TranslateLoader, useClass: TranslateServerLoader } + ] +}; + +export const config = mergeApplicationConfig(appConfig, serverConfig); diff --git a/cmd/lthn-desktop/frontend/src/app/app.config.ts b/cmd/lthn-desktop/frontend/src/app/app.config.ts new file mode 100644 index 0000000..9b3536a --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/app.config.ts @@ -0,0 +1,67 @@ +import {APP_INITIALIZER, ApplicationConfig, importProvidersFrom, isDevMode} from '@angular/core'; +import {provideRouter, withHashLocation} from '@angular/router'; +import {MonacoEditorModule} from 'ngx-monaco-editor-v2'; + +import {routes} from './app.routes'; +import {I18nService} from './services/i18n.service'; +import {TranslateModule} from '@ngx-translate/core'; +import {provideHttpClient} from '@angular/common/http'; +import {provideTranslateHttpLoader} from '@ngx-translate/http-loader'; +import {StyleManagerService} from './services/style-manager.service'; +import { provideHighcharts } from 'highcharts-angular'; + +const translationProviders = [ + provideHttpClient(), + importProvidersFrom( + TranslateModule.forRoot({ + fallbackLang: 'en', + }) + ), + provideHighcharts({ + options: { + credits: {enabled: false}, + title: { + style: { + color: 'tomato', + }, + }, + legend: { + enabled: false, + }, + }, + modules: () => { + return [ + import('highcharts/esm/modules/accessibility'), + import('highcharts/esm/modules/exporting'), + import('highcharts/esm/themes/sunset'), + ]; + }, + }), + ...(isDevMode() + ? [ + provideTranslateHttpLoader({ + prefix: './assets/i18n/', + suffix: '.json', + }), + ] + : []), +]; + +export function initializeApp(styleManager: StyleManagerService) { + return () => styleManager.init(); +} + +export const appConfig: ApplicationConfig = { + providers: [ + provideRouter(routes, withHashLocation()), + importProvidersFrom(MonacoEditorModule.forRoot()), + I18nService, + ...translationProviders, + { + provide: APP_INITIALIZER, + useFactory: initializeApp, + deps: [StyleManagerService], + multi: true + } + ], +}; diff --git a/cmd/lthn-desktop/frontend/src/app/app.css b/cmd/lthn-desktop/frontend/src/app/app.css new file mode 100644 index 0000000..e69de29 diff --git a/cmd/lthn-desktop/frontend/src/app/app.html b/cmd/lthn-desktop/frontend/src/app/app.html new file mode 100644 index 0000000..f42f6e8 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/app.html @@ -0,0 +1,140 @@ + + + +
+ + + + + + + +
+ +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cmd/lthn-desktop/frontend/src/app/app.routes.server.ts b/cmd/lthn-desktop/frontend/src/app/app.routes.server.ts new file mode 100644 index 0000000..ffd37b1 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/app.routes.server.ts @@ -0,0 +1,8 @@ +import { RenderMode, ServerRoute } from '@angular/ssr'; + +export const serverRoutes: ServerRoute[] = [ + { + path: '**', + renderMode: RenderMode.Prerender + } +]; diff --git a/cmd/lthn-desktop/frontend/src/app/app.routes.ts b/cmd/lthn-desktop/frontend/src/app/app.routes.ts new file mode 100644 index 0000000..119226f --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/app.routes.ts @@ -0,0 +1,39 @@ +import { Routes } from '@angular/router'; +import { ApplicationFrame } from '../frame/application.frame'; +import { BlockchainComponent } from './blockchain/blockchain.component'; +import { SystemTrayFrame } from '../frame/system-tray.frame'; +import { DeveloperEditorComponent } from './developer/editor.component'; +import { SetupComponent } from './system/setup.component'; +import { FullComponent } from './system/setup/full.component'; +import { BlockchainSetupComponent } from './system/setup/blockchain.component'; +import { GatewayClientSetupComponent } from './system/setup/gateway-client.component'; +import { SeedNodeSetupComponent } from './system/setup/seed-node.component'; +import { MiningComponent } from './mining/mining.component'; +import { ClaudePanelComponent } from './developer/claude-panel.component'; + +export const routes: Routes = [ + { path: 'system-tray', component: SystemTrayFrame }, + { path: 'editor/monaco', component: DeveloperEditorComponent }, + { + path: 'setup', + component: SetupComponent, + children: [ + { path: 'full', component: FullComponent }, + { path: 'blockchain', component: BlockchainSetupComponent }, + { path: 'gateway-client', component: GatewayClientSetupComponent }, + { path: 'seed-node', component: SeedNodeSetupComponent } + ] + }, + { + path: '', + component: ApplicationFrame, + children: [ + { path: 'blockchain', component: BlockchainComponent }, + { path: 'dev/edit', component: DeveloperEditorComponent }, + { path: 'dev/claude', component: ClaudePanelComponent }, + { path: 'mining', component: MiningComponent }, + // Redirect empty path to a default view within the frame + { path: '', redirectTo: 'blockchain', pathMatch: 'full' } + ] + } +]; diff --git a/cmd/lthn-desktop/frontend/src/app/app.spec.ts b/cmd/lthn-desktop/frontend/src/app/app.spec.ts new file mode 100644 index 0000000..aa2a763 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/app.spec.ts @@ -0,0 +1,24 @@ +import { TestBed } from '@angular/core/testing'; +import { App } from './app'; +import { ActivatedRoute } from '@angular/router'; + +describe('App', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [App], + providers: [ + { + provide: ActivatedRoute, + useValue: {} + } + ] + }).compileComponents(); + }); + + it('should create the app', () => { + const fixture = TestBed.createComponent(App); + const app = fixture.componentInstance; + expect(app).toBeTruthy(); + }); + +}); diff --git a/cmd/lthn-desktop/frontend/src/app/app.ts b/cmd/lthn-desktop/frontend/src/app/app.ts new file mode 100644 index 0000000..d479b79 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/app.ts @@ -0,0 +1,40 @@ +import { Component, OnInit, Inject, PLATFORM_ID, CUSTOM_ELEMENTS_SCHEMA, ViewChild, ElementRef } from '@angular/core'; +import { CommonModule, DOCUMENT, isPlatformBrowser } from '@angular/common'; +import {RouterLink, RouterOutlet} from '@angular/router'; +import { FooterComponent } from './shared/components/footer/footer.component'; +import { TranslateModule, TranslateService } from '@ngx-translate/core'; +import {Subscription} from 'rxjs'; + +@Component({ + selector: 'app-root', + imports: [ + CommonModule, + RouterOutlet, + FooterComponent, + TranslateModule, + RouterLink + ], + templateUrl: './app.html', + styleUrl: './app.css', + standalone: true, + schemas: [CUSTOM_ELEMENTS_SCHEMA], +}) +export class App { + @ViewChild('sidebar', { read: ElementRef, static: false }) sidebar?: ElementRef; + + sidebarOpen = false; + userMenuOpen = false; + currentRole = 'Developer'; + + time: string = ''; + + constructor( + @Inject(DOCUMENT) private document: Document, + @Inject(PLATFORM_ID) private platformId: object, + private translateService: TranslateService + ) { + // Set default language + this.translateService.use('en'); + } + +} diff --git a/cmd/lthn-desktop/frontend/src/app/blockchain/blockchain.component.ts b/cmd/lthn-desktop/frontend/src/app/blockchain/blockchain.component.ts new file mode 100644 index 0000000..9ac98d0 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/blockchain/blockchain.component.ts @@ -0,0 +1,33 @@ +import { Component } from '@angular/core'; +// import {FetchBlockData} from '@lthn/blockchain/service'; +import { HighchartsChartComponent, ChartConstructorType } from 'highcharts-angular'; + +@Component({ + selector: 'app-blockchain', + standalone: true, + imports: [HighchartsChartComponent], + template: ``, + styles: [`.chart { width: 100%; height: 400px; display: block; }`] +}) +export class BlockchainComponent { + chartOptions: Highcharts.Options = { + series: [ + { + data: [1, 2, 3], + type: 'line', + }, + ], + } + chartConstructor: ChartConstructorType = 'chart'; // Optional, defaults to 'chart' + updateFlag: boolean = false; // Optional + oneToOneFlag: boolean = true; + // async fetchData() { + // await FetchBlockData("0"); + // } +} diff --git a/cmd/lthn-desktop/frontend/src/app/custom-elements.module.ts b/cmd/lthn-desktop/frontend/src/app/custom-elements.module.ts new file mode 100644 index 0000000..e6bf0ca --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/custom-elements.module.ts @@ -0,0 +1,8 @@ +import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; +import { } from "@awesome.me/webawesome/dist/webawesome.loader.js" +// This module enables Angular to accept unknown custom elements (Web Awesome components) +// without throwing template parse errors. +@NgModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], +}) +export class CustomElementsModule {} diff --git a/cmd/lthn-desktop/frontend/src/app/developer/claude-panel.component.ts b/cmd/lthn-desktop/frontend/src/app/developer/claude-panel.component.ts new file mode 100644 index 0000000..d1e9c89 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/developer/claude-panel.component.ts @@ -0,0 +1,478 @@ +import { Component, OnInit, OnDestroy, ElementRef, ViewChild } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +interface Message { + role: 'user' | 'assistant' | 'system'; + content: string; + timestamp: Date; +} + +interface WsMessage { + type: string; + channel?: string; + processId?: string; + data?: any; + timestamp: string; +} + +@Component({ + selector: 'claude-panel', + standalone: true, + imports: [CommonModule, FormsModule], + template: ` +
+
+ + + CLAUDE + + + {{ connected ? 'Connected' : 'Disconnected' }} + + +
+ +
+ @if (messages.length === 0) { +
+ +

No messages yet

+

Start a conversation with Claude

+
+ } + @for (msg of messages; track msg.timestamp) { +
+
+ + @if (msg.role === 'user') { + + } @else if (msg.role === 'assistant') { + + } @else { + + } + + {{ msg.role === 'assistant' ? 'Claude' : msg.role }} + {{ formatTime(msg.timestamp) }} +
+
{{ msg.content }}
+
+ } + @if (isStreaming) { +
+
+ + Claude + + + +
+
{{ streamingContent || '...' }}
+
+ } +
+ +
+ + +
+
+ `, + styles: [` + .claude-panel { + display: flex; + flex-direction: column; + height: 100%; + background: #1e1e1e; + color: #ccc; + } + .panel-header { + display: flex; + align-items: center; + padding: 8px 12px; + background: #333; + border-bottom: 1px solid #444; + gap: 8px; + } + .panel-title { + flex: 1; + font-size: 11px; + font-weight: 600; + color: #999; + letter-spacing: 0.5px; + display: flex; + align-items: center; + gap: 6px; + } + .panel-title i { + color: #6b9eff; + } + .connection-status { + font-size: 10px; + padding: 2px 8px; + border-radius: 10px; + background: #5a3030; + color: #ff8080; + } + .connection-status.connected { + background: #305a30; + color: #80ff80; + } + .panel-btn { + background: none; + border: none; + color: #888; + cursor: pointer; + padding: 4px 6px; + border-radius: 3px; + } + .panel-btn:hover { + background: #444; + color: #fff; + } + .messages-container { + flex: 1; + overflow-y: auto; + padding: 12px; + display: flex; + flex-direction: column; + gap: 12px; + } + .empty-state { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100%; + color: #666; + text-align: center; + } + .empty-state i { + font-size: 48px; + margin-bottom: 16px; + color: #444; + } + .empty-state .hint { + font-size: 12px; + color: #555; + } + .message { + padding: 12px; + border-radius: 8px; + background: #2d2d2d; + } + .message.user { + background: #1a3a5c; + margin-left: 24px; + } + .message.assistant { + background: #2d2d2d; + margin-right: 24px; + } + .message.system { + background: #3d3020; + font-size: 12px; + text-align: center; + } + .message-header { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 8px; + font-size: 11px; + color: #888; + } + .role-icon { + width: 20px; + height: 20px; + display: flex; + align-items: center; + justify-content: center; + background: #444; + border-radius: 50%; + font-size: 10px; + } + .message.user .role-icon { + background: #2a5a8c; + } + .message.assistant .role-icon { + background: #4a3a6c; + color: #a0a0ff; + } + .role-label { + font-weight: 500; + text-transform: capitalize; + } + .timestamp { + margin-left: auto; + font-size: 10px; + } + .message-content { + font-size: 13px; + line-height: 1.5; + white-space: pre-wrap; + word-break: break-word; + } + .streaming .message-content { + border-right: 2px solid #6b9eff; + animation: blink 0.8s infinite; + } + @keyframes blink { + 0%, 50% { border-color: #6b9eff; } + 51%, 100% { border-color: transparent; } + } + .typing-indicator { + display: flex; + gap: 3px; + margin-left: 8px; + } + .typing-indicator span { + width: 4px; + height: 4px; + background: #6b9eff; + border-radius: 50%; + animation: bounce 1.2s infinite; + } + .typing-indicator span:nth-child(2) { animation-delay: 0.2s; } + .typing-indicator span:nth-child(3) { animation-delay: 0.4s; } + @keyframes bounce { + 0%, 60%, 100% { transform: translateY(0); } + 30% { transform: translateY(-4px); } + } + .input-area { + display: flex; + padding: 12px; + background: #252526; + border-top: 1px solid #444; + gap: 8px; + } + .input-area textarea { + flex: 1; + background: #1e1e1e; + border: 1px solid #444; + border-radius: 6px; + padding: 10px 12px; + color: #ccc; + font-family: inherit; + font-size: 13px; + resize: none; + min-height: 40px; + max-height: 120px; + } + .input-area textarea:focus { + outline: none; + border-color: #6b9eff; + } + .input-area textarea::placeholder { + color: #666; + } + .send-btn { + background: #0e639c; + border: none; + border-radius: 6px; + padding: 10px 16px; + color: #fff; + cursor: pointer; + font-size: 14px; + } + .send-btn:hover:not(:disabled) { + background: #1177bb; + } + .send-btn:disabled { + opacity: 0.5; + cursor: not-allowed; + } + `] +}) +export class ClaudePanelComponent implements OnInit, OnDestroy { + @ViewChild('messagesContainer') messagesContainer!: ElementRef; + @ViewChild('inputField') inputField!: ElementRef; + + messages: Message[] = []; + inputText: string = ''; + isStreaming: boolean = false; + streamingContent: string = ''; + connected: boolean = false; + + private ws: WebSocket | null = null; + private wsUrl: string = 'ws://localhost:9877/ws'; + + ngOnInit(): void { + this.connect(); + } + + ngOnDestroy(): void { + this.disconnect(); + } + + connect(): void { + if (this.ws) { + this.disconnect(); + } + + try { + this.ws = new WebSocket(this.wsUrl); + + this.ws.onopen = () => { + this.connected = true; + this.addSystemMessage('Connected to Core'); + // Subscribe to claude channel for responses + this.sendWsMessage({ type: 'subscribe', data: 'claude' }); + }; + + this.ws.onmessage = (event) => { + this.handleWsMessage(event.data); + }; + + this.ws.onclose = () => { + this.connected = false; + this.addSystemMessage('Disconnected from Core'); + }; + + this.ws.onerror = (error) => { + console.error('WebSocket error:', error); + this.connected = false; + }; + } catch (error) { + console.error('Failed to connect:', error); + } + } + + disconnect(): void { + if (this.ws) { + this.ws.close(); + this.ws = null; + } + this.connected = false; + } + + handleWsMessage(data: string): void { + try { + const msg: WsMessage = JSON.parse(data); + + switch (msg.type) { + case 'claude_response': + this.isStreaming = false; + this.messages.push({ + role: 'assistant', + content: msg.data, + timestamp: new Date() + }); + this.scrollToBottom(); + break; + + case 'claude_stream': + this.isStreaming = true; + this.streamingContent = (this.streamingContent || '') + msg.data; + this.scrollToBottom(); + break; + + case 'claude_stream_end': + this.isStreaming = false; + if (this.streamingContent) { + this.messages.push({ + role: 'assistant', + content: this.streamingContent, + timestamp: new Date() + }); + this.streamingContent = ''; + } + this.scrollToBottom(); + break; + + case 'error': + this.addSystemMessage(`Error: ${msg.data}`); + this.isStreaming = false; + break; + } + } catch (error) { + console.error('Failed to parse message:', error); + } + } + + sendWsMessage(msg: any): void { + if (this.ws && this.ws.readyState === WebSocket.OPEN) { + this.ws.send(JSON.stringify(msg)); + } + } + + sendMessage(): void { + const text = this.inputText.trim(); + if (!text) return; + + this.messages.push({ + role: 'user', + content: text, + timestamp: new Date() + }); + + // Send to backend via WebSocket + this.sendWsMessage({ + type: 'claude_message', + data: text + }); + + this.inputText = ''; + this.isStreaming = true; + this.streamingContent = ''; + this.scrollToBottom(); + + // Focus back on input + setTimeout(() => { + if (this.inputField) { + this.inputField.nativeElement.focus(); + } + }, 0); + } + + onEnterKey(event: Event): void { + const keyEvent = event as KeyboardEvent; + if (!keyEvent.shiftKey) { + event.preventDefault(); + this.sendMessage(); + } + } + + clearMessages(): void { + this.messages = []; + this.streamingContent = ''; + this.isStreaming = false; + } + + addSystemMessage(content: string): void { + this.messages.push({ + role: 'system', + content, + timestamp: new Date() + }); + this.scrollToBottom(); + } + + formatTime(date: Date): string { + return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }); + } + + scrollToBottom(): void { + setTimeout(() => { + if (this.messagesContainer) { + const el = this.messagesContainer.nativeElement; + el.scrollTop = el.scrollHeight; + } + }, 0); + } +} diff --git a/cmd/lthn-desktop/frontend/src/app/developer/editor.component.ts b/cmd/lthn-desktop/frontend/src/app/developer/editor.component.ts new file mode 100644 index 0000000..485a4db --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/developer/editor.component.ts @@ -0,0 +1,412 @@ +import { Component, OnInit, OnDestroy } from '@angular/core'; +import { MonacoEditorModule } from 'ngx-monaco-editor-v2'; +import { FormsModule } from '@angular/forms'; +import { CommonModule } from '@angular/common'; +import { ActivatedRoute } from '@angular/router'; +import { Events } from '@wailsio/runtime'; +import * as IDE from '@lthn/ide/service'; +import { DirectoryEntry } from '@lthn/ide/models'; +import { SelectDirectory } from '@lthn/core/display/service'; + +interface TreeNode extends DirectoryEntry { + expanded?: boolean; + children?: TreeNode[]; + level?: number; +} + +@Component({ + selector: 'dev-edit', + standalone: true, + imports: [MonacoEditorModule, FormsModule, CommonModule], + template: ` +
+ +
+
+ PROJECT + + +
+ @if (workspaceRoot) { +
{{ workspaceName }}
+
+ @for (node of fileTree; track node.path) { + + } +
+ } @else { +
+

No folder open

+ +
+ } +
+ + +
+ + +
+ @if (filePath) { +
+ {{ filePath }} + @if (isModified) { + + } +
+ } + + +
+
+ + + +
+ @if (node.isDir) { + + + } @else { + + } + {{ node.name }} +
+ @if (node.isDir && node.expanded && node.children) { + @for (child of node.children; track child.path) { + + } + } +
+ `, + styles: [` + .ide-container { + display: flex; + height: 100vh; + background: #1e1e1e; + } + .project-panel { + background: #252526; + display: flex; + flex-direction: column; + min-width: 150px; + max-width: 500px; + } + .panel-header { + display: flex; + align-items: center; + padding: 8px 12px; + background: #333; + border-bottom: 1px solid #444; + } + .panel-title { + flex: 1; + font-size: 11px; + font-weight: 600; + color: #999; + letter-spacing: 0.5px; + } + .panel-btn { + background: none; + border: none; + color: #888; + cursor: pointer; + padding: 4px 6px; + margin-left: 4px; + border-radius: 3px; + } + .panel-btn:hover { + background: #444; + color: #fff; + } + .workspace-name { + padding: 8px 12px; + font-size: 13px; + font-weight: 500; + color: #ccc; + border-bottom: 1px solid #333; + background: #2d2d2d; + } + .file-tree { + flex: 1; + overflow-y: auto; + padding: 4px 0; + } + .tree-item { + display: flex; + align-items: center; + padding: 4px 8px; + cursor: pointer; + color: #ccc; + font-size: 13px; + gap: 6px; + } + .tree-item:hover { + background: #2a2d2e; + } + .tree-item.selected { + background: #094771; + } + .tree-item i { + font-size: 12px; + width: 14px; + text-align: center; + } + .tree-item .fa-chevron-right, .tree-item .fa-chevron-down { + font-size: 10px; + color: #888; + } + .tree-item .fa-folder { color: #dcb67a; } + .tree-item .fa-folder-open { color: #dcb67a; } + .node-name { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .no-workspace { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 200px; + color: #888; + } + .open-folder-btn { + margin-top: 12px; + padding: 8px 16px; + background: #0e639c; + border: none; + color: #fff; + border-radius: 4px; + cursor: pointer; + font-size: 13px; + } + .open-folder-btn:hover { + background: #1177bb; + } + .resizer { + width: 4px; + cursor: col-resize; + background: #333; + } + .resizer:hover { + background: #007acc; + } + .editor-area { + flex: 1; + display: flex; + flex-direction: column; + min-width: 200px; + } + .editor-toolbar { + height: 30px; + background: #1e1e1e; + color: #ccc; + display: flex; + align-items: center; + padding: 0 10px; + font-size: 12px; + border-bottom: 1px solid #333; + } + .file-path { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .modified-indicator { + color: #e0a000; + margin-left: 8px; + font-size: 16px; + } + /* File type icons */ + .file-icon { color: #888; } + .file-icon.fa-file-code { color: #519aba; } + .file-icon.fa-file-lines { color: #888; } + `] +}) +export class DeveloperEditorComponent implements OnInit, OnDestroy { + editorOptions = { theme: 'vs-dark', language: 'typescript' }; + code: string = ''; + filePath: string = ''; + isModified: boolean = false; + originalCode: string = ''; + + workspaceRoot: string = ''; + workspaceName: string = ''; + fileTree: TreeNode[] = []; + panelWidth: number = 250; + + private unsubscribeSave: (() => void) | null = null; + private isResizing = false; + + constructor(private route: ActivatedRoute) {} + + async ngOnInit(): Promise { + this.unsubscribeSave = Events.On('ide:save', () => { + this.saveFile(); + }); + + this.route.queryParams.subscribe(async params => { + if (params['file']) { + await this.loadFile(params['file']); + } else if (params['new']) { + await this.newFile(); + } else if (params['workspace']) { + await this.setWorkspace(params['workspace']); + } else { + this.code = '// Welcome to Core IDE\n// Open a folder to browse your project files\n// Or use File → Open to open a file'; + } + }); + + // Set up resize handlers + document.addEventListener('mousemove', this.onResize.bind(this)); + document.addEventListener('mouseup', this.stopResize.bind(this)); + } + + ngOnDestroy(): void { + if (this.unsubscribeSave) { + this.unsubscribeSave(); + } + document.removeEventListener('mousemove', this.onResize.bind(this)); + document.removeEventListener('mouseup', this.stopResize.bind(this)); + } + + async openWorkspace(): Promise { + try { + const path = await SelectDirectory(); + if (path) { + await this.setWorkspace(path); + } + } catch (error) { + console.error('Error selecting directory:', error); + } + } + + async setWorkspace(path: string): Promise { + this.workspaceRoot = path; + this.workspaceName = path.split('/').pop() || path; + await this.refreshTree(); + } + + async refreshTree(): Promise { + if (!this.workspaceRoot) return; + try { + const entries = await IDE.ListDirectory(this.workspaceRoot); + this.fileTree = this.sortEntries(entries.map(e => ({ ...e, level: 0 }))); + } catch (error) { + console.error('Error loading directory:', error); + } + } + + async onNodeClick(node: TreeNode): Promise { + if (node.isDir) { + node.expanded = !node.expanded; + if (node.expanded && !node.children) { + try { + const entries = await IDE.ListDirectory(node.path); + node.children = this.sortEntries(entries.map(e => ({ + ...e, + level: (node.level || 0) + 1 + }))); + } catch (error) { + console.error('Error loading directory:', error); + } + } + } else { + await this.loadFile(node.path); + } + } + + sortEntries(entries: TreeNode[]): TreeNode[] { + return entries + .filter(e => !e.name.startsWith('.')) // Hide hidden files + .sort((a, b) => { + if (a.isDir && !b.isDir) return -1; + if (!a.isDir && b.isDir) return 1; + return a.name.localeCompare(b.name); + }); + } + + getFileIcon(filename: string): string { + const ext = filename.split('.').pop()?.toLowerCase(); + const codeExts = ['ts', 'tsx', 'js', 'jsx', 'go', 'py', 'rs', 'java', 'c', 'cpp', 'h', 'cs', 'rb', 'php']; + if (codeExts.includes(ext || '')) return 'fa-file-code'; + if (['md', 'txt', 'json', 'yaml', 'yml', 'toml', 'xml'].includes(ext || '')) return 'fa-file-lines'; + return 'fa-file'; + } + + startResize(event: MouseEvent): void { + this.isResizing = true; + event.preventDefault(); + } + + onResize(event: MouseEvent): void { + if (!this.isResizing) return; + this.panelWidth = Math.max(150, Math.min(500, event.clientX)); + } + + stopResize(): void { + this.isResizing = false; + } + + async newFile(): Promise { + try { + const fileInfo = await IDE.NewFile('typescript'); + this.code = fileInfo.content; + this.originalCode = fileInfo.content; + this.filePath = ''; + this.editorOptions = { ...this.editorOptions, language: fileInfo.language }; + this.isModified = false; + } catch (error) { + console.error('Error creating new file:', error); + } + } + + async loadFile(path: string): Promise { + try { + const fileInfo = await IDE.OpenFile(path); + this.code = fileInfo.content; + this.originalCode = fileInfo.content; + this.filePath = fileInfo.path; + this.editorOptions = { ...this.editorOptions, language: fileInfo.language }; + this.isModified = false; + } catch (error) { + console.error('Error loading file:', error); + this.code = `// Error loading file: ${path}\n// ${error}`; + } + } + + async saveFile(): Promise { + if (!this.filePath) { + console.log('No file path - need to implement save as dialog'); + return; + } + try { + await IDE.SaveFile(this.filePath, this.code); + this.originalCode = this.code; + this.isModified = false; + console.log('File saved:', this.filePath); + } catch (error) { + console.error('Error saving file:', error); + } + } + + onCodeChange(): void { + this.isModified = this.code !== this.originalCode; + } +} diff --git a/cmd/lthn-desktop/frontend/src/app/mining/mining.component.ts b/cmd/lthn-desktop/frontend/src/app/mining/mining.component.ts new file mode 100644 index 0000000..b303569 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/mining/mining.component.ts @@ -0,0 +1,113 @@ +import {Component, CUSTOM_ELEMENTS_SCHEMA, OnInit} from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@Component({ + selector: 'app-mining', + standalone: true, + imports: [CommonModule], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + template: ` + +
+ +
+
+
+ +
+

+ Current Mining Stats +

+
+
+

Hashrate

+

12.5 KH/s

+
+
+

Temperature

+

65°C

+
+
+

Uptime

+

2h 15m

+
+
+

Blocks Found

+

3

+
+
+
+ + +
+

+ Mining Config Quick Run +

+
+
+ + +
+ +
+ +
+ + +
+

+ Installed Software Version +

+
+

XMRig

+

v6.18.0

+ + Check for update + +
+
+
+
+ + `, + styles: [] +}) +export class MiningComponent { + + constructor() { } + + +} diff --git a/cmd/lthn-desktop/frontend/src/app/services/clipboard.service.ts b/cmd/lthn-desktop/frontend/src/app/services/clipboard.service.ts new file mode 100644 index 0000000..9bfb531 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/services/clipboard.service.ts @@ -0,0 +1,31 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ providedIn: 'root' }) +export class ClipboardService { + async copyText(text: string): Promise { + try { + if (navigator.clipboard && navigator.clipboard.writeText) { + await navigator.clipboard.writeText(text); + return true; + } + } catch (e) { + // fall back + } + + // Fallback using a hidden textarea + const ta = document.createElement('textarea'); + ta.value = text; + ta.style.position = 'fixed'; + ta.style.left = '-9999px'; + document.body.appendChild(ta); + ta.select(); + try { + document.execCommand('copy'); + return true; + } catch (e) { + return false; + } finally { + document.body.removeChild(ta); + } + } +} diff --git a/cmd/lthn-desktop/frontend/src/app/services/file-dialog.service.ts b/cmd/lthn-desktop/frontend/src/app/services/file-dialog.service.ts new file mode 100644 index 0000000..856a454 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/services/file-dialog.service.ts @@ -0,0 +1,85 @@ +import { Injectable } from '@angular/core'; + +// WAILS3 INTEGRATION: +// This service currently uses web-standard File System Access API. +// For Wails3, replace with Go service methods calling: +// - application.OpenFileDialog().PromptForSingleSelection() +// - application.SaveFileDialog().SetFilename().PromptForSelection() +// See WAILS3_INTEGRATION.md for complete examples. + +export interface OpenFileOptions { + multiple?: boolean; + accept?: string[]; // e.g., ["application/json", "text/plain"] +} + +export interface SaveFileOptions { + suggestedName?: string; + types?: { description?: string; accept?: Record }[]; + blob: Blob; +} + +@Injectable({ providedIn: 'root' }) +export class FileDialogService { + // Directory picker using File System Access API when available + async pickDirectory(): Promise { + const nav: any = window.navigator; + if ((window as any).showDirectoryPicker) { + try { + // @ts-ignore + const handle: any = await (window as any).showDirectoryPicker({ mode: 'readwrite' }); + return handle; + } catch (e) { + return null; + } + } + // Fallback: not supported in all browsers; inform the user + alert('Directory picker is not supported in this browser.'); + return null; + } + + // Open file(s) with fallback if FS Access API not used + async openFile(opts: OpenFileOptions = {}): Promise { + // Always supported fallback + return new Promise((resolve) => { + const input = document.createElement('input'); + input.type = 'file'; + input.multiple = !!opts.multiple; + if (opts.accept && opts.accept.length) { + input.accept = opts.accept.join(','); + } + input.onchange = () => { + const files = input.files ? Array.from(input.files) : null; + resolve(files); + }; + input.click(); + }); + } + + // Save file using File System Access API if available, otherwise trigger a download + async saveFile(opts: SaveFileOptions): Promise { + if ((window as any).showSaveFilePicker) { + try { + // @ts-ignore + const handle = await (window as any).showSaveFilePicker({ + suggestedName: opts.suggestedName, + types: opts.types + }); + const writable = await handle.createWritable(); + await writable.write(opts.blob); + await writable.close(); + return { name: handle.name } as any; + } catch (e) { + return null; + } + } + + // Fallback: download + const url = URL.createObjectURL(opts.blob); + const a = document.createElement('a'); + a.href = url; + a.download = opts.suggestedName || 'download'; + a.click(); + URL.revokeObjectURL(url); + return { name: opts.suggestedName || 'download' } as any; + } +} diff --git a/cmd/lthn-desktop/frontend/src/app/services/hardware-wallet.service.ts b/cmd/lthn-desktop/frontend/src/app/services/hardware-wallet.service.ts new file mode 100644 index 0000000..719dff1 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/services/hardware-wallet.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ providedIn: 'root' }) +export class HardwareWalletService { + // Placeholder for WebHID/WebUSB detection + get isWebHIDAvailable() { + return 'hid' in navigator; + } + + get isWebUSBAvailable() { + return 'usb' in navigator; + } + + async connectLedger(): Promise { + // In a real implementation, prompt for a specific HID/USB device + // and establish transport (e.g., via @ledgerhq/hw-transport-webhid). + // This is a stub to document the integration point. + throw new Error('HardwareWalletService.connectLedger is not implemented in the web build.'); + } + + async getAppVersion(): Promise { + // Should query the connected device/app for version information + throw new Error('HardwareWalletService.getAppVersion is not implemented in the web build.'); + } + + async disconnect(): Promise { + // Close transport/session to the device + throw new Error('HardwareWalletService.disconnect is not implemented in the web build.'); + } +} diff --git a/cmd/lthn-desktop/frontend/src/app/services/i18n.service.ts b/cmd/lthn-desktop/frontend/src/app/services/i18n.service.ts new file mode 100644 index 0000000..fdcef46 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/services/i18n.service.ts @@ -0,0 +1,53 @@ +import { Injectable, isDevMode, Optional } from '@angular/core'; +import { SetLanguage, AvailableLanguages } from '@lthn/core/i18n/service'; +import { BehaviorSubject } from 'rxjs'; +import { TranslationService } from './translation.service'; +import { TranslateService } from '@ngx-translate/core'; + +@Injectable({ + providedIn: 'root' +}) +export class I18nService { + private currentLanguageSubject = new BehaviorSubject('en'); + public currentLanguage$ = this.currentLanguageSubject.asObservable(); + + constructor( + private translationService: TranslationService, + @Optional() private ngxTranslate?: TranslateService + ) { + if (isDevMode() && this.ngxTranslate) { + this.ngxTranslate.setDefaultLang('en'); + } + } + + async setLanguage(lang: string): Promise { + if (isDevMode() && this.ngxTranslate) { + await this.translationService.reload(lang); + this.currentLanguageSubject.next(lang); + } else { + try { + await SetLanguage(lang); + this.currentLanguageSubject.next(lang); + await this.translationService.reload(lang); + } catch (error) { + console.error(`I18nService: Failed to set language to "${lang}":`, error); + throw error; + } + } + } + + getAvailableLanguages(): Promise { + if (isDevMode()) { + return Promise.resolve(['en']); // For dev, we can mock this. + } + return AvailableLanguages().then((languages) => { + if (languages == null || languages?.length == 0) + return Promise.resolve(['en']); + return Promise.resolve(languages) + }); + } + + public onReady(): Promise { + return this.translationService.onReady(); + } +} diff --git a/cmd/lthn-desktop/frontend/src/app/services/ipc/stubs.ts b/cmd/lthn-desktop/frontend/src/app/services/ipc/stubs.ts new file mode 100644 index 0000000..22bc14c --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/services/ipc/stubs.ts @@ -0,0 +1,233 @@ +// IPC Stub classes mapping old Electron IPC services and methods. +// These stubs let the web build compile and run without native IPC. +// Each method throws a NotImplementedError to highlight what needs +// to be replaced in a native wrapper or future web-compatible API. +// +// WAILS3 INTEGRATION: +// These stubs will be replaced by Wails3 auto-generated bindings. +// See WAILS3_INTEGRATION.md for complete migration guide. +// +// Pattern: +// 1. Create Go service structs with exported methods (e.g., NodeService, WalletService) +// 2. Register services in Wails3 main.go: application.NewService(&NodeService{}) +// 3. Run `wails3 generate bindings` to create TypeScript bindings +// 4. Import generated bindings: import { GetInfo } from '../bindings/.../nodeservice' +// 5. Replace stub calls with binding calls: await GetInfo() instead of IPC.Node.getInfo() +// +// Each service below maps 1:1 to a Go service struct that will be created. + +export class NotImplementedError extends Error { + constructor(message: string) { + super(message); + this.name = 'NotImplementedError'; + } +} + +function notImplemented(service: string, method: string): never { + throw new NotImplementedError(`IPC ${service}.${method} is not implemented in the web build.`); +} + +function makeIpcStub>(service: string, methods: string[]): T { + const obj: Record = {}; + for (const m of methods) { + obj[m] = (..._args: any[]) => notImplemented(service, m); + } + return obj as T; +} + +// Services and their methods as defined in old/app/background/**/client.js +export const Node = makeIpcStub('Node', [ + 'start', + 'stop', + 'reset', + 'generateToAddress', + 'getAPIKey', + 'getNoDns', + 'getSpvMode', + 'getInfo', + 'getNameInfo', + 'getTXByAddresses', + 'getNameByHash', + 'getBlockByHeight', + 'getTx', + 'broadcastRawTx', + 'sendRawAirdrop', + 'getFees', + 'getAverageBlockTime', + 'getMTP', + 'getCoin', + 'verifyMessageWithName', + 'setNodeDir', + 'setAPIKey', + 'setNoDns', + 'setSpvMode', + 'getDir', + 'getHNSPrice', + 'testCustomRPCClient', + 'getDNSSECProof', + 'sendRawClaim', +]); + +export const Wallet = makeIpcStub('Wallet', [ + 'start', + 'getAPIKey', + 'setAPIKey', + 'getWalletInfo', + 'getAccountInfo', + 'getCoin', + 'getTX', + 'getNames', + 'createNewWallet', + 'importSeed', + 'generateReceivingAddress', + 'getAuctionInfo', + 'getTransactionHistory', + 'getPendingTransactions', + 'getBids', + 'getBlind', + 'getMasterHDKey', + 'hasAddress', + 'setPassphrase', + 'revealSeed', + 'estimateTxFee', + 'estimateMaxSend', + 'removeWalletById', + 'updateAccountDepth', + 'findNonce', + 'findNonceCancel', + 'encryptWallet', + 'backup', + 'rescan', + 'deepClean', + 'reset', + 'sendOpen', + 'sendBid', + 'sendRegister', + 'sendUpdate', + 'sendReveal', + 'sendRedeem', + 'sendRenewal', + 'sendRevealAll', + 'sendRedeemAll', + 'sendRegisterAll', + 'signMessageWithName', + 'transferMany', + 'finalizeAll', + 'finalizeMany', + 'renewAll', + 'renewMany', + 'sendTransfer', + 'cancelTransfer', + 'finalizeTransfer', + 'finalizeWithPayment', + 'claimPaidTransfer', + 'revokeName', + 'send', + 'lock', + 'unlock', + 'isLocked', + 'addSharedKey', + 'removeSharedKey', + 'getNonce', + 'importNonce', + 'zap', + 'importName', + 'rpcGetWalletInfo', + 'loadTransaction', + 'listWallets', + 'getStats', + 'isReady', + 'createClaim', + 'sendClaim', +]); + +export const Setting = makeIpcStub('Setting', [ + 'getExplorer', + 'setExplorer', + 'getLocale', + 'setLocale', + 'getCustomLocale', + 'setCustomLocale', + 'getLatestRelease', +]); + +export const Ledger = makeIpcStub('Ledger', [ + 'getXPub', + 'getAppVersion', +]); + +export const DB = makeIpcStub('DB', [ + 'open', + 'close', + 'put', + 'get', + 'del', + 'getUserDir', +]); + +export const Analytics = makeIpcStub('Analytics', [ + 'setOptIn', + 'getOptIn', + 'track', + 'screenView', +]); + +export const Connections = makeIpcStub('Connections', [ + 'getConnection', + 'setConnection', + 'setConnectionType', + 'getCustomRPC', +]); + +export const Shakedex = makeIpcStub('Shakedex', [ + 'fulfillSwap', + 'getFulfillments', + 'finalizeSwap', + 'transferLock', + 'transferCancel', + 'getListings', + 'finalizeLock', + 'finalizeCancel', + 'launchAuction', + 'downloadProofs', + 'restoreOneListing', + 'restoreOneFill', + 'getExchangeAuctions', + 'listAuction', + 'getFeeInfo', + 'getBestBid', +]); + +export const Claim = makeIpcStub('Claim', [ + 'airdropGenerateProofs', +]); + +export const Logger = makeIpcStub('Logger', [ + 'info', + 'warn', + 'error', + 'log', + 'download', +]); + +export const Hip2 = makeIpcStub('Hip2', [ + 'getPort', + 'setPort', + 'fetchAddress', + 'setServers', +]); + +// Aggregate facade to import from components/services if needed +export const IPC = { + Node, + Wallet, + Setting, + Ledger, + DB, + Analytics, + Connections, + Shakedex, + Claim, + Logger, + Hip2, +}; diff --git a/cmd/lthn-desktop/frontend/src/app/services/notifications.service.ts b/cmd/lthn-desktop/frontend/src/app/services/notifications.service.ts new file mode 100644 index 0000000..1bf0af5 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/services/notifications.service.ts @@ -0,0 +1,24 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ providedIn: 'root' }) +export class NotificationsService { + async requestPermission(): Promise { + if (!('Notification' in window)) return 'denied'; + if (Notification.permission === 'default') { + try { + return await Notification.requestPermission(); + } catch { + return Notification.permission; + } + } + return Notification.permission; + } + + async show(title: string, options?: NotificationOptions): Promise { + if (!('Notification' in window)) return; + const perm = await this.requestPermission(); + if (perm === 'granted') { + new Notification(title, options); + } + } +} diff --git a/cmd/lthn-desktop/frontend/src/app/services/storage.provider.ts b/cmd/lthn-desktop/frontend/src/app/services/storage.provider.ts new file mode 100644 index 0000000..a4c5694 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/services/storage.provider.ts @@ -0,0 +1,6 @@ +import { InjectionToken } from '@angular/core'; + +export const BROWSER_STORAGE = new InjectionToken('Browser Storage', { + providedIn: 'root', + factory: () => localStorage +}); diff --git a/cmd/lthn-desktop/frontend/src/app/services/storage.service.ts b/cmd/lthn-desktop/frontend/src/app/services/storage.service.ts new file mode 100644 index 0000000..86561e2 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/services/storage.service.ts @@ -0,0 +1,34 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ providedIn: 'root' }) +export class StorageService { + private prefix = 'lthnDNS:'; + + setItem(key: string, value: T): void { + try { + localStorage.setItem(this.prefix + key, JSON.stringify(value)); + } catch (e) { + // ignore quota or unsupported errors + } + } + + getItem(key: string, fallback: T | null = null): T | null { + const raw = localStorage.getItem(this.prefix + key); + if (!raw) return fallback; + try { + return JSON.parse(raw) as T; + } catch { + return fallback; + } + } + + removeItem(key: string): void { + localStorage.removeItem(this.prefix + key); + } + + clearAll(): void { + Object.keys(localStorage) + .filter(k => k.startsWith(this.prefix)) + .forEach(k => localStorage.removeItem(k)); + } +} diff --git a/cmd/lthn-desktop/frontend/src/app/services/style-manager.service.ts b/cmd/lthn-desktop/frontend/src/app/services/style-manager.service.ts new file mode 100644 index 0000000..d86beef --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/services/style-manager.service.ts @@ -0,0 +1,31 @@ +import { Injectable } from '@angular/core'; +import { environment } from '../../environments/environment'; + +@Injectable({ + providedIn: 'root' +}) +export class StyleManagerService { + + constructor() { } + + init() { + // if (environment.pro) { + // this.loadProStyles(); + // } + } + + private loadProStyles() { + const proStyles = [ + 'node_modules/@fortawesome/fontawesome-free/css/light.min.css', + 'node_modules/@fortawesome/fontawesome-free/css/jelly-regular.min.css', + 'node_modules/@fortawesome/fontawesome-free/css/jelly-fill-regular.min.css' + ]; + + proStyles.forEach(style => { + const link = document.createElement('link'); + link.rel = 'stylesheet'; + link.href = style; + document.head.appendChild(link); + }); + } +} diff --git a/cmd/lthn-desktop/frontend/src/app/services/translation.service.ts b/cmd/lthn-desktop/frontend/src/app/services/translation.service.ts new file mode 100644 index 0000000..60cb1bb --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/services/translation.service.ts @@ -0,0 +1,79 @@ +import { Injectable, isDevMode } from '@angular/core'; +import { GetAllMessages, Translate } from '@lthn/core/i18n/service'; +import { TranslateService } from '@ngx-translate/core'; +import { firstValueFrom } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class TranslationService { + private translations: Map = new Map(); + private isLoaded = false; + private loadingPromise: Promise; + + constructor(private ngxTranslate: TranslateService) { + this.loadingPromise = this.loadTranslations('en'); + } + + public reload(lang: string): Promise { + this.isLoaded = false; + this.loadingPromise = this.loadTranslations(lang); + return this.loadingPromise; + } + + private async loadTranslations(lang: string): Promise { + if (isDevMode()) { + await firstValueFrom(this.ngxTranslate.use(lang)); + this.isLoaded = true; + console.log('TranslationService: Using ngx-translate for development.'); + } else { + try { + const allMessages: Record | null = await GetAllMessages(lang); + if (!allMessages) { + return + } + this.translations.clear(); + for (const key in allMessages) { + if (Object.prototype.hasOwnProperty.call(allMessages, key)) { + this.translations.set(key, allMessages[key]); + } + } + this.isLoaded = true; + console.log('TranslationService: Translations loaded/reloaded successfully.'); + } catch (error) { + console.error('TranslationService: Failed to load translations:', error); + throw error; + } + } + } + + public translate(key: string): string { + if (isDevMode()) { + return this.ngxTranslate.instant(key); + } else { + if (!this.isLoaded) { + return key; + } + return this.translations.get(key) || key; + } + } + + public _ = this.translate; + + public async translateOnDemand(key: string): Promise { + if (isDevMode()) { + return firstValueFrom(this.ngxTranslate.get(key)); + } else { + try { + return await Translate(key).then(s => s || key); + } catch (error) { + console.error(`TranslationService: Failed to translate key "${key}" on demand:`, error); + return key; // Fallback + } + } + } + + public onReady(): Promise { + return this.loadingPromise; + } +} diff --git a/cmd/lthn-desktop/frontend/src/app/system/setup.component.ts b/cmd/lthn-desktop/frontend/src/app/system/setup.component.ts new file mode 100644 index 0000000..288accc --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/system/setup.component.ts @@ -0,0 +1,110 @@ +import { Component, OnInit, OnDestroy } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RouterLink, RouterOutlet, Router, ActivatedRoute, NavigationEnd } from '@angular/router'; +import { filter, Subscription } from 'rxjs'; + +@Component({ + selector: 'app-setup', + standalone: true, + imports: [CommonModule, RouterLink, RouterOutlet], + template: ` +
+ +
+

Lethean VPN Setup

+
+ + +
+
+ + +
+

+ Welcome to Lethean Setup +

+

+ Please choose your setup option +

+
+
+ + + + +
+
+ +
+
+ + +
+
+

Status

+

Installing Lethean Desktop...

+ +
+
+
+ `, +}) +export class SetupComponent implements OnInit, OnDestroy { + hasChildRoute: boolean = false; + currentStep: number = 1; // 1: Start Install, 2: Config, 3: Installing, 4: Welcome + progressBarWidth: string = '8%'; // Initial width for step 1 + private routerSubscription: Subscription | undefined; + + constructor(private router: Router, private activatedRoute: ActivatedRoute) {} + + ngOnInit(): void { + this.checkChildRoute(); + this.routerSubscription = this.router.events.pipe( + filter(event => event instanceof NavigationEnd) + ).subscribe(() => { + this.checkChildRoute(); + this.updateProgressBar(); + }); + } + + ngOnDestroy(): void { + this.routerSubscription?.unsubscribe(); + } + + checkChildRoute(): void { + this.hasChildRoute = this.activatedRoute.firstChild !== null; + } + + updateProgressBar(): void { + const currentPath = this.router.url; + if (currentPath.includes('/setup/full') || currentPath.includes('/setup/blockchain') || currentPath.includes('/setup/gateway-client') || currentPath.includes('/setup/seed-node')) { + this.currentStep = 2; // Config stage + this.progressBarWidth = '33%'; + } else if (currentPath === '/setup') { + this.currentStep = 1; // Start Install stage + this.progressBarWidth = '8%'; + } else { + // Default or other stages, can be expanded later + this.currentStep = 1; // Fallback + this.progressBarWidth = '8%'; + } + } +} diff --git a/cmd/lthn-desktop/frontend/src/app/system/setup/blockchain.component.ts b/cmd/lthn-desktop/frontend/src/app/system/setup/blockchain.component.ts new file mode 100644 index 0000000..85dd40d --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/system/setup/blockchain.component.ts @@ -0,0 +1,28 @@ +import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@Component({ + selector: 'app-setup-blockchain', + standalone: true, + imports: [CommonModule], + template: ` +
+
+
+

+ Blockchain Setup +

+

+ Configure your blockchain settings. +

+
+
+ +
+
+
+ `, +}) +export class BlockchainSetupComponent {} diff --git a/cmd/lthn-desktop/frontend/src/app/system/setup/full.component.ts b/cmd/lthn-desktop/frontend/src/app/system/setup/full.component.ts new file mode 100644 index 0000000..a35e6d5 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/system/setup/full.component.ts @@ -0,0 +1,207 @@ +import {Component, signal} from '@angular/core'; +import {FormsModule} from '@angular/forms'; +import {Router} from '@angular/router'; +import {SelectDirectory} from '@lthn/core/display/service'; +import {Save} from '@lthn/core/config/service'; + +@Component({ + selector: 'app-full-setup', + standalone: true, + imports: [FormsModule], + template: ` +
+

+ Full Installation Wizard +

+ +
+
+ +
+ +
+
+ `, +}) +export class FullComponent { + currentStep = signal(1); + username = ''; + installDirectory = '~/lethean'; + + constructor(private router: Router) { + } + + async selectInstallDirectory(): Promise { + try { + const selectedPath = await SelectDirectory(); + if (selectedPath) { + this.installDirectory = selectedPath; + } + } catch (error) { + console.error('Error selecting directory:', error); + } + } + + nextStep(): void { + if (this.currentStep() < 6) { + this.currentStep.update(step => step + 1); + } + } + + async finishSetup(): Promise { + await Save() + console.log('Setup finished!'); + console.log('Username:', this.username); + console.log('Install Directory:', this.installDirectory); + this.router.navigate(['/blockchain']); + } +} diff --git a/cmd/lthn-desktop/frontend/src/app/system/setup/gateway-client.component.ts b/cmd/lthn-desktop/frontend/src/app/system/setup/gateway-client.component.ts new file mode 100644 index 0000000..a2e7b9d --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/system/setup/gateway-client.component.ts @@ -0,0 +1,28 @@ +import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@Component({ + selector: 'app-setup-gateway-client', + standalone: true, + imports: [CommonModule], + template: ` +
+
+
+

+ Gateway Client Setup +

+

+ Configure your gateway client settings. +

+
+
+ +
+
+
+ `, +}) +export class GatewayClientSetupComponent {} diff --git a/cmd/lthn-desktop/frontend/src/app/system/setup/seed-node.component.ts b/cmd/lthn-desktop/frontend/src/app/system/setup/seed-node.component.ts new file mode 100644 index 0000000..03b5305 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/system/setup/seed-node.component.ts @@ -0,0 +1,28 @@ +import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@Component({ + selector: 'app-setup-seed-node', + standalone: true, + imports: [CommonModule], + template: ` +
+
+
+

+ Seed Node Setup +

+

+ Configure your seed node settings. +

+
+
+ +
+
+
+ `, +}) +export class SeedNodeSetupComponent {} diff --git a/cmd/lthn-desktop/frontend/src/app/translate-server.loader.ts b/cmd/lthn-desktop/frontend/src/app/translate-server.loader.ts new file mode 100644 index 0000000..38db3c2 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/app/translate-server.loader.ts @@ -0,0 +1,14 @@ +import { join } from 'path'; +import { Observable, of } from 'rxjs'; +import { TranslateLoader } from '@ngx-translate/core'; +import * as fs from 'fs'; + +export class TranslateServerLoader implements TranslateLoader { + constructor(private prefix: string = 'i18n', private suffix: string = '.json') {} + + public getTranslation(lang: string): Observable { + const path = join(process.cwd(), 'i18n', this.prefix, `${lang}${this.suffix}`); + const data = JSON.parse(fs.readFileSync(path, 'utf8')); + return of(data); + } +} diff --git a/cmd/lthn-desktop/frontend/src/environments/environment.common.ts b/cmd/lthn-desktop/frontend/src/environments/environment.common.ts new file mode 100644 index 0000000..3be1243 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/environments/environment.common.ts @@ -0,0 +1,18 @@ +export const appVersion = '250905-1502'; + +export const appInfo = { + name: 'Core', + logo: 'ganatan', + network: 'ganatan', + xnetwork: 'dannyganatan', + linkedinnetwork: 'dannyganatan', + website: 'www.ganatan.com', +}; + +export const applicationBase = { + name: 'angular-starter', + angular: 'Angular 20.3.2', + bootstrap: 'Bootstrap 5.3.8', + fontawesome: 'Font Awesome 7.0.1', +}; + diff --git a/cmd/lthn-desktop/frontend/src/environments/environment.development.ts b/cmd/lthn-desktop/frontend/src/environments/environment.development.ts new file mode 100644 index 0000000..237999f --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/environments/environment.development.ts @@ -0,0 +1,13 @@ +import { appInfo, applicationBase } from './environment.common'; + +export const environment = { + appInfo, + application: { + ...applicationBase, + angular: `${applicationBase.angular} DEV`, + }, + urlNews: './assets/params/json/mock/trailers.json', + urlMovies: './assets/params/json/mock/movies.json', + useMock: true, + backend: 'http://localhost:3000', +}; diff --git a/cmd/lthn-desktop/frontend/src/environments/environment.prod.ts b/cmd/lthn-desktop/frontend/src/environments/environment.prod.ts new file mode 100644 index 0000000..3612073 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/cmd/lthn-desktop/frontend/src/environments/environment.ts b/cmd/lthn-desktop/frontend/src/environments/environment.ts new file mode 100644 index 0000000..ffe8aed --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/environments/environment.ts @@ -0,0 +1,3 @@ +export const environment = { + production: false +}; diff --git a/cmd/lthn-desktop/frontend/src/frame/application.frame.html b/cmd/lthn-desktop/frontend/src/frame/application.frame.html new file mode 100644 index 0000000..79b1c6c --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/frame/application.frame.html @@ -0,0 +1,161 @@ + +
+ + + Open sidebar + + + + + + +
+
+ + +
+
+ + + + + + +
+ + @if (userMenuOpen) { +
+ + + Documentation + + @for (item of userNavigation; track item.name) { + + + {{ item.name }} + + } +
+
+ Switch Role +
+ @for (item of roleNavigation; track item.name) { + + {{ item.name }} + + } +
+ } +
+
+
+
+ + +
+
+
+ @if (featureKey && !isFeatureEnabled) { + + } @else { + + } +
+
+
+
+
+ + @if (currentRole === 'Developer') { + + } + {{ time }} +
+
+
diff --git a/cmd/lthn-desktop/frontend/src/frame/application.frame.ts b/cmd/lthn-desktop/frontend/src/frame/application.frame.ts new file mode 100644 index 0000000..c821131 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/frame/application.frame.ts @@ -0,0 +1,149 @@ +import {Component, CUSTOM_ELEMENTS_SCHEMA, OnDestroy, OnInit} from '@angular/core'; +import { CommonModule, TitleCasePipe } from '@angular/common'; +import { NavigationEnd, Router, RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router'; +import { ShowEnvironmentDialog } from "@lthn/core/display/service" +import { OpenDocsWindow } from "@lthn/docs/service" +import { EnableFeature, IsFeatureEnabled } from "@lthn/core/config/service"; +import { TranslationService } from '../app/services/translation.service'; +import { I18nService } from '../app/services/i18n.service'; +import { Subscription } from 'rxjs'; + +@Component({ + selector: 'application-frame', + standalone: true, + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [CommonModule, RouterOutlet, RouterLink, RouterLinkActive, TitleCasePipe], + templateUrl: './application.frame.html', +}) +export class ApplicationFrame implements OnInit, OnDestroy { + sidebarOpen = false; + userMenuOpen = false; + currentRole = 'Developer'; + time: string = ''; + private intervalId: number | undefined; + private langChangeSubscription: Subscription | undefined; + + featureKey: string | null = null; + isFeatureEnabled: boolean = false; + userNavigation: any[] = []; + navigation: any[] = []; + roleNavigation: any[] = []; + + constructor( + private router: Router, + public t: TranslationService, + private i18nService: I18nService + ) { + + + } + + async ngOnInit(): Promise { + this.updateTime(); + this.intervalId = window.setInterval(() => { + this.updateTime(); + }, 1000); + + await this.t.onReady(); + this.initializeUserNavigation(); + + this.langChangeSubscription = this.i18nService.currentLanguage$.subscribe(async () => { + await this.t.onReady(); + this.initializeUserNavigation(); + }); + + this.router.events.subscribe(event => { + if (event instanceof NavigationEnd) { + this.extractFeatureKeyAndCheckStatus(event.urlAfterRedirects); + } + }); + this.navigation = [ + { name: this.t._('menu.blockchain'), href: 'blockchain', icon: "fa-chart-network fa-regular fa-2xl shrink-0" }, + { name: this.t._('menu.mining'), href: 'mining', icon: "fa-pickaxe fa-regular fa-2xl shrink-0" }, + { name: this.t._('Developer'), href: 'dev/edit', icon: "fa-code fa-regular fa-2xl shrink-0" }, + { name: this.t._('Claude AI'), href: 'dev/claude', icon: "fa-robot fa-regular fa-2xl shrink-0" }, + ]; + + this.roleNavigation = [ + { name: this.t._('menu.hub-client'), href: '/config/client-hub' }, + { name: this.t._('menu.hub-server'), href: '/config/server-hub' }, + { name: this.t._('menu.hub-developer'), href: '/config/developer-hub' }, + { name: this.t._('menu.hub-gateway'), href: '/config/gateway-hub' }, + { name: this.t._('menu.hub-admin'), href: '/config/admin-hub' }, + ]; + await this.extractFeatureKeyAndCheckStatus(this.router.url); // Initial check + } + + ngOnDestroy(): void { + if (this.intervalId) { + clearInterval(this.intervalId); + } + if (this.langChangeSubscription) { + this.langChangeSubscription.unsubscribe(); + } + } + + initializeUserNavigation(): void { + this.userNavigation = [ + { name: this.t._('menu.your-profile'), href: '#', icon: "fa-id-card fa-regular" }, + { name: this.t._('menu.logout'), href: '#', icon: "fa-right-from-bracket fa-regular" }, + ]; + } + + updateTime(): void { + const now = new Date(); + this.time = now.toLocaleTimeString(); + } + + async extractFeatureKeyAndCheckStatus(url: string): Promise { + // Remove leading slash and split by slash + const parts = url.startsWith('/') ? url.substring(1).split('/') : url.split('/'); + if (parts.length > 0 && parts[0] !== '') { + this.featureKey = parts[0]; + await this.checkFeatureStatus(); + } else { + this.featureKey = null; + this.isFeatureEnabled = true; // No feature key, so assume enabled + } + } + + async checkFeatureStatus(): Promise { + if (this.featureKey) { + try { + this.isFeatureEnabled = await IsFeatureEnabled(this.featureKey); + } catch (error) { + console.error(`Error checking feature ${this.featureKey}:`, error); + this.isFeatureEnabled = false; + } + } else { + this.isFeatureEnabled = true; + } + } + + async activateFeature(): Promise { + if (this.featureKey) { + try { + await EnableFeature(this.featureKey); + await this.checkFeatureStatus(); + } catch (error) { + console.error(`Error activating feature ${this.featureKey}:`, error); + } + } + } + + showTestDialog(): void { + alert('Test Dialog Triggered!'); + } + + openDocs() { + return OpenDocsWindow("getting-started/chain#using-the-cli") + } + switchRole(roleName: string) { + if (roleName.endsWith(' Hub')) { + this.currentRole = roleName.replace(' Hub', ''); + } + this.userMenuOpen = false; + } + + protected readonly ShowEnvironmentDialog = ShowEnvironmentDialog; +} diff --git a/cmd/lthn-desktop/frontend/src/frame/blank.frame.ts b/cmd/lthn-desktop/frontend/src/frame/blank.frame.ts new file mode 100644 index 0000000..0962a4e --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/frame/blank.frame.ts @@ -0,0 +1,21 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RouterOutlet } from '@angular/router'; + +@Component({ + selector: 'blank-frame', + standalone: true, + imports: [CommonModule, RouterOutlet], + template: ` + + `, +}) +export class BlankFrame implements OnInit, OnDestroy { + ngOnInit(): void { + // Initialization logic for blank frame + } + + ngOnDestroy(): void { + // Cleanup logic for blank frame + } +} diff --git a/cmd/lthn-desktop/frontend/src/frame/system-tray.frame.ts b/cmd/lthn-desktop/frontend/src/frame/system-tray.frame.ts new file mode 100644 index 0000000..c0c1715 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/frame/system-tray.frame.ts @@ -0,0 +1,55 @@ +import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@Component({ + selector: 'system-tray-frame', + standalone: true, + imports: [CommonModule], + template: ` +
+
+
+ Lethean Community +
+
+ + +
+
+
+
    +
  • +

    Status: Connected

    +
  • +
  • +

    IP: 127.0.0.1

    +
  • +
  • +

    Uptime: 00:00:00

    +
  • +
+
+
+ +
+
+ ` +}) +export class SystemTrayFrame { + settingsMenuOpen = false; + + settingsNavigation = [ + { name: 'Settings', href: '#' }, + { name: 'About', href: '#' }, + { name: 'Check for Updates...', href: '#' }, + ]; +} diff --git a/cmd/lthn-desktop/frontend/src/index.html b/cmd/lthn-desktop/frontend/src/index.html new file mode 100644 index 0000000..3af61ec --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/index.html @@ -0,0 +1,13 @@ + + + + + Frontend + + + + + + + + diff --git a/cmd/lthn-desktop/frontend/src/lib/electron-compat/README.md b/cmd/lthn-desktop/frontend/src/lib/electron-compat/README.md new file mode 100644 index 0000000..8915a6c --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/lib/electron-compat/README.md @@ -0,0 +1,221 @@ +# Electron Compatibility Layer for Wails + +This module provides Electron-like APIs that map to Wails v3 runtime equivalents. It's designed to help developers familiar with Electron contribute to this Wails-based application. + +## Quick Start + +```typescript +import { ipcRenderer, shell, dialog, app, clipboard, BrowserWindow } from '@lib/electron-compat'; + +// IPC Communication - just like Electron! +const result = await ipcRenderer.invoke('blockchain:fetchBlockData', '12345'); + +// Open external links +await shell.openExternal('https://lethean.io'); + +// File dialogs +const files = await dialog.showOpenDialog({ + title: 'Select Wallet', + filters: [{ name: 'Wallet', extensions: ['wallet', 'keys'] }] +}); + +// Clipboard +await clipboard.writeText(walletAddress); + +// Window management +const win = BrowserWindow.getFocusedWindow(); +win.setTitle('Lethean Desktop'); +win.maximize(); +``` + +## API Mapping Reference + +### ipcRenderer + +| Electron | Wails | Notes | +|----------|-------|-------| +| `ipcRenderer.send(channel, ...args)` | `Events.Emit()` | Fire-and-forget | +| `ipcRenderer.invoke(channel, ...args)` | `Call.ByName()` | Returns Promise | +| `ipcRenderer.on(channel, listener)` | `Events.On()` | Subscribe | +| `ipcRenderer.once(channel, listener)` | `Events.Once()` | One-time | +| `ipcRenderer.sendSync()` | ❌ | Not supported | + +**Channel Naming Convention:** +```typescript +// Electron-style channels are auto-converted: +'blockchain:fetchBlockData' → 'blockchain.Service.FetchBlockData' +'config:get' → 'config.Service.Get' + +// Or use direct Wails binding paths: +'github.com/letheanVPN/desktop/services/blockchain.Service.FetchBlockData' +``` + +### shell + +| Electron | Wails | Status | +|----------|-------|--------| +| `shell.openExternal(url)` | `Browser.OpenURL()` | ✅ Works | +| `shell.openPath(path)` | Go backend | ⚠️ Needs Go service | +| `shell.showItemInFolder(path)` | Go backend | ⚠️ Needs Go service | +| `shell.beep()` | Web Audio API | ✅ Works | + +### dialog + +| Electron | Wails | Status | +|----------|-------|--------| +| `dialog.showOpenDialog()` | `Dialogs.OpenFile()` | ✅ Works | +| `dialog.showSaveDialog()` | `Dialogs.SaveFile()` | ✅ Works | +| `dialog.showMessageBox()` | `Dialogs.Info/Warning/Error/Question()` | ✅ Simplified | +| `dialog.showErrorBox()` | `Dialogs.Error()` | ✅ Works | + +### BrowserWindow + +| Electron | Wails | Status | +|----------|-------|--------| +| `new BrowserWindow()` | Go `display.Service.OpenWindow()` | ⚠️ Via Go | +| `win.maximize/minimize()` | `Window.Maximise/Minimise()` | ✅ Works | +| `win.setTitle()` | `Window.SetTitle()` | ✅ Works | +| `win.setSize/Position()` | `Window.SetSize/Position()` | ✅ Works | +| `win.on(event)` | `Events.On()` | ✅ Works | +| Multi-window support | Go backend | ⚠️ Different model | + +### clipboard + +| Electron | Wails | Status | +|----------|-------|--------| +| `clipboard.readText()` | `navigator.clipboard` | ✅ Async | +| `clipboard.writeText()` | `navigator.clipboard` | ✅ Async | +| `clipboard.readImage()` | `navigator.clipboard` | ✅ Async | +| Sync methods | ❌ | Browser limitation | + +### app + +| Electron | Wails | Status | +|----------|-------|--------| +| `app.quit()` | `Application.Quit()` | ✅ Works | +| `app.getVersion()` | Hardcoded | ⚠️ Could bind | +| `app.getPath()` | Go backend | ⚠️ Needs Go service | +| `app.getLocale()` | `navigator.language` | ✅ Works | + +## Key Differences from Electron + +### 1. Process Model +- **Electron**: Main process + Renderer process(es) +- **Wails**: Go backend + Single frontend (WebView) + +### 2. IPC Communication +- **Electron**: `ipcMain`/`ipcRenderer` with event-based messaging +- **Wails**: Direct Go method calls via bindings + Events for pub/sub + +### 3. Window Management +- **Electron**: Create windows freely from main or renderer +- **Wails**: Windows created from Go backend, controlled via runtime + +### 4. Native Features +- **Electron**: Node.js APIs available in renderer (with nodeIntegration) +- **Wails**: Native features exposed through Go bindings + +## Backend Requirements + +Some APIs require Go backend services. Create these in `services/core/`: + +### shell/service.go (for shell.openPath, etc.) + +```go +package shell + +import ( + "os/exec" + "runtime" +) + +type Service struct{} + +func NewService() *Service { + return &Service{} +} + +func (s *Service) OpenPath(path string) error { + var cmd *exec.Cmd + switch runtime.GOOS { + case "darwin": + cmd = exec.Command("open", path) + case "linux": + cmd = exec.Command("xdg-open", path) + case "windows": + cmd = exec.Command("cmd", "/c", "start", "", path) + } + return cmd.Start() +} + +func (s *Service) ShowItemInFolder(path string) error { + switch runtime.GOOS { + case "darwin": + return exec.Command("open", "-R", path).Start() + case "linux": + return exec.Command("xdg-open", filepath.Dir(path)).Start() + case "windows": + return exec.Command("explorer", "/select,", path).Start() + } + return nil +} +``` + +## Adding New Channel Mappings + +Edit `ipc-renderer.ts` and add to `channelMappings`: + +```typescript +const channelMappings: Record = { + // Add your mappings here + 'myService:myMethod': 'github.com/letheanVPN/desktop/services/mypackage.Service.MyMethod', +}; +``` + +## Example: Migrating Electron Code + +### Before (Electron) +```typescript +const { ipcRenderer, shell } = require('electron'); + +// Call main process +const data = await ipcRenderer.invoke('get-wallet-balance', walletId); + +// Open link +shell.openExternal('https://explorer.lethean.io'); + +// File dialog +const { filePaths } = await ipcRenderer.invoke('show-open-dialog', { + filters: [{ name: 'Wallet', extensions: ['wallet'] }] +}); +``` + +### After (Wails + electron-compat) +```typescript +import { ipcRenderer, shell, dialog } from '@lib/electron-compat'; + +// Call Go service (same API!) +const data = await ipcRenderer.invoke('wallet:getBalance', walletId); + +// Open link (identical!) +await shell.openExternal('https://explorer.lethean.io'); + +// File dialog (slightly different, dialog is in frontend) +const { filePaths } = await dialog.showOpenDialog({ + filters: [{ name: 'Wallet', extensions: ['wallet'] }] +}); +``` + +## Contributing + +When adding Electron API compatibility: + +1. Check if Wails has a direct equivalent in `@wailsio/runtime` +2. If not, determine if it needs a Go backend service +3. Add proper TypeScript types +4. Document any behavioral differences +5. Add to this README + +## License + +EUPL-1.2 (same as parent project) diff --git a/cmd/lthn-desktop/frontend/src/lib/electron-compat/app.ts b/cmd/lthn-desktop/frontend/src/lib/electron-compat/app.ts new file mode 100644 index 0000000..e2f74e4 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/lib/electron-compat/app.ts @@ -0,0 +1,294 @@ +/** + * Electron app Compatibility Layer + * + * Maps Electron's app API to Wails Application runtime. + * + * Note: Many Electron app APIs relate to the main process lifecycle, + * which works differently in Wails. This provides the most commonly + * used subset that makes sense in a Wails context. + * + * @example + * import { app } from '@lib/electron-compat'; + * + * console.log('App version:', app.getVersion()); + * console.log('User data path:', await app.getPath('userData')); + */ + +import { Application, Call } from '@wailsio/runtime'; + +// Cache for app info to avoid repeated calls +let cachedAppInfo: { name: string; version: string } | null = null; + +export const app = { + /** + * Get the application name. + * + * @returns The application name from wails.json + */ + getName(): string { + return 'Lethean Desktop'; // Could be made dynamic via Go binding + }, + + /** + * Get the application version. + * + * @returns The application version + * + * @example + * console.log(`Running version ${app.getVersion()}`); + */ + getVersion(): string { + // This could be bound from Go's build-time version + return '1.0.0'; + }, + + /** + * Get a special directory path. + * + * NOTE: This requires a Go backend method to be implemented. + * + * @param name - The path type to get + * @returns Promise resolving to the path string + * + * @example + * const userDataPath = await app.getPath('userData'); + * const logsPath = await app.getPath('logs'); + */ + async getPath( + name: + | 'home' + | 'appData' + | 'userData' + | 'sessionData' + | 'temp' + | 'exe' + | 'module' + | 'desktop' + | 'documents' + | 'downloads' + | 'music' + | 'pictures' + | 'videos' + | 'recent' + | 'logs' + | 'crashDumps' + ): Promise { + try { + // Maps to the config service's path resolution + const result = await Call.ByName( + 'github.com/letheanVPN/desktop/services/core/config.Service.GetPath', + name + ); + return result as string; + } catch { + // Fallback to reasonable defaults + console.warn(`[electron-compat] getPath('${name}') not implemented, using fallback`); + return ''; + } + }, + + /** + * Get the current application locale. + * + * @returns The system locale string (e.g., 'en-US') + */ + getLocale(): string { + return navigator.language || 'en-US'; + }, + + /** + * Get the system locale for spell checking. + */ + getSystemLocale(): string { + return navigator.language || 'en-US'; + }, + + /** + * Check if the app is packaged (production build). + * + * @returns true if running as packaged app + */ + isPackaged(): boolean { + // In Wails, check if we're in dev mode + return !window.location.href.includes('localhost'); + }, + + /** + * Quit the application. + * + * @param exitCode - Optional exit code (default: 0) + */ + quit(exitCode?: number): void { + Application.Quit(); + }, + + /** + * Exit the application immediately. + * + * @param exitCode - Exit code (default: 0) + */ + exit(exitCode?: number): void { + Application.Quit(); + }, + + /** + * Relaunch the application. + * + * NOTE: Not directly supported in Wails - logs a warning. + */ + relaunch(_options?: { args?: string[]; execPath?: string }): void { + console.warn('[electron-compat] relaunch() is not directly supported in Wails'); + // Could potentially be implemented via Go with os/exec + }, + + /** + * Check if the app is ready. + * In Wails, the app is ready when the frontend loads. + * + * @returns Always true in the frontend context + */ + isReady(): boolean { + return true; + }, + + /** + * Wait for the app to be ready. + * Resolves immediately in Wails frontend context. + * + * @returns Promise that resolves when app is ready + */ + whenReady(): Promise { + return Promise.resolve(); + }, + + /** + * Focus the application. + */ + focus(_options?: { steal: boolean }): void { + window.focus(); + }, + + /** + * Hide the application (macOS). + * Maps to Window.Hide() in Wails. + */ + hide(): void { + // Would need Go binding for proper implementation + console.warn('[electron-compat] hide() requires Go backend implementation'); + }, + + /** + * Show the application (after hide). + */ + show(): void { + window.focus(); + }, + + /** + * Set the application badge count (macOS/Linux). + * + * @param count - Badge count (0 to clear) + * @returns Whether the call succeeded + */ + setBadgeCount(count: number): boolean { + // Not directly supported in Wails - would need Go implementation + console.warn('[electron-compat] setBadgeCount() requires Go backend implementation'); + return false; + }, + + /** + * Get the badge count. + * + * @returns The current badge count + */ + getBadgeCount(): number { + return 0; + }, + + /** + * Check if running on Rosetta 2 (Apple Silicon with x64 binary). + * + * @returns Promise resolving to boolean + */ + async isRunningUnderARM64Translation(): Promise { + // Would need Go implementation to check + return false; + }, + + // ========================================================================= + // Event-like methods (for Electron compatibility) + // ========================================================================= + + /** + * Register a callback for when the app is ready. + * Executes immediately since Wails frontend is already "ready". + * + * @param callback - Function to call + */ + on(event: string, callback: (...args: unknown[]) => void): void { + if (event === 'ready') { + // Already ready in frontend context + callback(); + } else if (event === 'window-all-closed') { + // Not applicable - Wails handles this + console.warn(`[electron-compat] app.on('${event}') - event not supported in Wails frontend`); + } else if (event === 'activate') { + // macOS dock click - would need Go implementation + console.warn(`[electron-compat] app.on('${event}') requires Go backend implementation`); + } else { + console.warn(`[electron-compat] app.on('${event}') - unknown event`); + } + }, + + /** + * Register a one-time callback. + */ + once(event: string, callback: (...args: unknown[]) => void): void { + this.on(event, callback); + }, +}; + +/* + * ============================================================================= + * GO BACKEND IMPLEMENTATION REQUIRED (for getPath) + * ============================================================================= + * + * Add this method to: services/core/config/service.go + * + * ```go + * import ( + * "os" + * "path/filepath" + * "runtime" + * + * "github.com/adrg/xdg" + * ) + * + * // GetPath returns special directory paths (Electron app.getPath compatibility) + * func (s *Service) GetPath(name string) (string, error) { + * switch name { + * case "home": + * return os.UserHomeDir() + * case "appData": + * return xdg.ConfigHome, nil + * case "userData": + * return xdg.DataHome + "/lethean-desktop", nil + * case "temp": + * return os.TempDir(), nil + * case "desktop": + * home, _ := os.UserHomeDir() + * return filepath.Join(home, "Desktop"), nil + * case "documents": + * home, _ := os.UserHomeDir() + * return filepath.Join(home, "Documents"), nil + * case "downloads": + * home, _ := os.UserHomeDir() + * return filepath.Join(home, "Downloads"), nil + * case "logs": + * return xdg.StateHome + "/lethean-desktop/logs", nil + * default: + * return "", fmt.Errorf("unknown path name: %s", name) + * } + * } + * ``` + */ diff --git a/cmd/lthn-desktop/frontend/src/lib/electron-compat/browser-window.ts b/cmd/lthn-desktop/frontend/src/lib/electron-compat/browser-window.ts new file mode 100644 index 0000000..8cb4d6c --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/lib/electron-compat/browser-window.ts @@ -0,0 +1,491 @@ +/** + * Electron BrowserWindow Compatibility Layer + * + * Maps Electron's BrowserWindow API to Wails Window system. + * + * IMPORTANT: Wails has a fundamentally different window model than Electron: + * - Electron: Multiple BrowserWindow instances, each with own renderer process + * - Wails: Single main window with ability to spawn additional windows via Go + * + * This compatibility layer provides a subset of BrowserWindow functionality + * that maps to Wails' window capabilities. + * + * @example + * import { BrowserWindow } from '@lib/electron-compat'; + * + * // Get current window + * const win = BrowserWindow.getFocusedWindow(); + * win.setTitle('My Window'); + * win.maximize(); + */ + +import { Window, Call, Events } from '@wailsio/runtime'; + +export interface BrowserWindowOptions { + width?: number; + height?: number; + x?: number; + y?: number; + minWidth?: number; + minHeight?: number; + maxWidth?: number; + maxHeight?: number; + resizable?: boolean; + movable?: boolean; + minimizable?: boolean; + maximizable?: boolean; + closable?: boolean; + focusable?: boolean; + alwaysOnTop?: boolean; + fullscreen?: boolean; + fullscreenable?: boolean; + title?: string; + show?: boolean; + frame?: boolean; + transparent?: boolean; + backgroundColor?: string; +} + +export interface Rectangle { + x: number; + y: number; + width: number; + height: number; +} + +/** + * BrowserWindow compatibility class for the current Wails window. + * + * Note: Unlike Electron, you cannot create new BrowserWindow instances + * directly from the frontend. Use the Go backend's display service + * to open new windows. + */ +export class BrowserWindow { + private id: number; + private static currentWindow: BrowserWindow | null = null; + + private constructor(id: number = 0) { + this.id = id; + } + + /** + * Get the currently focused window. + * In Wails, this typically returns a wrapper for the main window. + * + * @returns BrowserWindow instance or null + */ + static getFocusedWindow(): BrowserWindow | null { + if (!BrowserWindow.currentWindow) { + BrowserWindow.currentWindow = new BrowserWindow(0); + } + return BrowserWindow.currentWindow; + } + + /** + * Get all open windows. + * In Wails, window management is handled by Go, so this returns + * just the current window context. + * + * @returns Array of BrowserWindow instances + */ + static getAllWindows(): BrowserWindow[] { + const focused = BrowserWindow.getFocusedWindow(); + return focused ? [focused] : []; + } + + /** + * Create a new browser window. + * + * NOTE: In Wails, new windows must be created via Go backend. + * This method calls the display service to open a new window. + * + * @param options - Window configuration + */ + static async create(options: BrowserWindowOptions & { url?: string; name?: string }): Promise { + try { + await Call.ByName( + 'github.com/letheanVPN/desktop/services/core/display.Service.OpenWindow', + options.name || 'window', + { + Title: options.title || '', + Width: options.width || 800, + Height: options.height || 600, + URL: options.url || '/', + AlwaysOnTop: options.alwaysOnTop || false, + Frameless: options.frame === false, + Resizable: options.resizable !== false, + MinWidth: options.minWidth, + MinHeight: options.minHeight, + MaxWidth: options.maxWidth, + MaxHeight: options.maxHeight, + } + ); + } catch (error) { + console.error('[electron-compat] BrowserWindow.create failed:', error); + throw error; + } + } + + // ========================================================================= + // Instance Methods - Window State + // ========================================================================= + + /** + * Close the window. + */ + close(): void { + Window.Close(); + } + + /** + * Focus the window. + */ + focus(): void { + Window.Focus(); + } + + /** + * Blur (unfocus) the window. + */ + blur(): void { + // Not directly supported in Wails + console.warn('[electron-compat] blur() not directly supported'); + } + + /** + * Check if the window is focused. + */ + isFocused(): boolean { + return document.hasFocus(); + } + + /** + * Check if the window is destroyed/closed. + */ + isDestroyed(): boolean { + return false; // Current window is never destroyed in this context + } + + /** + * Show the window. + */ + show(): void { + Window.Show(); + } + + /** + * Hide the window. + */ + hide(): void { + Window.Hide(); + } + + /** + * Check if the window is visible. + */ + isVisible(): boolean { + return !document.hidden; + } + + /** + * Check if the window is maximized. + */ + async isMaximized(): Promise { + return await Window.IsMaximised(); + } + + /** + * Maximize the window. + */ + maximize(): void { + Window.Maximise(); + } + + /** + * Unmaximize the window. + */ + unmaximize(): void { + Window.UnMaximise(); + } + + /** + * Check if the window is minimized. + */ + async isMinimized(): Promise { + return await Window.IsMinimised(); + } + + /** + * Minimize the window. + */ + minimize(): void { + Window.Minimise(); + } + + /** + * Restore the window from minimized state. + */ + restore(): void { + Window.UnMinimise(); + } + + /** + * Check if the window is in fullscreen mode. + */ + async isFullScreen(): Promise { + return await Window.IsFullscreen(); + } + + /** + * Set fullscreen mode. + */ + setFullScreen(flag: boolean): void { + if (flag) { + Window.Fullscreen(); + } else { + Window.UnFullscreen(); + } + } + + /** + * Toggle fullscreen mode. + */ + toggleFullScreen(): void { + Window.ToggleFullscreen(); + } + + // ========================================================================= + // Instance Methods - Window Properties + // ========================================================================= + + /** + * Get the window title. + */ + getTitle(): string { + return document.title; + } + + /** + * Set the window title. + */ + setTitle(title: string): void { + Window.SetTitle(title); + } + + /** + * Get the window bounds. + */ + async getBounds(): Promise { + const size = await Window.Size(); + const pos = await Window.Position(); + return { + x: pos.x, + y: pos.y, + width: size.width, + height: size.height, + }; + } + + /** + * Set the window bounds. + */ + setBounds(bounds: Partial): void { + if (bounds.width !== undefined && bounds.height !== undefined) { + Window.SetSize(bounds.width, bounds.height); + } + if (bounds.x !== undefined && bounds.y !== undefined) { + Window.SetPosition(bounds.x, bounds.y); + } + } + + /** + * Get the window size. + */ + async getSize(): Promise<[number, number]> { + const size = await Window.Size(); + return [size.width, size.height]; + } + + /** + * Set the window size. + */ + setSize(width: number, height: number): void { + Window.SetSize(width, height); + } + + /** + * Get the window position. + */ + async getPosition(): Promise<[number, number]> { + const pos = await Window.Position(); + return [pos.x, pos.y]; + } + + /** + * Set the window position. + */ + setPosition(x: number, y: number): void { + Window.SetPosition(x, y); + } + + /** + * Center the window on screen. + */ + center(): void { + Window.Center(); + } + + /** + * Set minimum window size. + */ + setMinimumSize(width: number, height: number): void { + Window.SetMinSize(width, height); + } + + /** + * Set maximum window size. + */ + setMaximumSize(width: number, height: number): void { + Window.SetMaxSize(width, height); + } + + /** + * Set whether the window is resizable. + */ + setResizable(resizable: boolean): void { + Window.SetResizable(resizable); + } + + /** + * Check if the window is resizable. + */ + async isResizable(): Promise { + return await Window.Resizable(); + } + + /** + * Set always on top. + */ + setAlwaysOnTop(flag: boolean): void { + Window.SetAlwaysOnTop(flag); + } + + /** + * Check if always on top. + */ + async isAlwaysOnTop(): Promise { + return await Window.IsAlwaysOnTop(); + } + + /** + * Set the window background color. + */ + setBackgroundColor(_color: string): void { + // Simplified - would need color parsing + Window.SetBackgroundColour({ r: 0, g: 0, b: 0, a: 255 }); + } + + // ========================================================================= + // Instance Methods - Events + // ========================================================================= + + /** + * Register an event listener. + */ + on(event: string, listener: (...args: unknown[]) => void): this { + const eventMap: Record = { + close: 'window:close', + closed: 'window:closed', + focus: 'window:focus', + blur: 'window:blur', + maximize: 'window:maximise', + unmaximize: 'window:unmaximise', + minimize: 'window:minimise', + restore: 'window:restore', + resize: 'window:resize', + move: 'window:move', + 'enter-full-screen': 'window:fullscreen', + 'leave-full-screen': 'window:unfullscreen', + }; + + const wailsEvent = eventMap[event]; + if (wailsEvent) { + Events.On(wailsEvent, listener); + } else { + console.warn(`[electron-compat] BrowserWindow event '${event}' not mapped`); + } + + return this; + } + + /** + * Register a one-time event listener. + */ + once(event: string, listener: (...args: unknown[]) => void): this { + const eventMap: Record = { + close: 'window:close', + ready: 'window:ready', + }; + + const wailsEvent = eventMap[event]; + if (wailsEvent) { + Events.Once(wailsEvent, listener); + } + + return this; + } + + // ========================================================================= + // WebContents-like methods (limited support) + // ========================================================================= + + /** + * Get the webContents-like object. + * Returns a simplified interface since Wails doesn't have webContents. + */ + get webContents() { + return { + /** + * Get the current URL. + */ + getURL: (): string => { + return window.location.href; + }, + + /** + * Navigate to a URL (changes the hash route). + */ + loadURL: (url: string): void => { + if (url.startsWith('#')) { + window.location.hash = url; + } else { + window.location.href = url; + } + }, + + /** + * Reload the page. + */ + reload: (): void => { + window.location.reload(); + }, + + /** + * Open DevTools. + */ + openDevTools: (): void => { + console.log('[electron-compat] To open DevTools, use browser developer tools (F12 or Cmd+Option+I)'); + }, + + /** + * Send a message to the renderer (no-op in Wails, we ARE the renderer). + */ + send: (channel: string, ...args: unknown[]): void => { + Events.Emit({ name: channel, data: args }); + }, + }; + } +} + +// Also export as default for compatibility with some Electron patterns +export default BrowserWindow; diff --git a/cmd/lthn-desktop/frontend/src/lib/electron-compat/clipboard.ts b/cmd/lthn-desktop/frontend/src/lib/electron-compat/clipboard.ts new file mode 100644 index 0000000..719187e --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/lib/electron-compat/clipboard.ts @@ -0,0 +1,231 @@ +/** + * Electron clipboard Compatibility Layer + * + * Maps Electron's clipboard API to the browser Clipboard API. + * + * The browser's Clipboard API is async and requires user permissions, + * while Electron's is sync. This implementation uses async methods + * with fallbacks where possible. + * + * @example + * import { clipboard } from '@lib/electron-compat'; + * + * await clipboard.writeText('Hello, World!'); + * const text = await clipboard.readText(); + */ + +export const clipboard = { + /** + * Read plain text from the clipboard. + * + * @param type - Clipboard type ('selection' for Linux primary selection) + * @returns Promise resolving to clipboard text content + * + * @example + * const walletAddress = await clipboard.readText(); + */ + async readText(type?: 'selection' | 'clipboard'): Promise { + try { + return await navigator.clipboard.readText(); + } catch (error) { + console.error('[electron-compat] clipboard.readText failed:', error); + return ''; + } + }, + + /** + * Write plain text to the clipboard. + * + * @param text - The text to write + * @param type - Clipboard type ('selection' for Linux primary selection) + * + * @example + * await clipboard.writeText(walletAddress); + */ + async writeText(text: string, type?: 'selection' | 'clipboard'): Promise { + try { + await navigator.clipboard.writeText(text); + } catch (error) { + // Fallback for older browsers or when clipboard API is blocked + console.error('[electron-compat] clipboard.writeText failed:', error); + fallbackCopyText(text); + } + }, + + /** + * Read HTML content from the clipboard. + * + * @returns Promise resolving to HTML string + */ + async readHTML(): Promise { + try { + const items = await navigator.clipboard.read(); + for (const item of items) { + if (item.types.includes('text/html')) { + const blob = await item.getType('text/html'); + return await blob.text(); + } + } + return ''; + } catch (error) { + console.error('[electron-compat] clipboard.readHTML failed:', error); + return ''; + } + }, + + /** + * Write HTML content to the clipboard. + * + * @param markup - The HTML string to write + */ + async writeHTML(markup: string): Promise { + try { + const blob = new Blob([markup], { type: 'text/html' }); + await navigator.clipboard.write([ + new ClipboardItem({ + 'text/html': blob, + }), + ]); + } catch (error) { + console.error('[electron-compat] clipboard.writeHTML failed:', error); + } + }, + + /** + * Read an image from the clipboard. + * + * @returns Promise resolving to image data as data URL, or empty string + */ + async readImage(): Promise { + try { + const items = await navigator.clipboard.read(); + for (const item of items) { + const imageTypes = item.types.filter((type) => type.startsWith('image/')); + if (imageTypes.length > 0) { + const blob = await item.getType(imageTypes[0]); + return await blobToDataURL(blob); + } + } + return ''; + } catch (error) { + console.error('[electron-compat] clipboard.readImage failed:', error); + return ''; + } + }, + + /** + * Write an image to the clipboard. + * + * @param dataUrl - Image as data URL (e.g., 'data:image/png;base64,...') + */ + async writeImage(dataUrl: string): Promise { + try { + const response = await fetch(dataUrl); + const blob = await response.blob(); + await navigator.clipboard.write([ + new ClipboardItem({ + [blob.type]: blob, + }), + ]); + } catch (error) { + console.error('[electron-compat] clipboard.writeImage failed:', error); + } + }, + + /** + * Check if the clipboard has content of a specific format. + * + * @param format - MIME type to check for + * @returns Promise resolving to boolean + */ + async has(format: string): Promise { + try { + const items = await navigator.clipboard.read(); + return items.some((item) => item.types.includes(format)); + } catch { + return false; + } + }, + + /** + * Clear the clipboard. + */ + async clear(): Promise { + try { + await navigator.clipboard.writeText(''); + } catch (error) { + console.error('[electron-compat] clipboard.clear failed:', error); + } + }, + + /** + * Get available formats in the clipboard. + * + * @returns Promise resolving to array of MIME types + */ + async availableFormats(): Promise { + try { + const items = await navigator.clipboard.read(); + const formats: string[] = []; + for (const item of items) { + formats.push(...item.types); + } + return [...new Set(formats)]; + } catch { + return []; + } + }, + + // ========================================================================= + // Electron sync methods (not supported - use async versions above) + // ========================================================================= + + /** + * @deprecated Use readText() instead - sync clipboard not supported in browser + */ + readTextSync(): string { + console.warn('[electron-compat] readTextSync not supported. Use async readText() instead.'); + return ''; + }, + + /** + * @deprecated Use writeText() instead - sync clipboard not supported in browser + */ + writeTextSync(_text: string): void { + console.warn('[electron-compat] writeTextSync not supported. Use async writeText() instead.'); + }, +}; + +/** + * Fallback copy using execCommand (for older browsers). + */ +function fallbackCopyText(text: string): void { + const textArea = document.createElement('textarea'); + textArea.value = text; + textArea.style.position = 'fixed'; + textArea.style.left = '-9999px'; + textArea.style.top = '-9999px'; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + + try { + document.execCommand('copy'); + } catch (err) { + console.error('[electron-compat] Fallback copy failed:', err); + } + + document.body.removeChild(textArea); +} + +/** + * Convert a Blob to a data URL. + */ +function blobToDataURL(blob: Blob): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onloadend = () => resolve(reader.result as string); + reader.onerror = reject; + reader.readAsDataURL(blob); + }); +} diff --git a/cmd/lthn-desktop/frontend/src/lib/electron-compat/dialog.ts b/cmd/lthn-desktop/frontend/src/lib/electron-compat/dialog.ts new file mode 100644 index 0000000..9bc19c7 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/lib/electron-compat/dialog.ts @@ -0,0 +1,294 @@ +/** + * Electron dialog Compatibility Layer + * + * Maps Electron's dialog API to Wails Dialog system. + * + * Electron Concept -> Wails Equivalent: + * - dialog.showOpenDialog() -> Dialogs.Open() + * - dialog.showSaveDialog() -> Dialogs.Save() + * - dialog.showMessageBox() -> Dialogs.Info/Warning/Error/Question() + * + * @example + * import { dialog } from '@lib/electron-compat'; + * + * const result = await dialog.showOpenDialog({ + * properties: ['openFile', 'multiSelections'], + * filters: [{ name: 'Images', extensions: ['jpg', 'png'] }] + * }); + */ + +import { Dialogs } from '@wailsio/runtime'; + +export interface FileFilter { + name: string; + extensions: string[]; +} + +export interface OpenDialogOptions { + title?: string; + defaultPath?: string; + buttonLabel?: string; + filters?: FileFilter[]; + properties?: Array< + | 'openFile' + | 'openDirectory' + | 'multiSelections' + | 'showHiddenFiles' + | 'createDirectory' + | 'promptToCreate' + | 'noResolveAliases' + | 'treatPackageAsDirectory' + | 'dontAddToRecent' + >; + message?: string; +} + +export interface SaveDialogOptions { + title?: string; + defaultPath?: string; + buttonLabel?: string; + filters?: FileFilter[]; + message?: string; + nameFieldLabel?: string; + showsTagField?: boolean; + properties?: Array<'showHiddenFiles' | 'createDirectory' | 'showOverwriteConfirmation' | 'dontAddToRecent'>; +} + +export interface MessageBoxOptions { + type?: 'none' | 'info' | 'error' | 'question' | 'warning'; + buttons?: string[]; + defaultId?: number; + title?: string; + message: string; + detail?: string; + checkboxLabel?: string; + checkboxChecked?: boolean; + cancelId?: number; + noLink?: boolean; +} + +export interface OpenDialogReturnValue { + canceled: boolean; + filePaths: string[]; +} + +export interface SaveDialogReturnValue { + canceled: boolean; + filePath?: string; +} + +export interface MessageBoxReturnValue { + response: number; + checkboxChecked: boolean; +} + +/** + * Convert Electron file filters to Wails filter format + */ +function convertFilters(filters?: FileFilter[]): string { + if (!filters || filters.length === 0) return ''; + + // Wails uses pattern format: "*.jpg;*.png;*.gif" + const patterns = filters.flatMap((f) => f.extensions.map((ext) => `*.${ext}`)); + return patterns.join(';'); +} + +export const dialog = { + /** + * Show a file open dialog. + * + * @param options - Dialog configuration options + * @returns Promise resolving to selected file paths + * + * @example + * const result = await dialog.showOpenDialog({ + * title: 'Select Wallet File', + * filters: [{ name: 'Wallet', extensions: ['wallet', 'keys'] }], + * properties: ['openFile'] + * }); + * + * if (!result.canceled) { + * console.log('Selected:', result.filePaths); + * } + */ + async showOpenDialog(options: OpenDialogOptions = {}): Promise { + const props = options.properties || ['openFile']; + const isDirectory = props.includes('openDirectory'); + const allowMultiple = props.includes('multiSelections'); + + try { + let result: string | string[] | null; + + if (isDirectory) { + // Wails directory selection + result = await Dialogs.OpenDirectory({ + Title: options.title, + DefaultDirectory: options.defaultPath, + ButtonText: options.buttonLabel, + CanCreateDirectories: props.includes('createDirectory'), + }); + + // Directory dialog returns single path or null + return { + canceled: !result, + filePaths: result ? [result as string] : [], + }; + } else { + // Wails file selection + if (allowMultiple) { + result = await Dialogs.OpenMultipleFiles({ + Title: options.title, + DefaultDirectory: options.defaultPath, + DefaultFilename: '', + ButtonText: options.buttonLabel, + Filters: convertFilters(options.filters), + }); + } else { + result = await Dialogs.OpenFile({ + Title: options.title, + DefaultDirectory: options.defaultPath, + DefaultFilename: '', + ButtonText: options.buttonLabel, + Filters: convertFilters(options.filters), + }); + } + + // Normalize to array + const filePaths = result + ? Array.isArray(result) + ? result + : [result] + : []; + + return { + canceled: filePaths.length === 0, + filePaths, + }; + } + } catch (error) { + console.error('[electron-compat] showOpenDialog error:', error); + return { canceled: true, filePaths: [] }; + } + }, + + /** + * Show a file save dialog. + * + * @param options - Dialog configuration options + * @returns Promise resolving to the selected save path + * + * @example + * const result = await dialog.showSaveDialog({ + * title: 'Export Keys', + * defaultPath: 'my-wallet.keys', + * filters: [{ name: 'Keys', extensions: ['keys'] }] + * }); + * + * if (!result.canceled) { + * console.log('Saving to:', result.filePath); + * } + */ + async showSaveDialog(options: SaveDialogOptions = {}): Promise { + try { + const result = await Dialogs.SaveFile({ + Title: options.title, + DefaultDirectory: options.defaultPath ? options.defaultPath.split('/').slice(0, -1).join('/') : undefined, + DefaultFilename: options.defaultPath ? options.defaultPath.split('/').pop() : undefined, + ButtonText: options.buttonLabel, + Filters: convertFilters(options.filters), + CanCreateDirectories: options.properties?.includes('createDirectory'), + }); + + return { + canceled: !result, + filePath: result || undefined, + }; + } catch (error) { + console.error('[electron-compat] showSaveDialog error:', error); + return { canceled: true }; + } + }, + + /** + * Show a message box dialog. + * + * @param options - Message box configuration + * @returns Promise resolving to the button index clicked + * + * @example + * const result = await dialog.showMessageBox({ + * type: 'question', + * buttons: ['Yes', 'No', 'Cancel'], + * title: 'Confirm', + * message: 'Are you sure you want to delete this wallet?', + * detail: 'This action cannot be undone.' + * }); + * + * if (result.response === 0) { + * // User clicked "Yes" + * } + */ + async showMessageBox(options: MessageBoxOptions): Promise { + try { + // Map Electron dialog types to Wails dialog methods + const dialogType = options.type || 'info'; + const buttons = options.buttons || ['OK']; + + // Wails has separate methods for each dialog type + let dialogPromise: Promise; + + const dialogOptions = { + Title: options.title || '', + Message: options.message, + // Note: Wails dialogs don't support custom buttons in the same way + // This is a simplified implementation + }; + + switch (dialogType) { + case 'error': + dialogPromise = Dialogs.Error(dialogOptions); + break; + case 'warning': + dialogPromise = Dialogs.Warning(dialogOptions); + break; + case 'question': + dialogPromise = Dialogs.Question(dialogOptions); + break; + case 'info': + case 'none': + default: + dialogPromise = Dialogs.Info(dialogOptions); + break; + } + + const result = await dialogPromise; + + // Map Wails result to Electron-style response + // Wails Question returns "Yes", "No", etc. + const responseIndex = buttons.findIndex( + (b) => b.toLowerCase() === (result || '').toLowerCase() + ); + + return { + response: responseIndex >= 0 ? responseIndex : 0, + checkboxChecked: false, // Wails doesn't support checkboxes in dialogs + }; + } catch (error) { + console.error('[electron-compat] showMessageBox error:', error); + return { response: 0, checkboxChecked: false }; + } + }, + + /** + * Show an error dialog (synchronous in Electron, async here). + * + * @param title - Dialog title + * @param content - Error message content + */ + async showErrorBox(title: string, content: string): Promise { + await Dialogs.Error({ + Title: title, + Message: content, + }); + }, +}; diff --git a/cmd/lthn-desktop/frontend/src/lib/electron-compat/index.ts b/cmd/lthn-desktop/frontend/src/lib/electron-compat/index.ts new file mode 100644 index 0000000..098306c --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/lib/electron-compat/index.ts @@ -0,0 +1,28 @@ +/** + * Electron Compatibility Layer for Wails v3 + * + * This module provides Electron-like APIs that map to Wails runtime equivalents. + * It's designed to help developers familiar with Electron contribute to this + * Wails-based application without needing to learn the Wails API from scratch. + * + * Usage: + * import { ipcRenderer, shell, dialog, app } from '@lib/electron-compat'; + * + * // Works like Electron! + * ipcRenderer.invoke('my-channel', data); + * shell.openExternal('https://lethean.io'); + * + * @see https://wails.io/docs/reference/runtime/intro + * @see https://www.electronjs.org/docs/latest/api/ipc-renderer + */ + +export { ipcRenderer } from './ipc-renderer'; +export { shell } from './shell'; +export { dialog } from './dialog'; +export { app } from './app'; +export { clipboard } from './clipboard'; +export { BrowserWindow } from './browser-window'; + +// Re-export types for TypeScript users +export type { IpcRendererEvent, IpcMainInvokeEvent } from './ipc-renderer'; +export type { OpenDialogOptions, SaveDialogOptions, MessageBoxOptions } from './dialog'; diff --git a/cmd/lthn-desktop/frontend/src/lib/electron-compat/ipc-renderer.ts b/cmd/lthn-desktop/frontend/src/lib/electron-compat/ipc-renderer.ts new file mode 100644 index 0000000..cc202b2 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/lib/electron-compat/ipc-renderer.ts @@ -0,0 +1,274 @@ +/** + * Electron ipcRenderer Compatibility Layer + * + * Maps Electron's ipcRenderer API to Wails Events and Call system. + * + * Electron Concept -> Wails Equivalent: + * - ipcRenderer.send() -> Events.Emit() (fire-and-forget) + * - ipcRenderer.invoke() -> Call() to bound Go methods (returns Promise) + * - ipcRenderer.on() -> Events.On() (subscribe to events) + * - ipcRenderer.once() -> Events.Once() (one-time subscription) + * + * @example + * // Electron style: + * const result = await ipcRenderer.invoke('blockchain:fetchBlock', blockId); + * + * // This maps to Wails: + * const result = await Call.ByName('blockchain.Service.FetchBlockData', blockId); + */ + +import { Events, Call } from '@wailsio/runtime'; + +/** + * Event object passed to listeners (Electron compatibility) + */ +export interface IpcRendererEvent { + sender: unknown; + /** The event name/channel */ + channel: string; +} + +export interface IpcMainInvokeEvent extends IpcRendererEvent { + /** Frame ID - not applicable in Wails, always -1 */ + frameId: number; +} + +type IpcListener = (event: IpcRendererEvent, ...args: unknown[]) => void; + +// Store for managing event subscriptions (Wails returns cancel functions) +const listenerMap = new Map void>>(); + +/** + * Electron-compatible ipcRenderer implementation backed by Wails runtime + */ +export const ipcRenderer = { + /** + * Send a message to the main process (fire-and-forget). + * In Wails, this emits an event that Go handlers can listen to. + * + * @param channel - The event channel name + * @param args - Arguments to send + * + * @example + * ipcRenderer.send('user:logout'); + * ipcRenderer.send('analytics:track', { event: 'pageView', page: '/home' }); + */ + send(channel: string, ...args: unknown[]): void { + Events.Emit({ name: channel, data: args.length === 1 ? args[0] : args }); + }, + + /** + * Send a message and wait for a response (Promise-based). + * Maps to calling bound Go service methods. + * + * IMPORTANT: Channel format determines the Go method called: + * - 'service:method' -> Attempts to call Service.Method() + * - 'package.Service.Method' -> Direct Wails binding call + * + * @param channel - The channel/method identifier + * @param args - Arguments to pass to the Go method + * @returns Promise resolving to the Go method's return value + * + * @example + * // Call blockchain service + * const block = await ipcRenderer.invoke('blockchain:fetchBlockData', '12345'); + * + * // Or use direct Wails binding path + * const block = await ipcRenderer.invoke('blockchain.Service.FetchBlockData', '12345'); + */ + async invoke(channel: string, ...args: unknown[]): Promise { + // Convert electron-style 'service:method' to Wails binding path + const bindingPath = convertChannelToBinding(channel); + + try { + // Call the bound Go method + const result = await Call.ByName(bindingPath, ...args); + return result as T; + } catch (error) { + // Wrap in Electron-like error format + throw new Error(`Error invoking '${channel}': ${error}`); + } + }, + + /** + * Subscribe to messages from the main process. + * + * @param channel - The event channel to listen on + * @param listener - Callback function receiving (event, ...args) + * @returns this (for chaining) + * + * @example + * ipcRenderer.on('mining:hashrate-update', (event, hashrate) => { + * console.log('New hashrate:', hashrate); + * }); + */ + on(channel: string, listener: IpcListener): typeof ipcRenderer { + const wrappedListener = (data: unknown) => { + const event: IpcRendererEvent = { sender: null, channel }; + const args = Array.isArray(data) ? data : [data]; + listener(event, ...args); + }; + + // Wails Events.On returns a cancel function + const cancel = Events.On(channel, wrappedListener); + + // Store the mapping so we can remove it later + if (!listenerMap.has(channel)) { + listenerMap.set(channel, new Map()); + } + listenerMap.get(channel)!.set(listener, cancel); + + return this; + }, + + /** + * Subscribe to a single message, then auto-unsubscribe. + * + * @param channel - The event channel to listen on + * @param listener - Callback function receiving (event, ...args) + * @returns this (for chaining) + * + * @example + * ipcRenderer.once('app:ready', (event) => { + * console.log('App is ready!'); + * }); + */ + once(channel: string, listener: IpcListener): typeof ipcRenderer { + const wrappedListener = (data: unknown) => { + const event: IpcRendererEvent = { sender: null, channel }; + const args = Array.isArray(data) ? data : [data]; + listener(event, ...args); + }; + + Events.Once(channel, wrappedListener); + return this; + }, + + /** + * Remove a specific listener from a channel. + * + * @param channel - The event channel + * @param listener - The listener function to remove + * @returns this (for chaining) + */ + removeListener(channel: string, listener: IpcListener): typeof ipcRenderer { + const channelListeners = listenerMap.get(channel); + if (channelListeners) { + const cancel = channelListeners.get(listener); + if (cancel) { + cancel(); // Call the Wails cancel function + channelListeners.delete(listener); + } + } + return this; + }, + + /** + * Remove all listeners for a channel (or all channels if none specified). + * + * @param channel - Optional channel to clear; if omitted, clears all + * @returns this (for chaining) + */ + removeAllListeners(channel?: string): typeof ipcRenderer { + if (channel) { + const channelListeners = listenerMap.get(channel); + if (channelListeners) { + channelListeners.forEach((cancel) => cancel()); + listenerMap.delete(channel); + } + } else { + listenerMap.forEach((channelListeners) => { + channelListeners.forEach((cancel) => cancel()); + }); + listenerMap.clear(); + } + return this; + }, + + /** + * Send a synchronous message (NOT RECOMMENDED). + * Wails doesn't support sync IPC - this throws an error. + * + * @deprecated Use invoke() instead for request/response patterns + * @throws Always throws - sync IPC not supported in Wails + */ + sendSync(_channel: string, ..._args: unknown[]): never { + throw new Error( + 'sendSync is not supported in Wails. Use ipcRenderer.invoke() for request/response patterns.' + ); + }, + + /** + * Post a message to a specific frame (NOT APPLICABLE). + * Wails doesn't have the same frame concept as Electron. + * + * @deprecated Not applicable in Wails architecture + */ + postMessage(_channel: string, _message: unknown, _transfer?: unknown[]): void { + console.warn('postMessage is not applicable in Wails. Use send() or invoke() instead.'); + }, +}; + +/** + * Convert Electron-style channel names to Wails binding paths. + * + * Examples: + * - 'blockchain:fetchBlockData' -> 'github.com/letheanVPN/desktop/services/blockchain.Service.FetchBlockData' + * - 'config:get' -> 'github.com/letheanVPN/desktop/services/core/config.Service.Get' + * - 'mining.Service.Start' -> 'github.com/letheanVPN/desktop/services/mining.Service.Start' + * + * Add your own mappings in the channelMappings object below! + */ +function convertChannelToBinding(channel: string): string { + // If it already looks like a binding path, use it directly + if (channel.includes('.') && !channel.includes(':')) { + return channel; + } + + // Known service mappings - ADD YOUR MAPPINGS HERE + const channelMappings: Record = { + // Blockchain service + 'blockchain:fetchBlockData': 'github.com/letheanVPN/desktop/services/blockchain.Service.FetchBlockData', + 'blockchain:start': 'github.com/letheanVPN/desktop/services/blockchain.Service.Start', + 'blockchain:install': 'github.com/letheanVPN/desktop/services/blockchain.Service.Install', + + // Config service + 'config:get': 'github.com/letheanVPN/desktop/services/core/config.Service.Get', + 'config:isFeatureEnabled': 'github.com/letheanVPN/desktop/services/core/config.Service.IsFeatureEnabled', + + // Display service + 'display:showEnvironmentDialog': 'github.com/letheanVPN/desktop/services/core/display.Service.ShowEnvironmentDialog', + 'display:openWindow': 'github.com/letheanVPN/desktop/services/core/display.Service.OpenWindow', + + // Mining service + 'mining:start': 'github.com/letheanVPN/desktop/services/mining.Service.Start', + 'mining:stop': 'github.com/letheanVPN/desktop/services/mining.Service.Stop', + 'mining:getStats': 'github.com/letheanVPN/desktop/services/mining.Service.GetStats', + + // i18n service + 'i18n:translate': 'github.com/letheanVPN/desktop/services/core/i18n.Service.Translate', + + // Docs service + 'docs:openDocsWindow': 'github.com/letheanVPN/desktop/services/docs.Service.OpenDocsWindow', + }; + + const mapped = channelMappings[channel.toLowerCase()] || channelMappings[channel]; + if (mapped) { + return mapped; + } + + // Auto-convert 'service:method' pattern + // e.g., 'blockchain:fetchBlock' -> 'blockchain.Service.FetchBlock' + const [service, method] = channel.split(':'); + if (service && method) { + const pascalMethod = method.charAt(0).toUpperCase() + method.slice(1); + console.warn( + `[electron-compat] Auto-converting channel '${channel}'. ` + + `Consider adding an explicit mapping for better reliability.` + ); + return `${service}.Service.${pascalMethod}`; + } + + // Fallback: return as-is and let Wails handle the error + return channel; +} diff --git a/cmd/lthn-desktop/frontend/src/lib/electron-compat/shell.ts b/cmd/lthn-desktop/frontend/src/lib/electron-compat/shell.ts new file mode 100644 index 0000000..0607216 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/lib/electron-compat/shell.ts @@ -0,0 +1,204 @@ +/** + * Electron shell Compatibility Layer + * + * Maps Electron's shell API to Wails Browser/runtime equivalents. + * + * Electron Concept -> Wails Equivalent: + * - shell.openExternal() -> Browser.OpenURL() + * - shell.openPath() -> Runtime call to Go's os/exec + * - shell.showItemInFolder() -> Runtime call to Go's file manager + * + * @example + * import { shell } from '@lib/electron-compat'; + * + * shell.openExternal('https://lethean.io'); + * shell.showItemInFolder('/path/to/file.txt'); + */ + +import { Browser, Call } from '@wailsio/runtime'; + +export const shell = { + /** + * Open a URL in the user's default browser. + * + * @param url - The URL to open + * @param _options - Electron options (ignored in Wails) + * @returns Promise that resolves when the URL is opened + * + * @example + * await shell.openExternal('https://github.com/letheanVPN/desktop'); + * await shell.openExternal('mailto:support@lethean.io'); + */ + async openExternal(url: string, _options?: { activate?: boolean }): Promise { + Browser.OpenURL(url); + }, + + /** + * Open a file or folder with the system's default application. + * + * NOTE: This requires a Go backend method to be implemented. + * See the comment below for the Go implementation. + * + * @param path - The path to open + * @returns Promise resolving to an error string (empty if success) + * + * @example + * const error = await shell.openPath('/Users/me/Documents/file.pdf'); + * if (error) console.error('Failed to open:', error); + */ + async openPath(path: string): Promise { + try { + // This needs a Go backend method - see shell_backend.go below + await Call.ByName('github.com/letheanVPN/desktop/services/core/shell.Service.OpenPath', path); + return ''; + } catch (error) { + return String(error); + } + }, + + /** + * Show a file in its parent folder with the file selected. + * + * NOTE: This requires a Go backend method to be implemented. + * See the comment below for the Go implementation. + * + * @param fullPath - The full path to the file + * + * @example + * shell.showItemInFolder('/Users/me/Downloads/blockchain.dat'); + */ + async showItemInFolder(fullPath: string): Promise { + try { + // This needs a Go backend method - see shell_backend.go below + await Call.ByName('github.com/letheanVPN/desktop/services/core/shell.Service.ShowItemInFolder', fullPath); + } catch (error) { + console.error('[electron-compat] showItemInFolder failed:', error); + } + }, + + /** + * Move a file to the system trash/recycle bin. + * + * NOTE: This requires a Go backend method to be implemented. + * + * @param fullPath - The full path to the file + * @returns Promise resolving to void + * + * @example + * await shell.trashItem('/Users/me/old-file.txt'); + */ + async trashItem(fullPath: string): Promise { + try { + await Call.ByName('github.com/letheanVPN/desktop/services/core/shell.Service.TrashItem', fullPath); + } catch (error) { + throw new Error(`Failed to trash item: ${error}`); + } + }, + + /** + * Play the system beep sound. + */ + beep(): void { + // Use the Web Audio API as a fallback + try { + const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)(); + const oscillator = audioContext.createOscillator(); + oscillator.type = 'sine'; + oscillator.frequency.value = 800; + oscillator.connect(audioContext.destination); + oscillator.start(); + oscillator.stop(audioContext.currentTime + 0.1); + } catch { + console.log('\u0007'); // ASCII bell character fallback + } + }, + + /** + * Read a shortcut file (Windows .lnk files). + * Not applicable on macOS/Linux. + * + * @deprecated Platform-specific, not implemented in Wails + */ + readShortcutLink(_shortcutPath: string): { target: string } { + console.warn('[electron-compat] readShortcutLink is Windows-only and not implemented'); + return { target: '' }; + }, + + /** + * Write a shortcut file (Windows .lnk files). + * Not applicable on macOS/Linux. + * + * @deprecated Platform-specific, not implemented in Wails + */ + writeShortcutLink(_shortcutPath: string, _options: unknown): boolean { + console.warn('[electron-compat] writeShortcutLink is Windows-only and not implemented'); + return false; + }, +}; + +/* + * ============================================================================= + * GO BACKEND IMPLEMENTATION REQUIRED + * ============================================================================= + * + * Create this file at: services/core/shell/service.go + * + * ```go + * package shell + * + * import ( + * "os/exec" + * "runtime" + * ) + * + * type Service struct{} + * + * func NewService() *Service { + * return &Service{} + * } + * + * // OpenPath opens a file or folder with the system default application. + * func (s *Service) OpenPath(path string) error { + * var cmd *exec.Cmd + * switch runtime.GOOS { + * case "darwin": + * cmd = exec.Command("open", path) + * case "linux": + * cmd = exec.Command("xdg-open", path) + * case "windows": + * cmd = exec.Command("cmd", "/c", "start", "", path) + * } + * return cmd.Start() + * } + * + * // ShowItemInFolder opens the folder containing the file and selects it. + * func (s *Service) ShowItemInFolder(path string) error { + * var cmd *exec.Cmd + * switch runtime.GOOS { + * case "darwin": + * cmd = exec.Command("open", "-R", path) + * case "linux": + * cmd = exec.Command("xdg-open", filepath.Dir(path)) + * case "windows": + * cmd = exec.Command("explorer", "/select,", path) + * } + * return cmd.Start() + * } + * + * // TrashItem moves a file to the system trash. + * func (s *Service) TrashItem(path string) error { + * switch runtime.GOOS { + * case "darwin": + * return exec.Command("osascript", "-e", + * `tell application "Finder" to delete POSIX file "`+path+`"`).Run() + * case "linux": + * return exec.Command("gio", "trash", path).Run() + * case "windows": + * // Windows requires PowerShell or COM for trash + * return exec.Command("powershell", "-Command", + * `Add-Type -AssemblyName Microsoft.VisualBasic; [Microsoft.VisualBasic.FileIO.FileSystem]::DeleteFile('`+path+`','OnlyErrorDialogs','SendToRecycleBin')`).Run() + * } + * return nil + * } + * ``` + */ diff --git a/cmd/lthn-desktop/frontend/src/main.server.ts b/cmd/lthn-desktop/frontend/src/main.server.ts new file mode 100644 index 0000000..723e001 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/main.server.ts @@ -0,0 +1,8 @@ +import { BootstrapContext, bootstrapApplication } from '@angular/platform-browser'; +import { App } from './app/app'; +import { config } from './app/app.config.server'; + +const bootstrap = (context: BootstrapContext) => + bootstrapApplication(App, config, context); + +export default bootstrap; diff --git a/cmd/lthn-desktop/frontend/src/main.ts b/cmd/lthn-desktop/frontend/src/main.ts new file mode 100644 index 0000000..6d4e152 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/main.ts @@ -0,0 +1,7 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { appConfig } from './app/app.config'; +import { AppComponent } from './app/app.component'; + +bootstrapApplication(AppComponent, appConfig) + .catch((err) => console.error(err)); + diff --git a/cmd/lthn-desktop/frontend/src/polyfills.ts b/cmd/lthn-desktop/frontend/src/polyfills.ts new file mode 100644 index 0000000..20adc4b --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/polyfills.ts @@ -0,0 +1,4 @@ +// This file includes polyfills needed by Angular and is loaded before the app. +// You can add your own extra polyfills to this file. + +import 'zone.js'; // Included with Angular CLI. diff --git a/cmd/lthn-desktop/frontend/src/server.ts b/cmd/lthn-desktop/frontend/src/server.ts new file mode 100644 index 0000000..e6546c4 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/server.ts @@ -0,0 +1,68 @@ +import { + AngularNodeAppEngine, + createNodeRequestHandler, + isMainModule, + writeResponseToNodeResponse, +} from '@angular/ssr/node'; +import express from 'express'; +import { join } from 'node:path'; + +const browserDistFolder = join(import.meta.dirname, '../browser'); + +const app = express(); +const angularApp = new AngularNodeAppEngine(); + +/** + * Example Express Rest API endpoints can be defined here. + * Uncomment and define endpoints as necessary. + * + * Example: + * ```ts + * app.get('/api/{*splat}', (req, res) => { + * // Handle API request + * }); + * ``` + */ + +/** + * Serve static files from /browser + */ +app.use( + express.static(browserDistFolder, { + maxAge: '1y', + index: false, + redirect: false, + }), +); + +/** + * Handle all other requests by rendering the Angular application. + */ +app.use((req, res, next) => { + angularApp + .handle(req) + .then((response) => + response ? writeResponseToNodeResponse(response, res) : next(), + ) + .catch(next); +}); + +/** + * Start the server if this module is the main entry point. + * The server listens on the port defined by the `PORT` environment variable, or defaults to 4000. + */ +if (isMainModule(import.meta.url)) { + const port = process.env['PORT'] || 4000; + app.listen(port, (error) => { + if (error) { + throw error; + } + + console.log(`Node Express server listening on http://localhost:${port}`); + }); +} + +/** + * Request handler used by the Angular CLI (for dev-server and during build) or Firebase Cloud Functions. + */ +export const reqHandler = createNodeRequestHandler(app); diff --git a/cmd/lthn-desktop/frontend/src/styles.css b/cmd/lthn-desktop/frontend/src/styles.css new file mode 100644 index 0000000..0ce01c7 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/styles.css @@ -0,0 +1,13 @@ +@import "@awesome.me/webawesome/dist/styles/webawesome.css"; +@import "@awesome.me/webawesome/dist/styles/themes/premium.css"; +@import "@awesome.me/webawesome/dist/styles/native.css"; +@import "@awesome.me/webawesome/dist/styles/utilities.css"; +@import "@awesome.me/webawesome/dist/styles/color/palettes/vogue.css"; +html, +body { + min-height: 100%; + height: 100%; + padding: 0; + margin: 0; +} + diff --git a/cmd/lthn-desktop/frontend/src/styles.scss b/cmd/lthn-desktop/frontend/src/styles.scss new file mode 100644 index 0000000..34d4530 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/styles.scss @@ -0,0 +1,11 @@ +@use "tailwindcss"; +@import "@fortawesome/fontawesome-free/css/fontawesome.min.css"; +@import "@fortawesome/fontawesome-free/css/brands.min.css"; +@import "@fortawesome/fontawesome-free/css/regular.min.css"; +@import "@fortawesome/fontawesome-free/css/solid.min.css"; + +html { + height: 100%; + overflow: hidden; +} +/* You can add your own global styles here */ diff --git a/cmd/lthn-desktop/frontend/src/test.ts b/cmd/lthn-desktop/frontend/src/test.ts new file mode 100644 index 0000000..9d201be --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/test.ts @@ -0,0 +1,38 @@ +import 'zone.js/testing'; +import { TestBed } from '@angular/core/testing'; +import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; +import { TranslateService, TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { Observable, of } from 'rxjs'; + +// Provide TranslateService mock globally for tests to avoid NG0201 in standalone components +(() => { + class FakeTranslateLoader implements TranslateLoader { + getTranslation(lang: string): Observable { return of({}); } + } + + const translateServiceMock: Partial = { + use: (() => ({ toPromise: async () => undefined })) as any, + instant: ((key: string) => key) as any, + get: (((key: any) => ({ subscribe: (fn: any) => fn(key) })) as any), + onLangChange: { subscribe: () => ({ unsubscribe() {} }) } as any, + } as Partial; + + // Patch TestBed.configureTestingModule to always include Translate support + const originalConfigure = TestBed.configureTestingModule.bind(TestBed); + (TestBed as any).configureTestingModule = (meta: any = {}) => { + // Ensure providers include TranslateService mock if not already provided + const providers = meta.providers ?? []; + const hasTranslateProvider = providers.some((p: any) => p && (p.provide === TranslateService)); + meta.providers = hasTranslateProvider ? providers : [...providers, { provide: TranslateService, useValue: translateServiceMock }]; + + // Ensure imports include TranslateModule.forRoot with a fake loader (brings internal _TranslateService) + const imports = meta.imports ?? []; + const hasTranslateModule = imports.some((imp: any) => imp && (imp === TranslateModule || (imp.ngModule && imp.ngModule === TranslateModule))); + if (!hasTranslateModule) { + imports.push(TranslateModule.forRoot({ loader: { provide: TranslateLoader, useClass: FakeTranslateLoader } })); + } + meta.imports = imports; + + return originalConfigure(meta); + }; +})(); diff --git a/cmd/lthn-desktop/frontend/src/testing/gbu.ts b/cmd/lthn-desktop/frontend/src/testing/gbu.ts new file mode 100644 index 0000000..baa66c5 --- /dev/null +++ b/cmd/lthn-desktop/frontend/src/testing/gbu.ts @@ -0,0 +1,31 @@ +// Good/Bad/Ugly test helpers for Jasmine +// Usage: +// import { itGood, itBad, itUgly, trio } from 'src/testing/gbu'; +// itGood('does X', () => { /* ... */ }); +// trio('feature does Y', { +// good: () => { /* ... */ }, +// bad: () => { /* ... */ }, +// ugly: () => { /* ... */ }, +// }); + +export function suffix(base: string, tag: 'Good' | 'Bad' | 'Ugly'): string { + return `${base}_${tag}`; +} + +export function itGood(name: string, fn: jasmine.ImplementationCallback, timeout?: number): void { + it(suffix(name, 'Good'), fn, timeout as any); +} + +export function itBad(name: string, fn: jasmine.ImplementationCallback, timeout?: number): void { + it(suffix(name, 'Bad'), fn, timeout as any); +} + +export function itUgly(name: string, fn: jasmine.ImplementationCallback, timeout?: number): void { + it(suffix(name, 'Ugly'), fn, timeout as any); +} + +export function trio(name: string, impls: { good: () => void; bad: () => void; ugly: () => void; }): void { + itGood(name, impls.good); + itBad(name, impls.bad); + itUgly(name, impls.ugly); +} diff --git a/cmd/lthn-desktop/frontend/tsconfig.app.json b/cmd/lthn-desktop/frontend/tsconfig.app.json new file mode 100644 index 0000000..a0f9842 --- /dev/null +++ b/cmd/lthn-desktop/frontend/tsconfig.app.json @@ -0,0 +1,21 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [ + "node" + ] + }, + "files": [ + "src/main.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.d.ts" + ], + "exclude": [ + "src/**/*.spec.ts" + ] +} diff --git a/cmd/lthn-desktop/frontend/tsconfig.json b/cmd/lthn-desktop/frontend/tsconfig.json new file mode 100644 index 0000000..add582d --- /dev/null +++ b/cmd/lthn-desktop/frontend/tsconfig.json @@ -0,0 +1,56 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "paths": { + "@bindings/*": [ + "bindings/*" + ], + "@lthn/ide/*": [ + "bindings/github.com/Snider/Core/pkg/ide/*" + ], + "@lthn/docs/*": [ + "bindings/github.com/Snider/Core/pkg/docs/*" + ], + "@lthn/core/*": [ + "bindings/github.com/Snider/Core/pkg/*" + ], + "@lthn/*": [ + "bindings/github.com/letheanVPN/desktop/services/*" + ], + "@lib/*": [ + "src/lib/*" + ] + }, + "allowJs": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "skipLibCheck": true, + "isolatedModules": true, + "experimentalDecorators": true, + "importHelpers": true, + "target": "ES2022", + "module": "preserve" + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "typeCheckHostBindings": true, + "strictTemplates": true + }, + "files": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/cmd/lthn-desktop/frontend/tsconfig.spec.json b/cmd/lthn-desktop/frontend/tsconfig.spec.json new file mode 100644 index 0000000..04df34c --- /dev/null +++ b/cmd/lthn-desktop/frontend/tsconfig.spec.json @@ -0,0 +1,14 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine" + ] + }, + "include": [ + "src/**/*.ts" + ] +} diff --git a/cmd/lthn-desktop/go.mod b/cmd/lthn-desktop/go.mod new file mode 100644 index 0000000..8cf464a --- /dev/null +++ b/cmd/lthn-desktop/go.mod @@ -0,0 +1,120 @@ +module lthn-desktop + +go 1.25.5 + +require ( + github.com/Snider/Core v0.0.0-00010101000000-000000000000 + github.com/Snider/Core/pkg/display v0.0.0 + github.com/Snider/Core/pkg/mcp v0.0.0-00010101000000-000000000000 + github.com/Snider/Core/pkg/webview v0.0.0-00010101000000-000000000000 + github.com/Snider/Core/pkg/ws v0.0.0-00010101000000-000000000000 + github.com/gorilla/websocket v1.5.3 + github.com/wailsapp/wails/v3 v3.0.0-alpha.41 +) + +replace ( + github.com/Snider/Core => ../../ + github.com/Snider/Core/pkg/config => ../../pkg/config + github.com/Snider/Core/pkg/core => ../../pkg/core + github.com/Snider/Core/pkg/crypt => ../../pkg/crypt + github.com/Snider/Core/pkg/display => ../../pkg/display + github.com/Snider/Core/pkg/docs => ../../pkg/docs + github.com/Snider/Core/pkg/help => ../../pkg/help + github.com/Snider/Core/pkg/i18n => ../../pkg/i18n + github.com/Snider/Core/pkg/ide => ../../pkg/ide + github.com/Snider/Core/pkg/io => ../../pkg/io + github.com/Snider/Core/pkg/mcp => ../../pkg/mcp + github.com/Snider/Core/pkg/module => ../../pkg/module + github.com/Snider/Core/pkg/plugin => ../../pkg/plugin + github.com/Snider/Core/pkg/process => ../../pkg/process + github.com/Snider/Core/pkg/runtime => ../../pkg/runtime + github.com/Snider/Core/pkg/webview => ../../pkg/webview + github.com/Snider/Core/pkg/workspace => ../../pkg/workspace + github.com/Snider/Core/pkg/ws => ../../pkg/ws +) + +require ( + dario.cat/mergo v1.0.2 // indirect + git.sr.ht/~jackmordaunt/go-toast/v2 v2.0.3 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/ProtonMail/go-crypto v1.3.0 // indirect + github.com/Snider/Core/pkg/config v0.0.0-00010101000000-000000000000 // indirect + github.com/Snider/Core/pkg/core v0.0.0 // indirect + github.com/Snider/Core/pkg/docs v0.0.0-00010101000000-000000000000 // indirect + github.com/Snider/Core/pkg/help v0.0.0-00010101000000-000000000000 // indirect + github.com/Snider/Core/pkg/i18n v0.0.0-00010101000000-000000000000 // indirect + github.com/Snider/Core/pkg/ide v0.0.0-00010101000000-000000000000 // indirect + github.com/Snider/Core/pkg/module v0.0.0-00010101000000-000000000000 // indirect + github.com/Snider/Core/pkg/process v0.0.0-00010101000000-000000000000 // indirect + github.com/Snider/Enchantrix v0.0.2 // indirect + github.com/adrg/xdg v0.5.3 // indirect + github.com/bep/debounce v1.2.1 // indirect + github.com/bytedance/sonic v1.14.0 // indirect + github.com/bytedance/sonic/loader v0.3.0 // indirect + github.com/cloudflare/circl v1.6.1 // indirect + github.com/cloudwego/base64x v0.1.6 // indirect + github.com/cyphar/filepath-securejoin v0.6.1 // indirect + github.com/ebitengine/purego v0.9.1 // indirect + github.com/emirpasic/gods v1.18.1 // indirect + github.com/gabriel-vasile/mimetype v1.4.8 // indirect + github.com/gin-contrib/sse v1.1.0 // indirect + github.com/gin-gonic/gin v1.11.0 // indirect + github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect + github.com/go-git/go-billy/v5 v5.6.2 // indirect + github.com/go-git/go-git/v5 v5.16.4 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.27.0 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/goccy/go-yaml v1.18.0 // indirect + github.com/godbus/dbus/v5 v5.2.0 // indirect + github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect + github.com/google/jsonschema-go v0.3.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/jchv/go-winloader v0.0.0-20250406163304-c1995be93bd1 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/kevinburke/ssh_config v1.4.0 // indirect + github.com/klauspost/cpuid/v2 v2.3.0 // indirect + github.com/leaanthony/go-ansi-parser v1.6.1 // indirect + github.com/leaanthony/u v1.1.1 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/lmittmann/tint v1.1.2 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/modelcontextprotocol/go-sdk v1.2.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/nicksnyder/go-i18n/v2 v2.6.1 // indirect + github.com/pelletier/go-toml/v2 v2.2.4 // indirect + github.com/pjbgf/sha1cd v0.5.0 // indirect + github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/quic-go/qpack v0.5.1 // indirect + github.com/quic-go/quic-go v0.54.0 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/samber/lo v1.52.0 // indirect + github.com/sergi/go-diff v1.4.0 // indirect + github.com/skeema/knownhosts v1.3.2 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.3.0 // indirect + github.com/wailsapp/go-webview2 v1.0.23 // indirect + github.com/wailsapp/mimetype v1.4.1 // indirect + github.com/xanzy/ssh-agent v0.3.3 // indirect + github.com/yosida95/uritemplate/v3 v3.0.2 // indirect + go.uber.org/mock v0.5.0 // indirect + golang.org/x/arch v0.20.0 // indirect + golang.org/x/crypto v0.45.0 // indirect + golang.org/x/mod v0.30.0 // indirect + golang.org/x/net v0.47.0 // indirect + golang.org/x/oauth2 v0.33.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/text v0.32.0 // indirect + golang.org/x/tools v0.39.0 // indirect + google.golang.org/protobuf v1.36.9 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect +) diff --git a/cmd/lthn-desktop/go.sum b/cmd/lthn-desktop/go.sum new file mode 100644 index 0000000..222660a --- /dev/null +++ b/cmd/lthn-desktop/go.sum @@ -0,0 +1,235 @@ +dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= +dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= +git.sr.ht/~jackmordaunt/go-toast/v2 v2.0.3 h1:N3IGoHHp9pb6mj1cbXbuaSXV/UMKwmbKLf53nQmtqMA= +git.sr.ht/~jackmordaunt/go-toast/v2 v2.0.3/go.mod h1:QtOLZGz8olr4qH2vWK0QH0w0O4T9fEIjMuWpKUsH7nc= +github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= +github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw= +github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE= +github.com/Snider/Enchantrix v0.0.2 h1:ExZQiBhfS/p/AHFTKhY80TOd+BXZjK95EzByAEgwvjs= +github.com/Snider/Enchantrix v0.0.2/go.mod h1:CtFcLAvnDT1KcuF1JBb/DJj0KplY8jHryO06KzQ1hsQ= +github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78= +github.com/adrg/xdg v0.5.3/go.mod h1:nlTsY+NNiCBGCK2tpm09vRqfVzrc2fLmXGpBLF0zlTQ= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= +github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= +github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ= +github.com/bytedance/sonic v1.14.0/go.mod h1:WoEbx8WTcFJfzCe0hbmyTGrfjt8PzNEBdxlNUO24NhA= +github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA= +github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= +github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= +github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= +github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= +github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= +github.com/cyphar/filepath-securejoin v0.6.1 h1:5CeZ1jPXEiYt3+Z6zqprSAgSWiggmpVyciv8syjIpVE= +github.com/cyphar/filepath-securejoin v0.6.1/go.mod h1:A8hd4EnAeyujCJRrICiOWqjS1AX0a9kM5XL+NwKoYSc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/ebitengine/purego v0.9.1 h1:a/k2f2HQU3Pi399RPW1MOaZyhKJL9w/xFpKAg4q1s0A= +github.com/ebitengine/purego v0.9.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o= +github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= +github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= +github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w= +github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM= +github.com/gin-gonic/gin v1.11.0 h1:OW/6PLjyusp2PPXtyxKHU0RbX6I/l28FTdDlae5ueWk= +github.com/gin-gonic/gin v1.11.0/go.mod h1:+iq/FyxlGzII0KHiBGjuNn4UNENUlKbGlNmc+W50Dls= +github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= +github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= +github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= +github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= +github.com/go-git/go-git/v5 v5.16.4 h1:7ajIEZHZJULcyJebDLo99bGgS0jRrOxzZG4uCk2Yb2Y= +github.com/go-git/go-git/v5 v5.16.4/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHOvC0/uWoy2Fzwn4= +github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= +github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= +github.com/godbus/dbus/v5 v5.2.0 h1:3WexO+U+yg9T70v9FdHr9kCxYlazaAXUhx2VMkbfax8= +github.com/godbus/dbus/v5 v5.2.0/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c= +github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= +github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/jsonschema-go v0.3.0 h1:6AH2TxVNtk3IlvkkhjrtbUc4S8AvO0Xii0DxIygDg+Q= +github.com/google/jsonschema-go v0.3.0/go.mod h1:r5quNTdLOYEz95Ru18zA0ydNbBuYoo9tgaYcxEYhJVE= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jchv/go-winloader v0.0.0-20250406163304-c1995be93bd1 h1:njuLRcjAuMKr7kI3D85AXWkw6/+v9PwtV6M6o11sWHQ= +github.com/jchv/go-winloader v0.0.0-20250406163304-c1995be93bd1/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kevinburke/ssh_config v1.4.0 h1:6xxtP5bZ2E4NF5tuQulISpTO2z8XbtH8cg1PWkxoFkQ= +github.com/kevinburke/ssh_config v1.4.0/go.mod h1:q2RIzfka+BXARoNexmF9gkxEX7DmvbW9P4hIVx2Kg4M= +github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= +github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leaanthony/go-ansi-parser v1.6.1 h1:xd8bzARK3dErqkPFtoF9F3/HgN8UQk0ed1YDKpEz01A= +github.com/leaanthony/go-ansi-parser v1.6.1/go.mod h1:+vva/2y4alzVmmIEpk9QDhA7vLC5zKDTRwfZGOp3IWU= +github.com/leaanthony/u v1.1.1 h1:TUFjwDGlNX+WuwVEzDqQwC2lOv0P4uhTQw7CMFdiK7M= +github.com/leaanthony/u v1.1.1/go.mod h1:9+o6hejoRljvZ3BzdYlVL0JYCwtnAsVuN9pVTQcaRfI= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/lmittmann/tint v1.1.2 h1:2CQzrL6rslrsyjqLDwD11bZ5OpLBPU+g3G/r5LSfS8w= +github.com/lmittmann/tint v1.1.2/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ= +github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/modelcontextprotocol/go-sdk v1.2.0 h1:Y23co09300CEk8iZ/tMxIX1dVmKZkzoSBZOpJwUnc/s= +github.com/modelcontextprotocol/go-sdk v1.2.0/go.mod h1:6fM3LCm3yV7pAs8isnKLn07oKtB0MP9LHd3DfAcKw10= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/nicksnyder/go-i18n/v2 v2.6.1 h1:JDEJraFsQE17Dut9HFDHzCoAWGEQJom5s0TRd17NIEQ= +github.com/nicksnyder/go-i18n/v2 v2.6.1/go.mod h1:Vee0/9RD3Quc/NmwEjzzD7VTZ+Ir7QbXocrkhOzmUKA= +github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= +github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= +github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= +github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/pjbgf/sha1cd v0.5.0 h1:a+UkboSi1znleCDUNT3M5YxjOnN1fz2FhN48FlwCxs0= +github.com/pjbgf/sha1cd v0.5.0/go.mod h1:lhpGlyHLpQZoxMv8HcgXvZEhcGs0PG/vsZnEJ7H0iCM= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= +github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= +github.com/quic-go/quic-go v0.54.0 h1:6s1YB9QotYI6Ospeiguknbp2Znb/jZYjZLRXn9kMQBg= +github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/samber/lo v1.52.0 h1:Rvi+3BFHES3A8meP33VPAxiBZX/Aws5RxrschYGjomw= +github.com/samber/lo v1.52.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= +github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw= +github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/skeema/knownhosts v1.3.2 h1:EDL9mgf4NzwMXCTfaxSD/o/a5fxDw/xL9nkU28JjdBg= +github.com/skeema/knownhosts v1.3.2/go.mod h1:bEg3iQAuw+jyiw+484wwFJoKSLwcfd7fqRy+N0QTiow= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA= +github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4= +github.com/wailsapp/go-webview2 v1.0.23 h1:jmv8qhz1lHibCc79bMM/a/FqOnnzOGEisLav+a0b9P0= +github.com/wailsapp/go-webview2 v1.0.23/go.mod h1:qJmWAmAmaniuKGZPWwne+uor3AHMB5PFhqiK0Bbj8kc= +github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs= +github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o= +github.com/wailsapp/wails/v3 v3.0.0-alpha.41 h1:DYcC1/vtO862sxnoyCOMfLLypbzpFWI257fR6zDYY+Y= +github.com/wailsapp/wails/v3 v3.0.0-alpha.41/go.mod h1:7i8tSuA74q97zZ5qEJlcVZdnO+IR7LT2KU8UpzYMPsw= +github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= +github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= +github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4= +github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4= +go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= +go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/arch v0.20.0 h1:dx1zTU0MAE98U+TQ8BLl7XsJbgze2WnNKF/8tGp/Q6c= +golang.org/x/arch v0.20.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= +golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac h1:l5+whBCLH3iH2ZNHYLbAe58bo7yrN4mVcnkHDYz5vvs= +golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac/go.mod h1:hH+7mtFmImwwcMvScyxUhjuVHR3HGaDPMn9rMSUUbxo= +golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= +golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= +golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/oauth2 v0.33.0 h1:4Q+qn+E5z8gPRJfmRy7C2gGG3T4jIprK6aSYgTXGRpo= +golang.org/x/oauth2 v0.33.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= +golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= +golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= +google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= +google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/cmd/lthn-desktop/main.go b/cmd/lthn-desktop/main.go new file mode 100644 index 0000000..941fb3f --- /dev/null +++ b/cmd/lthn-desktop/main.go @@ -0,0 +1,73 @@ +package main + +import ( + "embed" + "io/fs" + "log" + + core "github.com/Snider/Core" + "github.com/wailsapp/wails/v3/pkg/application" + "github.com/wailsapp/wails/v3/pkg/services/notifications" +) + +//go:embed all:frontend/dist/frontend/browser +var assets embed.FS + +// Default MCP port for the embedded server +const mcpPort = 9877 + +func main() { + // Create the Core runtime with plugin support + rt, err := core.NewRuntime() + if err != nil { + log.Fatal(err) + } + + // Create the notifications service for native system notifications + notifier := notifications.New() + + // Wire the notifier to the display service for native notifications + rt.Display.SetNotifier(notifier) + + // Create the MCP bridge for Claude Code integration + // This provides WebView access, console capture, window control, and process management + mcpBridge := NewMCPBridge(mcpPort, rt.Display) + + // Collect all services including plugins + // Display service registered separately so Wails calls its Startup() for tray/window + services := []application.Service{ + application.NewService(rt.Runtime), + application.NewService(rt.Display), + application.NewService(notifier), // Native notifications + application.NewService(rt.Docs), + application.NewService(rt.Config), + application.NewService(rt.I18n), + application.NewService(rt.Help), + application.NewService(rt.Crypt), + application.NewService(rt.IDE), + application.NewService(rt.Module), + application.NewService(rt.Workspace), + application.NewService(mcpBridge), // MCP Bridge for Claude Code + } + services = append(services, rt.PluginServices()...) + + // Strip the embed path prefix so files are served from root + staticAssets, err := fs.Sub(assets, "frontend/dist/frontend/browser") + if err != nil { + log.Fatal(err) + } + + app := application.New(application.Options{ + Services: services, + Assets: application.AssetOptions{ + Handler: application.AssetFileServerFS(staticAssets), + }, + }) + + log.Printf("Starting Core GUI with MCP server on port %d", mcpPort) + + err = app.Run() + if err != nil { + log.Fatal(err) + } +} diff --git a/cmd/lthn-desktop/mcp_bridge.go b/cmd/lthn-desktop/mcp_bridge.go new file mode 100644 index 0000000..e8fe4ca --- /dev/null +++ b/cmd/lthn-desktop/mcp_bridge.go @@ -0,0 +1,1135 @@ +package main + +import ( + "context" + "encoding/base64" + "encoding/json" + "fmt" + "log" + "net/http" + "sync" + + "github.com/Snider/Core/pkg/display" + "github.com/Snider/Core/pkg/mcp" + "github.com/Snider/Core/pkg/webview" + "github.com/Snider/Core/pkg/ws" + "github.com/wailsapp/wails/v3/pkg/application" +) + +// MCPBridge wires together MCP, WebView, Display and WebSocket services +// and starts the MCP HTTP server after Wails initializes. +type MCPBridge struct { + mcpService *mcp.Service + webview *webview.Service + display *display.Service + wsHub *ws.Hub + claudeBridge *ClaudeBridge + app *application.App + port int + running bool + mu sync.Mutex +} + +// NewMCPBridge creates a new MCP bridge with all services wired up. +func NewMCPBridge(port int, displaySvc *display.Service) *MCPBridge { + wv := webview.New() + hub := ws.NewHub() + mcpSvc := mcp.NewStandaloneWithPort(port) + mcpSvc.SetWebView(wv) + mcpSvc.SetDisplay(displaySvc) + + // Create Claude bridge to forward messages to MCP core on port 9876 + claudeBridge := NewClaudeBridge("ws://localhost:9876/ws") + + return &MCPBridge{ + mcpService: mcpSvc, + webview: wv, + display: displaySvc, + wsHub: hub, + claudeBridge: claudeBridge, + port: port, + } +} + +// ServiceStartup is called by Wails when the app starts. +// This wires up the app reference and starts the HTTP server. +func (b *MCPBridge) ServiceStartup(ctx context.Context, options application.ServiceOptions) error { + b.mu.Lock() + defer b.mu.Unlock() + + // Get the Wails app reference + b.app = application.Get() + if b.app == nil { + return fmt.Errorf("failed to get Wails app reference") + } + + // Wire up the WebView service with the app + b.webview.SetApp(b.app) + + // Set up console listener + b.webview.SetupConsoleListener() + + // Inject console capture into all windows after a short delay + // (windows may not be created yet) + go b.injectConsoleCapture() + + // Start the HTTP server for MCP + go b.startHTTPServer() + + log.Printf("MCP Bridge started on port %d", b.port) + return nil +} + +// injectConsoleCapture injects the console capture script into windows. +func (b *MCPBridge) injectConsoleCapture() { + // Wait a bit for windows to be created + // In production, you'd use events to detect window creation + windows := b.webview.ListWindows() + for _, w := range windows { + if err := b.webview.InjectConsoleCapture(w.Name); err != nil { + log.Printf("Failed to inject console capture in %s: %v", w.Name, err) + } + } +} + +// startHTTPServer starts the HTTP server for MCP and WebSocket. +func (b *MCPBridge) startHTTPServer() { + b.running = true + + // Start the WebSocket hub + hubCtx := context.Background() + go b.wsHub.Run(hubCtx) + + // Claude bridge disabled - port 9876 is not an MCP WebSocket server + // b.claudeBridge.Start() + + mux := http.NewServeMux() + + // WebSocket endpoint for GUI clients + mux.HandleFunc("/ws", b.wsHub.HandleWebSocket) + + // WebSocket endpoint for real-time display events + mux.HandleFunc("/events", b.handleEventsWebSocket) + + // MCP info endpoint + mux.HandleFunc("/mcp", b.handleMCPInfo) + + // MCP tools endpoint (simple HTTP for now, SSE later) + mux.HandleFunc("/mcp/tools", b.handleMCPTools) + mux.HandleFunc("/mcp/call", b.handleMCPCall) + + // Health check + mux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(map[string]any{ + "status": "ok", + "mcp": true, + "webview": b.webview != nil, + "display": b.display != nil, + }) + }) + + addr := fmt.Sprintf(":%d", b.port) + log.Printf("MCP HTTP server listening on %s", addr) + + if err := http.ListenAndServe(addr, mux); err != nil { + log.Printf("MCP HTTP server error: %v", err) + } +} + +// handleMCPInfo returns MCP server information. +func (b *MCPBridge) handleMCPInfo(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.Header().Set("Access-Control-Allow-Origin", "*") + + info := map[string]any{ + "name": "core", + "version": "0.1.0", + "capabilities": map[string]any{ + "webview": true, + "display": b.display != nil, + "windowControl": b.display != nil, + "screenControl": b.display != nil, + "websocket": fmt.Sprintf("ws://localhost:%d/ws", b.port), + "events": fmt.Sprintf("ws://localhost:%d/events", b.port), + }, + } + json.NewEncoder(w).Encode(info) +} + +// handleMCPTools returns the list of available tools. +func (b *MCPBridge) handleMCPTools(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.Header().Set("Access-Control-Allow-Origin", "*") + + // Return tool list - grouped by category + tools := []map[string]string{ + // File operations + {"name": "file_read", "description": "Read the contents of a file"}, + {"name": "file_write", "description": "Write content to a file"}, + {"name": "file_edit", "description": "Edit a file by replacing text"}, + {"name": "file_delete", "description": "Delete a file"}, + {"name": "file_exists", "description": "Check if file exists"}, + {"name": "file_rename", "description": "Rename or move a file"}, + {"name": "dir_list", "description": "List directory contents"}, + {"name": "dir_create", "description": "Create a directory"}, + {"name": "lang_detect", "description": "Detect file language"}, + {"name": "lang_list", "description": "List supported languages"}, + // Process management + {"name": "process_start", "description": "Start a process"}, + {"name": "process_stop", "description": "Stop a process"}, + {"name": "process_kill", "description": "Kill a process"}, + {"name": "process_list", "description": "List processes"}, + {"name": "process_output", "description": "Get process output"}, + {"name": "process_input", "description": "Send input to process"}, + // WebSocket streaming + {"name": "ws_start", "description": "Start WebSocket server"}, + {"name": "ws_info", "description": "Get WebSocket info"}, + // WebView interaction (JS runtime, console, DOM) + {"name": "webview_list", "description": "List windows"}, + {"name": "webview_eval", "description": "Execute JavaScript"}, + {"name": "webview_console", "description": "Get console messages"}, + {"name": "webview_console_clear", "description": "Clear console buffer"}, + {"name": "webview_click", "description": "Click element"}, + {"name": "webview_type", "description": "Type into element"}, + {"name": "webview_query", "description": "Query DOM elements"}, + {"name": "webview_navigate", "description": "Navigate to URL"}, + {"name": "webview_source", "description": "Get page source"}, + {"name": "webview_url", "description": "Get current page URL"}, + {"name": "webview_title", "description": "Get current page title"}, + {"name": "webview_screenshot", "description": "Capture page as base64 PNG"}, + {"name": "webview_screenshot_element", "description": "Capture specific element as PNG"}, + {"name": "webview_scroll", "description": "Scroll to element or position"}, + {"name": "webview_hover", "description": "Hover over element"}, + {"name": "webview_select", "description": "Select option in dropdown"}, + {"name": "webview_check", "description": "Check/uncheck checkbox or radio"}, + {"name": "webview_element_info", "description": "Get detailed info about element"}, + {"name": "webview_computed_style", "description": "Get computed styles for element"}, + {"name": "webview_highlight", "description": "Visually highlight element"}, + {"name": "webview_dom_tree", "description": "Get DOM tree structure"}, + {"name": "webview_errors", "description": "Get captured error messages"}, + {"name": "webview_performance", "description": "Get performance metrics"}, + {"name": "webview_resources", "description": "List loaded resources"}, + {"name": "webview_network", "description": "Get network requests log"}, + {"name": "webview_network_clear", "description": "Clear network request log"}, + {"name": "webview_network_inject", "description": "Inject network interceptor for detailed logging"}, + {"name": "webview_pdf", "description": "Export page as PDF (base64 data URI)"}, + {"name": "webview_print", "description": "Open print dialog for window"}, + // Window/Display control (native app control) + {"name": "window_list", "description": "List all windows with positions"}, + {"name": "window_get", "description": "Get info about a specific window"}, + {"name": "window_create", "description": "Create a new window at specific position"}, + {"name": "window_close", "description": "Close a window by name"}, + {"name": "window_position", "description": "Move a window to specific coordinates"}, + {"name": "window_size", "description": "Resize a window"}, + {"name": "window_bounds", "description": "Set position and size in one call"}, + {"name": "window_maximize", "description": "Maximize a window"}, + {"name": "window_minimize", "description": "Minimize a window"}, + {"name": "window_restore", "description": "Restore from maximized/minimized"}, + {"name": "window_focus", "description": "Bring window to front"}, + {"name": "window_focused", "description": "Get currently focused window"}, + {"name": "window_visibility", "description": "Show or hide a window"}, + {"name": "window_always_on_top", "description": "Pin window above others"}, + {"name": "window_title", "description": "Change window title"}, + {"name": "window_title_get", "description": "Get current window title"}, + {"name": "window_fullscreen", "description": "Toggle fullscreen mode"}, + {"name": "screen_list", "description": "List all screens/monitors"}, + {"name": "screen_get", "description": "Get specific screen by ID"}, + {"name": "screen_primary", "description": "Get primary screen info"}, + {"name": "screen_at_point", "description": "Get screen containing a point"}, + {"name": "screen_for_window", "description": "Get screen a window is on"}, + {"name": "screen_work_areas", "description": "Get usable screen space (excluding dock/menubar)"}, + // Layout management + {"name": "layout_save", "description": "Save current window arrangement with a name"}, + {"name": "layout_restore", "description": "Restore a saved layout by name"}, + {"name": "layout_list", "description": "List all saved layouts"}, + {"name": "layout_delete", "description": "Delete a saved layout"}, + {"name": "layout_get", "description": "Get details of a specific layout"}, + {"name": "layout_tile", "description": "Auto-tile windows (left/right/grid/quadrants)"}, + {"name": "layout_snap", "description": "Snap window to screen edge/corner"}, + {"name": "layout_stack", "description": "Stack windows in cascade pattern"}, + {"name": "layout_workflow", "description": "Apply preset workflow layout (coding/debugging/presenting)"}, + // System tray + {"name": "tray_set_icon", "description": "Set system tray icon"}, + {"name": "tray_set_tooltip", "description": "Set system tray tooltip"}, + {"name": "tray_set_label", "description": "Set system tray label"}, + {"name": "tray_set_menu", "description": "Set system tray menu items"}, + {"name": "tray_info", "description": "Get system tray info"}, + // Window background colour (for transparency) + {"name": "window_background_colour", "description": "Set window background colour with alpha"}, + // System integration + {"name": "clipboard_read", "description": "Read text from system clipboard"}, + {"name": "clipboard_write", "description": "Write text to system clipboard"}, + {"name": "clipboard_has", "description": "Check if clipboard has content"}, + {"name": "clipboard_clear", "description": "Clear the clipboard"}, + {"name": "notification_show", "description": "Show native system notification"}, + {"name": "notification_permission_request", "description": "Request notification permission"}, + {"name": "notification_permission_check", "description": "Check notification permission status"}, + {"name": "theme_get", "description": "Get current system theme (dark/light)"}, + {"name": "theme_system", "description": "Get system theme preference"}, + {"name": "focus_set", "description": "Set focus to specific window"}, + // Dialogs + {"name": "dialog_open_file", "description": "Show file open dialog"}, + {"name": "dialog_save_file", "description": "Show file save dialog"}, + {"name": "dialog_open_directory", "description": "Show directory picker"}, + {"name": "dialog_confirm", "description": "Show confirmation dialog (yes/no)"}, + {"name": "dialog_prompt", "description": "Show input prompt dialog (not supported natively)"}, + // Event subscriptions (WebSocket) + {"name": "event_info", "description": "Get WebSocket event server info and connected clients"}, + } + json.NewEncoder(w).Encode(map[string]any{"tools": tools}) +} + +// handleMCPCall handles tool calls via HTTP POST. +// This provides a REST bridge for display/window tools. +func (b *MCPBridge) handleMCPCall(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS") + w.Header().Set("Access-Control-Allow-Headers", "Content-Type") + + if r.Method == "OPTIONS" { + w.WriteHeader(http.StatusOK) + return + } + + if r.Method != "POST" { + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + return + } + + var req struct { + Tool string `json:"tool"` + Params map[string]any `json:"params"` + } + + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + // Execute tools based on prefix + var result map[string]any + if len(req.Tool) > 8 && req.Tool[:8] == "webview_" { + result = b.executeWebviewTool(req.Tool, req.Params) + } else { + result = b.executeDisplayTool(req.Tool, req.Params) + } + json.NewEncoder(w).Encode(result) +} + +// executeDisplayTool handles window and screen tool execution. +func (b *MCPBridge) executeDisplayTool(tool string, params map[string]any) map[string]any { + if b.display == nil { + return map[string]any{"error": "display service not available"} + } + + switch tool { + case "window_list": + windows := b.display.ListWindowInfos() + return map[string]any{"windows": windows} + + case "window_get": + name, _ := params["name"].(string) + info, err := b.display.GetWindowInfo(name) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"window": info} + + case "window_position": + name, _ := params["name"].(string) + x, _ := params["x"].(float64) + y, _ := params["y"].(float64) + err := b.display.SetWindowPosition(name, int(x), int(y)) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "name": name, "x": int(x), "y": int(y)} + + case "window_size": + name, _ := params["name"].(string) + width, _ := params["width"].(float64) + height, _ := params["height"].(float64) + err := b.display.SetWindowSize(name, int(width), int(height)) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "name": name, "width": int(width), "height": int(height)} + + case "window_bounds": + name, _ := params["name"].(string) + x, _ := params["x"].(float64) + y, _ := params["y"].(float64) + width, _ := params["width"].(float64) + height, _ := params["height"].(float64) + err := b.display.SetWindowBounds(name, int(x), int(y), int(width), int(height)) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "name": name, "x": int(x), "y": int(y), "width": int(width), "height": int(height)} + + case "window_maximize": + name, _ := params["name"].(string) + err := b.display.MaximizeWindow(name) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "action": "maximize"} + + case "window_minimize": + name, _ := params["name"].(string) + err := b.display.MinimizeWindow(name) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "action": "minimize"} + + case "window_restore": + name, _ := params["name"].(string) + err := b.display.RestoreWindow(name) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "action": "restore"} + + case "window_focus": + name, _ := params["name"].(string) + err := b.display.FocusWindow(name) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "action": "focus"} + + case "screen_list": + screens := b.display.GetScreens() + return map[string]any{"screens": screens} + + case "screen_get": + id := getStringParam(params, "id") + screen, err := b.display.GetScreen(id) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"screen": screen} + + case "screen_primary": + screen, err := b.display.GetPrimaryScreen() + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"screen": screen} + + case "screen_at_point": + x := getIntParam(params, "x") + y := getIntParam(params, "y") + screen, err := b.display.GetScreenAtPoint(x, y) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"screen": screen} + + case "screen_for_window": + name := getStringParam(params, "name") + screen, err := b.display.GetScreenForWindow(name) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"screen": screen} + + case "window_create": + opts := display.CreateWindowOptions{ + Name: getStringParam(params, "name"), + Title: getStringParam(params, "title"), + URL: getStringParam(params, "url"), + X: getIntParam(params, "x"), + Y: getIntParam(params, "y"), + Width: getIntParam(params, "width"), + Height: getIntParam(params, "height"), + } + info, err := b.display.CreateWindow(opts) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "window": info} + + case "window_close": + name, _ := params["name"].(string) + err := b.display.CloseWindow(name) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "action": "close"} + + case "window_visibility": + name, _ := params["name"].(string) + visible, _ := params["visible"].(bool) + err := b.display.SetWindowVisibility(name, visible) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "visible": visible} + + case "window_always_on_top": + name, _ := params["name"].(string) + onTop, _ := params["onTop"].(bool) + err := b.display.SetWindowAlwaysOnTop(name, onTop) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "alwaysOnTop": onTop} + + case "window_title": + name, _ := params["name"].(string) + title, _ := params["title"].(string) + err := b.display.SetWindowTitle(name, title) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "title": title} + + case "window_title_get": + name := getStringParam(params, "name") + title, err := b.display.GetWindowTitle(name) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"title": title} + + case "window_fullscreen": + name, _ := params["name"].(string) + fullscreen, _ := params["fullscreen"].(bool) + err := b.display.SetWindowFullscreen(name, fullscreen) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "fullscreen": fullscreen} + + case "screen_work_areas": + areas := b.display.GetWorkAreas() + return map[string]any{"workAreas": areas} + + case "window_focused": + name := b.display.GetFocusedWindow() + return map[string]any{"focused": name} + + case "layout_save": + name, _ := params["name"].(string) + err := b.display.SaveLayout(name) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "name": name} + + case "layout_restore": + name, _ := params["name"].(string) + err := b.display.RestoreLayout(name) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "name": name} + + case "layout_list": + layouts := b.display.ListLayouts() + return map[string]any{"layouts": layouts} + + case "layout_delete": + name, _ := params["name"].(string) + err := b.display.DeleteLayout(name) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "name": name} + + case "layout_get": + name, _ := params["name"].(string) + layout := b.display.GetLayout(name) + if layout == nil { + return map[string]any{"error": "layout not found", "name": name} + } + return map[string]any{"layout": layout} + + case "layout_tile": + mode := getStringParam(params, "mode") + var windowNames []string + if names, ok := params["windows"].([]any); ok { + for _, n := range names { + if s, ok := n.(string); ok { + windowNames = append(windowNames, s) + } + } + } + err := b.display.TileWindows(display.TileMode(mode), windowNames) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "mode": mode} + + case "layout_snap": + name := getStringParam(params, "name") + position := getStringParam(params, "position") + err := b.display.SnapWindow(name, display.SnapPosition(position)) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "position": position} + + case "layout_stack": + var windowNames []string + if names, ok := params["windows"].([]any); ok { + for _, n := range names { + if s, ok := n.(string); ok { + windowNames = append(windowNames, s) + } + } + } + offsetX := getIntParam(params, "offsetX") + offsetY := getIntParam(params, "offsetY") + err := b.display.StackWindows(windowNames, offsetX, offsetY) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "layout_workflow": + workflow := getStringParam(params, "workflow") + err := b.display.ApplyWorkflowLayout(display.WorkflowType(workflow)) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true, "workflow": workflow} + + case "tray_set_tooltip": + tooltip := getStringParam(params, "tooltip") + err := b.display.SetTrayTooltip(tooltip) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "tray_set_label": + label := getStringParam(params, "label") + err := b.display.SetTrayLabel(label) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "tray_set_icon": + // Icon data as base64 encoded PNG + iconBase64 := getStringParam(params, "icon") + if iconBase64 == "" { + return map[string]any{"error": "icon data required"} + } + // Decode base64 + iconData, err := base64.StdEncoding.DecodeString(iconBase64) + if err != nil { + return map[string]any{"error": "invalid base64 icon data: " + err.Error()} + } + err = b.display.SetTrayIcon(iconData) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "tray_set_menu": + // Menu items as JSON array + var items []display.TrayMenuItem + if menuData, ok := params["menu"].([]any); ok { + menuJSON, _ := json.Marshal(menuData) + json.Unmarshal(menuJSON, &items) + } + err := b.display.SetTrayMenu(items) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "tray_info": + info := b.display.GetTrayInfo() + return info + + case "window_background_colour": + name := getStringParam(params, "name") + r := uint8(getIntParam(params, "r")) + g := uint8(getIntParam(params, "g")) + b_val := uint8(getIntParam(params, "b")) + a := uint8(getIntParam(params, "a")) + if a == 0 { + a = 255 // Default to opaque + } + err := b.display.SetWindowBackgroundColour(name, r, g, b_val, a) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "clipboard_read": + text, err := b.display.ReadClipboard() + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"text": text} + + case "clipboard_write": + text, _ := params["text"].(string) + err := b.display.WriteClipboard(text) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "clipboard_has": + has := b.display.HasClipboard() + return map[string]any{"hasContent": has} + + case "clipboard_clear": + err := b.display.ClearClipboard() + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "notification_show": + title := getStringParam(params, "title") + message := getStringParam(params, "message") + subtitle := getStringParam(params, "subtitle") + id := getStringParam(params, "id") + err := b.display.ShowNotification(display.NotificationOptions{ + ID: id, + Title: title, + Message: message, + Subtitle: subtitle, + }) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "notification_permission_request": + granted, err := b.display.RequestNotificationPermission() + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"granted": granted} + + case "notification_permission_check": + authorized, err := b.display.CheckNotificationPermission() + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"authorized": authorized} + + case "theme_get": + theme := b.display.GetTheme() + return map[string]any{"theme": theme} + + case "theme_system": + theme := b.display.GetSystemTheme() + return map[string]any{"theme": theme} + + case "focus_set": + name := getStringParam(params, "name") + err := b.display.FocusWindow(name) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "dialog_open_file": + title := getStringParam(params, "title") + defaultDir := getStringParam(params, "defaultDirectory") + multiple, _ := params["allowMultiple"].(bool) + opts := display.OpenFileOptions{ + Title: title, + DefaultDirectory: defaultDir, + AllowMultiple: multiple, + } + if multiple { + paths, err := b.display.OpenFileDialog(opts) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"paths": paths} + } + path, err := b.display.OpenSingleFileDialog(opts) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"path": path} + + case "dialog_save_file": + title := getStringParam(params, "title") + defaultDir := getStringParam(params, "defaultDirectory") + defaultFilename := getStringParam(params, "defaultFilename") + path, err := b.display.SaveFileDialog(display.SaveFileOptions{ + Title: title, + DefaultDirectory: defaultDir, + DefaultFilename: defaultFilename, + }) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"path": path} + + case "dialog_open_directory": + title := getStringParam(params, "title") + defaultDir := getStringParam(params, "defaultDirectory") + path, err := b.display.OpenDirectoryDialog(display.OpenDirectoryOptions{ + Title: title, + DefaultDirectory: defaultDir, + }) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"path": path} + + case "dialog_confirm": + title := getStringParam(params, "title") + message := getStringParam(params, "message") + confirmed, err := b.display.ConfirmDialog(title, message) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"confirmed": confirmed} + + case "dialog_prompt": + title := getStringParam(params, "title") + message := getStringParam(params, "message") + result, ok, err := b.display.PromptDialog(title, message) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"result": result, "ok": ok} + + case "event_info": + eventMgr := b.display.GetEventManager() + if eventMgr == nil { + return map[string]any{"error": "event manager not available"} + } + return map[string]any{ + "endpoint": fmt.Sprintf("ws://localhost:%d/events", b.port), + "connectedClients": eventMgr.ConnectedClients(), + "eventTypes": []string{ + "window.focus", "window.blur", "window.move", "window.resize", + "window.close", "window.create", "theme.change", "screen.change", + }, + } + + default: + return map[string]any{"error": "unknown tool", "tool": tool} + } +} + +// executeWebviewTool handles webview/JS tool execution. +func (b *MCPBridge) executeWebviewTool(tool string, params map[string]any) map[string]any { + if b.webview == nil { + return map[string]any{"error": "webview service not available"} + } + + switch tool { + case "webview_list": + windows := b.webview.ListWindows() + return map[string]any{"windows": windows} + + case "webview_eval": + windowName := getStringParam(params, "window") + code := getStringParam(params, "code") + result, err := b.webview.ExecJS(windowName, code) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"result": result} + + case "webview_console": + level := getStringParam(params, "level") + limit := getIntParam(params, "limit") + if limit == 0 { + limit = 100 + } + messages := b.webview.GetConsoleMessages(level, limit) + return map[string]any{"messages": messages} + + case "webview_console_clear": + b.webview.ClearConsole() + return map[string]any{"success": true} + + case "webview_click": + windowName := getStringParam(params, "window") + selector := getStringParam(params, "selector") + err := b.webview.Click(windowName, selector) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "webview_type": + windowName := getStringParam(params, "window") + selector := getStringParam(params, "selector") + text := getStringParam(params, "text") + err := b.webview.Type(windowName, selector, text) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "webview_query": + windowName := getStringParam(params, "window") + selector := getStringParam(params, "selector") + result, err := b.webview.QuerySelector(windowName, selector) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"elements": result} + + case "webview_navigate": + windowName := getStringParam(params, "window") + url := getStringParam(params, "url") + err := b.webview.Navigate(windowName, url) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "webview_source": + windowName := getStringParam(params, "window") + result, err := b.webview.GetPageSource(windowName) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"source": result} + + case "webview_url": + windowName := getStringParam(params, "window") + result, err := b.webview.GetURL(windowName) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"url": result} + + case "webview_title": + windowName := getStringParam(params, "window") + result, err := b.webview.GetTitle(windowName) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"title": result} + + case "webview_screenshot": + windowName := getStringParam(params, "window") + data, err := b.webview.Screenshot(windowName) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"data": data} + + case "webview_screenshot_element": + windowName := getStringParam(params, "window") + selector := getStringParam(params, "selector") + data, err := b.webview.ScreenshotElement(windowName, selector) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"data": data} + + case "webview_scroll": + windowName := getStringParam(params, "window") + selector := getStringParam(params, "selector") + x := getIntParam(params, "x") + y := getIntParam(params, "y") + err := b.webview.Scroll(windowName, selector, x, y) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "webview_hover": + windowName := getStringParam(params, "window") + selector := getStringParam(params, "selector") + err := b.webview.Hover(windowName, selector) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "webview_select": + windowName := getStringParam(params, "window") + selector := getStringParam(params, "selector") + value := getStringParam(params, "value") + err := b.webview.Select(windowName, selector, value) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "webview_check": + windowName := getStringParam(params, "window") + selector := getStringParam(params, "selector") + checked, _ := params["checked"].(bool) + err := b.webview.Check(windowName, selector, checked) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "webview_element_info": + windowName := getStringParam(params, "window") + selector := getStringParam(params, "selector") + result, err := b.webview.GetElementInfo(windowName, selector) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"element": result} + + case "webview_computed_style": + windowName := getStringParam(params, "window") + selector := getStringParam(params, "selector") + var properties []string + if props, ok := params["properties"].([]any); ok { + for _, p := range props { + if s, ok := p.(string); ok { + properties = append(properties, s) + } + } + } + result, err := b.webview.GetComputedStyle(windowName, selector, properties) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"styles": result} + + case "webview_highlight": + windowName := getStringParam(params, "window") + selector := getStringParam(params, "selector") + duration := getIntParam(params, "duration") + err := b.webview.Highlight(windowName, selector, duration) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "webview_dom_tree": + windowName := getStringParam(params, "window") + maxDepth := getIntParam(params, "maxDepth") + result, err := b.webview.GetDOMTree(windowName, maxDepth) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"tree": result} + + case "webview_errors": + limit := getIntParam(params, "limit") + if limit == 0 { + limit = 50 + } + errors := b.webview.GetErrors(limit) + return map[string]any{"errors": errors} + + case "webview_performance": + windowName := getStringParam(params, "window") + result, err := b.webview.GetPerformance(windowName) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"performance": result} + + case "webview_resources": + windowName := getStringParam(params, "window") + result, err := b.webview.GetResources(windowName) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"resources": result} + + case "webview_network": + windowName := getStringParam(params, "window") + limit := getIntParam(params, "limit") + result, err := b.webview.GetNetworkRequests(windowName, limit) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"requests": result} + + case "webview_network_clear": + windowName := getStringParam(params, "window") + err := b.webview.ClearNetworkRequests(windowName) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "webview_network_inject": + windowName := getStringParam(params, "window") + err := b.webview.InjectNetworkInterceptor(windowName) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + case "webview_pdf": + windowName := getStringParam(params, "window") + options := make(map[string]any) + if filename := getStringParam(params, "filename"); filename != "" { + options["filename"] = filename + } + if margin, ok := params["margin"].(float64); ok { + options["margin"] = margin + } + data, err := b.webview.ExportToPDF(windowName, options) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"data": data} + + case "webview_print": + windowName := getStringParam(params, "window") + err := b.webview.PrintToPDF(windowName) + if err != nil { + return map[string]any{"error": err.Error()} + } + return map[string]any{"success": true} + + default: + return map[string]any{"error": "unknown webview tool", "tool": tool} + } +} + +// Helper functions for parameter extraction +func getStringParam(params map[string]any, key string) string { + if v, ok := params[key].(string); ok { + return v + } + return "" +} + +func getIntParam(params map[string]any, key string) int { + if v, ok := params[key].(float64); ok { + return int(v) + } + return 0 +} + +// GetMCPService returns the MCP service for direct access. +func (b *MCPBridge) GetMCPService() *mcp.Service { + return b.mcpService +} + +// GetWebView returns the WebView service. +func (b *MCPBridge) GetWebView() *webview.Service { + return b.webview +} + +// GetDisplay returns the Display service. +func (b *MCPBridge) GetDisplay() *display.Service { + return b.display +} + +// handleEventsWebSocket handles WebSocket connections for real-time display events. +func (b *MCPBridge) handleEventsWebSocket(w http.ResponseWriter, r *http.Request) { + eventMgr := b.display.GetEventManager() + if eventMgr == nil { + http.Error(w, "event manager not available", http.StatusServiceUnavailable) + return + } + eventMgr.HandleWebSocket(w, r) +} diff --git a/cmd/lthn-desktop/public/assets/app.js b/cmd/lthn-desktop/public/assets/app.js new file mode 100644 index 0000000..28abaa3 --- /dev/null +++ b/cmd/lthn-desktop/public/assets/app.js @@ -0,0 +1 @@ +console.log("Hello from app.js!"); diff --git a/cmd/lthn-desktop/public/assets/apptray.png b/cmd/lthn-desktop/public/assets/apptray.png new file mode 100644 index 0000000..0778fc6 Binary files /dev/null and b/cmd/lthn-desktop/public/assets/apptray.png differ diff --git a/cmd/lthn-desktop/public/bindings/github.com/Snider/Core/pkg/core/index.ts b/cmd/lthn-desktop/public/bindings/github.com/Snider/Core/pkg/core/index.ts new file mode 100644 index 0000000..6eb5e47 --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/github.com/Snider/Core/pkg/core/index.ts @@ -0,0 +1,11 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export { + Core, + Features +} from "./models.js"; + +export type { + Config +} from "./models.js"; diff --git a/cmd/lthn-desktop/public/bindings/github.com/Snider/Core/pkg/core/models.ts b/cmd/lthn-desktop/public/bindings/github.com/Snider/Core/pkg/core/models.ts new file mode 100644 index 0000000..421f362 --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/github.com/Snider/Core/pkg/core/models.ts @@ -0,0 +1,90 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as application$0 from "../../../../wailsapp/wails/v3/pkg/application/models.js"; + +/** + * Config provides access to application configuration. + */ +export type Config = any; + +/** + * Core is the central application object that manages services, assets, and communication. + */ +export class Core { + "App": application$0.App | null; + "Features": Features | null; + + /** Creates a new Core instance. */ + constructor($$source: Partial = {}) { + if (!("App" in $$source)) { + this["App"] = null; + } + if (!("Features" in $$source)) { + this["Features"] = null; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new Core instance from a string or object. + */ + static createFrom($$source: any = {}): Core { + const $$createField0_0 = $$createType1; + const $$createField1_0 = $$createType3; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("App" in $$parsedSource) { + $$parsedSource["App"] = $$createField0_0($$parsedSource["App"]); + } + if ("Features" in $$parsedSource) { + $$parsedSource["Features"] = $$createField1_0($$parsedSource["Features"]); + } + return new Core($$parsedSource as Partial); + } +} + +/** + * Features provides a way to check if a feature is enabled. + * This is used for feature flagging and conditional logic. + */ +export class Features { + /** + * Flags is a list of enabled feature flags. + */ + "Flags": string[]; + + /** Creates a new Features instance. */ + constructor($$source: Partial = {}) { + if (!("Flags" in $$source)) { + this["Flags"] = []; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new Features instance from a string or object. + */ + static createFrom($$source: any = {}): Features { + const $$createField0_0 = $$createType4; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("Flags" in $$parsedSource) { + $$parsedSource["Flags"] = $$createField0_0($$parsedSource["Flags"]); + } + return new Features($$parsedSource as Partial); + } +} + +// Private type creation functions +const $$createType0 = application$0.App.createFrom; +const $$createType1 = $Create.Nullable($$createType0); +const $$createType2 = Features.createFrom; +const $$createType3 = $Create.Nullable($$createType2); +const $$createType4 = $Create.Array($Create.Any); diff --git a/cmd/lthn-desktop/public/bindings/github.com/Snider/Core/pkg/display/index.ts b/cmd/lthn-desktop/public/bindings/github.com/Snider/Core/pkg/display/index.ts new file mode 100644 index 0000000..eb75575 --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/github.com/Snider/Core/pkg/display/index.ts @@ -0,0 +1,15 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import * as Service from "./service.js"; +export { + Service +}; + +export { + Window +} from "./models.js"; + +export type { + WindowOption +} from "./models.js"; diff --git a/cmd/lthn-desktop/public/bindings/github.com/Snider/Core/pkg/display/models.ts b/cmd/lthn-desktop/public/bindings/github.com/Snider/Core/pkg/display/models.ts new file mode 100644 index 0000000..e1d5261 --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/github.com/Snider/Core/pkg/display/models.ts @@ -0,0 +1,15 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as application$0 from "../../../../wailsapp/wails/v3/pkg/application/models.js"; + +export const Window = application$0.WebviewWindowOptions; +export type Window = application$0.WebviewWindowOptions; + +export type WindowOption = any; diff --git a/cmd/lthn-desktop/public/bindings/github.com/Snider/Core/pkg/display/service.ts b/cmd/lthn-desktop/public/bindings/github.com/Snider/Core/pkg/display/service.ts new file mode 100644 index 0000000..d0c20f5 --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/github.com/Snider/Core/pkg/display/service.ts @@ -0,0 +1,126 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +/** + * Service manages windowing, dialogs, and other visual elements. + * It is the primary interface for interacting with the UI. + * @module + */ + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as core$0 from "../core/models.js"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as application$0 from "../../../../wailsapp/wails/v3/pkg/application/models.js"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as $models from "./models.js"; + +/** + * Config returns the registered Config service from the core application. + * This is a convenience method for accessing the application's configuration. + */ +export function Config(): $CancellablePromise { + return $Call.ByID(2232242108); +} + +/** + * Core returns the central core instance, providing access to all registered services. + */ +export function Core(): $CancellablePromise { + return $Call.ByID(1945729093).then(($result: any) => { + return $$createType1($result); + }); +} + +/** + * NewWithOptions creates a new window by applying a series of options. + */ +export function NewWithOptions(...opts: $models.WindowOption[]): $CancellablePromise { + return $Call.ByID(2933522506, opts).then(($result: any) => { + return $$createType3($result); + }); +} + +/** + * NewWithStruct creates a new window using the provided options and returns its handle. + */ +export function NewWithStruct(options: $models.Window | null): $CancellablePromise { + return $Call.ByID(51896165, options).then(($result: any) => { + return $$createType3($result); + }); +} + +/** + * NewWithURL creates a new default window pointing to the specified URL. + */ +export function NewWithURL(url: string): $CancellablePromise { + return $Call.ByID(1128847469, url).then(($result: any) => { + return $$createType3($result); + }); +} + +/** + * OpenWindow creates a new window with the given options. If no options are + * provided, it will use the default options. + * + * example: + * + * err := displayService.OpenWindow( + * display.WithName("my-window"), + * display.WithTitle("My Window"), + * display.WithWidth(800), + * display.WithHeight(600), + * ) + * if err != nil { + * log.Fatal(err) + * } + */ +export function OpenWindow(...opts: $models.WindowOption[]): $CancellablePromise { + return $Call.ByID(1872737238, opts); +} + +/** + * SelectDirectory opens a directory selection dialog and returns the selected path. + */ +export function SelectDirectory(): $CancellablePromise { + return $Call.ByID(968138697); +} + +/** + * ShowEnvironmentDialog displays a dialog containing detailed information about + * the application's runtime environment. This is useful for debugging and + * understanding the context in which the application is running. + * + * example: + * + * displayService.ShowEnvironmentDialog() + */ +export function ShowEnvironmentDialog(): $CancellablePromise { + return $Call.ByID(3261510832); +} + +/** + * Startup is called when the app starts. It initializes the display service + * and sets up the main application window and system tray. + * + * err := displayService.Startup(ctx) + * if err != nil { + * log.Fatal(err) + * } + */ +export function Startup(): $CancellablePromise { + return $Call.ByID(1664741927); +} + +// Private type creation functions +const $$createType0 = core$0.Core.createFrom; +const $$createType1 = $Create.Nullable($$createType0); +const $$createType2 = application$0.WebviewWindow.createFrom; +const $$createType3 = $Create.Nullable($$createType2); diff --git a/cmd/lthn-desktop/public/bindings/github.com/Snider/Core/pkg/plugin/index.ts b/cmd/lthn-desktop/public/bindings/github.com/Snider/Core/pkg/plugin/index.ts new file mode 100644 index 0000000..2c5eddf --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/github.com/Snider/Core/pkg/plugin/index.ts @@ -0,0 +1,15 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import * as Router from "./router.js"; +export { + Router +}; + +export { + PluginInfo +} from "./models.js"; + +export type { + Plugin +} from "./models.js"; diff --git a/cmd/lthn-desktop/public/bindings/github.com/Snider/Core/pkg/plugin/models.ts b/cmd/lthn-desktop/public/bindings/github.com/Snider/Core/pkg/plugin/models.ts new file mode 100644 index 0000000..99922ea --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/github.com/Snider/Core/pkg/plugin/models.ts @@ -0,0 +1,66 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +/** + * Plugin defines the interface that all plugins must implement. + */ +export type Plugin = any; + +/** + * PluginInfo contains metadata about a registered plugin. + */ +export class PluginInfo { + "Name": string; + "Namespace": string; + "Description": string; + "Version": string; + "Author": string; + + /** + * List of sub-routes this plugin handles + */ + "Routes": string[]; + + /** Creates a new PluginInfo instance. */ + constructor($$source: Partial = {}) { + if (!("Name" in $$source)) { + this["Name"] = ""; + } + if (!("Namespace" in $$source)) { + this["Namespace"] = ""; + } + if (!("Description" in $$source)) { + this["Description"] = ""; + } + if (!("Version" in $$source)) { + this["Version"] = ""; + } + if (!("Author" in $$source)) { + this["Author"] = ""; + } + if (!("Routes" in $$source)) { + this["Routes"] = []; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new PluginInfo instance from a string or object. + */ + static createFrom($$source: any = {}): PluginInfo { + const $$createField5_0 = $$createType0; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("Routes" in $$parsedSource) { + $$parsedSource["Routes"] = $$createField5_0($$parsedSource["Routes"]); + } + return new PluginInfo($$parsedSource as Partial); + } +} + +// Private type creation functions +const $$createType0 = $Create.Array($Create.Any); diff --git a/cmd/lthn-desktop/public/bindings/github.com/Snider/Core/pkg/plugin/router.ts b/cmd/lthn-desktop/public/bindings/github.com/Snider/Core/pkg/plugin/router.ts new file mode 100644 index 0000000..d42aeb2 --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/github.com/Snider/Core/pkg/plugin/router.ts @@ -0,0 +1,100 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +/** + * Router manages plugin registration and provides a Gin-based HTTP router. + * It implements http.Handler and can be used as the Wails asset handler middleware. + * @module + */ + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as gin$0 from "../../../../gin-gonic/gin/models.js"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as application$0 from "../../../../wailsapp/wails/v3/pkg/application/models.js"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as http$0 from "../../../../../net/http/models.js"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as $models from "./models.js"; + +/** + * Engine returns the underlying Gin engine for advanced configuration. + */ +export function Engine(): $CancellablePromise { + return $Call.ByID(2071121571).then(($result: any) => { + return $$createType1($result); + }); +} + +/** + * Get returns a plugin by namespace and name. + */ +export function Get($namespace: string, name: string): $CancellablePromise<[$models.Plugin, boolean]> { + return $Call.ByID(2263988351, $namespace, name); +} + +/** + * List returns info about all registered plugins. + */ +export function List(): $CancellablePromise<$models.PluginInfo[]> { + return $Call.ByID(1465721241).then(($result: any) => { + return $$createType3($result); + }); +} + +/** + * ListByNamespace returns all plugins in a namespace. + */ +export function ListByNamespace($namespace: string): $CancellablePromise<$models.Plugin[]> { + return $Call.ByID(3303695111, $namespace).then(($result: any) => { + return $$createType4($result); + }); +} + +/** + * Register adds a plugin to the router. + */ +export function Register(p: $models.Plugin): $CancellablePromise { + return $Call.ByID(1142024616, p); +} + +/** + * ServiceOptions returns the Wails service options for the router. + */ +export function ServiceOptions(): $CancellablePromise { + return $Call.ByID(1034114530).then(($result: any) => { + return $$createType5($result); + }); +} + +/** + * SetAssetHandler sets the fallback handler for non-API routes (Wails assets). + */ +export function SetAssetHandler(h: http$0.Handler): $CancellablePromise { + return $Call.ByID(417441915, h); +} + +/** + * Unregister removes a plugin from the router. + * Note: Gin doesn't support removing routes, so this only removes from our registry. + * A restart is required for route changes to take effect. + */ +export function Unregister($namespace: string, name: string): $CancellablePromise { + return $Call.ByID(2047711931, $namespace, name); +} + +// Private type creation functions +const $$createType0 = gin$0.Engine.createFrom; +const $$createType1 = $Create.Nullable($$createType0); +const $$createType2 = $models.PluginInfo.createFrom; +const $$createType3 = $Create.Array($$createType2); +const $$createType4 = $Create.Array($Create.Any); +const $$createType5 = application$0.ServiceOptions.createFrom; diff --git a/cmd/lthn-desktop/public/bindings/github.com/gin-gonic/gin/index.ts b/cmd/lthn-desktop/public/bindings/github.com/gin-gonic/gin/index.ts new file mode 100644 index 0000000..9305413 --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/github.com/gin-gonic/gin/index.ts @@ -0,0 +1,11 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export { + Engine +} from "./models.js"; + +export type { + HandlerFunc, + HandlersChain +} from "./models.js"; diff --git a/cmd/lthn-desktop/public/bindings/github.com/gin-gonic/gin/models.ts b/cmd/lthn-desktop/public/bindings/github.com/gin-gonic/gin/models.ts new file mode 100644 index 0000000..f38a25e --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/github.com/gin-gonic/gin/models.ts @@ -0,0 +1,220 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as render$0 from "./render/models.js"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as template$0 from "../../../html/template/models.js"; + +/** + * Engine is the framework's instance, it contains the muxer, middleware and configuration settings. + * Create an instance of Engine, by using New() or Default() + */ +export class Engine { + "Handlers": HandlersChain; + + /** + * RedirectTrailingSlash enables automatic redirection if the current route can't be matched but a + * handler for the path with (without) the trailing slash exists. + * For example if /foo/ is requested but a route only exists for /foo, the + * client is redirected to /foo with http status code 301 for GET requests + * and 307 for all other request methods. + */ + "RedirectTrailingSlash": boolean; + + /** + * RedirectFixedPath if enabled, the router tries to fix the current request path, if no + * handle is registered for it. + * First superfluous path elements like ../ or // are removed. + * Afterwards the router does a case-insensitive lookup of the cleaned path. + * If a handle can be found for this route, the router makes a redirection + * to the corrected path with status code 301 for GET requests and 307 for + * all other request methods. + * For example /FOO and /..//Foo could be redirected to /foo. + * RedirectTrailingSlash is independent of this option. + */ + "RedirectFixedPath": boolean; + + /** + * HandleMethodNotAllowed if enabled, the router checks if another method is allowed for the + * current route, if the current request can not be routed. + * If this is the case, the request is answered with 'Method Not Allowed' + * and HTTP status code 405. + * If no other Method is allowed, the request is delegated to the NotFound + * handler. + */ + "HandleMethodNotAllowed": boolean; + + /** + * ForwardedByClientIP if enabled, client IP will be parsed from the request's headers that + * match those stored at `(*gin.Engine).RemoteIPHeaders`. If no IP was + * fetched, it falls back to the IP obtained from + * `(*gin.Context).Request.RemoteAddr`. + */ + "ForwardedByClientIP": boolean; + + /** + * AppEngine was deprecated. + * Deprecated: USE `TrustedPlatform` WITH VALUE `gin.PlatformGoogleAppEngine` INSTEAD + * #726 #755 If enabled, it will trust some headers starting with + * 'X-AppEngine...' for better integration with that PaaS. + */ + "AppEngine": boolean; + + /** + * UseRawPath if enabled, the url.RawPath will be used to find parameters. + */ + "UseRawPath": boolean; + + /** + * UnescapePathValues if true, the path value will be unescaped. + * If UseRawPath is false (by default), the UnescapePathValues effectively is true, + * as url.Path gonna be used, which is already unescaped. + */ + "UnescapePathValues": boolean; + + /** + * RemoveExtraSlash a parameter can be parsed from the URL even with extra slashes. + * See the PR #1817 and issue #1644 + */ + "RemoveExtraSlash": boolean; + + /** + * RemoteIPHeaders list of headers used to obtain the client IP when + * `(*gin.Engine).ForwardedByClientIP` is `true` and + * `(*gin.Context).Request.RemoteAddr` is matched by at least one of the + * network origins of list defined by `(*gin.Engine).SetTrustedProxies()`. + */ + "RemoteIPHeaders": string[]; + + /** + * TrustedPlatform if set to a constant of value gin.Platform*, trusts the headers set by + * that platform, for example to determine the client IP + */ + "TrustedPlatform": string; + + /** + * MaxMultipartMemory value of 'maxMemory' param that is given to http.Request's ParseMultipartForm + * method call. + */ + "MaxMultipartMemory": number; + + /** + * UseH2C enable h2c support. + */ + "UseH2C": boolean; + + /** + * ContextWithFallback enable fallback Context.Deadline(), Context.Done(), Context.Err() and Context.Value() when Context.Request.Context() is not nil. + */ + "ContextWithFallback": boolean; + "HTMLRender": render$0.HTMLRender; + "FuncMap": template$0.FuncMap; + + /** Creates a new Engine instance. */ + constructor($$source: Partial = {}) { + if (!("Handlers" in $$source)) { + this["Handlers"] = []; + } + if (!("RedirectTrailingSlash" in $$source)) { + this["RedirectTrailingSlash"] = false; + } + if (!("RedirectFixedPath" in $$source)) { + this["RedirectFixedPath"] = false; + } + if (!("HandleMethodNotAllowed" in $$source)) { + this["HandleMethodNotAllowed"] = false; + } + if (!("ForwardedByClientIP" in $$source)) { + this["ForwardedByClientIP"] = false; + } + if (!("AppEngine" in $$source)) { + this["AppEngine"] = false; + } + if (!("UseRawPath" in $$source)) { + this["UseRawPath"] = false; + } + if (!("UnescapePathValues" in $$source)) { + this["UnescapePathValues"] = false; + } + if (!("RemoveExtraSlash" in $$source)) { + this["RemoveExtraSlash"] = false; + } + if (!("RemoteIPHeaders" in $$source)) { + this["RemoteIPHeaders"] = []; + } + if (!("TrustedPlatform" in $$source)) { + this["TrustedPlatform"] = ""; + } + if (!("MaxMultipartMemory" in $$source)) { + this["MaxMultipartMemory"] = 0; + } + if (!("UseH2C" in $$source)) { + this["UseH2C"] = false; + } + if (!("ContextWithFallback" in $$source)) { + this["ContextWithFallback"] = false; + } + if (!("HTMLRender" in $$source)) { + this["HTMLRender"] = null; + } + if (!("FuncMap" in $$source)) { + this["FuncMap"] = {}; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new Engine instance from a string or object. + */ + static createFrom($$source: any = {}): Engine { + const $$createField0_0 = $$createType0; + const $$createField9_0 = $$createType2; + const $$createField15_0 = $$createType3; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("Handlers" in $$parsedSource) { + $$parsedSource["Handlers"] = $$createField0_0($$parsedSource["Handlers"]); + } + if ("RemoteIPHeaders" in $$parsedSource) { + $$parsedSource["RemoteIPHeaders"] = $$createField9_0($$parsedSource["RemoteIPHeaders"]); + } + if ("FuncMap" in $$parsedSource) { + $$parsedSource["FuncMap"] = $$createField15_0($$parsedSource["FuncMap"]); + } + return new Engine($$parsedSource as Partial); + } +} + +/** + * HandlerFunc defines the handler used by gin middleware as return value. + */ +export type HandlerFunc = any; + +/** + * HandlersChain defines a HandlerFunc slice. + */ +export type HandlersChain = HandlerFunc[]; + +// Private type creation functions +var $$createType0 = (function $$initCreateType0(...args: any[]): any { + if ($$createType0 === $$initCreateType0) { + $$createType0 = $$createType1; + } + return $$createType0(...args); +}); +const $$createType1 = $Create.Array($Create.Any); +const $$createType2 = $Create.Array($Create.Any); +var $$createType3 = (function $$initCreateType3(...args: any[]): any { + if ($$createType3 === $$initCreateType3) { + $$createType3 = $$createType4; + } + return $$createType3(...args); +}); +const $$createType4 = $Create.Map($Create.Any, $Create.Any); diff --git a/cmd/lthn-desktop/public/bindings/github.com/gin-gonic/gin/render/index.ts b/cmd/lthn-desktop/public/bindings/github.com/gin-gonic/gin/render/index.ts new file mode 100644 index 0000000..c4ad421 --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/github.com/gin-gonic/gin/render/index.ts @@ -0,0 +1,6 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export type { + HTMLRender +} from "./models.js"; diff --git a/cmd/lthn-desktop/public/bindings/github.com/gin-gonic/gin/render/models.ts b/cmd/lthn-desktop/public/bindings/github.com/gin-gonic/gin/render/models.ts new file mode 100644 index 0000000..07b0af3 --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/github.com/gin-gonic/gin/render/models.ts @@ -0,0 +1,11 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +/** + * HTMLRender interface is to be implemented by HTMLProduction and HTMLDebug. + */ +export type HTMLRender = any; diff --git a/cmd/lthn-desktop/public/bindings/github.com/leaanthony/u/index.ts b/cmd/lthn-desktop/public/bindings/github.com/leaanthony/u/index.ts new file mode 100644 index 0000000..69f881f --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/github.com/leaanthony/u/index.ts @@ -0,0 +1,7 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export { + Bool, + Var +} from "./models.js"; diff --git a/cmd/lthn-desktop/public/bindings/github.com/leaanthony/u/models.ts b/cmd/lthn-desktop/public/bindings/github.com/leaanthony/u/models.ts new file mode 100644 index 0000000..4801261 --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/github.com/leaanthony/u/models.ts @@ -0,0 +1,40 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +/** + * Var is a variable that can be set, unset and queried for its state. + */ +export class Var { + + /** Creates a new Var instance. */ + constructor($$source: Partial> = {}) { + + Object.assign(this, $$source); + } + + /** + * Given creation functions for each type parameter, + * returns a creation function for a concrete instance + * of the generic class Var. + */ + static createFrom($$createParamT: (source: any) => T): ($$source?: any) => Var { + return ($$source: any = {}) => { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new Var($$parsedSource as Partial>); + }; + } +} + +/** + * Bool is a `bool` that can be unset + */ +export const Bool = Var; + +/** + * Bool is a `bool` that can be unset + */ +export type Bool = Var; diff --git a/cmd/lthn-desktop/public/bindings/github.com/wailsapp/wails/v3/internal/eventcreate.ts b/cmd/lthn-desktop/public/bindings/github.com/wailsapp/wails/v3/internal/eventcreate.ts new file mode 100644 index 0000000..1ea1058 --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/github.com/wailsapp/wails/v3/internal/eventcreate.ts @@ -0,0 +1,9 @@ +//@ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +Object.freeze($Create.Events); diff --git a/cmd/lthn-desktop/public/bindings/github.com/wailsapp/wails/v3/internal/eventdata.d.ts b/cmd/lthn-desktop/public/bindings/github.com/wailsapp/wails/v3/internal/eventdata.d.ts new file mode 100644 index 0000000..3dd1807 --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/github.com/wailsapp/wails/v3/internal/eventdata.d.ts @@ -0,0 +1,2 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT diff --git a/cmd/lthn-desktop/public/bindings/github.com/wailsapp/wails/v3/pkg/application/index.ts b/cmd/lthn-desktop/public/bindings/github.com/wailsapp/wails/v3/pkg/application/index.ts new file mode 100644 index 0000000..0f5cf56 --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/github.com/wailsapp/wails/v3/pkg/application/index.ts @@ -0,0 +1,47 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export { + App, + BackdropType, + BackgroundType, + BrowserManager, + ButtonState, + ClipboardManager, + ContextMenuManager, + CoreWebView2PermissionState, + DialogManager, + DragEffect, + EnvironmentManager, + EventManager, + KeyBindingManager, + LinuxWindow, + MacAppearanceType, + MacBackdrop, + MacLiquidGlass, + MacLiquidGlassStyle, + MacTitleBar, + MacToolbarStyle, + MacWebviewPreferences, + MacWindow, + MacWindowLevel, + Menu, + MenuBarTheme, + MenuManager, + NSVisualEffectMaterial, + RGBA, + ScreenManager, + ServiceOptions, + SystemTrayManager, + TextTheme, + Theme, + ThemeSettings, + WebviewGpuPolicy, + WebviewWindow, + WebviewWindowOptions, + WindowManager, + WindowStartPosition, + WindowState, + WindowTheme, + WindowsWindow +} from "./models.js"; diff --git a/cmd/lthn-desktop/public/bindings/github.com/wailsapp/wails/v3/pkg/application/models.ts b/cmd/lthn-desktop/public/bindings/github.com/wailsapp/wails/v3/pkg/application/models.ts new file mode 100644 index 0000000..59c28a4 --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/github.com/wailsapp/wails/v3/pkg/application/models.ts @@ -0,0 +1,2051 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as u$0 from "../../../../../leaanthony/u/models.js"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as events$0 from "../events/models.js"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as slog$0 from "../../../../../../log/slog/models.js"; + +export class App { + /** + * Manager pattern for organized API + */ + "Window": WindowManager | null; + "ContextMenu": ContextMenuManager | null; + "KeyBinding": KeyBindingManager | null; + "Browser": BrowserManager | null; + "Env": EnvironmentManager | null; + "Dialog": DialogManager | null; + "Event": EventManager | null; + "Menu": MenuManager | null; + "Screen": ScreenManager | null; + "Clipboard": ClipboardManager | null; + "SystemTray": SystemTrayManager | null; + "Logger": slog$0.Logger | null; + + /** Creates a new App instance. */ + constructor($$source: Partial = {}) { + if (!("Window" in $$source)) { + this["Window"] = null; + } + if (!("ContextMenu" in $$source)) { + this["ContextMenu"] = null; + } + if (!("KeyBinding" in $$source)) { + this["KeyBinding"] = null; + } + if (!("Browser" in $$source)) { + this["Browser"] = null; + } + if (!("Env" in $$source)) { + this["Env"] = null; + } + if (!("Dialog" in $$source)) { + this["Dialog"] = null; + } + if (!("Event" in $$source)) { + this["Event"] = null; + } + if (!("Menu" in $$source)) { + this["Menu"] = null; + } + if (!("Screen" in $$source)) { + this["Screen"] = null; + } + if (!("Clipboard" in $$source)) { + this["Clipboard"] = null; + } + if (!("SystemTray" in $$source)) { + this["SystemTray"] = null; + } + if (!("Logger" in $$source)) { + this["Logger"] = null; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new App instance from a string or object. + */ + static createFrom($$source: any = {}): App { + const $$createField0_0 = $$createType1; + const $$createField1_0 = $$createType3; + const $$createField2_0 = $$createType5; + const $$createField3_0 = $$createType7; + const $$createField4_0 = $$createType9; + const $$createField5_0 = $$createType11; + const $$createField6_0 = $$createType13; + const $$createField7_0 = $$createType15; + const $$createField8_0 = $$createType17; + const $$createField9_0 = $$createType19; + const $$createField10_0 = $$createType21; + const $$createField11_0 = $$createType23; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("Window" in $$parsedSource) { + $$parsedSource["Window"] = $$createField0_0($$parsedSource["Window"]); + } + if ("ContextMenu" in $$parsedSource) { + $$parsedSource["ContextMenu"] = $$createField1_0($$parsedSource["ContextMenu"]); + } + if ("KeyBinding" in $$parsedSource) { + $$parsedSource["KeyBinding"] = $$createField2_0($$parsedSource["KeyBinding"]); + } + if ("Browser" in $$parsedSource) { + $$parsedSource["Browser"] = $$createField3_0($$parsedSource["Browser"]); + } + if ("Env" in $$parsedSource) { + $$parsedSource["Env"] = $$createField4_0($$parsedSource["Env"]); + } + if ("Dialog" in $$parsedSource) { + $$parsedSource["Dialog"] = $$createField5_0($$parsedSource["Dialog"]); + } + if ("Event" in $$parsedSource) { + $$parsedSource["Event"] = $$createField6_0($$parsedSource["Event"]); + } + if ("Menu" in $$parsedSource) { + $$parsedSource["Menu"] = $$createField7_0($$parsedSource["Menu"]); + } + if ("Screen" in $$parsedSource) { + $$parsedSource["Screen"] = $$createField8_0($$parsedSource["Screen"]); + } + if ("Clipboard" in $$parsedSource) { + $$parsedSource["Clipboard"] = $$createField9_0($$parsedSource["Clipboard"]); + } + if ("SystemTray" in $$parsedSource) { + $$parsedSource["SystemTray"] = $$createField10_0($$parsedSource["SystemTray"]); + } + if ("Logger" in $$parsedSource) { + $$parsedSource["Logger"] = $$createField11_0($$parsedSource["Logger"]); + } + return new App($$parsedSource as Partial); + } +} + +export enum BackdropType { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + Auto = 0, + None = 1, + Mica = 2, + Acrylic = 3, + Tabbed = 4, +}; + +export enum BackgroundType { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + BackgroundTypeSolid = 0, + BackgroundTypeTransparent = 1, + BackgroundTypeTranslucent = 2, +}; + +/** + * BrowserManager manages browser-related operations + */ +export class BrowserManager { + + /** Creates a new BrowserManager instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new BrowserManager instance from a string or object. + */ + static createFrom($$source: any = {}): BrowserManager { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new BrowserManager($$parsedSource as Partial); + } +} + +export enum ButtonState { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + ButtonEnabled = 0, + ButtonDisabled = 1, + ButtonHidden = 2, +}; + +/** + * ClipboardManager manages clipboard operations + */ +export class ClipboardManager { + + /** Creates a new ClipboardManager instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new ClipboardManager instance from a string or object. + */ + static createFrom($$source: any = {}): ClipboardManager { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new ClipboardManager($$parsedSource as Partial); + } +} + +/** + * ContextMenuManager manages all context menu operations + */ +export class ContextMenuManager { + + /** Creates a new ContextMenuManager instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new ContextMenuManager instance from a string or object. + */ + static createFrom($$source: any = {}): ContextMenuManager { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new ContextMenuManager($$parsedSource as Partial); + } +} + +export enum CoreWebView2PermissionState { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + CoreWebView2PermissionStateDefault = 0, + CoreWebView2PermissionStateAllow = 1, + CoreWebView2PermissionStateDeny = 2, +}; + +/** + * DialogManager manages dialog-related operations + */ +export class DialogManager { + + /** Creates a new DialogManager instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new DialogManager instance from a string or object. + */ + static createFrom($$source: any = {}): DialogManager { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new DialogManager($$parsedSource as Partial); + } +} + +export enum DragEffect { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + /** + * DragEffectNone is used to indicate that the drop target cannot accept the data. + */ + DragEffectNone = 1, + + /** + * DragEffectCopy is used to indicate that the data is copied to the drop target. + */ + DragEffectCopy = 2, + + /** + * DragEffectMove is used to indicate that the data is removed from the drag source. + */ + DragEffectMove = 3, + + /** + * DragEffectLink is used to indicate that a link to the original data is established. + */ + DragEffectLink = 4, +}; + +/** + * EnvironmentManager manages environment-related operations + */ +export class EnvironmentManager { + + /** Creates a new EnvironmentManager instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new EnvironmentManager instance from a string or object. + */ + static createFrom($$source: any = {}): EnvironmentManager { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new EnvironmentManager($$parsedSource as Partial); + } +} + +/** + * EventManager manages event-related operations + */ +export class EventManager { + + /** Creates a new EventManager instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new EventManager instance from a string or object. + */ + static createFrom($$source: any = {}): EventManager { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new EventManager($$parsedSource as Partial); + } +} + +/** + * KeyBindingManager manages all key binding operations + */ +export class KeyBindingManager { + + /** Creates a new KeyBindingManager instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new KeyBindingManager instance from a string or object. + */ + static createFrom($$source: any = {}): KeyBindingManager { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new KeyBindingManager($$parsedSource as Partial); + } +} + +/** + * LinuxWindow specific to Linux windows + */ +export class LinuxWindow { + /** + * Icon Sets up the icon representing the window. This icon is used when the window is minimized + * (also known as iconified). + */ + "Icon": string; + + /** + * WindowIsTranslucent sets the window's background to transparent when enabled. + */ + "WindowIsTranslucent": boolean; + + /** + * WebviewGpuPolicy used for determining the hardware acceleration policy for the webview. + * - WebviewGpuPolicyAlways + * - WebviewGpuPolicyOnDemand + * - WebviewGpuPolicyNever + * + * Due to https://github.com/wailsapp/wails/issues/2977, if options.Linux is nil + * in the call to wails.Run(), WebviewGpuPolicy is set by default to WebviewGpuPolicyNever. + * Client code may override this behavior by passing a non-nil Options and set + * WebviewGpuPolicy as needed. + */ + "WebviewGpuPolicy": WebviewGpuPolicy; + + /** + * WindowDidMoveDebounceMS is the debounce time in milliseconds for the WindowDidMove event + */ + "WindowDidMoveDebounceMS": number; + + /** + * Menu is the window's menu + */ + "Menu": Menu | null; + + /** Creates a new LinuxWindow instance. */ + constructor($$source: Partial = {}) { + if (!("Icon" in $$source)) { + this["Icon"] = ""; + } + if (!("WindowIsTranslucent" in $$source)) { + this["WindowIsTranslucent"] = false; + } + if (!("WebviewGpuPolicy" in $$source)) { + this["WebviewGpuPolicy"] = WebviewGpuPolicy.$zero; + } + if (!("WindowDidMoveDebounceMS" in $$source)) { + this["WindowDidMoveDebounceMS"] = 0; + } + if (!("Menu" in $$source)) { + this["Menu"] = null; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new LinuxWindow instance from a string or object. + */ + static createFrom($$source: any = {}): LinuxWindow { + const $$createField0_0 = $Create.ByteSlice; + const $$createField4_0 = $$createType25; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("Icon" in $$parsedSource) { + $$parsedSource["Icon"] = $$createField0_0($$parsedSource["Icon"]); + } + if ("Menu" in $$parsedSource) { + $$parsedSource["Menu"] = $$createField4_0($$parsedSource["Menu"]); + } + return new LinuxWindow($$parsedSource as Partial); + } +} + +/** + * MacAppearanceType is a type of Appearance for Cocoa windows + */ +export enum MacAppearanceType { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = "", + + /** + * DefaultAppearance uses the default system value + */ + DefaultAppearance = "", + + /** + * NSAppearanceNameAqua - The standard light system appearance. + */ + NSAppearanceNameAqua = "NSAppearanceNameAqua", + + /** + * NSAppearanceNameDarkAqua - The standard dark system appearance. + */ + NSAppearanceNameDarkAqua = "NSAppearanceNameDarkAqua", + + /** + * NSAppearanceNameVibrantLight - The light vibrant appearance + */ + NSAppearanceNameVibrantLight = "NSAppearanceNameVibrantLight", + + /** + * NSAppearanceNameAccessibilityHighContrastAqua - A high-contrast version of the standard light system appearance. + */ + NSAppearanceNameAccessibilityHighContrastAqua = "NSAppearanceNameAccessibilityHighContrastAqua", + + /** + * NSAppearanceNameAccessibilityHighContrastDarkAqua - A high-contrast version of the standard dark system appearance. + */ + NSAppearanceNameAccessibilityHighContrastDarkAqua = "NSAppearanceNameAccessibilityHighContrastDarkAqua", + + /** + * NSAppearanceNameAccessibilityHighContrastVibrantLight - A high-contrast version of the light vibrant appearance. + */ + NSAppearanceNameAccessibilityHighContrastVibrantLight = "NSAppearanceNameAccessibilityHighContrastVibrantLight", + + /** + * NSAppearanceNameAccessibilityHighContrastVibrantDark - A high-contrast version of the dark vibrant appearance. + */ + NSAppearanceNameAccessibilityHighContrastVibrantDark = "NSAppearanceNameAccessibilityHighContrastVibrantDark", +}; + +/** + * MacBackdrop is the backdrop type for macOS + */ +export enum MacBackdrop { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + /** + * MacBackdropNormal - The default value. The window will have a normal opaque background. + */ + MacBackdropNormal = 0, + + /** + * MacBackdropTransparent - The window will have a transparent background, with the content underneath it being visible + */ + MacBackdropTransparent = 1, + + /** + * MacBackdropTranslucent - The window will have a translucent background, with the content underneath it being "fuzzy" or "frosted" + */ + MacBackdropTranslucent = 2, + + /** + * MacBackdropLiquidGlass - The window will use Apple's Liquid Glass effect (macOS 15.0+ with fallback to translucent) + */ + MacBackdropLiquidGlass = 3, +}; + +/** + * MacLiquidGlass contains configuration for the Liquid Glass effect + */ +export class MacLiquidGlass { + /** + * Style of the glass effect + */ + "Style": MacLiquidGlassStyle; + + /** + * Material to use for NSVisualEffectView (when NSGlassEffectView is not available) + * Set to NSVisualEffectMaterialAuto to use automatic selection based on Style + */ + "Material": NSVisualEffectMaterial; + + /** + * Corner radius for the glass effect (0 for square corners) + */ + "CornerRadius": number; + + /** + * Tint color for the glass (optional, nil for no tint) + */ + "TintColor": RGBA | null; + + /** + * Group identifier for merging multiple glass windows + */ + "GroupID": string; + + /** + * Spacing between grouped glass elements (in points) + */ + "GroupSpacing": number; + + /** Creates a new MacLiquidGlass instance. */ + constructor($$source: Partial = {}) { + if (!("Style" in $$source)) { + this["Style"] = MacLiquidGlassStyle.$zero; + } + if (!("Material" in $$source)) { + this["Material"] = NSVisualEffectMaterial.$zero; + } + if (!("CornerRadius" in $$source)) { + this["CornerRadius"] = 0; + } + if (!("TintColor" in $$source)) { + this["TintColor"] = null; + } + if (!("GroupID" in $$source)) { + this["GroupID"] = ""; + } + if (!("GroupSpacing" in $$source)) { + this["GroupSpacing"] = 0; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new MacLiquidGlass instance from a string or object. + */ + static createFrom($$source: any = {}): MacLiquidGlass { + const $$createField3_0 = $$createType27; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("TintColor" in $$parsedSource) { + $$parsedSource["TintColor"] = $$createField3_0($$parsedSource["TintColor"]); + } + return new MacLiquidGlass($$parsedSource as Partial); + } +} + +/** + * MacLiquidGlassStyle defines the style of the Liquid Glass effect + */ +export enum MacLiquidGlassStyle { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + /** + * LiquidGlassStyleAutomatic - System determines the best style + */ + LiquidGlassStyleAutomatic = 0, + + /** + * LiquidGlassStyleLight - Light glass appearance + */ + LiquidGlassStyleLight = 1, + + /** + * LiquidGlassStyleDark - Dark glass appearance + */ + LiquidGlassStyleDark = 2, + + /** + * LiquidGlassStyleVibrant - Vibrant glass with enhanced effects + */ + LiquidGlassStyleVibrant = 3, +}; + +/** + * MacTitleBar contains options for the Mac titlebar + */ +export class MacTitleBar { + /** + * AppearsTransparent will make the titlebar transparent + */ + "AppearsTransparent": boolean; + + /** + * Hide will hide the titlebar + */ + "Hide": boolean; + + /** + * HideTitle will hide the title + */ + "HideTitle": boolean; + + /** + * FullSizeContent will extend the window content to the full size of the window + */ + "FullSizeContent": boolean; + + /** + * UseToolbar will use a toolbar instead of a titlebar + */ + "UseToolbar": boolean; + + /** + * HideToolbarSeparator will hide the toolbar separator + */ + "HideToolbarSeparator": boolean; + + /** + * ShowToolbarWhenFullscreen will keep the toolbar visible when the window is in fullscreen mode + */ + "ShowToolbarWhenFullscreen": boolean; + + /** + * ToolbarStyle is the style of toolbar to use + */ + "ToolbarStyle": MacToolbarStyle; + + /** Creates a new MacTitleBar instance. */ + constructor($$source: Partial = {}) { + if (!("AppearsTransparent" in $$source)) { + this["AppearsTransparent"] = false; + } + if (!("Hide" in $$source)) { + this["Hide"] = false; + } + if (!("HideTitle" in $$source)) { + this["HideTitle"] = false; + } + if (!("FullSizeContent" in $$source)) { + this["FullSizeContent"] = false; + } + if (!("UseToolbar" in $$source)) { + this["UseToolbar"] = false; + } + if (!("HideToolbarSeparator" in $$source)) { + this["HideToolbarSeparator"] = false; + } + if (!("ShowToolbarWhenFullscreen" in $$source)) { + this["ShowToolbarWhenFullscreen"] = false; + } + if (!("ToolbarStyle" in $$source)) { + this["ToolbarStyle"] = MacToolbarStyle.$zero; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new MacTitleBar instance from a string or object. + */ + static createFrom($$source: any = {}): MacTitleBar { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new MacTitleBar($$parsedSource as Partial); + } +} + +/** + * MacToolbarStyle is the style of toolbar for macOS + */ +export enum MacToolbarStyle { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + /** + * MacToolbarStyleAutomatic - The default value. The style will be determined by the window's given configuration + */ + MacToolbarStyleAutomatic = 0, + + /** + * MacToolbarStyleExpanded - The toolbar will appear below the window title + */ + MacToolbarStyleExpanded = 1, + + /** + * MacToolbarStylePreference - The toolbar will appear below the window title and the items in the toolbar will attempt to have equal widths when possible + */ + MacToolbarStylePreference = 2, + + /** + * MacToolbarStyleUnified - The window title will appear inline with the toolbar when visible + */ + MacToolbarStyleUnified = 3, + + /** + * MacToolbarStyleUnifiedCompact - Same as MacToolbarStyleUnified, but with reduced margins in the toolbar allowing more focus to be on the contents of the window + */ + MacToolbarStyleUnifiedCompact = 4, +}; + +/** + * MacWebviewPreferences contains preferences for the Mac webview + */ +export class MacWebviewPreferences { + /** + * TabFocusesLinks will enable tabbing to links + */ + "TabFocusesLinks": u$0.Bool; + + /** + * TextInteractionEnabled will enable text interaction + */ + "TextInteractionEnabled": u$0.Bool; + + /** + * FullscreenEnabled will enable fullscreen + */ + "FullscreenEnabled": u$0.Bool; + + /** + * AllowsBackForwardNavigationGestures enables horizontal swipe gestures for back/forward navigation + */ + "AllowsBackForwardNavigationGestures": u$0.Bool; + + /** Creates a new MacWebviewPreferences instance. */ + constructor($$source: Partial = {}) { + if (!("TabFocusesLinks" in $$source)) { + this["TabFocusesLinks"] = (new u$0.Bool()); + } + if (!("TextInteractionEnabled" in $$source)) { + this["TextInteractionEnabled"] = (new u$0.Bool()); + } + if (!("FullscreenEnabled" in $$source)) { + this["FullscreenEnabled"] = (new u$0.Bool()); + } + if (!("AllowsBackForwardNavigationGestures" in $$source)) { + this["AllowsBackForwardNavigationGestures"] = (new u$0.Bool()); + } + + Object.assign(this, $$source); + } + + /** + * Creates a new MacWebviewPreferences instance from a string or object. + */ + static createFrom($$source: any = {}): MacWebviewPreferences { + const $$createField0_0 = $$createType28; + const $$createField1_0 = $$createType28; + const $$createField2_0 = $$createType28; + const $$createField3_0 = $$createType28; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("TabFocusesLinks" in $$parsedSource) { + $$parsedSource["TabFocusesLinks"] = $$createField0_0($$parsedSource["TabFocusesLinks"]); + } + if ("TextInteractionEnabled" in $$parsedSource) { + $$parsedSource["TextInteractionEnabled"] = $$createField1_0($$parsedSource["TextInteractionEnabled"]); + } + if ("FullscreenEnabled" in $$parsedSource) { + $$parsedSource["FullscreenEnabled"] = $$createField2_0($$parsedSource["FullscreenEnabled"]); + } + if ("AllowsBackForwardNavigationGestures" in $$parsedSource) { + $$parsedSource["AllowsBackForwardNavigationGestures"] = $$createField3_0($$parsedSource["AllowsBackForwardNavigationGestures"]); + } + return new MacWebviewPreferences($$parsedSource as Partial); + } +} + +/** + * MacWindow contains macOS specific options for Webview Windows + */ +export class MacWindow { + /** + * Backdrop is the backdrop type for the window + */ + "Backdrop": MacBackdrop; + + /** + * DisableShadow will disable the window shadow + */ + "DisableShadow": boolean; + + /** + * TitleBar contains options for the Mac titlebar + */ + "TitleBar": MacTitleBar; + + /** + * Appearance is the appearance type for the window + */ + "Appearance": MacAppearanceType; + + /** + * InvisibleTitleBarHeight defines the height of an invisible titlebar which responds to dragging + */ + "InvisibleTitleBarHeight": number; + + /** + * Maps events from platform specific to common event types + */ + "EventMapping": { [_: `${number}`]: events$0.WindowEventType }; + + /** + * EnableFraudulentWebsiteWarnings will enable warnings for fraudulent websites. + * Default: false + */ + "EnableFraudulentWebsiteWarnings": boolean; + + /** + * WebviewPreferences contains preferences for the webview + */ + "WebviewPreferences": MacWebviewPreferences; + + /** + * WindowLevel sets the window level to control the order of windows in the screen + */ + "WindowLevel": MacWindowLevel; + + /** + * LiquidGlass contains configuration for the Liquid Glass effect + */ + "LiquidGlass": MacLiquidGlass; + + /** Creates a new MacWindow instance. */ + constructor($$source: Partial = {}) { + if (!("Backdrop" in $$source)) { + this["Backdrop"] = MacBackdrop.$zero; + } + if (!("DisableShadow" in $$source)) { + this["DisableShadow"] = false; + } + if (!("TitleBar" in $$source)) { + this["TitleBar"] = (new MacTitleBar()); + } + if (!("Appearance" in $$source)) { + this["Appearance"] = MacAppearanceType.$zero; + } + if (!("InvisibleTitleBarHeight" in $$source)) { + this["InvisibleTitleBarHeight"] = 0; + } + if (!("EventMapping" in $$source)) { + this["EventMapping"] = {}; + } + if (!("EnableFraudulentWebsiteWarnings" in $$source)) { + this["EnableFraudulentWebsiteWarnings"] = false; + } + if (!("WebviewPreferences" in $$source)) { + this["WebviewPreferences"] = (new MacWebviewPreferences()); + } + if (!("WindowLevel" in $$source)) { + this["WindowLevel"] = MacWindowLevel.$zero; + } + if (!("LiquidGlass" in $$source)) { + this["LiquidGlass"] = (new MacLiquidGlass()); + } + + Object.assign(this, $$source); + } + + /** + * Creates a new MacWindow instance from a string or object. + */ + static createFrom($$source: any = {}): MacWindow { + const $$createField2_0 = $$createType29; + const $$createField5_0 = $$createType30; + const $$createField7_0 = $$createType31; + const $$createField9_0 = $$createType32; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("TitleBar" in $$parsedSource) { + $$parsedSource["TitleBar"] = $$createField2_0($$parsedSource["TitleBar"]); + } + if ("EventMapping" in $$parsedSource) { + $$parsedSource["EventMapping"] = $$createField5_0($$parsedSource["EventMapping"]); + } + if ("WebviewPreferences" in $$parsedSource) { + $$parsedSource["WebviewPreferences"] = $$createField7_0($$parsedSource["WebviewPreferences"]); + } + if ("LiquidGlass" in $$parsedSource) { + $$parsedSource["LiquidGlass"] = $$createField9_0($$parsedSource["LiquidGlass"]); + } + return new MacWindow($$parsedSource as Partial); + } +} + +export enum MacWindowLevel { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = "", + + MacWindowLevelNormal = "normal", + MacWindowLevelFloating = "floating", + MacWindowLevelTornOffMenu = "tornOffMenu", + MacWindowLevelModalPanel = "modalPanel", + MacWindowLevelMainMenu = "mainMenu", + MacWindowLevelStatus = "status", + MacWindowLevelPopUpMenu = "popUpMenu", + MacWindowLevelScreenSaver = "screenSaver", +}; + +export class Menu { + + /** Creates a new Menu instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new Menu instance from a string or object. + */ + static createFrom($$source: any = {}): Menu { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new Menu($$parsedSource as Partial); + } +} + +export class MenuBarTheme { + /** + * Default is the default theme + */ + "Default": TextTheme | null; + + /** + * Hover defines the theme to use when the menu item is hovered + */ + "Hover": TextTheme | null; + + /** + * Selected defines the theme to use when the menu item is selected + */ + "Selected": TextTheme | null; + + /** Creates a new MenuBarTheme instance. */ + constructor($$source: Partial = {}) { + if (!("Default" in $$source)) { + this["Default"] = null; + } + if (!("Hover" in $$source)) { + this["Hover"] = null; + } + if (!("Selected" in $$source)) { + this["Selected"] = null; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new MenuBarTheme instance from a string or object. + */ + static createFrom($$source: any = {}): MenuBarTheme { + const $$createField0_0 = $$createType34; + const $$createField1_0 = $$createType34; + const $$createField2_0 = $$createType34; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("Default" in $$parsedSource) { + $$parsedSource["Default"] = $$createField0_0($$parsedSource["Default"]); + } + if ("Hover" in $$parsedSource) { + $$parsedSource["Hover"] = $$createField1_0($$parsedSource["Hover"]); + } + if ("Selected" in $$parsedSource) { + $$parsedSource["Selected"] = $$createField2_0($$parsedSource["Selected"]); + } + return new MenuBarTheme($$parsedSource as Partial); + } +} + +/** + * MenuManager manages menu-related operations + */ +export class MenuManager { + + /** Creates a new MenuManager instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new MenuManager instance from a string or object. + */ + static createFrom($$source: any = {}): MenuManager { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new MenuManager($$parsedSource as Partial); + } +} + +/** + * NSVisualEffectMaterial represents the NSVisualEffectMaterial enum for macOS + */ +export enum NSVisualEffectMaterial { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + /** + * NSVisualEffectMaterial values from macOS SDK + */ + NSVisualEffectMaterialAppearanceBased = 0, + NSVisualEffectMaterialLight = 1, + NSVisualEffectMaterialDark = 2, + NSVisualEffectMaterialTitlebar = 3, + NSVisualEffectMaterialSelection = 4, + NSVisualEffectMaterialMenu = 5, + NSVisualEffectMaterialPopover = 6, + NSVisualEffectMaterialSidebar = 7, + NSVisualEffectMaterialHeaderView = 10, + NSVisualEffectMaterialSheet = 11, + NSVisualEffectMaterialWindowBackground = 12, + NSVisualEffectMaterialHUDWindow = 13, + NSVisualEffectMaterialFullScreenUI = 15, + NSVisualEffectMaterialToolTip = 17, + NSVisualEffectMaterialContentBackground = 18, + NSVisualEffectMaterialUnderWindowBackground = 21, + NSVisualEffectMaterialUnderPageBackground = 22, + + /** + * Use auto-selection based on Style + */ + NSVisualEffectMaterialAuto = -1, +}; + +export class RGBA { + "Red": number; + "Green": number; + "Blue": number; + "Alpha": number; + + /** Creates a new RGBA instance. */ + constructor($$source: Partial = {}) { + if (!("Red" in $$source)) { + this["Red"] = 0; + } + if (!("Green" in $$source)) { + this["Green"] = 0; + } + if (!("Blue" in $$source)) { + this["Blue"] = 0; + } + if (!("Alpha" in $$source)) { + this["Alpha"] = 0; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new RGBA instance from a string or object. + */ + static createFrom($$source: any = {}): RGBA { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new RGBA($$parsedSource as Partial); + } +} + +export class ScreenManager { + + /** Creates a new ScreenManager instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new ScreenManager instance from a string or object. + */ + static createFrom($$source: any = {}): ScreenManager { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new ScreenManager($$parsedSource as Partial); + } +} + +/** + * ServiceOptions provides optional parameters for calls to [NewService]. + */ +export class ServiceOptions { + /** + * Name can be set to override the name of the service + * for logging and debugging purposes. + * + * If empty, it will default + * either to the value obtained through the [ServiceName] interface, + * or to the type name. + */ + "Name": string; + + /** + * If the service instance implements [http.Handler], + * it will be mounted on the internal asset server + * at the prefix specified by Route. + */ + "Route": string; + + /** + * MarshalError will be called if non-nil + * to marshal to JSON the error values returned by this service's methods. + * + * MarshalError is not allowed to fail, + * but it may return a nil slice to fall back + * to the globally configured error handler. + * + * If the returned slice is not nil, it must contain valid JSON. + */ + "MarshalError": any; + + /** Creates a new ServiceOptions instance. */ + constructor($$source: Partial = {}) { + if (!("Name" in $$source)) { + this["Name"] = ""; + } + if (!("Route" in $$source)) { + this["Route"] = ""; + } + if (!("MarshalError" in $$source)) { + this["MarshalError"] = null; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new ServiceOptions instance from a string or object. + */ + static createFrom($$source: any = {}): ServiceOptions { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new ServiceOptions($$parsedSource as Partial); + } +} + +/** + * SystemTrayManager manages system tray-related operations + */ +export class SystemTrayManager { + + /** Creates a new SystemTrayManager instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new SystemTrayManager instance from a string or object. + */ + static createFrom($$source: any = {}): SystemTrayManager { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new SystemTrayManager($$parsedSource as Partial); + } +} + +export class TextTheme { + /** + * Text is the colour of the text + */ + "Text": number | null; + + /** + * Background is the background colour of the text + */ + "Background": number | null; + + /** Creates a new TextTheme instance. */ + constructor($$source: Partial = {}) { + if (!("Text" in $$source)) { + this["Text"] = null; + } + if (!("Background" in $$source)) { + this["Background"] = null; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new TextTheme instance from a string or object. + */ + static createFrom($$source: any = {}): TextTheme { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new TextTheme($$parsedSource as Partial); + } +} + +export enum Theme { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + /** + * SystemDefault will use whatever the system theme is. The application will follow system theme changes. + */ + SystemDefault = 0, + + /** + * Dark Mode + */ + Dark = 1, + + /** + * Light Mode + */ + Light = 2, +}; + +/** + * ThemeSettings defines custom colours to use in dark or light mode. + * They may be set using the hex values: 0x00BBGGRR + */ +export class ThemeSettings { + /** + * Dark mode active window + */ + "DarkModeActive": WindowTheme | null; + + /** + * Dark mode inactive window + */ + "DarkModeInactive": WindowTheme | null; + + /** + * Light mode active window + */ + "LightModeActive": WindowTheme | null; + + /** + * Light mode inactive window + */ + "LightModeInactive": WindowTheme | null; + + /** + * Dark mode MenuBar + */ + "DarkModeMenuBar": MenuBarTheme | null; + + /** + * Light mode MenuBar + */ + "LightModeMenuBar": MenuBarTheme | null; + + /** Creates a new ThemeSettings instance. */ + constructor($$source: Partial = {}) { + if (!("DarkModeActive" in $$source)) { + this["DarkModeActive"] = null; + } + if (!("DarkModeInactive" in $$source)) { + this["DarkModeInactive"] = null; + } + if (!("LightModeActive" in $$source)) { + this["LightModeActive"] = null; + } + if (!("LightModeInactive" in $$source)) { + this["LightModeInactive"] = null; + } + if (!("DarkModeMenuBar" in $$source)) { + this["DarkModeMenuBar"] = null; + } + if (!("LightModeMenuBar" in $$source)) { + this["LightModeMenuBar"] = null; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new ThemeSettings instance from a string or object. + */ + static createFrom($$source: any = {}): ThemeSettings { + const $$createField0_0 = $$createType36; + const $$createField1_0 = $$createType36; + const $$createField2_0 = $$createType36; + const $$createField3_0 = $$createType36; + const $$createField4_0 = $$createType38; + const $$createField5_0 = $$createType38; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("DarkModeActive" in $$parsedSource) { + $$parsedSource["DarkModeActive"] = $$createField0_0($$parsedSource["DarkModeActive"]); + } + if ("DarkModeInactive" in $$parsedSource) { + $$parsedSource["DarkModeInactive"] = $$createField1_0($$parsedSource["DarkModeInactive"]); + } + if ("LightModeActive" in $$parsedSource) { + $$parsedSource["LightModeActive"] = $$createField2_0($$parsedSource["LightModeActive"]); + } + if ("LightModeInactive" in $$parsedSource) { + $$parsedSource["LightModeInactive"] = $$createField3_0($$parsedSource["LightModeInactive"]); + } + if ("DarkModeMenuBar" in $$parsedSource) { + $$parsedSource["DarkModeMenuBar"] = $$createField4_0($$parsedSource["DarkModeMenuBar"]); + } + if ("LightModeMenuBar" in $$parsedSource) { + $$parsedSource["LightModeMenuBar"] = $$createField5_0($$parsedSource["LightModeMenuBar"]); + } + return new ThemeSettings($$parsedSource as Partial); + } +} + +/** + * WebviewGpuPolicy values used for determining the webview's hardware acceleration policy. + */ +export enum WebviewGpuPolicy { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + /** + * WebviewGpuPolicyAlways Hardware acceleration is always enabled. + */ + WebviewGpuPolicyAlways = 0, + + /** + * WebviewGpuPolicyOnDemand Hardware acceleration is enabled/disabled as request by web contents. + */ + WebviewGpuPolicyOnDemand = 1, + + /** + * WebviewGpuPolicyNever Hardware acceleration is always disabled. + */ + WebviewGpuPolicyNever = 2, +}; + +export class WebviewWindow { + + /** Creates a new WebviewWindow instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new WebviewWindow instance from a string or object. + */ + static createFrom($$source: any = {}): WebviewWindow { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new WebviewWindow($$parsedSource as Partial); + } +} + +export class WebviewWindowOptions { + /** + * Name is a unique identifier that can be given to a window. + */ + "Name": string; + + /** + * Title is the title of the window. + */ + "Title": string; + + /** + * Width is the starting width of the window. + */ + "Width": number; + + /** + * Height is the starting height of the window. + */ + "Height": number; + + /** + * AlwaysOnTop will make the window float above other windows. + */ + "AlwaysOnTop": boolean; + + /** + * URL is the URL to load in the window. + */ + "URL": string; + + /** + * DisableResize will disable the ability to resize the window. + */ + "DisableResize": boolean; + + /** + * Frameless will remove the window frame. + */ + "Frameless": boolean; + + /** + * MinWidth is the minimum width of the window. + */ + "MinWidth": number; + + /** + * MinHeight is the minimum height of the window. + */ + "MinHeight": number; + + /** + * MaxWidth is the maximum width of the window. + */ + "MaxWidth": number; + + /** + * MaxHeight is the maximum height of the window. + */ + "MaxHeight": number; + + /** + * StartState indicates the state of the window when it is first shown. + * Default: WindowStateNormal + */ + "StartState": WindowState; + + /** + * BackgroundType is the type of background to use for the window. + * Default: BackgroundTypeSolid + */ + "BackgroundType": BackgroundType; + + /** + * BackgroundColour is the colour to use for the window background. + */ + "BackgroundColour": RGBA; + + /** + * HTML is the HTML to load in the window. + */ + "HTML": string; + + /** + * JS is the JavaScript to load in the window. + */ + "JS": string; + + /** + * CSS is the CSS to load in the window. + */ + "CSS": string; + + /** + * Initial Position + */ + "InitialPosition": WindowStartPosition; + + /** + * X is the starting X position of the window. + */ + "X": number; + + /** + * Y is the starting Y position of the window. + */ + "Y": number; + + /** + * Hidden will hide the window when it is first created. + */ + "Hidden": boolean; + + /** + * Zoom is the zoom level of the window. + */ + "Zoom": number; + + /** + * ZoomControlEnabled will enable the zoom control. + */ + "ZoomControlEnabled": boolean; + + /** + * EnableDragAndDrop will enable drag and drop. + */ + "EnableDragAndDrop": boolean; + + /** + * OpenInspectorOnStartup will open the inspector when the window is first shown. + */ + "OpenInspectorOnStartup": boolean; + + /** + * Mac options + */ + "Mac": MacWindow; + + /** + * Windows options + */ + "Windows": WindowsWindow; + + /** + * Linux options + */ + "Linux": LinuxWindow; + + /** + * Toolbar button states + */ + "MinimiseButtonState": ButtonState; + "MaximiseButtonState": ButtonState; + "CloseButtonState": ButtonState; + + /** + * If true, the window's devtools will be available (default true in builds without the `production` build tag) + */ + "DevToolsEnabled": boolean; + + /** + * If true, the window's default context menu will be disabled (default false) + */ + "DefaultContextMenuDisabled": boolean; + + /** + * KeyBindings is a map of key bindings to functions + */ + "KeyBindings": { [_: string]: any }; + + /** + * IgnoreMouseEvents will ignore mouse events in the window (Windows + Mac only) + */ + "IgnoreMouseEvents": boolean; + + /** + * ContentProtectionEnabled specifies whether content protection is enabled, preventing screen capture and recording. + * Effective on Windows and macOS only; no-op on Linux. + * Best-effort protection with platform-specific caveats (see docs). + */ + "ContentProtectionEnabled": boolean; + + /** Creates a new WebviewWindowOptions instance. */ + constructor($$source: Partial = {}) { + if (!("Name" in $$source)) { + this["Name"] = ""; + } + if (!("Title" in $$source)) { + this["Title"] = ""; + } + if (!("Width" in $$source)) { + this["Width"] = 0; + } + if (!("Height" in $$source)) { + this["Height"] = 0; + } + if (!("AlwaysOnTop" in $$source)) { + this["AlwaysOnTop"] = false; + } + if (!("URL" in $$source)) { + this["URL"] = ""; + } + if (!("DisableResize" in $$source)) { + this["DisableResize"] = false; + } + if (!("Frameless" in $$source)) { + this["Frameless"] = false; + } + if (!("MinWidth" in $$source)) { + this["MinWidth"] = 0; + } + if (!("MinHeight" in $$source)) { + this["MinHeight"] = 0; + } + if (!("MaxWidth" in $$source)) { + this["MaxWidth"] = 0; + } + if (!("MaxHeight" in $$source)) { + this["MaxHeight"] = 0; + } + if (!("StartState" in $$source)) { + this["StartState"] = WindowState.$zero; + } + if (!("BackgroundType" in $$source)) { + this["BackgroundType"] = BackgroundType.$zero; + } + if (!("BackgroundColour" in $$source)) { + this["BackgroundColour"] = (new RGBA()); + } + if (!("HTML" in $$source)) { + this["HTML"] = ""; + } + if (!("JS" in $$source)) { + this["JS"] = ""; + } + if (!("CSS" in $$source)) { + this["CSS"] = ""; + } + if (!("InitialPosition" in $$source)) { + this["InitialPosition"] = WindowStartPosition.$zero; + } + if (!("X" in $$source)) { + this["X"] = 0; + } + if (!("Y" in $$source)) { + this["Y"] = 0; + } + if (!("Hidden" in $$source)) { + this["Hidden"] = false; + } + if (!("Zoom" in $$source)) { + this["Zoom"] = 0; + } + if (!("ZoomControlEnabled" in $$source)) { + this["ZoomControlEnabled"] = false; + } + if (!("EnableDragAndDrop" in $$source)) { + this["EnableDragAndDrop"] = false; + } + if (!("OpenInspectorOnStartup" in $$source)) { + this["OpenInspectorOnStartup"] = false; + } + if (!("Mac" in $$source)) { + this["Mac"] = (new MacWindow()); + } + if (!("Windows" in $$source)) { + this["Windows"] = (new WindowsWindow()); + } + if (!("Linux" in $$source)) { + this["Linux"] = (new LinuxWindow()); + } + if (!("MinimiseButtonState" in $$source)) { + this["MinimiseButtonState"] = ButtonState.$zero; + } + if (!("MaximiseButtonState" in $$source)) { + this["MaximiseButtonState"] = ButtonState.$zero; + } + if (!("CloseButtonState" in $$source)) { + this["CloseButtonState"] = ButtonState.$zero; + } + if (!("DevToolsEnabled" in $$source)) { + this["DevToolsEnabled"] = false; + } + if (!("DefaultContextMenuDisabled" in $$source)) { + this["DefaultContextMenuDisabled"] = false; + } + if (!("KeyBindings" in $$source)) { + this["KeyBindings"] = {}; + } + if (!("IgnoreMouseEvents" in $$source)) { + this["IgnoreMouseEvents"] = false; + } + if (!("ContentProtectionEnabled" in $$source)) { + this["ContentProtectionEnabled"] = false; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new WebviewWindowOptions instance from a string or object. + */ + static createFrom($$source: any = {}): WebviewWindowOptions { + const $$createField14_0 = $$createType26; + const $$createField26_0 = $$createType39; + const $$createField27_0 = $$createType40; + const $$createField28_0 = $$createType41; + const $$createField34_0 = $$createType42; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("BackgroundColour" in $$parsedSource) { + $$parsedSource["BackgroundColour"] = $$createField14_0($$parsedSource["BackgroundColour"]); + } + if ("Mac" in $$parsedSource) { + $$parsedSource["Mac"] = $$createField26_0($$parsedSource["Mac"]); + } + if ("Windows" in $$parsedSource) { + $$parsedSource["Windows"] = $$createField27_0($$parsedSource["Windows"]); + } + if ("Linux" in $$parsedSource) { + $$parsedSource["Linux"] = $$createField28_0($$parsedSource["Linux"]); + } + if ("KeyBindings" in $$parsedSource) { + $$parsedSource["KeyBindings"] = $$createField34_0($$parsedSource["KeyBindings"]); + } + return new WebviewWindowOptions($$parsedSource as Partial); + } +} + +/** + * WindowManager manages all window-related operations + */ +export class WindowManager { + + /** Creates a new WindowManager instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new WindowManager instance from a string or object. + */ + static createFrom($$source: any = {}): WindowManager { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new WindowManager($$parsedSource as Partial); + } +} + +export enum WindowStartPosition { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + WindowCentered = 0, + WindowXY = 1, +}; + +export enum WindowState { + /** + * The Go zero value for the underlying type of the enum. + */ + $zero = 0, + + WindowStateNormal = 0, + WindowStateMinimised = 1, + WindowStateMaximised = 2, + WindowStateFullscreen = 3, +}; + +export class WindowTheme { + /** + * BorderColour is the colour of the window border + */ + "BorderColour": number | null; + + /** + * TitleBarColour is the colour of the window title bar + */ + "TitleBarColour": number | null; + + /** + * TitleTextColour is the colour of the window title text + */ + "TitleTextColour": number | null; + + /** Creates a new WindowTheme instance. */ + constructor($$source: Partial = {}) { + if (!("BorderColour" in $$source)) { + this["BorderColour"] = null; + } + if (!("TitleBarColour" in $$source)) { + this["TitleBarColour"] = null; + } + if (!("TitleTextColour" in $$source)) { + this["TitleTextColour"] = null; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new WindowTheme instance from a string or object. + */ + static createFrom($$source: any = {}): WindowTheme { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new WindowTheme($$parsedSource as Partial); + } +} + +export class WindowsWindow { + /** + * Select the type of translucent backdrop. Requires Windows 11 22621 or later. + * Only used when window's `BackgroundType` is set to `BackgroundTypeTranslucent`. + * Default: Auto + */ + "BackdropType": BackdropType; + + /** + * Disable the icon in the titlebar + * Default: false + */ + "DisableIcon": boolean; + + /** + * Theme (Dark / Light / SystemDefault) + * Default: SystemDefault - The application will follow system theme changes. + */ + "Theme": Theme; + + /** + * Specify custom colours to use for dark/light mode + * Default: nil + */ + "CustomTheme": ThemeSettings; + + /** + * Disable all window decorations in Frameless mode, which means no "Aero Shadow" and no "Rounded Corner" will be shown. + * "Rounded Corners" are only available on Windows 11. + * Default: false + */ + "DisableFramelessWindowDecorations": boolean; + + /** + * WindowMask is used to set the window shape. Use a PNG with an alpha channel to create a custom shape. + * Default: nil + */ + "WindowMask": string; + + /** + * WindowMaskDraggable is used to make the window draggable by clicking on the window mask. + * Default: false + */ + "WindowMaskDraggable": boolean; + + /** + * ResizeDebounceMS is the amount of time to debounce redraws of webview2 + * when resizing the window + * Default: 0 + */ + "ResizeDebounceMS": number; + + /** + * WindowDidMoveDebounceMS is the amount of time to debounce the WindowDidMove event + * when moving the window + * Default: 0 + */ + "WindowDidMoveDebounceMS": number; + + /** + * Event mapping for the window. This allows you to define a translation from one event to another. + * Default: nil + */ + "EventMapping": { [_: `${number}`]: events$0.WindowEventType }; + + /** + * HiddenOnTaskbar hides the window from the taskbar + * Default: false + */ + "HiddenOnTaskbar": boolean; + + /** + * EnableSwipeGestures enables swipe gestures for the window + * Default: false + */ + "EnableSwipeGestures": boolean; + + /** + * Menu is the menu to use for the window. + */ + "Menu": Menu | null; + + /** + * Drag Cursor Effects + */ + "OnEnterEffect": DragEffect; + "OnOverEffect": DragEffect; + + /** + * Permissions map for WebView2. If empty, default permissions will be granted. + */ + "Permissions": { [_: `${number}`]: CoreWebView2PermissionState }; + + /** + * ExStyle is the extended window style + */ + "ExStyle": number; + + /** + * GeneralAutofillEnabled enables general autofill + */ + "GeneralAutofillEnabled": boolean; + + /** + * PasswordAutosaveEnabled enables autosaving passwords + */ + "PasswordAutosaveEnabled": boolean; + + /** + * EnabledFeatures, DisabledFeatures and AdditionalLaunchArgs are used to enable or disable specific features in the WebView2 browser. + * Available flags: https://learn.microsoft.com/en-us/microsoft-edge/webview2/concepts/webview-features-flags?tabs=dotnetcsharp#available-webview2-browser-flags + * WARNING: Apps in production shouldn't use WebView2 browser flags, + * because these flags might be removed or altered at any time, + * and aren't necessarily supported long-term. + * AdditionalLaunchArgs should always be preceded by "--" + */ + "EnabledFeatures": string[]; + "DisabledFeatures": string[]; + "AdditionalLaunchArgs": string[]; + + /** Creates a new WindowsWindow instance. */ + constructor($$source: Partial = {}) { + if (!("BackdropType" in $$source)) { + this["BackdropType"] = BackdropType.$zero; + } + if (!("DisableIcon" in $$source)) { + this["DisableIcon"] = false; + } + if (!("Theme" in $$source)) { + this["Theme"] = Theme.$zero; + } + if (!("CustomTheme" in $$source)) { + this["CustomTheme"] = (new ThemeSettings()); + } + if (!("DisableFramelessWindowDecorations" in $$source)) { + this["DisableFramelessWindowDecorations"] = false; + } + if (!("WindowMask" in $$source)) { + this["WindowMask"] = ""; + } + if (!("WindowMaskDraggable" in $$source)) { + this["WindowMaskDraggable"] = false; + } + if (!("ResizeDebounceMS" in $$source)) { + this["ResizeDebounceMS"] = 0; + } + if (!("WindowDidMoveDebounceMS" in $$source)) { + this["WindowDidMoveDebounceMS"] = 0; + } + if (!("EventMapping" in $$source)) { + this["EventMapping"] = {}; + } + if (!("HiddenOnTaskbar" in $$source)) { + this["HiddenOnTaskbar"] = false; + } + if (!("EnableSwipeGestures" in $$source)) { + this["EnableSwipeGestures"] = false; + } + if (!("Menu" in $$source)) { + this["Menu"] = null; + } + if (!("OnEnterEffect" in $$source)) { + this["OnEnterEffect"] = DragEffect.$zero; + } + if (!("OnOverEffect" in $$source)) { + this["OnOverEffect"] = DragEffect.$zero; + } + if (!("Permissions" in $$source)) { + this["Permissions"] = {}; + } + if (!("ExStyle" in $$source)) { + this["ExStyle"] = 0; + } + if (!("GeneralAutofillEnabled" in $$source)) { + this["GeneralAutofillEnabled"] = false; + } + if (!("PasswordAutosaveEnabled" in $$source)) { + this["PasswordAutosaveEnabled"] = false; + } + if (!("EnabledFeatures" in $$source)) { + this["EnabledFeatures"] = []; + } + if (!("DisabledFeatures" in $$source)) { + this["DisabledFeatures"] = []; + } + if (!("AdditionalLaunchArgs" in $$source)) { + this["AdditionalLaunchArgs"] = []; + } + + Object.assign(this, $$source); + } + + /** + * Creates a new WindowsWindow instance from a string or object. + */ + static createFrom($$source: any = {}): WindowsWindow { + const $$createField3_0 = $$createType43; + const $$createField5_0 = $Create.ByteSlice; + const $$createField9_0 = $$createType30; + const $$createField12_0 = $$createType25; + const $$createField15_0 = $$createType44; + const $$createField19_0 = $$createType45; + const $$createField20_0 = $$createType45; + const $$createField21_0 = $$createType45; + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + if ("CustomTheme" in $$parsedSource) { + $$parsedSource["CustomTheme"] = $$createField3_0($$parsedSource["CustomTheme"]); + } + if ("WindowMask" in $$parsedSource) { + $$parsedSource["WindowMask"] = $$createField5_0($$parsedSource["WindowMask"]); + } + if ("EventMapping" in $$parsedSource) { + $$parsedSource["EventMapping"] = $$createField9_0($$parsedSource["EventMapping"]); + } + if ("Menu" in $$parsedSource) { + $$parsedSource["Menu"] = $$createField12_0($$parsedSource["Menu"]); + } + if ("Permissions" in $$parsedSource) { + $$parsedSource["Permissions"] = $$createField15_0($$parsedSource["Permissions"]); + } + if ("EnabledFeatures" in $$parsedSource) { + $$parsedSource["EnabledFeatures"] = $$createField19_0($$parsedSource["EnabledFeatures"]); + } + if ("DisabledFeatures" in $$parsedSource) { + $$parsedSource["DisabledFeatures"] = $$createField20_0($$parsedSource["DisabledFeatures"]); + } + if ("AdditionalLaunchArgs" in $$parsedSource) { + $$parsedSource["AdditionalLaunchArgs"] = $$createField21_0($$parsedSource["AdditionalLaunchArgs"]); + } + return new WindowsWindow($$parsedSource as Partial); + } +} + +// Private type creation functions +const $$createType0 = WindowManager.createFrom; +const $$createType1 = $Create.Nullable($$createType0); +const $$createType2 = ContextMenuManager.createFrom; +const $$createType3 = $Create.Nullable($$createType2); +const $$createType4 = KeyBindingManager.createFrom; +const $$createType5 = $Create.Nullable($$createType4); +const $$createType6 = BrowserManager.createFrom; +const $$createType7 = $Create.Nullable($$createType6); +const $$createType8 = EnvironmentManager.createFrom; +const $$createType9 = $Create.Nullable($$createType8); +const $$createType10 = DialogManager.createFrom; +const $$createType11 = $Create.Nullable($$createType10); +const $$createType12 = EventManager.createFrom; +const $$createType13 = $Create.Nullable($$createType12); +const $$createType14 = MenuManager.createFrom; +const $$createType15 = $Create.Nullable($$createType14); +const $$createType16 = ScreenManager.createFrom; +const $$createType17 = $Create.Nullable($$createType16); +const $$createType18 = ClipboardManager.createFrom; +const $$createType19 = $Create.Nullable($$createType18); +const $$createType20 = SystemTrayManager.createFrom; +const $$createType21 = $Create.Nullable($$createType20); +const $$createType22 = slog$0.Logger.createFrom; +const $$createType23 = $Create.Nullable($$createType22); +const $$createType24 = Menu.createFrom; +const $$createType25 = $Create.Nullable($$createType24); +const $$createType26 = RGBA.createFrom; +const $$createType27 = $Create.Nullable($$createType26); +const $$createType28 = u$0.Var.createFrom($Create.Any); +const $$createType29 = MacTitleBar.createFrom; +const $$createType30 = $Create.Map($Create.Any, $Create.Any); +const $$createType31 = MacWebviewPreferences.createFrom; +const $$createType32 = MacLiquidGlass.createFrom; +const $$createType33 = TextTheme.createFrom; +const $$createType34 = $Create.Nullable($$createType33); +const $$createType35 = WindowTheme.createFrom; +const $$createType36 = $Create.Nullable($$createType35); +const $$createType37 = MenuBarTheme.createFrom; +const $$createType38 = $Create.Nullable($$createType37); +const $$createType39 = MacWindow.createFrom; +const $$createType40 = WindowsWindow.createFrom; +const $$createType41 = LinuxWindow.createFrom; +const $$createType42 = $Create.Map($Create.Any, $Create.Any); +const $$createType43 = ThemeSettings.createFrom; +const $$createType44 = $Create.Map($Create.Any, $Create.Any); +const $$createType45 = $Create.Array($Create.Any); diff --git a/cmd/lthn-desktop/public/bindings/github.com/wailsapp/wails/v3/pkg/events/index.ts b/cmd/lthn-desktop/public/bindings/github.com/wailsapp/wails/v3/pkg/events/index.ts new file mode 100644 index 0000000..64958d6 --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/github.com/wailsapp/wails/v3/pkg/events/index.ts @@ -0,0 +1,6 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export type { + WindowEventType +} from "./models.js"; diff --git a/cmd/lthn-desktop/public/bindings/github.com/wailsapp/wails/v3/pkg/events/models.ts b/cmd/lthn-desktop/public/bindings/github.com/wailsapp/wails/v3/pkg/events/models.ts new file mode 100644 index 0000000..f14a4a1 --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/github.com/wailsapp/wails/v3/pkg/events/models.ts @@ -0,0 +1,8 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +export type WindowEventType = number; diff --git a/cmd/lthn-desktop/public/bindings/html/template/index.ts b/cmd/lthn-desktop/public/bindings/html/template/index.ts new file mode 100644 index 0000000..6bf5d69 --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/html/template/index.ts @@ -0,0 +1,6 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export type { + FuncMap +} from "./models.js"; diff --git a/cmd/lthn-desktop/public/bindings/html/template/models.ts b/cmd/lthn-desktop/public/bindings/html/template/models.ts new file mode 100644 index 0000000..6cec6cb --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/html/template/models.ts @@ -0,0 +1,12 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import * as template$0 from "../../text/template/models.js"; + +export type FuncMap = template$0.FuncMap; diff --git a/cmd/lthn-desktop/public/bindings/log/slog/index.ts b/cmd/lthn-desktop/public/bindings/log/slog/index.ts new file mode 100644 index 0000000..28f9022 --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/log/slog/index.ts @@ -0,0 +1,6 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export { + Logger +} from "./models.js"; diff --git a/cmd/lthn-desktop/public/bindings/log/slog/models.ts b/cmd/lthn-desktop/public/bindings/log/slog/models.ts new file mode 100644 index 0000000..ef606c6 --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/log/slog/models.ts @@ -0,0 +1,31 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +/** + * A Logger records structured information about each call to its + * Log, Debug, Info, Warn, and Error methods. + * For each call, it creates a [Record] and passes it to a [Handler]. + * + * To create a new Logger, call [New] or a Logger method + * that begins "With". + */ +export class Logger { + + /** Creates a new Logger instance. */ + constructor($$source: Partial = {}) { + + Object.assign(this, $$source); + } + + /** + * Creates a new Logger instance from a string or object. + */ + static createFrom($$source: any = {}): Logger { + let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source; + return new Logger($$parsedSource as Partial); + } +} diff --git a/cmd/lthn-desktop/public/bindings/net/http/index.ts b/cmd/lthn-desktop/public/bindings/net/http/index.ts new file mode 100644 index 0000000..dd70b92 --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/net/http/index.ts @@ -0,0 +1,6 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export type { + Handler +} from "./models.js"; diff --git a/cmd/lthn-desktop/public/bindings/net/http/models.ts b/cmd/lthn-desktop/public/bindings/net/http/models.ts new file mode 100644 index 0000000..6b222d0 --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/net/http/models.ts @@ -0,0 +1,34 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +/** + * A Handler responds to an HTTP request. + * + * [Handler.ServeHTTP] should write reply headers and data to the [ResponseWriter] + * and then return. Returning signals that the request is finished; it + * is not valid to use the [ResponseWriter] or read from the + * [Request.Body] after or concurrently with the completion of the + * ServeHTTP call. + * + * Depending on the HTTP client software, HTTP protocol version, and + * any intermediaries between the client and the Go server, it may not + * be possible to read from the [Request.Body] after writing to the + * [ResponseWriter]. Cautious handlers should read the [Request.Body] + * first, and then reply. + * + * Except for reading the body, handlers should not modify the + * provided Request. + * + * If ServeHTTP panics, the server (the caller of ServeHTTP) assumes + * that the effect of the panic was isolated to the active request. + * It recovers the panic, logs a stack trace to the server error log, + * and either closes the network connection or sends an HTTP/2 + * RST_STREAM, depending on the HTTP protocol. To abort a handler so + * the client sees an interrupted response but the server doesn't log + * an error, panic with the value [ErrAbortHandler]. + */ +export type Handler = any; diff --git a/cmd/lthn-desktop/public/bindings/text/template/index.ts b/cmd/lthn-desktop/public/bindings/text/template/index.ts new file mode 100644 index 0000000..6bf5d69 --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/text/template/index.ts @@ -0,0 +1,6 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export type { + FuncMap +} from "./models.js"; diff --git a/cmd/lthn-desktop/public/bindings/text/template/models.ts b/cmd/lthn-desktop/public/bindings/text/template/models.ts new file mode 100644 index 0000000..5ec3376 --- /dev/null +++ b/cmd/lthn-desktop/public/bindings/text/template/models.ts @@ -0,0 +1,24 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore: Unused imports +import { Create as $Create } from "@wailsio/runtime"; + +/** + * FuncMap is the type of the map defining the mapping from names to functions. + * Each function must have either a single return value, or two return values of + * which the second has type error. In that case, if the second (error) + * return value evaluates to non-nil during execution, execution terminates and + * Execute returns that error. + * + * Errors returned by Execute wrap the underlying error; call [errors.As] to + * unwrap them. + * + * When template execution invokes a function with an argument list, that list + * must be assignable to the function's parameter types. Functions meant to + * apply to arguments of arbitrary type can use parameters of type interface{} or + * of type [reflect.Value]. Similarly, functions meant to return a result of arbitrary + * type can return interface{} or [reflect.Value]. + */ +export type FuncMap = { [_: string]: any }; diff --git a/cmd/lthn-desktop/public/dist/assets/index-CXPsZVIz.js b/cmd/lthn-desktop/public/dist/assets/index-CXPsZVIz.js new file mode 100644 index 0000000..086509b --- /dev/null +++ b/cmd/lthn-desktop/public/dist/assets/index-CXPsZVIz.js @@ -0,0 +1 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const e of document.querySelectorAll('link[rel="modulepreload"]'))i(e);new MutationObserver(e=>{for(const r of e)if(r.type==="childList")for(const o of r.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&i(o)}).observe(document,{childList:!0,subtree:!0});function s(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),e.crossOrigin==="use-credentials"?r.credentials="include":e.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function i(e){if(e.ep)return;e.ep=!0;const r=s(e);fetch(e.href,r)}})();console.log("Core Framework App Loaded"); diff --git a/cmd/lthn-desktop/public/dist/index.html b/cmd/lthn-desktop/public/dist/index.html new file mode 100644 index 0000000..363b78d --- /dev/null +++ b/cmd/lthn-desktop/public/dist/index.html @@ -0,0 +1,87 @@ + + + + + + Core Framework + + + + + + + +
+ +
+

+ Core Framework +

+

A modular foundation for building robust desktop applications.

+
+ +
+

Loaded Services

+
+ + +
+
+ + + + +
+

Config

+

Manages application state and user preferences.

+
+ + +
+
+ + + +
+

Display

+

Controls windows, menus, and system tray interactions.

+
+ + +
+
+ + + +
+

Crypt

+

Provides cryptographic functions and security.

+
+ +
+
+ +
+ + + \ No newline at end of file diff --git a/cmd/lthn-desktop/public/html/assets/app.js b/cmd/lthn-desktop/public/html/assets/app.js new file mode 100644 index 0000000..0a38b01 --- /dev/null +++ b/cmd/lthn-desktop/public/html/assets/app.js @@ -0,0 +1,4 @@ +// This is the main entry point for the frontend application. +// We can add application-specific JavaScript here in the future. + +console.log("Core Framework App Loaded"); diff --git a/cmd/lthn-desktop/public/html/index.html b/cmd/lthn-desktop/public/html/index.html new file mode 100644 index 0000000..162b8c8 --- /dev/null +++ b/cmd/lthn-desktop/public/html/index.html @@ -0,0 +1,87 @@ + + + + + + Core Framework + + + + + + +
+ +
+

+ Core Framework +

+

A modular foundation for building robust desktop applications.

+
+ +
+

Loaded Services

+
+ + +
+
+ + + + +
+

Config

+

Manages application state and user preferences.

+
+ + +
+
+ + + +
+

Display

+

Controls windows, menus, and system tray interactions.

+
+ + +
+
+ + + +
+

Crypt

+

Provides cryptographic functions and security.

+
+ +
+
+ +
+ + + + \ No newline at end of file diff --git a/cmd/lthn-desktop/public/html/system-tray.html b/cmd/lthn-desktop/public/html/system-tray.html new file mode 100644 index 0000000..90d2cd2 --- /dev/null +++ b/cmd/lthn-desktop/public/html/system-tray.html @@ -0,0 +1,98 @@ + + + + + + Core System Tray + + + + + + +
+ +
+

+ Core Status +

+

Services at a glance.

+
+ +
+
+ + +
+
+ + + + +
+
+

Config

+

State and preferences loaded.

+
+
+ + +
+
+ + + +
+
+

Display

+

UI manager is active.

+
+
+ + +
+
+ + + +
+
+

Crypt

+

Security services are running.

+
+
+ +
+
+ +
+

Core Framework Active

+
+ +
+ + + + \ No newline at end of file diff --git a/cmd/lthn-desktop/public/package-lock.json b/cmd/lthn-desktop/public/package-lock.json new file mode 100644 index 0000000..4e88f78 --- /dev/null +++ b/cmd/lthn-desktop/public/package-lock.json @@ -0,0 +1,1084 @@ +{ + "name": "core-app", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "core-app", + "version": "0.0.0", + "dependencies": { + "@tailwindplus/elements": "^1.0.18", + "@wailsio/runtime": "^3.0.0-alpha.72" + }, + "devDependencies": { + "tailwindcss": "^4.1.14", + "vite": "^7.1.12" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz", + "integrity": "sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.5.tgz", + "integrity": "sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz", + "integrity": "sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.5.tgz", + "integrity": "sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.5.tgz", + "integrity": "sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.5.tgz", + "integrity": "sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.5.tgz", + "integrity": "sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.5.tgz", + "integrity": "sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.5.tgz", + "integrity": "sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.5.tgz", + "integrity": "sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.5.tgz", + "integrity": "sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.5.tgz", + "integrity": "sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.5.tgz", + "integrity": "sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.5.tgz", + "integrity": "sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.5.tgz", + "integrity": "sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz", + "integrity": "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.5.tgz", + "integrity": "sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.5.tgz", + "integrity": "sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.5.tgz", + "integrity": "sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.5.tgz", + "integrity": "sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.5.tgz", + "integrity": "sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz", + "integrity": "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindplus/elements": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/@tailwindplus/elements/-/elements-1.0.18.tgz", + "integrity": "sha512-JvqwL+6LwDIxC5zV9kAcI1wttpkUhgkGr7bcuYGH7fxnmgvVJglBERqlgPGGDXWB+lpuFgjgkvtK3pMm/7MvTA==", + "license": "SEE LICENSE IN LICENSE.md" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@wailsio/runtime": { + "version": "3.0.0-alpha.72", + "resolved": "https://registry.npmjs.org/@wailsio/runtime/-/runtime-3.0.0-alpha.72.tgz", + "integrity": "sha512-VJjDa0GBG7tp7WBMlytzLvsZ4gBQVBftIwiJ+dSg2C4e11N6JonJZp9iHT2xgK35rewKdwbX1vMDyrcBcyZYoA==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.5.tgz", + "integrity": "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.52.5", + "@rollup/rollup-android-arm64": "4.52.5", + "@rollup/rollup-darwin-arm64": "4.52.5", + "@rollup/rollup-darwin-x64": "4.52.5", + "@rollup/rollup-freebsd-arm64": "4.52.5", + "@rollup/rollup-freebsd-x64": "4.52.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.5", + "@rollup/rollup-linux-arm-musleabihf": "4.52.5", + "@rollup/rollup-linux-arm64-gnu": "4.52.5", + "@rollup/rollup-linux-arm64-musl": "4.52.5", + "@rollup/rollup-linux-loong64-gnu": "4.52.5", + "@rollup/rollup-linux-ppc64-gnu": "4.52.5", + "@rollup/rollup-linux-riscv64-gnu": "4.52.5", + "@rollup/rollup-linux-riscv64-musl": "4.52.5", + "@rollup/rollup-linux-s390x-gnu": "4.52.5", + "@rollup/rollup-linux-x64-gnu": "4.52.5", + "@rollup/rollup-linux-x64-musl": "4.52.5", + "@rollup/rollup-openharmony-arm64": "4.52.5", + "@rollup/rollup-win32-arm64-msvc": "4.52.5", + "@rollup/rollup-win32-ia32-msvc": "4.52.5", + "@rollup/rollup-win32-x64-gnu": "4.52.5", + "@rollup/rollup-win32-x64-msvc": "4.52.5", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.16.tgz", + "integrity": "sha512-pONL5awpaQX4LN5eiv7moSiSPd/DLDzKVRJz8Q9PgzmAdd1R4307GQS2ZpfiN7ZmekdQrfhZZiSE5jkLR4WNaA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/vite": { + "version": "7.1.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.12.tgz", + "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + } + } +} diff --git a/cmd/lthn-desktop/public/package.json b/cmd/lthn-desktop/public/package.json new file mode 100644 index 0000000..32c6d85 --- /dev/null +++ b/cmd/lthn-desktop/public/package.json @@ -0,0 +1,17 @@ +{ + "name": "core-app", + "version": "0.0.0", + "scripts": { + "start": "vite", + "build": "vite build", + "build:dev": "vite build --mode development" + }, + "dependencies": { + "@tailwindplus/elements": "^1.0.18", + "@wailsio/runtime": "^3.0.0-alpha.72" + }, + "devDependencies": { + "tailwindcss": "^4.1.14", + "vite": "^7.1.12" + } +} diff --git a/cmd/lthn-desktop/public/vite.config.js b/cmd/lthn-desktop/public/vite.config.js new file mode 100644 index 0000000..4813670 --- /dev/null +++ b/cmd/lthn-desktop/public/vite.config.js @@ -0,0 +1,17 @@ +import { defineConfig } from 'vite'; + +// https://vitejs.dev/config/ +export default defineConfig({ + // Set the root of the project to the 'html' directory. + // Vite will look for index.html in this folder. + root: 'html', + + build: { + // Set the output directory for the build. + // We need to go up one level from 'html' to place the 'dist' folder + // in the correct location for Wails. + outDir: '../dist', + // Ensure the output directory is emptied before each build. + emptyOutDir: true, + }, +}); diff --git a/go.work b/go.work index 471a193..83677c8 100644 --- a/go.work +++ b/go.work @@ -5,6 +5,7 @@ use ( ./cmd/core-gui ./cmd/core-mcp ./cmd/examples/core-static-di + ./cmd/lthn-desktop ./pkg/config ./pkg/core ./pkg/display diff --git a/pkg/help/go.mod b/pkg/help/go.mod index 7cc6d64..ea82c5c 100644 --- a/pkg/help/go.mod +++ b/pkg/help/go.mod @@ -48,7 +48,7 @@ require ( golang.org/x/crypto v0.45.0 // indirect golang.org/x/net v0.47.0 // indirect golang.org/x/sys v0.38.0 // indirect - golang.org/x/text v0.31.0 // indirect + golang.org/x/text v0.32.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/pkg/help/go.sum b/pkg/help/go.sum index cceb5af..8089633 100644 --- a/pkg/help/go.sum +++ b/pkg/help/go.sum @@ -111,7 +111,7 @@ golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=