NwN}y;YodjZ$V7N{h#g^2
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
literal 0
HcmV?d00001
diff --git a/scripts/new_client.cjs b/scripts/new_client.cjs
index 82d19b1c..525c42b2 100644
--- a/scripts/new_client.cjs
+++ b/scripts/new_client.cjs
@@ -1,107 +1,145 @@
const fs = require('fs');
const crypto = require('crypto');
const path = require('path');
-
-const filePath = process.argv[2];
-const version = process.argv[3];
-const clientType = process.argv[4] || 'default';
-const extraFlags = process.argv.slice(5).filter(a => !a.includes('\\') && !a.includes('/'));
-const cdnRoot = process.argv.slice(5).find(a => a.includes('\\') || a.includes('/')) || 'E:\\hf-cdn';
-
-if (!filePath || !version) {
- console.error('Usage: node scripts/new_client.cjs [default|fabric|forge] [flags...] [cdn-root]');
- console.error('Flags: kotlin, satin, sodium');
- console.error('Example: node scripts/new_client.cjs "E:\\hf-cdn\\clients\\fabric\\jars\\lambda.jar" "1.21.11" fabric kotlin');
- process.exit(1);
+const https = require('https');
+
+const VERSION_MANIFEST_URL = 'https://launchermeta.mojang.com/mc/game/version_manifest_v2.json';
+const FALLBACK_VERSIONS = ['1.21.4', '1.21.8', '1.21.10', '1.21.11'];
+
+function fetchVersions() {
+ return new Promise((resolve) => {
+ https.get(VERSION_MANIFEST_URL, { headers: { 'User-Agent': 'CollapseLoader-Script/1.0' } }, (res) => {
+ let data = '';
+ res.on('data', chunk => data += chunk);
+ res.on('end', () => {
+ try {
+ const json = JSON.parse(data);
+ const releases = json.versions.filter(v => v.type === 'release').map(v => v.id);
+ resolve(releases);
+ } catch {
+ resolve(FALLBACK_VERSIONS);
+ }
+ });
+ }).on('error', () => resolve(FALLBACK_VERSIONS));
+ });
}
-const KOTLIN_DEP = { md5_hash: '964103287b72e606de845420d1a8cc57', name: 'fabric-language-kotlin-1.13.8+kotlin.2.3.0', size: 7 };
-const SATIN_DEP = { md5_hash: '2cf1534f9e818bd567837979444557e9', name: 'satin-3.0.0-alpha.1', size: 0 };
-const SODIUM_DEP = { md5_hash: '28922a78d1876ee062e3265f10abcc46', name: 'sodium-fabric-0.6.13+mc1.21.4', size: 1 };
-
-const BARITONE_DEPS = {
- '1.21.11': { md5_hash: 'dbd83c7de8426f2facdc73f0a3a1da48', name: 'baritone-1.21.11', size: 2 }
-};
-
-const FABRIC_BASE_DEPS = {
- '1.21.4': [{ md5_hash: '128a8d042180e7c92567342e21a21a6d', name: 'fabric-api-0.119.4+1.21.4', size: 2 }],
- '1.21.8': [{ md5_hash: '85d76d57a7b5bb7043ea815133d2f6ba', name: 'fabric-api-0.136.1+1.21.8', size: 2 }],
- '1.21.10': [{ md5_hash: 'c9ebf1b300d813310d18115a7cc03f99', name: 'fabric-api-0.138.4+1.21.10', size: 2 }],
- '1.21.11': [{ md5_hash: 'e2a72b6c6aa2c6c4f74541394858c86a', name: 'fabric-api-0.140.2+1.21.11', size: 2 }],
-};
-
-const MAIN_CLASSES = {
- default: 'net.minecraft.client.main.Main',
- fabric: 'net.fabricmc.loader.launch.knot.KnotClient',
- forge: 'net.minecraft.launchwrapper.Launch',
-};
-
-const JSON_FILES = {
- default: path.join(cdnRoot, 'static', 'clients.json'),
- fabric: path.join(cdnRoot, 'static', 'fabric-clients.json'),
- forge: path.join(cdnRoot, 'static', 'forge-clients.json'),
-};
-
-const FILENAME_PREFIXES = {
- default: '',
- fabric: 'fabric/',
- forge: 'forge/',
-};
-
-const jsonPath = JSON_FILES[clientType];
-const existing = fs.existsSync(jsonPath) ? JSON.parse(fs.readFileSync(jsonPath, 'utf8')) : [];
-
-const file = path.basename(filePath);
-const filename = FILENAME_PREFIXES[clientType] + file;
-
-if (existing.find(c => c.filename === filename)) {
- console.error(`Client "${filename}" already exists in ${path.basename(jsonPath)}`);
- process.exit(1);
-}
+async function main() {
+ const args = process.argv.slice(2);
+ const showVersions = args.includes('--versions');
+
+ if (showVersions) {
+ console.log('Fetching Minecraft versions from Mojang...');
+ const versions = await fetchVersions();
+ console.log(`\nAvailable release versions (${versions.length}):\n`);
+ versions.forEach((v, i) => console.log(` ${i + 1}) ${v}`));
+ process.exit(0);
+ }
-const buf = fs.readFileSync(filePath);
-const md5 = crypto.createHash('md5').update(buf).digest('hex');
-const size = Math.round(fs.statSync(filePath).size / 1024 / 1024);
-const nextId = existing.length > 0 ? Math.max(...existing.map(c => c.id)) + 1 : 1;
-
-const entry = {
- client_type: clientType,
- created_at: new Date().toISOString(),
- downloads: 0,
- filename,
- id: nextId,
- launches: 0,
- main_class: MAIN_CLASSES[clientType],
- md5_hash: md5,
- name: path.basename(file, '.jar'),
- show: true,
- size,
- version,
- working: true,
-};
-
-if (clientType === 'fabric') {
- const deps = [...(FABRIC_BASE_DEPS[version] || [])];
- if (extraFlags.includes('kotlin')) deps.push(KOTLIN_DEP);
- if (extraFlags.includes('satin')) deps.push(SATIN_DEP);
- if (extraFlags.includes('sodium')) deps.push(SODIUM_DEP);
- if (extraFlags.includes('baritone')) {
- if (BARITONE_DEPS[version]) {
- deps.push(BARITONE_DEPS[version]);
- } else {
- console.warn(`Warning: baritone requested but no definition for version ${version}`);
+ const filePath = args.find(a => !a.startsWith('--') && !a.includes('\\') && !a.includes('/') && a.endsWith('.jar'));
+ const version = args.find(a => /^\d+\.\d+/.test(a) && !a.includes('\\') && !a.includes('/'));
+ const clientType = args.find(a => ['default', 'fabric', 'forge'].includes(a)) || 'default';
+ const cdnRoot = args.find(a => a.includes('\\') || a.includes('/')) || 'E:\\hf-cdn';
+ const extraFlags = args.filter(a => !a.startsWith('--') && !a.includes('\\') && !a.includes('/') && !a.endsWith('.jar') && !['default', 'fabric', 'forge'].includes(a) && !/^\d+\.\d+/.test(a));
+
+ if (!filePath || !version) {
+ console.error('Usage: node scripts/new_client.cjs [default|fabric|forge] [flags...] [cdn-root]');
+ console.error(' node scripts/new_client.cjs --versions # list available versions');
+ console.error('Flags: kotlin, satin, sodium');
+ console.error('Example: node scripts/new_client.cjs "E:\\hf-cdn\\clients\\fabric\\jars\\lambda.jar" "1.21.11" fabric kotlin');
+ process.exit(1);
+ }
+
+ const KOTLIN_DEP = { md5_hash: '964103287b72e606de845420d1a8cc57', name: 'fabric-language-kotlin-1.13.8+kotlin.2.3.0', size: 7 };
+ const SATIN_DEP = { md5_hash: '2cf1534f9e818bd567837979444557e9', name: 'satin-3.0.0-alpha.1', size: 0 };
+ const SODIUM_DEP = { md5_hash: '28922a78d1876ee062e3265f10abcc46', name: 'sodium-fabric-0.6.13+mc1.21.4', size: 1 };
+
+ const BARITONE_DEPS = {
+ '1.21.11': { md5_hash: 'dbd83c7de8426f2facdc73f0a3a1da48', name: 'baritone-1.21.11', size: 2 }
+ };
+
+ const FABRIC_BASE_DEPS = {
+ '1.21.4': [{ md5_hash: '128a8d042180e7c92567342e21a21a6d', name: 'fabric-api-0.119.4+1.21.4', size: 2 }],
+ '1.21.8': [{ md5_hash: '85d76d57a7b5bb7043ea815133d2f6ba', name: 'fabric-api-0.136.1+1.21.8', size: 2 }],
+ '1.21.10': [{ md5_hash: 'c9ebf1b300d813310d18115a7cc03f99', name: 'fabric-api-0.138.4+1.21.10', size: 2 }],
+ '1.21.11': [{ md5_hash: 'e2a72b6c6aa2c6c4f74541394858c86a', name: 'fabric-api-0.140.2+1.21.11', size: 2 }],
+ };
+
+ const MAIN_CLASSES = {
+ default: 'net.minecraft.client.main.Main',
+ fabric: 'net.fabricmc.loader.launch.knot.KnotClient',
+ forge: 'net.minecraft.launchwrapper.Launch',
+ };
+
+ const JSON_FILES = {
+ default: path.join(cdnRoot, 'static', 'clients.json'),
+ fabric: path.join(cdnRoot, 'static', 'fabric-clients.json'),
+ forge: path.join(cdnRoot, 'static', 'forge-clients.json'),
+ };
+
+ const FILENAME_PREFIXES = {
+ default: '',
+ fabric: 'fabric/',
+ forge: 'forge/',
+ };
+
+ const jsonPath = JSON_FILES[clientType];
+ const existing = fs.existsSync(jsonPath) ? JSON.parse(fs.readFileSync(jsonPath, 'utf8')) : [];
+
+ const file = path.basename(filePath);
+ const filename = FILENAME_PREFIXES[clientType] + file;
+
+ if (existing.find(c => c.filename === filename)) {
+ console.error(`Client "${filename}" already exists in ${path.basename(jsonPath)}`);
+ process.exit(1);
+ }
+
+ const buf = fs.readFileSync(filePath);
+ const md5 = crypto.createHash('md5').update(buf).digest('hex');
+ const size = Math.round(fs.statSync(filePath).size / 1024 / 1024);
+ const nextId = existing.length > 0 ? Math.max(...existing.map(c => c.id)) + 1 : 1;
+
+ const entry = {
+ client_type: clientType,
+ created_at: new Date().toISOString(),
+ downloads: 0,
+ filename,
+ id: nextId,
+ launches: 0,
+ main_class: MAIN_CLASSES[clientType],
+ md5_hash: md5,
+ name: path.basename(file, '.jar'),
+ show: true,
+ size,
+ version,
+ working: true,
+ };
+
+ if (clientType === 'fabric') {
+ const deps = [...(FABRIC_BASE_DEPS[version] || [])];
+ if (extraFlags.includes('kotlin')) deps.push(KOTLIN_DEP);
+ if (extraFlags.includes('satin')) deps.push(SATIN_DEP);
+ if (extraFlags.includes('sodium')) deps.push(SODIUM_DEP);
+ if (extraFlags.includes('baritone')) {
+ if (BARITONE_DEPS[version]) {
+ deps.push(BARITONE_DEPS[version]);
+ } else {
+ console.warn(`Warning: baritone requested but no definition for version ${version}`);
+ }
}
+ entry.dependencies = deps;
+ if (extraFlags.length) console.log(`Extra deps: ${extraFlags.join(', ')}`);
}
- entry.dependencies = deps;
- if (extraFlags.length) console.log(`Extra deps: ${extraFlags.join(', ')}`);
-}
-if (clientType === 'forge') {
- entry.dependencies = [];
-}
+ if (clientType === 'forge') {
+ entry.dependencies = [];
+ }
+
+ existing.unshift(entry);
+ fs.mkdirSync(path.dirname(jsonPath), { recursive: true });
+ fs.writeFileSync(jsonPath, JSON.stringify(existing, null, 2));
-existing.unshift(entry);
-fs.mkdirSync(path.dirname(jsonPath), { recursive: true });
-fs.writeFileSync(jsonPath, JSON.stringify(existing, null, 2));
+ console.log(`Added "${entry.name}" (id=${entry.id}) to ${path.basename(jsonPath)}`);
+ console.log(`md5: ${md5} | size: ${size}MB | version: ${version}`);
+}
-console.log(`Added "${entry.name}" (id=${entry.id}) to ${path.basename(jsonPath)}`);
-console.log(`md5: ${md5} | size: ${size}MB | version: ${version}`);
+main();
diff --git a/scripts/new_client.py b/scripts/new_client.py
index 5f678c80..99adeda6 100755
--- a/scripts/new_client.py
+++ b/scripts/new_client.py
@@ -9,6 +9,8 @@
import json
import hashlib
import os
+import re
+import subprocess
import sys
from datetime import datetime, timezone
from pathlib import Path
@@ -22,13 +24,6 @@
"1.21.11": {"md5_hash": "dbd83c7de8426f2facdc73f0a3a1da48", "name": "baritone-1.21.11", "size": 2},
}
-FABRIC_BASE_DEPS = {
- "1.21.4": [{"md5_hash": "128a8d042180e7c92567342e21a21a6d", "name": "fabric-api-0.119.4+1.21.4", "size": 2}],
- "1.21.8": [{"md5_hash": "85d76d57a7b5bb7043ea815133d2f6ba", "name": "fabric-api-0.136.1+1.21.8", "size": 2}],
- "1.21.10": [{"md5_hash": "c9ebf1b300d813310d18115a7cc03f99", "name": "fabric-api-0.138.4+1.21.10", "size": 2}],
- "1.21.11": [{"md5_hash": "e2a72b6c6aa2c6c4f74541394858c86a", "name": "fabric-api-0.140.2+1.21.11", "size": 2}],
-}
-
MAIN_CLASSES = {
"default": "net.minecraft.client.main.Main",
"fabric": "net.fabricmc.loader.launch.knot.KnotClient",
@@ -44,6 +39,12 @@
}
CDN_ROOT = os.environ.get("CDN_ROOT", "/media/w1xced/Disk/hf-cdn")
+HF_VERSIONS_URL = "https://huggingface.co/api/datasets/Collapsecdn/collapsecdn/tree/main/misc/minecraft-versions"
+FALLBACK_VERSIONS: dict[str, list[str]] = {
+ "default": ["1.16.5"],
+ "fabric": ["1.21.4", "1.21.8", "1.21.11"],
+ "forge": ["1.8.9"],
+}
def compute_md5(filepath: Path) -> str:
@@ -113,8 +114,110 @@ def pick_client_type() -> str | None:
return CLIENT_TYPES[choice - 1]
-def pick_version() -> str | None:
- versions = ["1.21.4", "1.21.8", "1.21.10", "1.21.11"]
+def _sort_versions(versions: list[str]) -> list[str]:
+ def to_num(v: str) -> int:
+ parts = v.split(".")
+ return sum(int(p) * (1000 ** (2 - i)) for i, p in enumerate(parts))
+ return sorted(versions, key=to_num)
+
+
+FABRIC_API_RE = re.compile(r"^fabric-api-([0-9.]+\+\d+\.\d+\.\d+)\.jar$")
+
+
+def scan_local_deps(cdn_root: str) -> dict:
+ """Scan {cdn_root}/clients/fabric/deps/jars/ and return parsed deps with MD5."""
+ deps_dir = os.path.join(cdn_root, "clients", "fabric", "deps", "jars")
+ result: dict[str, dict] = {}
+ if not os.path.isdir(deps_dir):
+ return result
+ for fname in sorted(os.listdir(deps_dir)):
+ if not fname.endswith(".jar"):
+ continue
+ fpath = os.path.join(deps_dir, fname)
+ if not os.path.isfile(fpath):
+ continue
+ md5 = compute_md5(Path(fpath))
+ size_mb = round(os.path.getsize(fpath) / 1024 / 1024)
+ result[fname] = {
+ "md5_hash": md5,
+ "name": fname.replace(".jar", ""),
+ "size": size_mb,
+ }
+ return result
+
+
+def _find_dep(local_deps: dict, keyword: str) -> dict | None:
+ """Find a dep by keyword in local scanned deps."""
+ for fname, info in local_deps.items():
+ if keyword.lower() in fname.lower():
+ return {"md5_hash": info["md5_hash"], "name": info["name"], "size": info["size"]}
+ return None
+
+
+def pick_fabric_api(cdn_root: str, mc_version: str) -> dict | None:
+ """Let user pick a fabric-api version from local deps, auto-compute MD5."""
+ local = scan_local_deps(cdn_root)
+ api_deps = {k: v for k, v in local.items() if FABRIC_API_RE.match(k)}
+ if not api_deps:
+ print("No fabric-api jars found in CDN deps folder.")
+ return None
+
+ matching = {k: v for k, v in api_deps.items() if f"+{mc_version}.jar" in k}
+ if not matching:
+ print(f"\nNo fabric-api for MC {mc_version}. Available:")
+ matching = api_deps
+
+ items = sorted(matching.items(), key=lambda x: x[1]["name"])
+ print("\nFabric API version:\n")
+ for i, (_, info) in enumerate(items, 1):
+ print(f" {i}) {info['name']} (md5: {info['md5_hash'][:12]}...)")
+ print(f"\n 0) None (skip fabric-api)\n")
+
+ try:
+ choice = int(input("Select fabric-api: "))
+ except (ValueError, EOFError):
+ return None
+
+ if choice == 0 or choice > len(items):
+ return None
+ _, info = items[choice - 1]
+ return {"md5_hash": info["md5_hash"], "name": info["name"], "size": info["size"]}
+
+
+def fetch_cdn_versions() -> dict[str, list[str]]:
+ """Parse jar filenames from HuggingFace CDN to get available versions per type."""
+ try:
+ result = subprocess.run(
+ ["curl", "-s", "--max-time", "10", HF_VERSIONS_URL],
+ capture_output=True, text=True, timeout=15,
+ )
+ if result.returncode == 0 and result.stdout:
+ data = json.loads(result.stdout)
+ map_fabric: set[str] = set()
+ map_forge: set[str] = set()
+ for item in data:
+ if item.get("type") == "file" and item.get("path"):
+ filename = item["path"].rsplit("/", 1)[-1]
+ m = re.match(r"^(fabric|forge)_(.+)\.jar$", filename)
+ if m:
+ kind, ver = m.group(1), m.group(2)
+ if kind == "fabric":
+ map_fabric.add(ver)
+ elif kind == "forge":
+ map_forge.add(ver)
+ return {
+ "default": FALLBACK_VERSIONS["default"],
+ "fabric": _sort_versions(list(map_fabric)) if map_fabric else FALLBACK_VERSIONS["fabric"],
+ "forge": _sort_versions(list(map_forge)) if map_forge else FALLBACK_VERSIONS["forge"],
+ }
+ except Exception:
+ pass
+ return {**FALLBACK_VERSIONS}
+
+
+def pick_version(client_type: str = "fabric") -> str | None:
+ cdn = fetch_cdn_versions()
+ versions = cdn.get(client_type, cdn.get("fabric", []))
print("\nMinecraft version:\n")
for i, v in enumerate(versions, 1):
print(f" {i}) {v}")
@@ -182,7 +285,7 @@ def main():
print("Cancelled.")
sys.exit(0)
- version = pick_version()
+ version = pick_version(client_type)
if not version:
print("Cancelled.")
sys.exit(0)
@@ -221,20 +324,33 @@ def main():
}
if client_type == "fabric":
- deps = list(FABRIC_BASE_DEPS.get(version, []))
+ deps = []
+ fabric_api = pick_fabric_api(CDN_ROOT, version)
+ if fabric_api:
+ deps.append(fabric_api)
+
if len(sys.argv) > 4:
flags = [a.lower() for a in sys.argv[4:] if not os.sep in a and "/" not in a]
else:
flags = pick_flags()
+ local = scan_local_deps(CDN_ROOT)
if "kotlin" in flags:
- deps.append(KOTLIN_DEP)
+ dep = _find_dep(local, "kotlin")
+ if dep: deps.append(dep)
+ else: deps.append(KOTLIN_DEP)
if "satin" in flags:
- deps.append(SATIN_DEP)
+ dep = _find_dep(local, "satin")
+ if dep: deps.append(dep)
+ else: deps.append(SATIN_DEP)
if "sodium" in flags:
- deps.append(SODIUM_DEP)
+ dep = _find_dep(local, "sodium")
+ if dep: deps.append(dep)
+ else: deps.append(SODIUM_DEP)
if "baritone" in flags:
- if version in BARITONE_DEPS:
+ dep = _find_dep(local, "baritone")
+ if dep: deps.append(dep)
+ elif version in BARITONE_DEPS:
deps.append(BARITONE_DEPS[version])
else:
print(f"Warning: baritone not available for {version}")
diff --git a/scripts/scripts_gui.py b/scripts/scripts_gui.py
index efe7d22c..4372d182 100755
--- a/scripts/scripts_gui.py
+++ b/scripts/scripts_gui.py
@@ -11,14 +11,44 @@
import hashlib
import json
import os
-import sys
+import re
import webbrowser
from datetime import datetime, timezone
from http.server import HTTPServer, BaseHTTPRequestHandler
from pathlib import Path
from urllib.parse import parse_qs, urlparse
-CDN_ROOT = os.environ.get("CDN_ROOT", "/media/w1xced/Disk/hf-cdn")
+CDN_ROOT = os.environ.get("CDN_ROOT", "/media/w1xced/disk/collapsecdn")
+FALLBACK_VERSIONS: dict[str, list[str]] = {
+ "default": ["1.16.5"],
+ "fabric": ["1.21.4", "1.21.8", "1.21.11"],
+ "forge": ["1.8.9"],
+}
+
+
+def _sort_versions(versions: list[str]) -> list[str]:
+ def to_num(v: str) -> int:
+ parts = v.split(".")
+ return sum(int(p) * (1000 ** (2 - i)) for i, p in enumerate(parts))
+ return sorted(versions, key=to_num)
+
+
+def scan_cdn_client_versions(cdn_root: str) -> dict[str, list[str]]:
+ """Scan local CDN misc/minecraft-versions/ to find available MC versions per type."""
+ result: dict[str, list[str]] = {t: [] for t in FALLBACK_VERSIONS}
+ mv_dir = os.path.join(cdn_root, "misc", "minecraft-versions")
+ if not os.path.isdir(mv_dir):
+ return result
+ for client_type in ["fabric", "forge"]:
+ versions: set[str] = set()
+ for fname in os.listdir(mv_dir):
+ if not fname.endswith(".jar"):
+ continue
+ m = re.match(r"^" + re.escape(client_type) + r"_(.+)\.jar$", fname)
+ if m:
+ versions.add(m.group(1))
+ result[client_type] = _sort_versions(list(versions)) if versions else FALLBACK_VERSIONS.get(client_type, [])
+ return result
KOTLIN_DEP = {"md5_hash": "964103287b72e606de845420d1a8cc57", "name": "fabric-language-kotlin-1.13.8+kotlin.2.3.0", "size": 7}
SATIN_DEP = {"md5_hash": "2cf1534f9e818bd567837979444557e9", "name": "satin-3.0.0-alpha.1", "size": 0}
@@ -48,6 +78,74 @@ def compute_md5(filepath):
return h.hexdigest()
+import re
+
+def _find_dep(local_other: dict, keyword: str) -> dict | None:
+ """Find a dep by keyword in local scanned deps."""
+ for fname, info in local_other.items():
+ if keyword.lower() in fname.lower():
+ return {"md5_hash": info["md5_hash"], "name": info["name"], "size": info["size"]}
+ return None
+
+
+FABRIC_API_RE = re.compile(r"^fabric-api-([0-9.]+\+\d+\.\d+\.\d+)\.jar$")
+OTHER_DEP_RE = re.compile(r"^(.+)\.jar$")
+
+
+def _find_file_by_name(name: str) -> str | None:
+ """Search CDN for a file by name in common locations."""
+ base = CDN_ROOT
+ search_dirs = [
+ os.path.join(base, "clients", "fabric", "deps", "jars"),
+ os.path.join(base, "misc", "minecraft-versions"),
+ os.path.join(base, "clients", "fabric"),
+ base,
+ ]
+ for d in search_dirs:
+ if not os.path.isdir(d):
+ continue
+ for root, dirs, files in os.walk(d):
+ if name in files:
+ return os.path.join(root, name)
+ return None
+
+
+def scan_local_deps(cdn_root: str) -> dict:
+ """Scan {cdn_root}/clients/fabric/deps/jars/ and return parsed deps with MD5."""
+ deps_dir = os.path.join(cdn_root, "clients", "fabric", "deps", "jars")
+ result = {"fabric_api": {}, "other": {}}
+ if not os.path.isdir(deps_dir):
+ return result
+ for fname in sorted(os.listdir(deps_dir)):
+ if not fname.endswith(".jar"):
+ continue
+ fpath = os.path.join(deps_dir, fname)
+ if not os.path.isfile(fpath):
+ continue
+ md5 = compute_md5(fpath)
+ size_mb = round(os.path.getsize(fpath) / 1024 / 1024)
+ m_api = FABRIC_API_RE.match(fname)
+ if m_api:
+ api_ver = m_api.group(1)
+ parts = api_ver.split("+")
+ result["fabric_api"][fname] = {
+ "md5_hash": md5,
+ "name": fname.replace(".jar", ""),
+ "size": size_mb,
+ "api_version": parts[0] if parts else "",
+ "mc_version": parts[1] if len(parts) > 1 else "",
+ }
+ else:
+ m_other = OTHER_DEP_RE.match(fname)
+ if m_other:
+ result["other"][fname] = {
+ "md5_hash": md5,
+ "name": fname.replace(".jar", ""),
+ "size": size_mb,
+ }
+ return result
+
+
HTML = r"""
@@ -110,8 +208,8 @@ def compute_md5(filepath):
-
-
-
"""
@@ -256,7 +431,7 @@ def compute_md5(filepath):
class Handler(BaseHTTPRequestHandler):
def log_message(self, format, *args):
- pass
+ print(f"[SERVER] {format % args}")
def _json(self, code, data):
body = json.dumps(data).encode()
@@ -272,7 +447,10 @@ def _read_body(self):
def do_GET(self):
if self.path == "/" or self.path == "/index.html":
- body = HTML.replace("CDN_ROOT_PLACEHOLDER", CDN_ROOT).encode()
+ versions = scan_cdn_client_versions(CDN_ROOT)
+ deps = scan_local_deps(CDN_ROOT)
+ payload = json.dumps({"versions": versions, "deps": deps}).replace("\\", "\\\\").replace("'", "\\'")
+ body = HTML.replace("CDN_ROOT_PLACEHOLDER", CDN_ROOT).replace("/*__INIT_DATA__*/", f"window.__INIT={payload};").encode()
self.send_response(200)
self.send_header("Content-Type", "text/html; charset=utf-8")
self.send_header("Content-Length", str(len(body)))
@@ -283,12 +461,32 @@ def do_GET(self):
def do_POST(self):
try:
- if self.path == "/api/md5":
+ if self.path == "/api/load":
+ data = self._read_body()
+ root = data.get("cdn_root", CDN_ROOT)
+ versions = scan_cdn_client_versions(root)
+ deps = scan_local_deps(root)
+ self._json(200, {"versions": versions, "deps": deps})
+
+ elif self.path == "/api/deps":
+ data = self._read_body()
+ root = data.get("cdn_root", CDN_ROOT)
+ deps = scan_local_deps(root)
+ self._json(200, {"deps": deps})
+
+ elif self.path == "/api/md5":
data = self._read_body()
filepath = data.get("path", "").strip()
- if not filepath or not os.path.isfile(filepath):
- self._json(200, {"error": f"File not found: {filepath}"})
+ if not filepath:
+ self._json(200, {"error": "No file path provided"})
return
+ if not os.path.isfile(filepath):
+ found = _find_file_by_name(filepath)
+ if found:
+ filepath = found
+ else:
+ self._json(200, {"error": f"File not found: {filepath}"})
+ return
digest = compute_md5(filepath)
self._json(200, {"name": os.path.basename(filepath), "hash": digest})
@@ -342,12 +540,33 @@ def do_POST(self):
}
if client_type == "fabric":
- deps = list(FABRIC_BASE_DEPS.get(version, []))
- if "kotlin" in flags: deps.append(KOTLIN_DEP)
- if "satin" in flags: deps.append(SATIN_DEP)
- if "sodium" in flags: deps.append(SODIUM_DEP)
- if "baritone" in flags and version in BARITONE_DEPS:
- deps.append(BARITONE_DEPS[version])
+ deps = []
+ fabric_api = data.get("fabric_api")
+ if fabric_api and fabric_api.get("md5_hash"):
+ deps.append({
+ "md5_hash": fabric_api["md5_hash"],
+ "name": fabric_api["name"],
+ "size": fabric_api.get("size", 0),
+ })
+ local = scan_local_deps(cdn_root)
+ local_other = local.get("other", {})
+ if "kotlin" in flags:
+ dep = _find_dep(local_other, "kotlin")
+ if dep: deps.append(dep)
+ else: deps.append(KOTLIN_DEP)
+ if "satin" in flags:
+ dep = _find_dep(local_other, "satin")
+ if dep: deps.append(dep)
+ else: deps.append(SATIN_DEP)
+ if "sodium" in flags:
+ dep = _find_dep(local_other, "sodium")
+ if dep: deps.append(dep)
+ else: deps.append(SODIUM_DEP)
+ if "baritone" in flags:
+ dep = _find_dep(local_other, "baritone")
+ if dep: deps.append(dep)
+ elif version in BARITONE_DEPS:
+ deps.append(BARITONE_DEPS[version])
entry["dependencies"] = deps
elif client_type == "forge":
entry["dependencies"] = []
@@ -369,7 +588,7 @@ def main():
server = HTTPServer(("127.0.0.1", port), Handler)
url = f"http://127.0.0.1:{port}"
print(f"Starting GUI at {url}")
- webbrowser.open(url)
+ print(f"CDN root: {CDN_ROOT}")
try:
server.serve_forever()
except KeyboardInterrupt:
From 08684ca20ebb09780801cb74cafbd627272ec30f Mon Sep 17 00:00:00 2001
From: dest4590
Date: Thu, 23 Jul 2026 22:21:47 +0300
Subject: [PATCH 03/21] chore(deps): updated deps, cleanup code and directories
---
.gitignore | 4 +-
AGENTS.md | 111 +-
package-lock.json | 960 ++++++++----------
package.json | 32 +-
.../__pycache__/new_client.cpython-313.pyc | Bin 18643 -> 0 bytes
.../__pycache__/scripts_gui.cpython-313.pyc | Bin 29998 -> 0 bytes
scripts/clients/gui_template.html | 524 ++++++++++
scripts/clients/md5.cjs | 36 +
scripts/{ => clients}/md5.py | 0
scripts/clients/new_client.cjs | 229 +++++
scripts/{ => clients}/new_client.py | 0
scripts/clients/scripts_gui.py | 309 ++++++
scripts/md5.cjs | 36 -
scripts/new_client.cjs | 145 ---
scripts/scripts_gui.py | 600 -----------
src-tauri/Cargo.lock | 648 ++++++------
src-tauri/Cargo.toml | 20 +-
17 files changed, 1955 insertions(+), 1699 deletions(-)
delete mode 100644 scripts/__pycache__/new_client.cpython-313.pyc
delete mode 100644 scripts/__pycache__/scripts_gui.cpython-313.pyc
create mode 100644 scripts/clients/gui_template.html
create mode 100644 scripts/clients/md5.cjs
rename scripts/{ => clients}/md5.py (100%)
mode change 100755 => 100644
create mode 100644 scripts/clients/new_client.cjs
rename scripts/{ => clients}/new_client.py (100%)
mode change 100755 => 100644
create mode 100644 scripts/clients/scripts_gui.py
delete mode 100644 scripts/md5.cjs
delete mode 100644 scripts/new_client.cjs
delete mode 100755 scripts/scripts_gui.py
diff --git a/.gitignore b/.gitignore
index 28b197fb..bf7eb1e7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -34,4 +34,6 @@ target/
.DS_Store/
.opencode/
-opencode.json
\ No newline at end of file
+opencode.json
+
+__pycache__/
\ No newline at end of file
diff --git a/AGENTS.md b/AGENTS.md
index d2cfe067..dc597761 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -33,18 +33,35 @@ cargo test
| Frontend | `src/` | Vue 3 + TypeScript |
| Backend | `src-tauri/src/` | Rust (Tauri v2) |
-Communication is exclusively via Tauri `invoke()` commands – there is no HTTP API between the two halves.
+Communication is exclusively via Tauri `invoke()` commands – there is no HTTP API between the two halves. The frontend API layer (`src/api/clients/internal.ts`) routes all HTTP calls through `invoke("api_request")`, so the Rust backend handles actual network requests.
### Frontend layout (`src/`)
- `main.ts` → `bootstrap/applicationBootstrap.ts` (mounts correct Vue component based on `?window=` URL param)
- Multiple window types: `main` (default), `network`, `customization` – each is a different root component
-- `features/` – domain folders: `auth/`, `clients/`, `download/`, `friends/`, `marketplace/`, `presets/`, `social/`
-- `api/` – Tauri invoke wrappers
-- `services/` – shared services (i18n, etc.)
-- `shared/` – reusable components/composables
+- `features/` – domain modules: `auth/`, `chat/`, `clients/`, `download/`, `friends/`, `marketplace/`, `presets/`, `social/`
+- `api/` – Tauri invoke wrappers (`ApiClient` class, re-exports `apiGet`/`apiPost`/etc.)
+- `services/` – business logic services (i18n, settings, theme, chat, updater, etc.)
+- `shared/` – reusable components, composables, types, utils
+- `components/` – top-level UI components (`core/`, `customization/`, `features/`, `modals/`, `presets/`, `settings/`)
+- `composables/` – app-level composables (`useAppInit`, `useAppHandlers`, `useDownloadSpeedMonitor`, `useIrcChat`)
+- `views/` – page-level view components (16 views mapped in `router/views.ts`)
+- `windows/` – separate window root components (`CustomizationWindow.vue`, `NetworkWindow.vue`)
+- `layouts/` – layout components (`Sidebar.vue`, `Titlebar.vue`, forms, modals)
+- `utils/` – top-level utilities (`settings.ts`, `tabs.ts`)
+- `assets/` – static assets (CSS, images, icons, videos)
- `config.ts` – API URL initialisation; must call `initializeApiUrl()` before using `getApiUrl()`
+### Router
+
+The app uses a **custom lightweight router** (not vue-router) implemented with Vue refs in `router/index.ts`. API: `push()`, `replace()`, `back()`, `canGoBack()`, `clearHistory()`. Route-to-component mapping is in `router/views.ts` with `tabOrder` for transition direction.
+
+Supported routes: `home`, `news`, `settings`, `about`, `customization`, `custom_clients`, `app_logs`, `account`, `login`, `register`, `verify`, `friends`, `user-profile`, `marketplace`, `network_debug`, `chat`.
+
+### State management
+
+There are no Pinia/Vuex stores. State is managed through **services** (singletons) and **composables** (reactive state). The `@stores` alias is defined in config but `src/stores/` does not exist.
+
### Path aliases (configured in both `vite.config.ts` and `tsconfig.json`)
```
@@ -55,19 +72,34 @@ Communication is exclusively via Tauri `invoke()` commands – there is no HTTP
@services → src/services/
@layouts → src/layouts/
@router → src/router/index.ts (bare alias)
-@stores → src/stores/
+@stores → src/stores/ (alias defined but directory does not exist)
+@components → src/components/
```
### Backend layout (`src-tauri/src/`)
-- `lib.rs` – app entry, Tauri builder, all `invoke_handler` registrations
-- `commands/` – Tauri command handlers (clients, irc, presets, settings, updater, utils, network, report)
+- `main.rs` – binary entry point; parses CLI args, loads `.env`, calls `prepare_startup()` then `run()`
+- `lib.rs` – library crate entry; Tauri builder, `invoke_handler!` macro (120+ commands), `setup` hook, `on_window_event`
+- `commands/` – Tauri command handlers:
+ - `clients.rs` – client launch, download, mods, logs, shortcuts
+ - `irc.rs` – IRC connect/disconnect/send (`IrcState` managed by Tauri)
+ - `mod_builds.rs` – mod build CRUD (create, update, delete, export, import)
+ - `network.rs` – `api_request`, network history
+ - `presets.rs` – preset CRUD
+ - `report.rs` – network report generation/export
+ - `settings.rs` – accounts, favorites, flags, settings, telemetry
+ - `updater.rs` – check/download/install updates
+ - `utils.rs` – data folder, base64, version, Discord RPC, tray, launch history
- `core/` – business logic
- - `clients/` – client manager
- - `network/` – downloader, servers, analytics, API
- - `platform/` – OS-specific code (Windows message boxes, DPI)
- - `storage/` – persistent state (settings, accounts, favorites, presets, custom clients, flags)
- - `utils/` – globals, logging macros, helpers, process, hashing, archive, Discord RPC
+ - `clients/` – client manager, custom clients, log checker, agent overlay verification
+ - `network/` – downloader, servers (health checks), API client, cache, server ads
+ - `platform/` – OS-specific code (Windows WebView2, Linux WebKitGTK, message boxes, DPI)
+ - `storage/` – persistent state (settings, accounts, favorites, flags, presets, custom clients, mod builds, launch history)
+ - `utils/` – globals, logging macros, helpers, process, hashing, archive, Discord RPC, DPI, taskbar, CLI args, module tags
+ - `state.rs` – `AppState`, `ClientState`, `CustomClientsState` (Tauri managed state)
+ - `app_runtime.rs` – `StartupRuntime`, tray menu parsing, deep link parsing/deduplication
+- `build.rs` – build script; captures git hash/branch/body, sets `DEVELOPMENT` env var
+- `tests/` – Rust unit tests (7 modules: clients_command, data, manager, runtime, settings, updater, utils_command)
**Adding a new Tauri command**: implement in `commands/.rs`, then register it in the `invoke_handler!` macro in `lib.rs`.
@@ -100,18 +132,30 @@ Env vars are parsed at Rust startup via `parse_env_bool()` in `core/utils/global
## Toolchain quirks
- **TypeScript is strict**: `strict`, `noUnusedLocals`, `noUnusedParameters` are all enabled. Unused vars cause build failures unless prefixed with `_`.
-- **ESLint targets `.ts`, `.tsx`, `.vue`** – `.js` files in `src/` are also linted.
-- **Prettier**: 4-space indent, trailing commas (`es5`). No `tailwind.config.js` – Tailwind v4 config lives in CSS via `@import "tailwindcss"` and `@plugin "daisyui"`.
+- **ESLint** uses flat config (`eslint.config.cjs`) targeting `.ts`, `.tsx`, `.vue`, `.js` files. Unused vars require `_` prefix.
+- **Prettier**: 4-space indent, trailing commas (`es5`). See `.prettierrc.yaml`.
+- **Tailwind CSS v4** config lives in CSS via `@import "tailwindcss"` and `@plugin "daisyui"` – no `tailwind.config.js`.
- **daisyUI v5** is the component library (see `.github/instructions/daisyui.instructions.md` for full class reference). Use daisyUI semantic color names (`bg-primary`, `text-base-content`, etc.) instead of Tailwind hardcoded colors so themes work.
- **Monaco editor** loads from CDN (`cdn.jsdelivr.net/npm/monaco-editor@0.55/min/vs`) – not bundled locally.
- **`daisyui` is excluded from Vite `optimizeDeps`** – do not add it back.
- **Rust `profile.dev`**: incremental builds, `opt-level=0`, `debug=1`. Dependencies are compiled at `opt-level=2` for reasonable dev performance.
+- **i18n**: 5 languages supported (English, Polish, Russian, Ukrainian, Chinese Simplified) via `vue-i18n` in `services/i18n/`.
---
## CI / Build
-- CI triggers on push to `main` or `dev` branches.
+### Workflows
+
+- **`build.yml`** – triggers on push to `main` or `dev` branches, or manual `workflow_dispatch`.
+ - `check-flags` job: parses commit message for `[skip ci]`/`skip-ci`/`skip_ci` and `release`/`build macos` keywords.
+ - `build` job (matrix: ubuntu-22.04 + windows-latest): installs deps, builds Tauri bundles, uploads artifacts.
+ - `build-macos` job (conditional): builds universal binary (`universal-apple-darwin`) with aarch64 + x86_64 targets.
+ - `create-release` job: creates GitHub prerelease tagged `build-` with all artifacts.
+- **`cleanup-artifacts.yml`** – runs weekly (Sunday 2 AM UTC) or manually; keeps only the 5 newest build artifacts.
+
+### Build details
+
- Commit messages containing `[skip ci]`, `skip-ci`, or `skip_ci` skip the build job.
- Commit messages containing `release` or `build macos` trigger the macOS universal binary build (otherwise macOS is skipped).
- Artifacts: `.msi`, NSIS `.exe`, portable `.exe` (Windows); `.AppImage`, `.deb`, `.rpm` (Linux); `.dmg` (macOS, conditional).
@@ -133,15 +177,17 @@ Files updated: `package.json`, `src-tauri/Cargo.toml`, `src-tauri/tauri.conf.jso
## Scripts
-| Script | Purpose |
-| ---------------------------------- | -------------------------------------------------------------- |
-| `scripts/bump_version.py` | Bump version across all config files |
-| `scripts/serve_mock_release.py` | Serve mock update JSON on `localhost:8000` for updater testing |
-| `scripts/new_client.py` | Add new client entry (interactive menu or CLI args) |
-| `scripts/md5.py` | Compute MD5 hash of a file (interactive or CLI) |
-| `scripts/scripts_gui.py` | Web GUI with buttons – opens browser at localhost:8765 |
-| `scripts/remove_releases.py` | Delete old GitHub releases (dry-run by default) |
-| `scripts/remove_unused_actions.py` | Delete unused GH Actions runs |
+| Script | Purpose |
+| ---------------------------------- | ------------------------------------------------------------------------ |
+| `scripts/bump_version.py` | Bump version across all config files |
+| `scripts/serve_mock_release.py` | Serve mock update JSON on `localhost:8000` for updater testing |
+| `scripts/new_client.py` | Add new client entry (interactive menu or CLI args) |
+| `scripts/new_client.cjs` | Node.js equivalent of new_client.py (CLI-only) |
+| `scripts/md5.py` | Compute MD5 hash of a file (interactive or CLI) |
+| `scripts/md5.cjs` | Node.js equivalent of md5.py (CLI-only) |
+| `scripts/scripts_gui.py` | Web GUI with buttons – opens browser at localhost:8765 |
+| `scripts/remove_releases.py` | Delete old GitHub releases (dry-run by default, needs `GITHUB_TOKEN`) |
+| `scripts/remove_unused_actions.py` | Delete unused GH Actions runs (dry-run by default, needs `GITHUB_TOKEN`) |
---
@@ -157,9 +203,24 @@ The app registers the `collapseloader://` URI scheme. Supported actions: `verify
---
+## Tauri plugins
+
+The app uses these Tauri plugins: `opener`, `notification`, `dialog`, `fs`, `deep-link`, `single-instance` (with deep-link feature).
+
+---
+
## Windows-only behaviour
- Junction points (not symlinks) are used on Windows to share `resourcepacks` and `shaderpacks` across clients.
- `junction` crate is a Windows-only dependency.
- DPI scaling helper (`core/utils/dpi.rs`) runs a background process on Windows when configured.
+- Taskbar progress indicator (`core/utils/taskbar.rs`) via Windows COM integration.
- WebView2 is required; the app prompts to install it if missing.
+
+---
+
+## Linux-only behaviour
+
+- WebKitGTK dependency checks at startup (`core/platform/linux.rs`).
+- `zbus` crate used for Linux-specific D-Bus integration.
+- `mold` linker used in CI for faster builds.
diff --git a/package-lock.json b/package-lock.json
index 0b62bb65..0a4d0c29 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,50 +1,50 @@
{
"name": "collapseloader",
- "version": "1.2.1",
+ "version": "1.2.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "collapseloader",
- "version": "1.2.1",
+ "version": "1.2.2",
"license": "GPL-3.0-only",
"dependencies": {
"@guolao/vue-monaco-editor": "1.6.0",
- "@lucide/vue": "1.24.0",
+ "@lucide/vue": "1.26.0",
"@stomp/stompjs": "^7.3.0",
- "@supabase/supabase-js": "^2.110.5",
+ "@supabase/supabase-js": "^2.110.8",
"@tauri-apps/api": "2.11.1",
- "@tauri-apps/plugin-dialog": "2.7.1",
+ "@tauri-apps/plugin-dialog": "2.7.2",
"@tauri-apps/plugin-fs": "2.5.1",
"@tauri-apps/plugin-notification": "2.3.3",
"@tauri-apps/plugin-opener": "2.5.4",
"axios": "1.18.1",
"gsap": "3.15.0",
- "monaco-editor": "^0.55.1",
+ "monaco-editor": "^0.56.0",
"tls": "^0.0.1",
- "vue": "3.5.39",
- "vue-i18n": "11.4.6"
+ "vue": "3.5.40",
+ "vue-i18n": "11.4.7"
},
"devDependencies": {
- "@tailwindcss/postcss": "^4.3.2",
- "@tailwindcss/vite": "^4.3.2",
+ "@tailwindcss/postcss": "^4.3.3",
+ "@tailwindcss/vite": "^4.3.3",
"@tauri-apps/cli": "2.11.4",
"@types/node": "26.1.1",
- "@typescript-eslint/eslint-plugin": "8.64.0",
- "@typescript-eslint/parser": "8.64.0",
+ "@typescript-eslint/eslint-plugin": "8.65.0",
+ "@typescript-eslint/parser": "8.65.0",
"@vitejs/plugin-vue": "6.0.8",
"axios-mock-adapter": "^2.1.0",
- "daisyui": "^5.6.18",
+ "daisyui": "^5.7.0",
"eslint": "^10.7.0",
- "eslint-plugin-vue": "10.9.2",
+ "eslint-plugin-vue": "10.10.0",
"jsdom": "^29.1.1",
- "prettier": "3.9.5",
- "tailwindcss": "4.3.2",
+ "prettier": "3.9.6",
+ "tailwindcss": "4.3.3",
"typescript": "^5.8.3",
- "vite": "^8.1.4",
+ "vite": "^8.1.5",
"vitest": "^4.1.10",
"vue-eslint-parser": "^10.4.1",
- "vue-tsc": "3.3.7"
+ "vue-tsc": "3.3.8"
}
},
"node_modules/@alloc/quick-lru": {
@@ -569,14 +569,14 @@
}
},
"node_modules/@intlify/core-base": {
- "version": "11.4.6",
- "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-11.4.6.tgz",
- "integrity": "sha512-EOeHO95XESK9IFHgHeZXunsM/WBAoCA0DlaWODvx14vKmetAuS97t+l6Xe9hTUqntPpF93vtVSjjUDafw3wXMw==",
+ "version": "11.4.7",
+ "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-11.4.7.tgz",
+ "integrity": "sha512-MSB/sBKwEWJTILvQIhg2rnIcwPpLayo3wGwvVA+dJTNeUBD9GoqQgAaSOLdI9iOPDHCm9YoVnLqpfzza98MpkQ==",
"license": "MIT",
"dependencies": {
- "@intlify/devtools-types": "11.4.6",
- "@intlify/message-compiler": "11.4.6",
- "@intlify/shared": "11.4.6"
+ "@intlify/devtools-types": "11.4.7",
+ "@intlify/message-compiler": "11.4.7",
+ "@intlify/shared": "11.4.7"
},
"engines": {
"node": ">= 22"
@@ -586,13 +586,13 @@
}
},
"node_modules/@intlify/devtools-types": {
- "version": "11.4.6",
- "resolved": "https://registry.npmjs.org/@intlify/devtools-types/-/devtools-types-11.4.6.tgz",
- "integrity": "sha512-wowQPpNem56b2d43IJmqbrzG2FeBKe5f/kUGlpNuBmXs6OSqncF8m1+1lxHuW8ISZJF0ma2RkW3iLkw0g0G4VA==",
+ "version": "11.4.7",
+ "resolved": "https://registry.npmjs.org/@intlify/devtools-types/-/devtools-types-11.4.7.tgz",
+ "integrity": "sha512-GSz+J+hqH+AEpAHIYya6fSufS30OaMnG39HiZX7DmGKi3+aaLvassCfsXENEc4Wr4m68q2YP0QdMdB3D9UeAXg==",
"license": "MIT",
"dependencies": {
- "@intlify/core-base": "11.4.6",
- "@intlify/shared": "11.4.6"
+ "@intlify/core-base": "11.4.7",
+ "@intlify/shared": "11.4.7"
},
"engines": {
"node": ">= 22"
@@ -602,12 +602,12 @@
}
},
"node_modules/@intlify/message-compiler": {
- "version": "11.4.6",
- "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-11.4.6.tgz",
- "integrity": "sha512-5nj3jULqeTAC1WovwMs1LQWgatTa2pM/rXN9T3XW8rdOtXW9ZF6/GLSNFTKDQmPLwclhPdgUWLJ/4w3fMeeC/Q==",
+ "version": "11.4.7",
+ "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-11.4.7.tgz",
+ "integrity": "sha512-bHxmh7n94N4N1evADeb7XTkc3jTw6Ki5biMFZVSX6Jmk+iehy8/maeH2XUsBI27rtKIK+Hzc6QnVAKggUwylKw==",
"license": "MIT",
"dependencies": {
- "@intlify/shared": "11.4.6",
+ "@intlify/shared": "11.4.7",
"source-map-js": "^1.0.2"
},
"engines": {
@@ -618,9 +618,9 @@
}
},
"node_modules/@intlify/shared": {
- "version": "11.4.6",
- "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-11.4.6.tgz",
- "integrity": "sha512-m1p1HHAMLhqSpTRH7VnXdrN0CQ4y+9vunFkpLkbD8soIuBsnQdawZXqMCgvwI2UVF9Ww7sVaw7g9tV2VO7shoA==",
+ "version": "11.4.7",
+ "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-11.4.7.tgz",
+ "integrity": "sha512-OtjPZan3No2OZZFnMUiCVsXC6+j+XRwEywaFDk0AoayAbLuPesyDloXhJZLl9JUl5vHZeQUkYSbEA8VX+CWMjg==",
"license": "MIT",
"engines": {
"node": ">= 22"
@@ -679,9 +679,9 @@
}
},
"node_modules/@lucide/vue": {
- "version": "1.24.0",
- "resolved": "https://registry.npmjs.org/@lucide/vue/-/vue-1.24.0.tgz",
- "integrity": "sha512-5bNPX0G2YEWdUlBYk7pE8SgDg/f1mkIFpJ9vtE44pW/cwRz7Ioc0tOTESoVJAPvxIELSmYekX+XXIJMjsswNIg==",
+ "version": "1.26.0",
+ "resolved": "https://registry.npmjs.org/@lucide/vue/-/vue-1.26.0.tgz",
+ "integrity": "sha512-jz00zLm8+i7VzBuQTbmjChIvIKehaIK5YbOVC+bab7qTh4JTkCd0XJQ4l5TY57gT08fMPVlvUITROB/vm/xImA==",
"license": "ISC",
"peerDependencies": {
"vue": ">=3.0.1"
@@ -716,9 +716,9 @@
}
},
"node_modules/@oxc-project/types": {
- "version": "0.138.0",
- "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.138.0.tgz",
- "integrity": "sha512-1a7ZKmrRTCoN1XMZ4L0PyyqrMnrNlLyPuOkdSX2MZg7IiIGRUyurNhAm73ptDOraoBcIordsIGKNPKUzy3ZmfA==",
+ "version": "0.139.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz",
+ "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==",
"dev": true,
"license": "MIT",
"funding": {
@@ -726,9 +726,9 @@
}
},
"node_modules/@rolldown/binding-android-arm64": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.4.tgz",
- "integrity": "sha512-EZLpf/8y7GXkkra90ML47kzik/GMP3EMcE9bPyHmRfxLC6z9+aW5A8poCsoxjrT5GfEcNAAvWwUHjvP1pUQkfw==",
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz",
+ "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==",
"cpu": [
"arm64"
],
@@ -743,9 +743,9 @@
}
},
"node_modules/@rolldown/binding-darwin-arm64": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.4.tgz",
- "integrity": "sha512-aUi+HBvmYb7j8krl1+qJgkG8C17fO79gk3c+jPw4S8glRFc1DTija9S3EyaTSQUm5GJXYKDAsugBEhFHH2vYiQ==",
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz",
+ "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==",
"cpu": [
"arm64"
],
@@ -760,9 +760,9 @@
}
},
"node_modules/@rolldown/binding-darwin-x64": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.4.tgz",
- "integrity": "sha512-F7hHC3gwY11+vByKPRWqwGbeXWVgKmL+pTGCinaEhdihzBV2aQ0fvZOch9cXYUOKuKKq429HeYXOqQLc7wFCEg==",
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz",
+ "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==",
"cpu": [
"x64"
],
@@ -777,9 +777,9 @@
}
},
"node_modules/@rolldown/binding-freebsd-x64": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.4.tgz",
- "integrity": "sha512-sI5yw+7s92SK6odiEhD5lKCBlWcpjHS5qyqpVQbZAJ0fIzEUXrmbl3DH2ybR3PZogulNJF+COLtmA8hUfvkCCQ==",
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz",
+ "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==",
"cpu": [
"x64"
],
@@ -794,9 +794,9 @@
}
},
"node_modules/@rolldown/binding-linux-arm-gnueabihf": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.4.tgz",
- "integrity": "sha512-mCi0OKgEieFircrtVYmQAFGszRtMnZ6fpZAXrxanXAu7lqZcsK1E1RAaZNG0uKAnxox3B1f4EyQNnoyMfN1vAA==",
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz",
+ "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==",
"cpu": [
"arm"
],
@@ -811,13 +811,16 @@
}
},
"node_modules/@rolldown/binding-linux-arm64-gnu": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.4.tgz",
- "integrity": "sha512-B9Ial3Kv5sh0SHnB1g/QWcUQCEvCF6QKGAl4zXypYj65mVI+B4AhFBwPtSN7pDrJeIx8Z7zdy4ntx+wQABom7w==",
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz",
+ "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==",
"cpu": [
"arm64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -828,13 +831,16 @@
}
},
"node_modules/@rolldown/binding-linux-arm64-musl": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.4.tgz",
- "integrity": "sha512-lZVym0PuHE1KZ22gmFTC15lAkrg9iTszR617oYRB/iPY1A56ywoJzVKOJBKaot5RiikCObmur6pogpse3gRcng==",
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz",
+ "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==",
"cpu": [
"arm64"
],
"dev": true,
+ "libc": [
+ "musl"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -845,13 +851,16 @@
}
},
"node_modules/@rolldown/binding-linux-ppc64-gnu": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.4.tgz",
- "integrity": "sha512-t2DNiLJWNTbnEHyUzTumldML6ET4/g16467LZoDDJ3tSxGvguL5/NyC2lCsNKuyRycg9XeDQF5SSv+TNOhQEXg==",
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz",
+ "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==",
"cpu": [
"ppc64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -862,13 +871,16 @@
}
},
"node_modules/@rolldown/binding-linux-s390x-gnu": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.4.tgz",
- "integrity": "sha512-0WIRnL1Uw4BvTZRLQt+PVgo6ZKTJadlC2btP+/EOXv2f/DWbY0rEgl+y834mIVwP1FkTlWVTrGGJXf12lru7EQ==",
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz",
+ "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==",
"cpu": [
"s390x"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -879,13 +891,16 @@
}
},
"node_modules/@rolldown/binding-linux-x64-gnu": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.4.tgz",
- "integrity": "sha512-JWtGshGfX+oENAKonoNkqEJX+7hC8yfhi9GUyPX1VX4mdh1y5r+ZiJLR5XzAB0aoP6s/PcILsGjKq8O0mm24bw==",
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz",
+ "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==",
"cpu": [
"x64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -896,13 +911,16 @@
}
},
"node_modules/@rolldown/binding-linux-x64-musl": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.4.tgz",
- "integrity": "sha512-rT6yQcxUuXs4CnbofqwHRRV0iem349rLMYpTjkgQGLjrY4ado/eDzwPZPTCgTOlF6Nkp8NEv70yLMTn6qkWxsQ==",
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz",
+ "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==",
"cpu": [
"x64"
],
"dev": true,
+ "libc": [
+ "musl"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -913,9 +931,9 @@
}
},
"node_modules/@rolldown/binding-openharmony-arm64": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.4.tgz",
- "integrity": "sha512-KXMGoboq5cyaCQjDA4GLuRiOwBQ0EyFnJoVViLeZ45/3rFItRODEr+NdsBcVpll40hhNArlm/speWGRvj08LzA==",
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz",
+ "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==",
"cpu": [
"arm64"
],
@@ -930,9 +948,9 @@
}
},
"node_modules/@rolldown/binding-wasm32-wasi": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.4.tgz",
- "integrity": "sha512-5K83rb36oJiY7BCyE9zLZtGcPV4g5wvq+xwdO0XPIwDVZI8cyB/AUjkNXGb92/rnmezEkjMOpgY61rtwjQtFwg==",
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz",
+ "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==",
"cpu": [
"wasm32"
],
@@ -949,9 +967,9 @@
}
},
"node_modules/@rolldown/binding-win32-arm64-msvc": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.4.tgz",
- "integrity": "sha512-PnWBtw3TV5KOg69HQQDR0mnQuyCmSGR2pAB4DC1rPF808fgKeTUMj2EOEyKATpgiuxuR5APQmiDO7PDgEjTFSA==",
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz",
+ "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==",
"cpu": [
"arm64"
],
@@ -966,9 +984,9 @@
}
},
"node_modules/@rolldown/binding-win32-x64-msvc": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.4.tgz",
- "integrity": "sha512-M1lpniBePobTfsa7Ks9a199e1akxsXn+GYBUKsEzv3YFzOm1HJAMNwKI3qr0Zq+mxwx9gOZoTdP1yXRYsZUocQ==",
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz",
+ "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==",
"cpu": [
"x64"
],
@@ -1003,9 +1021,9 @@
"license": "Apache-2.0"
},
"node_modules/@supabase/auth-js": {
- "version": "2.110.5",
- "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.110.5.tgz",
- "integrity": "sha512-QSlI5CNeEefHP95/GbeMhNgr8aHEHiXFh8c1IWthYyI9ZzBwEigYzJFCw4Ff+GkL8OK9tArBmGGv6rpg5zLXSw==",
+ "version": "2.110.8",
+ "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.110.8.tgz",
+ "integrity": "sha512-TQ5neTUDX2C2WmyYa03yGhLMkhdE/SkHXtK8/qxO/APUy3rsymsJCBP48p4jcN6iO2G0ow6RRexQd2mX+dSyJg==",
"license": "MIT",
"dependencies": {
"tslib": "2.8.1"
@@ -1015,9 +1033,9 @@
}
},
"node_modules/@supabase/functions-js": {
- "version": "2.110.5",
- "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.110.5.tgz",
- "integrity": "sha512-nuQuoIoEGT8ukrwr6THlY5v50bSMJ2rqti1FFsGyDaC98POLmcFQVFFh23PVPhRsKWUxrFc0MpmEoHKa7CY4mg==",
+ "version": "2.110.8",
+ "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.110.8.tgz",
+ "integrity": "sha512-5yB9TLYzvv2oSQxwb0gamEvIAsuH66pVt7AM/pz03S7wN6ehD34GNgbShrccetqPedXQSz7e/1hAJ9NeEhoZVg==",
"license": "MIT",
"dependencies": {
"tslib": "2.8.1"
@@ -1027,15 +1045,15 @@
}
},
"node_modules/@supabase/phoenix": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/@supabase/phoenix/-/phoenix-0.4.4.tgz",
- "integrity": "sha512-Gt0pqoXuIqX/8dvG0OKp/wMCobXNH3klNbUPBNyOfN0YA1IswrM3HyWFMOPk1Jy+BRaIyDPcFx4jLBwHNmlyfQ==",
+ "version": "0.4.5",
+ "resolved": "https://registry.npmjs.org/@supabase/phoenix/-/phoenix-0.4.5.tgz",
+ "integrity": "sha512-aAn9H9ovVyeApKy11OWOrrOGq8DV68yWeH4ud2lN9fzn4aO8Zb5GLL9m1pUg9nLqIcT+ZDfAcsZe0E/nqdv2lw==",
"license": "MIT"
},
"node_modules/@supabase/postgrest-js": {
- "version": "2.110.5",
- "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.110.5.tgz",
- "integrity": "sha512-eObfgBjxLPzFakwMpUmsv8nuNPOhoDhzzN8cwvEvGkxkmuRIZcOCYH9+DRbpKnxh7tgsBZW+KWtaZI2j98b2/g==",
+ "version": "2.110.8",
+ "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.110.8.tgz",
+ "integrity": "sha512-QeRROxl1PpOZw5Jzi7BwdN9icsycMrLlCCvsjS0hYLW+nZoaT46zdagz/glJirj8jHF4jSd5Jyipuae2cBClCw==",
"license": "MIT",
"dependencies": {
"tslib": "2.8.1"
@@ -1045,12 +1063,12 @@
}
},
"node_modules/@supabase/realtime-js": {
- "version": "2.110.5",
- "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.110.5.tgz",
- "integrity": "sha512-VtOZxw5jfrc37KgIfFdp9SOFJjtvJ0qU+gT8CPQjL7cqy4DJlaTXacw5aBBogLZksqAI0YN67qhlDaMKFwfOuw==",
+ "version": "2.110.8",
+ "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.110.8.tgz",
+ "integrity": "sha512-mwX7ituX6O31fLf+0g65rpLlNxqgnMaPltPsQwzox6jfmbfVl3tCxXrfr3HEsQcCRjpjuJG1+A0vFzP1yVjKHA==",
"license": "MIT",
"dependencies": {
- "@supabase/phoenix": "0.4.4",
+ "@supabase/phoenix": "0.4.5",
"tslib": "2.8.1"
},
"engines": {
@@ -1058,9 +1076,9 @@
}
},
"node_modules/@supabase/storage-js": {
- "version": "2.110.5",
- "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.110.5.tgz",
- "integrity": "sha512-7GkOZlrYknVGVPyijoDbu5OXGvQ2oQ6dkU0juAkIMPZ9QgtmJ8IPrxe76zGSbmzbaC1GdKw7pqeXEi2HT67sbA==",
+ "version": "2.110.8",
+ "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.110.8.tgz",
+ "integrity": "sha512-CcfhkZFBLxsthgUabZKxwfsoXdrikIGsL3LsGoV3FZTqCMx/s1y49taT4jT/oya5+1IuB0sFFHw6pF0o0iJniQ==",
"license": "MIT",
"dependencies": {
"iceberg-js": "^0.8.1",
@@ -1071,65 +1089,65 @@
}
},
"node_modules/@supabase/supabase-js": {
- "version": "2.110.5",
- "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.110.5.tgz",
- "integrity": "sha512-cAO1Nm+CCogRNVXN93bBkh0vjOdLM5e6J9gB/cHV9Lqni/gEmN2HJFrnn4NI33GYIfmlh4Wbm6siH+XXRgpexA==",
+ "version": "2.110.8",
+ "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.110.8.tgz",
+ "integrity": "sha512-E5qzoe74zhJRv4wRcbO9eMYzeQDb/+h6c603pL8shcxLGBjTKsIF7XXj05IcNj23TLDgJN1WkMw7mwAPyu5dZg==",
"license": "MIT",
"dependencies": {
- "@supabase/auth-js": "2.110.5",
- "@supabase/functions-js": "2.110.5",
- "@supabase/postgrest-js": "2.110.5",
- "@supabase/realtime-js": "2.110.5",
- "@supabase/storage-js": "2.110.5"
+ "@supabase/auth-js": "2.110.8",
+ "@supabase/functions-js": "2.110.8",
+ "@supabase/postgrest-js": "2.110.8",
+ "@supabase/realtime-js": "2.110.8",
+ "@supabase/storage-js": "2.110.8"
},
"engines": {
"node": ">=22.0.0"
}
},
"node_modules/@tailwindcss/node": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.2.tgz",
- "integrity": "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz",
+ "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/remapping": "^2.3.5",
- "enhanced-resolve": "5.21.6",
+ "enhanced-resolve": "^5.24.1",
"jiti": "^2.7.0",
"lightningcss": "1.32.0",
"magic-string": "^0.30.21",
"source-map-js": "^1.2.1",
- "tailwindcss": "4.3.2"
+ "tailwindcss": "4.3.3"
}
},
"node_modules/@tailwindcss/oxide": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.2.tgz",
- "integrity": "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz",
+ "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 20"
},
"optionalDependencies": {
- "@tailwindcss/oxide-android-arm64": "4.3.2",
- "@tailwindcss/oxide-darwin-arm64": "4.3.2",
- "@tailwindcss/oxide-darwin-x64": "4.3.2",
- "@tailwindcss/oxide-freebsd-x64": "4.3.2",
- "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2",
- "@tailwindcss/oxide-linux-arm64-gnu": "4.3.2",
- "@tailwindcss/oxide-linux-arm64-musl": "4.3.2",
- "@tailwindcss/oxide-linux-x64-gnu": "4.3.2",
- "@tailwindcss/oxide-linux-x64-musl": "4.3.2",
- "@tailwindcss/oxide-wasm32-wasi": "4.3.2",
- "@tailwindcss/oxide-win32-arm64-msvc": "4.3.2",
- "@tailwindcss/oxide-win32-x64-msvc": "4.3.2"
+ "@tailwindcss/oxide-android-arm64": "4.3.3",
+ "@tailwindcss/oxide-darwin-arm64": "4.3.3",
+ "@tailwindcss/oxide-darwin-x64": "4.3.3",
+ "@tailwindcss/oxide-freebsd-x64": "4.3.3",
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3",
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3",
+ "@tailwindcss/oxide-linux-arm64-musl": "4.3.3",
+ "@tailwindcss/oxide-linux-x64-gnu": "4.3.3",
+ "@tailwindcss/oxide-linux-x64-musl": "4.3.3",
+ "@tailwindcss/oxide-wasm32-wasi": "4.3.3",
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3",
+ "@tailwindcss/oxide-win32-x64-msvc": "4.3.3"
}
},
"node_modules/@tailwindcss/oxide-android-arm64": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.2.tgz",
- "integrity": "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz",
+ "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==",
"cpu": [
"arm64"
],
@@ -1144,9 +1162,9 @@
}
},
"node_modules/@tailwindcss/oxide-darwin-arm64": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.2.tgz",
- "integrity": "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz",
+ "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==",
"cpu": [
"arm64"
],
@@ -1161,9 +1179,9 @@
}
},
"node_modules/@tailwindcss/oxide-darwin-x64": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.2.tgz",
- "integrity": "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz",
+ "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==",
"cpu": [
"x64"
],
@@ -1178,9 +1196,9 @@
}
},
"node_modules/@tailwindcss/oxide-freebsd-x64": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.2.tgz",
- "integrity": "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz",
+ "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==",
"cpu": [
"x64"
],
@@ -1195,9 +1213,9 @@
}
},
"node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.2.tgz",
- "integrity": "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz",
+ "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==",
"cpu": [
"arm"
],
@@ -1212,13 +1230,16 @@
}
},
"node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.2.tgz",
- "integrity": "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz",
+ "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==",
"cpu": [
"arm64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -1229,13 +1250,16 @@
}
},
"node_modules/@tailwindcss/oxide-linux-arm64-musl": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.2.tgz",
- "integrity": "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz",
+ "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==",
"cpu": [
"arm64"
],
"dev": true,
+ "libc": [
+ "musl"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -1246,13 +1270,16 @@
}
},
"node_modules/@tailwindcss/oxide-linux-x64-gnu": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.2.tgz",
- "integrity": "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz",
+ "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==",
"cpu": [
"x64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -1263,13 +1290,16 @@
}
},
"node_modules/@tailwindcss/oxide-linux-x64-musl": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.2.tgz",
- "integrity": "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz",
+ "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==",
"cpu": [
"x64"
],
"dev": true,
+ "libc": [
+ "musl"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -1280,9 +1310,9 @@
}
},
"node_modules/@tailwindcss/oxide-wasm32-wasi": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.2.tgz",
- "integrity": "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz",
+ "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==",
"bundleDependencies": [
"@napi-rs/wasm-runtime",
"@emnapi/core",
@@ -1310,9 +1340,9 @@
}
},
"node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.2.tgz",
- "integrity": "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz",
+ "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==",
"cpu": [
"arm64"
],
@@ -1327,9 +1357,9 @@
}
},
"node_modules/@tailwindcss/oxide-win32-x64-msvc": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.2.tgz",
- "integrity": "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz",
+ "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==",
"cpu": [
"x64"
],
@@ -1344,29 +1374,29 @@
}
},
"node_modules/@tailwindcss/postcss": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.2.tgz",
- "integrity": "sha512-rjVWYCa7Ngbi5AarT6k8TkxUG3Wl1QKzHdIZVsjZSzf36Jmo2IKZt/NHRAwly8oDkbBOH0YTu+CHuf9jPxMc+g==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.3.tgz",
+ "integrity": "sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
- "@tailwindcss/node": "4.3.2",
- "@tailwindcss/oxide": "4.3.2",
- "postcss": "^8.5.15",
- "tailwindcss": "4.3.2"
+ "@tailwindcss/node": "4.3.3",
+ "@tailwindcss/oxide": "4.3.3",
+ "postcss": "^8.5.16",
+ "tailwindcss": "4.3.3"
}
},
"node_modules/@tailwindcss/vite": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.2.tgz",
- "integrity": "sha512-eHpMeX4JXfVNJDEcsouTeCBubJBTcTLigeaw/NTUW6PB5ATKKXdyonnXgTBX2VuRbjz1hjfz6C5XAhr52ImQXA==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz",
+ "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@tailwindcss/node": "4.3.2",
- "@tailwindcss/oxide": "4.3.2",
- "tailwindcss": "4.3.2"
+ "@tailwindcss/node": "4.3.3",
+ "@tailwindcss/oxide": "4.3.3",
+ "tailwindcss": "4.3.3"
},
"peerDependencies": {
"vite": "^5.2.0 || ^6 || ^7 || ^8"
@@ -1600,9 +1630,9 @@
}
},
"node_modules/@tauri-apps/plugin-dialog": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-dialog/-/plugin-dialog-2.7.1.tgz",
- "integrity": "sha512-OK1UBXYt+ojcmxMktzzuyonYIFta8CmAASpX+CA+DTGK24KlHjhYI6x2iOJ/TjZF4N7/ACK1oFmEOjIY9IhzOQ==",
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-dialog/-/plugin-dialog-2.7.2.tgz",
+ "integrity": "sha512-pX0IGm1I3I6wc+zeKYcq1GSqogK6okCNX5fOdaNU5ab1AjGS6l1E5wFNjEb7meg7ZFSp0JUs+0jQGQNyOvLrsg==",
"license": "MIT OR Apache-2.0",
"dependencies": {
"@tauri-apps/api": "^2.11.0"
@@ -1703,17 +1733,17 @@
"optional": true
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.64.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.64.0.tgz",
- "integrity": "sha512-CGvQPBxN3wZLu6Rz2kFUpZeoCm78xUic92ck39KPePkO1NPOwjCqdQnm5Q87tpWw9vcBvW8XLrDXjH9PWYtJ3Q==",
+ "version": "8.65.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.65.0.tgz",
+ "integrity": "sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/regexpp": "^4.12.2",
- "@typescript-eslint/scope-manager": "8.64.0",
- "@typescript-eslint/type-utils": "8.64.0",
- "@typescript-eslint/utils": "8.64.0",
- "@typescript-eslint/visitor-keys": "8.64.0",
+ "@typescript-eslint/scope-manager": "8.65.0",
+ "@typescript-eslint/type-utils": "8.65.0",
+ "@typescript-eslint/utils": "8.65.0",
+ "@typescript-eslint/visitor-keys": "8.65.0",
"ignore": "^7.0.5",
"natural-compare": "^1.4.0",
"ts-api-utils": "^2.5.0"
@@ -1726,23 +1756,23 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "@typescript-eslint/parser": "^8.64.0",
+ "@typescript-eslint/parser": "^8.65.0",
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
"typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": {
- "version": "8.64.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.64.0.tgz",
- "integrity": "sha512-XWG4Fmmv/6SvyS9nH8jWrKs6terwJvE8cyRt1CzYYqzp9OrPhCT4cMc/f7C6RZCwG+qMmiffJS1/qJP8G1URtg==",
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.65.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.65.0.tgz",
+ "integrity": "sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.64.0",
- "@typescript-eslint/typescript-estree": "8.64.0",
- "@typescript-eslint/utils": "8.64.0",
- "debug": "^4.4.3",
- "ts-api-utils": "^2.5.0"
+ "@typescript-eslint/scope-manager": "8.65.0",
+ "@typescript-eslint/types": "8.65.0",
+ "@typescript-eslint/typescript-estree": "8.65.0",
+ "@typescript-eslint/visitor-keys": "8.65.0",
+ "debug": "^4.4.3"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1756,22 +1786,16 @@
"typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.64.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.64.0.tgz",
- "integrity": "sha512-Pztpsn1aCE1oWDvDEfUk31nngvvF7vUB5SwHFEaZIFpvw7WJtqUHHL4plBZDA9HfWJJjL13BdG0YrJInTUvoVA==",
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.65.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.65.0.tgz",
+ "integrity": "sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/project-service": "8.64.0",
- "@typescript-eslint/tsconfig-utils": "8.64.0",
- "@typescript-eslint/types": "8.64.0",
- "@typescript-eslint/visitor-keys": "8.64.0",
- "debug": "^4.4.3",
- "minimatch": "^10.2.2",
- "semver": "^7.7.3",
- "tinyglobby": "^0.2.15",
- "ts-api-utils": "^2.5.0"
+ "@typescript-eslint/tsconfig-utils": "^8.65.0",
+ "@typescript-eslint/types": "^8.65.0",
+ "debug": "^4.4.3"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1784,16 +1808,15 @@
"typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/project-service": {
- "version": "8.64.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.64.0.tgz",
- "integrity": "sha512-tk4WpOJ6IEbGrVHaNmM0YRrwAD3exZlIK3iadQNAxh4YKk6jvUQ4ecq18n+v7+meh+cJ3j+D8nbk8sRKhlwLQg==",
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.65.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.65.0.tgz",
+ "integrity": "sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.64.0",
- "@typescript-eslint/types": "^8.64.0",
- "debug": "^4.4.3"
+ "@typescript-eslint/types": "8.65.0",
+ "@typescript-eslint/visitor-keys": "8.65.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1801,15 +1824,12 @@
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.64.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.64.0.tgz",
- "integrity": "sha512-2yo8rRNKuzbVWQp5kslhANqZ2uDAeROQHBRZNPu8JDsHmeFNj/XJJhX/FhNUWmkHHvoNsKa6+tHJiig87EzsQw==",
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.65.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.65.0.tgz",
+ "integrity": "sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1823,45 +1843,17 @@
"typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": {
- "version": "8.64.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.64.0.tgz",
- "integrity": "sha512-aJUGVB3+U0htrrCjoA8qukw8cm8fNCGAxK/tVoS70k8aeb7DETKeFozRiVFIwEeN9WJLsjaP3ph8I60tY2XZoQ==",
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.65.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.65.0.tgz",
+ "integrity": "sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@eslint-community/eslint-utils": "^4.9.1",
- "@typescript-eslint/scope-manager": "8.64.0",
- "@typescript-eslint/types": "8.64.0",
- "@typescript-eslint/typescript-estree": "8.64.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.64.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.64.0.tgz",
- "integrity": "sha512-Pztpsn1aCE1oWDvDEfUk31nngvvF7vUB5SwHFEaZIFpvw7WJtqUHHL4plBZDA9HfWJJjL13BdG0YrJInTUvoVA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/project-service": "8.64.0",
- "@typescript-eslint/tsconfig-utils": "8.64.0",
- "@typescript-eslint/types": "8.64.0",
- "@typescript-eslint/visitor-keys": "8.64.0",
+ "@typescript-eslint/types": "8.65.0",
+ "@typescript-eslint/typescript-estree": "8.65.0",
+ "@typescript-eslint/utils": "8.65.0",
"debug": "^4.4.3",
- "minimatch": "^10.2.2",
- "semver": "^7.7.3",
- "tinyglobby": "^0.2.15",
"ts-api-utils": "^2.5.0"
},
"engines": {
@@ -1872,84 +1864,35 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
"typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/project-service": {
- "version": "8.64.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.64.0.tgz",
- "integrity": "sha512-tk4WpOJ6IEbGrVHaNmM0YRrwAD3exZlIK3iadQNAxh4YKk6jvUQ4ecq18n+v7+meh+cJ3j+D8nbk8sRKhlwLQg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.64.0",
- "@typescript-eslint/types": "^8.64.0",
- "debug": "^4.4.3"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.64.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.64.0.tgz",
- "integrity": "sha512-2yo8rRNKuzbVWQp5kslhANqZ2uDAeROQHBRZNPu8JDsHmeFNj/XJJhX/FhNUWmkHHvoNsKa6+tHJiig87EzsQw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/parser": {
- "version": "8.64.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.64.0.tgz",
- "integrity": "sha512-KA0OshtlcCCXmbfqyZkM5pV3/WNraJf7DkJRLpyrmwPtud57H5BDX7C3k0LPSPxpprfRL+cJDGabF10mvNCoCw==",
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.65.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.65.0.tgz",
+ "integrity": "sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@typescript-eslint/scope-manager": "8.64.0",
- "@typescript-eslint/types": "8.64.0",
- "@typescript-eslint/typescript-estree": "8.64.0",
- "@typescript-eslint/visitor-keys": "8.64.0",
- "debug": "^4.4.3"
- },
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
- "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.64.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.64.0.tgz",
- "integrity": "sha512-Pztpsn1aCE1oWDvDEfUk31nngvvF7vUB5SwHFEaZIFpvw7WJtqUHHL4plBZDA9HfWJJjL13BdG0YrJInTUvoVA==",
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.65.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.65.0.tgz",
+ "integrity": "sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/project-service": "8.64.0",
- "@typescript-eslint/tsconfig-utils": "8.64.0",
- "@typescript-eslint/types": "8.64.0",
- "@typescript-eslint/visitor-keys": "8.64.0",
+ "@typescript-eslint/project-service": "8.65.0",
+ "@typescript-eslint/tsconfig-utils": "8.65.0",
+ "@typescript-eslint/types": "8.65.0",
+ "@typescript-eslint/visitor-keys": "8.65.0",
"debug": "^4.4.3",
"minimatch": "^10.2.2",
"semver": "^7.7.3",
@@ -1967,34 +1910,18 @@
"typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/project-service": {
- "version": "8.64.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.64.0.tgz",
- "integrity": "sha512-tk4WpOJ6IEbGrVHaNmM0YRrwAD3exZlIK3iadQNAxh4YKk6jvUQ4ecq18n+v7+meh+cJ3j+D8nbk8sRKhlwLQg==",
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.65.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.65.0.tgz",
+ "integrity": "sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.64.0",
- "@typescript-eslint/types": "^8.64.0",
- "debug": "^4.4.3"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.65.0",
+ "@typescript-eslint/types": "8.65.0",
+ "@typescript-eslint/typescript-estree": "8.65.0"
},
- "peerDependencies": {
- "typescript": ">=4.8.4 <6.1.0"
- }
- },
- "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.64.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.64.0.tgz",
- "integrity": "sha512-2yo8rRNKuzbVWQp5kslhANqZ2uDAeROQHBRZNPu8JDsHmeFNj/XJJhX/FhNUWmkHHvoNsKa6+tHJiig87EzsQw==",
- "dev": true,
- "license": "MIT",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@@ -2003,49 +1930,18 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
"typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@typescript-eslint/scope-manager": {
- "version": "8.64.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.64.0.tgz",
- "integrity": "sha512-CXEaFdYXjSTgKhisNkwCcJwTP8Pl+fmRrEQrri4nm3vU743bALrxzLmq7fHG/7e6a5xO0lDYeURpZmBuhHk54w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.64.0",
- "@typescript-eslint/visitor-keys": "8.64.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/types": {
- "version": "8.64.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.64.0.tgz",
- "integrity": "sha512-qjhfuTfLXjA4IOzXvz0rTjT01BqEiIgPoUeMwiEjnaHKJMTNo8rH5pYW1a2L/0Dnux2fPC85AeyJoWaGa8WxTA==",
- "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/visitor-keys": {
- "version": "8.64.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.64.0.tgz",
- "integrity": "sha512-mrtuL8Nsn6gi2H4mo5KMTp823M+3Q19Ew/i+Zlikq20tIMm99C3Ez0dCmkWWnxut20esQvTg8aUSEhMcAOXhEw==",
+ "version": "8.65.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.65.0.tgz",
+ "integrity": "sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.64.0",
+ "@typescript-eslint/types": "8.65.0",
"eslint-visitor-keys": "^5.0.0"
},
"engines": {
@@ -2229,13 +2125,13 @@
}
},
"node_modules/@vue/compiler-core": {
- "version": "3.5.39",
- "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.39.tgz",
- "integrity": "sha512-16KBTEXAJCpDr0mwlw+AZyhu8iyC7R3S2vBwsI7QnWJU6X3WKc9VKeNEZpiMdZ569qWhz9574L3vV55qRL0Vtw==",
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.40.tgz",
+ "integrity": "sha512-39E8IgOhTbVDnoJFMKc2DvYnypcZwUqgUhQkccva/0m6FUwtIKSGV7n1hpVmYcFaoRAwf9pBcwnKlCEsN63ZEQ==",
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.29.7",
- "@vue/shared": "3.5.39",
+ "@vue/shared": "3.5.40",
"entities": "^7.0.1",
"estree-walker": "^2.0.2",
"source-map-js": "^1.2.1"
@@ -2260,29 +2156,29 @@
"license": "MIT"
},
"node_modules/@vue/compiler-dom": {
- "version": "3.5.39",
- "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.39.tgz",
- "integrity": "sha512-oQPigALqYbNxTNPvNgSOe+czwVExfbVF02lz8jP0S3AXJiu3jxYDygNUiqSep4ezzW8XgnubqH63My2A7JR/vg==",
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.40.tgz",
+ "integrity": "sha512-pwkx4vqlqOspFstrcmzwkKLePVMD3PT65imRzLhanU2V1Fj4K13g6OXjanOyzw3aTAuRk84BOmY8f3rEHqPaVA==",
"license": "MIT",
"dependencies": {
- "@vue/compiler-core": "3.5.39",
- "@vue/shared": "3.5.39"
+ "@vue/compiler-core": "3.5.40",
+ "@vue/shared": "3.5.40"
}
},
"node_modules/@vue/compiler-sfc": {
- "version": "3.5.39",
- "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.39.tgz",
- "integrity": "sha512-d0ki86iOyN8LoZPBmk5SJWNwHP19CnDDCfuo//+2WJa2g5Ke0Jay983PIBIcSSzldC68I8DrD5GrHV3OSDfodg==",
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.40.tgz",
+ "integrity": "sha512-gIf497P4kpuALcvs5n3AEg1Vdn0pSY4XbjASIfHNYF1/MP3T2Mf2STERTubysBxCRxzJGJYtF/O7vwJrxFB3Vw==",
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.29.7",
- "@vue/compiler-core": "3.5.39",
- "@vue/compiler-dom": "3.5.39",
- "@vue/compiler-ssr": "3.5.39",
- "@vue/shared": "3.5.39",
+ "@vue/compiler-core": "3.5.40",
+ "@vue/compiler-dom": "3.5.40",
+ "@vue/compiler-ssr": "3.5.40",
+ "@vue/shared": "3.5.40",
"estree-walker": "^2.0.2",
"magic-string": "^0.30.21",
- "postcss": "^8.5.15",
+ "postcss": "^8.5.19",
"source-map-js": "^1.2.1"
}
},
@@ -2293,13 +2189,13 @@
"license": "MIT"
},
"node_modules/@vue/compiler-ssr": {
- "version": "3.5.39",
- "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.39.tgz",
- "integrity": "sha512-Ce7/wvwMHai74bdszfXExdazFigYnlF9zgCmEQUcM1j0fOymlouZ7XilTYNo8oUjhlnjYOZbGrcYKuqjz89Ucw==",
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.40.tgz",
+ "integrity": "sha512-rrE5xiXG663+vHCHa3J9p2z5OcBRjXmoqenprJxAFQxg5pSshzeBiCE6pu46axapRJ2Adk0YDA2BRZVjiHXnhg==",
"license": "MIT",
"dependencies": {
- "@vue/compiler-dom": "3.5.39",
- "@vue/shared": "3.5.39"
+ "@vue/compiler-dom": "3.5.40",
+ "@vue/shared": "3.5.40"
}
},
"node_modules/@vue/devtools-api": {
@@ -2309,9 +2205,9 @@
"license": "MIT"
},
"node_modules/@vue/language-core": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.3.7.tgz",
- "integrity": "sha512-LzmkKinXAMMoh8Jfi/jMUSDUjuPdv8mynH5WJGKfXyZtDw3hQ6GBaoI6Bcnl/Xqlu32q/0Z6i/trp4VXykzyLw==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.3.8.tgz",
+ "integrity": "sha512-ieGT8jJdhhy0mGzStZhsg/qPw5bQZJg5yF+3+XU6saf4sM7yo9ZXy3h+nCwrm2+b4qS/SypkNdR2jAF3uei9tA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2325,53 +2221,51 @@
}
},
"node_modules/@vue/reactivity": {
- "version": "3.5.39",
- "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.39.tgz",
- "integrity": "sha512-TpsuBJ9gGlZa5d23XcM2y8EXanz9dZeVDQBXRwzy46ItgvM+rWpzs+UVM0wcRLxGvcav0HE5jz2gNL53xlRAog==",
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.40.tgz",
+ "integrity": "sha512-B7ot9UlUZOi1zbq61/LvE88ZLTV8IlajTdiZTAEiDQgrnIMIZoPr9kGw0Zw46ObW62O9+H/Be3kMbfb7kYPQZA==",
"license": "MIT",
"dependencies": {
- "@vue/shared": "3.5.39"
+ "@vue/shared": "3.5.40"
}
},
"node_modules/@vue/runtime-core": {
- "version": "3.5.39",
- "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.39.tgz",
- "integrity": "sha512-9GLtNyRvPAUMbX+7ono0RC2j0guo2LXVi8LvcmAooImACUKm0oFf0jjwbX8/H0AE/t1nxhAkn8RSl9PMCzzxZw==",
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.40.tgz",
+ "integrity": "sha512-KAZLweuZ6uUJPK1PMSQPgBU5gCjgrrfjUhSglmU9NhH+Zjepa8cnwSydPWDWHDwOgY4g3VcZ+PljbiHlURNCbw==",
"license": "MIT",
"dependencies": {
- "@vue/reactivity": "3.5.39",
- "@vue/shared": "3.5.39"
+ "@vue/reactivity": "3.5.40",
+ "@vue/shared": "3.5.40"
}
},
"node_modules/@vue/runtime-dom": {
- "version": "3.5.39",
- "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.39.tgz",
- "integrity": "sha512-7Y6aAGboKcXAZ3ECuUy7RrS5yy2r47dhTp2SKaJmYxjopImaVFaNa5Ne66NwGovsrxVAl5S5rwc7m22UG7Lmww==",
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.40.tgz",
+ "integrity": "sha512-ZfrX8ssZQds900L9pr8AuK05ddnMsR4MPMZr8cPN9GoqoPWcXLhjvvbIA2SMv+7a97sJ1vv9pj/zxK0Cq/eEFQ==",
"license": "MIT",
"dependencies": {
- "@vue/reactivity": "3.5.39",
- "@vue/runtime-core": "3.5.39",
- "@vue/shared": "3.5.39",
+ "@vue/reactivity": "3.5.40",
+ "@vue/runtime-core": "3.5.40",
+ "@vue/shared": "3.5.40",
"csstype": "^3.2.3"
}
},
"node_modules/@vue/server-renderer": {
- "version": "3.5.39",
- "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.39.tgz",
- "integrity": "sha512-yZSakiAGw85rZfG7UM8akMnIF+FmeiNk47uvHf2nVBBSe+dIKUhZuZq9+XgJhbV3nS5Z4ALH23/MpXofW+mbcw==",
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.40.tgz",
+ "integrity": "sha512-XNJym9WpevhTVt1HuwOrCRJ5Q+9z4BjTMrDtjTrvx74SmUll8spNTw6whWJa9mEkO4PKn5TihI/bm/8ds2QVJw==",
"license": "MIT",
"dependencies": {
- "@vue/compiler-ssr": "3.5.39",
- "@vue/shared": "3.5.39"
- },
- "peerDependencies": {
- "vue": "3.5.39"
+ "@vue/compiler-ssr": "3.5.40",
+ "@vue/runtime-dom": "3.5.40",
+ "@vue/shared": "3.5.40"
}
},
"node_modules/@vue/shared": {
- "version": "3.5.39",
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.39.tgz",
- "integrity": "sha512-l1rrBtBfTnmxvtsvdQDXltUUy8S1Y+ZaqdfUzmAnJkTd8Z8rv5v/ytW+TKiqEOWyHPoqtPlNFSs0lhRmYVSHVA==",
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.40.tgz",
+ "integrity": "sha512-WxnBtruIqOoV3rA4jeKDWzrYI5h7Cp4+pjwDi8kWGHz+IslhiN+wguLVVhtv2l8VoU02rzDCVfDjgCl1lNpZVg==",
"license": "MIT"
},
"node_modules/acorn": {
@@ -2606,9 +2500,9 @@
"license": "MIT"
},
"node_modules/daisyui": {
- "version": "5.6.18",
- "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.6.18.tgz",
- "integrity": "sha512-6y9rboRQl8fosnusy/5pg11yp+H0LtK3YdtfS4Vf2QVnaYOKasNdYm6hDxeiT6bwZPdl4WRPzVIlIApdo2ssBg==",
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.7.0.tgz",
+ "integrity": "sha512-2/kYbxaKtv349lPrTyxMKC9SHsyA7fBULMSabJljDE82D079cjqz+UyAzsogWgy4sTs5NDvD000acfcFqbO1XA==",
"dev": true,
"license": "MIT",
"funding": {
@@ -2680,9 +2574,9 @@
}
},
"node_modules/dompurify": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.7.tgz",
- "integrity": "sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==",
+ "version": "3.4.8",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.8.tgz",
+ "integrity": "sha512-yb1cEmaOum7wFvOCSQxyfgVlv5D47Rc30iZWoMpbDIWTnJ6grDDQyu2KFJzB2k7u0pMuJcQ1zphH//fFnw2tjQ==",
"license": "(MPL-2.0 OR Apache-2.0)",
"optionalDependencies": {
"@types/trusted-types": "^2.0.7"
@@ -2703,9 +2597,9 @@
}
},
"node_modules/enhanced-resolve": {
- "version": "5.21.6",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz",
- "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==",
+ "version": "5.24.3",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.3.tgz",
+ "integrity": "sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2854,18 +2748,18 @@
}
},
"node_modules/eslint-plugin-vue": {
- "version": "10.9.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.9.2.tgz",
- "integrity": "sha512-4g7ZP3pYcuqd7Zp0pzUKcos0W+RkjBz4EGdhJ92FcYk6v03Ti/GK5NwjgsjxHK+98eXDbHeK7VtX1az7/8doZA==",
+ "version": "10.10.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.10.0.tgz",
+ "integrity": "sha512-dL9x9rBHqqNcByWiLOHK6L0SB97V82/NC0cZRn9cXPjM7pCuWlpQQP9bFH4vjBv80ej1ZpzAkuD8zWH1o9bZbA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
+ "@eslint-community/eslint-utils": "^4.9.1",
"natural-compare": "^1.4.0",
"nth-check": "^2.1.1",
- "postcss-selector-parser": "^7.1.0",
- "semver": "^7.6.3",
- "xml-name-validator": "^4.0.0"
+ "postcss-selector-parser": "^7.1.4",
+ "semver": "^7.8.5",
+ "xml-name-validator": "^5.0.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3468,16 +3362,6 @@
}
}
},
- "node_modules/jsdom/node_modules/xml-name-validator": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
- "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/json-buffer": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
@@ -3885,12 +3769,12 @@
}
},
"node_modules/monaco-editor": {
- "version": "0.55.1",
- "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.55.1.tgz",
- "integrity": "sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==",
+ "version": "0.56.0",
+ "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.56.0.tgz",
+ "integrity": "sha512-sXboRm3BeBeLm938eaiyLMe0OxzfXIlZvbv4ir/jVgQy1zDhWjgmny0WoN45fuDKhCCQsYMbBJrv/A6jd8aCUg==",
"license": "MIT",
"dependencies": {
- "dompurify": "3.2.7",
+ "dompurify": "3.4.8",
"marked": "14.0.0"
}
},
@@ -3908,9 +3792,9 @@
"license": "MIT"
},
"node_modules/nanoid": {
- "version": "3.3.12",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz",
- "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==",
+ "version": "3.3.16",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz",
+ "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==",
"funding": [
{
"type": "github",
@@ -4073,9 +3957,9 @@
}
},
"node_modules/postcss": {
- "version": "8.5.16",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz",
- "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==",
+ "version": "8.5.22",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.22.tgz",
+ "integrity": "sha512-KBDEIpLrvpv16pp3K0Fw+UCoZfopFjjgeB+0tA/aaThfEE74kKDLrgg603YvOWJyg3+WYtyq3xYsQWsIyZlPqQ==",
"funding": [
{
"type": "opencollective",
@@ -4092,7 +3976,7 @@
],
"license": "MIT",
"dependencies": {
- "nanoid": "^3.3.12",
+ "nanoid": "^3.3.16",
"picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
},
@@ -4101,9 +3985,9 @@
}
},
"node_modules/postcss-selector-parser": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
- "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz",
+ "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4125,9 +4009,9 @@
}
},
"node_modules/prettier": {
- "version": "3.9.5",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.5.tgz",
- "integrity": "sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg==",
+ "version": "3.9.6",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz",
+ "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==",
"dev": true,
"license": "MIT",
"bin": {
@@ -4170,13 +4054,13 @@
}
},
"node_modules/rolldown": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.4.tgz",
- "integrity": "sha512-IjZYiLxZwpnhwhdBH2ugdTGVSdhCQUmLxLoqyjiL0JxYjyRst+5a0P3xfrTxJ5F638j4Mvvw5FAX5XE6eHpXbA==",
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz",
+ "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@oxc-project/types": "=0.138.0",
+ "@oxc-project/types": "=0.139.0",
"@rolldown/pluginutils": "^1.0.0"
},
"bin": {
@@ -4186,21 +4070,21 @@
"node": "^20.19.0 || >=22.12.0"
},
"optionalDependencies": {
- "@rolldown/binding-android-arm64": "1.1.4",
- "@rolldown/binding-darwin-arm64": "1.1.4",
- "@rolldown/binding-darwin-x64": "1.1.4",
- "@rolldown/binding-freebsd-x64": "1.1.4",
- "@rolldown/binding-linux-arm-gnueabihf": "1.1.4",
- "@rolldown/binding-linux-arm64-gnu": "1.1.4",
- "@rolldown/binding-linux-arm64-musl": "1.1.4",
- "@rolldown/binding-linux-ppc64-gnu": "1.1.4",
- "@rolldown/binding-linux-s390x-gnu": "1.1.4",
- "@rolldown/binding-linux-x64-gnu": "1.1.4",
- "@rolldown/binding-linux-x64-musl": "1.1.4",
- "@rolldown/binding-openharmony-arm64": "1.1.4",
- "@rolldown/binding-wasm32-wasi": "1.1.4",
- "@rolldown/binding-win32-arm64-msvc": "1.1.4",
- "@rolldown/binding-win32-x64-msvc": "1.1.4"
+ "@rolldown/binding-android-arm64": "1.1.5",
+ "@rolldown/binding-darwin-arm64": "1.1.5",
+ "@rolldown/binding-darwin-x64": "1.1.5",
+ "@rolldown/binding-freebsd-x64": "1.1.5",
+ "@rolldown/binding-linux-arm-gnueabihf": "1.1.5",
+ "@rolldown/binding-linux-arm64-gnu": "1.1.5",
+ "@rolldown/binding-linux-arm64-musl": "1.1.5",
+ "@rolldown/binding-linux-ppc64-gnu": "1.1.5",
+ "@rolldown/binding-linux-s390x-gnu": "1.1.5",
+ "@rolldown/binding-linux-x64-gnu": "1.1.5",
+ "@rolldown/binding-linux-x64-musl": "1.1.5",
+ "@rolldown/binding-openharmony-arm64": "1.1.5",
+ "@rolldown/binding-wasm32-wasi": "1.1.5",
+ "@rolldown/binding-win32-arm64-msvc": "1.1.5",
+ "@rolldown/binding-win32-x64-msvc": "1.1.5"
}
},
"node_modules/saxes": {
@@ -4217,9 +4101,9 @@
}
},
"node_modules/semver": {
- "version": "7.8.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz",
- "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==",
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
"dev": true,
"license": "ISC",
"bin": {
@@ -4296,9 +4180,9 @@
"license": "MIT"
},
"node_modules/tailwindcss": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz",
- "integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz",
+ "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==",
"dev": true,
"license": "MIT"
},
@@ -4492,16 +4376,16 @@
"license": "MIT"
},
"node_modules/vite": {
- "version": "8.1.4",
- "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.4.tgz",
- "integrity": "sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==",
+ "version": "8.1.5",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.5.tgz",
+ "integrity": "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==",
"dev": true,
"license": "MIT",
"dependencies": {
"lightningcss": "^1.32.0",
"picomatch": "^4.0.5",
- "postcss": "^8.5.16",
- "rolldown": "~1.1.4",
+ "postcss": "^8.5.17",
+ "rolldown": "~1.1.5",
"tinyglobby": "^0.2.17"
},
"bin": {
@@ -4667,16 +4551,16 @@
"license": "MIT"
},
"node_modules/vue": {
- "version": "3.5.39",
- "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.39.tgz",
- "integrity": "sha512-xmZCYabFGcirU8r0fTuvl/LICc1OU620rnqepaJDL/a141ZigkG7AyaxQLdqJ02ZRYzWe6YPaDHeQx7MfknQfA==",
+ "version": "3.5.40",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.40.tgz",
+ "integrity": "sha512-+8PJ4SJXdn/cHGImF4CKdxlWHIN5Dkt7DoufRREM6h6uVCx2m7QxgcEQmmzyOK8A9mcafg7sFbJFYsdFVubTig==",
"license": "MIT",
"dependencies": {
- "@vue/compiler-dom": "3.5.39",
- "@vue/compiler-sfc": "3.5.39",
- "@vue/runtime-dom": "3.5.39",
- "@vue/server-renderer": "3.5.39",
- "@vue/shared": "3.5.39"
+ "@vue/compiler-dom": "3.5.40",
+ "@vue/compiler-sfc": "3.5.40",
+ "@vue/runtime-dom": "3.5.40",
+ "@vue/server-renderer": "3.5.40",
+ "@vue/shared": "3.5.40"
},
"peerDependencies": {
"typescript": "*"
@@ -4725,14 +4609,14 @@
}
},
"node_modules/vue-i18n": {
- "version": "11.4.6",
- "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-11.4.6.tgz",
- "integrity": "sha512-l0gE7Rfy0phCa5ChKYkOq543Wgd39BCK6hkktfr1Ed4D99oRkgPK9ffShASZdeC8OJxGfdWmpYoAaAH6iLEuIg==",
+ "version": "11.4.7",
+ "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-11.4.7.tgz",
+ "integrity": "sha512-j6RyshdPPzqLiMAUpnpvZGFPM+rRoWi14Sl5yTsquvoW0/56DWyvhAj2o9TO2YXGvb6teg8T0xrYO9jR3urvdw==",
"license": "MIT",
"dependencies": {
- "@intlify/core-base": "11.4.6",
- "@intlify/devtools-types": "11.4.6",
- "@intlify/shared": "11.4.6",
+ "@intlify/core-base": "11.4.7",
+ "@intlify/devtools-types": "11.4.7",
+ "@intlify/shared": "11.4.7",
"@vue/devtools-api": "^6.5.0"
},
"engines": {
@@ -4746,14 +4630,14 @@
}
},
"node_modules/vue-tsc": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.3.7.tgz",
- "integrity": "sha512-+C+rgD49wAQ5bUTl2sp5a8Bzg4YoldMNXM+g7CFe604MYcQ8PrZPMQhIjJSzKXtPBCa+C5ayMipqjbA7splekQ==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.3.8.tgz",
+ "integrity": "sha512-xXmYlVQpcwJDWyGlqbHrGVOl1h3UOsASymRibrHc+iy9j/UNnOrOn4u+fntHz4D6Cs74RtapeqVV6CzJeg+UlA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@volar/typescript": "2.4.28",
- "@vue/language-core": "3.3.7"
+ "@vue/language-core": "3.3.8"
},
"bin": {
"vue-tsc": "bin/vue-tsc.js"
@@ -4775,16 +4659,6 @@
"node": ">=18"
}
},
- "node_modules/w3c-xmlserializer/node_modules/xml-name-validator": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
- "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/webidl-conversions": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz",
@@ -4864,13 +4738,13 @@
}
},
"node_modules/xml-name-validator": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
- "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
+ "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
"dev": true,
"license": "Apache-2.0",
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/xmlchars": {
diff --git a/package.json b/package.json
index 5db0cce0..59130256 100644
--- a/package.json
+++ b/package.json
@@ -25,40 +25,40 @@
},
"dependencies": {
"@guolao/vue-monaco-editor": "1.6.0",
- "@lucide/vue": "1.24.0",
+ "@lucide/vue": "1.26.0",
"@stomp/stompjs": "^7.3.0",
- "@supabase/supabase-js": "^2.110.5",
+ "@supabase/supabase-js": "^2.110.8",
"@tauri-apps/api": "2.11.1",
- "@tauri-apps/plugin-dialog": "2.7.1",
+ "@tauri-apps/plugin-dialog": "2.7.2",
"@tauri-apps/plugin-fs": "2.5.1",
"@tauri-apps/plugin-notification": "2.3.3",
"@tauri-apps/plugin-opener": "2.5.4",
"axios": "1.18.1",
"gsap": "3.15.0",
- "monaco-editor": "^0.55.1",
+ "monaco-editor": "^0.56.0",
"tls": "^0.0.1",
- "vue": "3.5.39",
- "vue-i18n": "11.4.6"
+ "vue": "3.5.40",
+ "vue-i18n": "11.4.7"
},
"devDependencies": {
- "@tailwindcss/postcss": "^4.3.2",
- "@tailwindcss/vite": "^4.3.2",
+ "@tailwindcss/postcss": "^4.3.3",
+ "@tailwindcss/vite": "^4.3.3",
"@tauri-apps/cli": "2.11.4",
"@types/node": "26.1.1",
- "@typescript-eslint/eslint-plugin": "8.64.0",
- "@typescript-eslint/parser": "8.64.0",
+ "@typescript-eslint/eslint-plugin": "8.65.0",
+ "@typescript-eslint/parser": "8.65.0",
"@vitejs/plugin-vue": "6.0.8",
"axios-mock-adapter": "^2.1.0",
- "daisyui": "^5.6.18",
+ "daisyui": "^5.7.0",
"eslint": "^10.7.0",
- "eslint-plugin-vue": "10.9.2",
+ "eslint-plugin-vue": "10.10.0",
"jsdom": "^29.1.1",
- "prettier": "3.9.5",
- "tailwindcss": "4.3.2",
+ "prettier": "3.9.6",
+ "tailwindcss": "4.3.3",
"typescript": "^5.8.3",
- "vite": "^8.1.4",
+ "vite": "^8.1.5",
"vitest": "^4.1.10",
"vue-eslint-parser": "^10.4.1",
- "vue-tsc": "3.3.7"
+ "vue-tsc": "3.3.8"
}
}
diff --git a/scripts/__pycache__/new_client.cpython-313.pyc b/scripts/__pycache__/new_client.cpython-313.pyc
deleted file mode 100644
index fa64a6c604a4cb1b74c789d28d3886425eb064eb..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 18643
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
Vi?Nip^tTNAZwEKwXBokv{|D*ZwbTFr
diff --git a/scripts/__pycache__/scripts_gui.cpython-313.pyc b/scripts/__pycache__/scripts_gui.cpython-313.pyc
deleted file mode 100644
index c68e43992f681ea39577534c86b69c63193ebf51..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 29998
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