diff --git a/.gitignore b/.gitignore index 8f528a5..2e3faf4 100644 --- a/.gitignore +++ b/.gitignore @@ -23,5 +23,9 @@ vite.config.js.timestamp-* vite.config.ts.timestamp-* *.pmtiles +static/map/sprites/ +static/map/fonts/ -dev.config.ts \ No newline at end of file +dev.config.ts +# Copied from sql.js by `pnpm sqlite:wasm` +static/assets/sql-wasm.wasm diff --git a/.prettierignore b/.prettierignore index 7c92822..3b65aca 100644 --- a/.prettierignore +++ b/.prettierignore @@ -31,3 +31,7 @@ bun.lockb # Managed by release-please /.release-please-manifest.json + + +# generated migration snapshots +/src/lib/db/migrations/meta \ No newline at end of file diff --git a/android/app/capacitor.build.gradle b/android/app/capacitor.build.gradle index 95bad48..78392e2 100644 --- a/android/app/capacitor.build.gradle +++ b/android/app/capacitor.build.gradle @@ -9,6 +9,9 @@ android { apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" dependencies { + implementation project(':capacitor-community-sqlite') + implementation project(':capacitor-app') + implementation project(':capacitor-app-launcher') implementation project(':capacitor-filesystem') implementation project(':capacitor-geolocation') implementation project(':capacitor-preferences') diff --git a/android/capacitor.settings.gradle b/android/capacitor.settings.gradle index 8f2abec..29af60d 100644 --- a/android/capacitor.settings.gradle +++ b/android/capacitor.settings.gradle @@ -2,6 +2,15 @@ include ':capacitor-android' project(':capacitor-android').projectDir = new File('../node_modules/.pnpm/@capacitor+android@8.3.0_patch_hash=5f151b861cf2cde88167eece495aecb0862a61bea5115b27870_874123a7c3556940d002a867e09a2b84/node_modules/@capacitor/android/capacitor') +include ':capacitor-community-sqlite' +project(':capacitor-community-sqlite').projectDir = new File('../node_modules/.pnpm/@capacitor-community+sqlite@8.1.1_@capacitor+core@8.3.0/node_modules/@capacitor-community/sqlite/android') + +include ':capacitor-app' +project(':capacitor-app').projectDir = new File('../node_modules/.pnpm/@capacitor+app@8.1.1_@capacitor+core@8.3.0/node_modules/@capacitor/app/android') + +include ':capacitor-app-launcher' +project(':capacitor-app-launcher').projectDir = new File('../node_modules/.pnpm/@capacitor+app-launcher@8.0.1_@capacitor+core@8.3.0/node_modules/@capacitor/app-launcher/android') + include ':capacitor-filesystem' project(':capacitor-filesystem').projectDir = new File('../node_modules/.pnpm/@capacitor+filesystem@8.1.2_@capacitor+core@8.3.0/node_modules/@capacitor/filesystem/android') diff --git a/capacitor.config.ts b/capacitor.config.ts index 6fda157..cf5175c 100644 --- a/capacitor.config.ts +++ b/capacitor.config.ts @@ -1,5 +1,8 @@ +import { readFileSync } from 'node:fs'; import type { CapacitorConfig } from '@capacitor/cli'; +const { version } = JSON.parse(readFileSync('./package.json', 'utf8')); + let devConfig: CapacitorConfig = {}; try { //@ts-expect-error ts-ignore @@ -12,6 +15,8 @@ const config: CapacitorConfig = { appId: 'com.maroonrides.maroonrides', appName: 'Maroon Rides', webDir: 'build', + ios: { overrideUserAgent: `Maroon Rides App (iOS) v${version}` }, + android: { overrideUserAgent: `Maroon Rides App (Android) v${version}` }, ...devConfig, }; diff --git a/drizzle.config.ts b/drizzle.config.ts new file mode 100644 index 0000000..c9397d7 --- /dev/null +++ b/drizzle.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'drizzle-kit'; + +export default defineConfig({ + dialect: 'sqlite', + schema: './src/lib/db/schema.ts', + out: './src/lib/db/migrations', +}); diff --git a/ios/App/App.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ios/App/App.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 6786327..e208a44 100644 --- a/ios/App/App.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ios/App/App.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "1bce83be7f64ec4d30594f7d0593d7d6dcc88b5a6ffd38fd9e47d8a529f380d7", + "originHash" : "bcee7d7a6a0cc7f55e12b7e800803c65261aa213e97c6b6410ed0ebf9d376fb7", "pins" : [ { "identity" : "capacitor-swift-pm", @@ -27,6 +27,24 @@ "revision" : "5b722138d4ddc81275e0405acfd812a497519970", "version" : "2.0.0" } + }, + { + "identity" : "sqlcipher.swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/sqlcipher/SQLCipher.swift.git", + "state" : { + "revision" : "39f212458aeb88e33bdac2200a793a3f0d55d32b", + "version" : "4.19.0" + } + }, + { + "identity" : "zipfoundation", + "kind" : "remoteSourceControl", + "location" : "https://github.com/weichsel/ZIPFoundation.git", + "state" : { + "revision" : "22787ffb59de99e5dc1fbfe80b19c97a904ad48d", + "version" : "0.9.20" + } } ], "version" : 3 diff --git a/ios/App/CapApp-SPM/Package.swift b/ios/App/CapApp-SPM/Package.swift index 47eafb8..10da492 100644 --- a/ios/App/CapApp-SPM/Package.swift +++ b/ios/App/CapApp-SPM/Package.swift @@ -12,6 +12,9 @@ let package = Package( ], dependencies: [ .package(url: "https://github.com/ionic-team/capacitor-swift-pm.git", exact: "8.3.0"), + .package(name: "CapacitorCommunitySqlite", path: "../../../node_modules/.pnpm/@capacitor-community+sqlite@8.1.1_@capacitor+core@8.3.0/node_modules/@capacitor-community/sqlite"), + .package(name: "CapacitorApp", path: "../../../node_modules/.pnpm/@capacitor+app@8.1.1_@capacitor+core@8.3.0/node_modules/@capacitor/app"), + .package(name: "CapacitorAppLauncher", path: "../../../node_modules/.pnpm/@capacitor+app-launcher@8.0.1_@capacitor+core@8.3.0/node_modules/@capacitor/app-launcher"), .package(name: "CapacitorFilesystem", path: "../../../node_modules/.pnpm/@capacitor+filesystem@8.1.2_@capacitor+core@8.3.0/node_modules/@capacitor/filesystem"), .package(name: "CapacitorGeolocation", path: "../../../node_modules/.pnpm/@capacitor+geolocation@8.0.0_@capacitor+core@8.3.0/node_modules/@capacitor/geolocation"), .package(name: "CapacitorPreferences", path: "../../../node_modules/.pnpm/@capacitor+preferences@8.0.1_@capacitor+core@8.3.0/node_modules/@capacitor/preferences") @@ -22,6 +25,9 @@ let package = Package( dependencies: [ .product(name: "Capacitor", package: "capacitor-swift-pm"), .product(name: "Cordova", package: "capacitor-swift-pm"), + .product(name: "CapacitorCommunitySqlite", package: "CapacitorCommunitySqlite"), + .product(name: "CapacitorApp", package: "CapacitorApp"), + .product(name: "CapacitorAppLauncher", package: "CapacitorAppLauncher"), .product(name: "CapacitorFilesystem", package: "CapacitorFilesystem"), .product(name: "CapacitorGeolocation", package: "CapacitorGeolocation"), .product(name: "CapacitorPreferences", package: "CapacitorPreferences") diff --git a/package.json b/package.json index d988dd0..602c578 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,22 @@ { "name": "maroonrides", "private": true, - "version": "2.0.3", + "version": "3.0.0", "type": "module", "scripts": { "dev": "vite dev --host 0.0.0.0", "build": "vite build", "preview": "vite preview", - "prepare": "svelte-kit sync || echo ''", + "prepare": "svelte-kit sync && pnpm sqlite:wasm || echo ''", + "sqlite:wasm": "cp node_modules/sql.js/dist/sql-wasm.wasm static/assets/sql-wasm.wasm", + "api:generate": "openapi-typescript ../api/openapi.json -o src/lib/api/openapi.d.ts", + "db:generate": "drizzle-kit generate", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", "lint": "prettier --check .", "format": "prettier --write .", - "pmtiles": "./pmtiles/cstat.sh" + "pmtiles": "./pmtiles/cstat.sh", + "test": "vitest run" }, "devDependencies": { "@capacitor/cli": "^8.0.2", @@ -24,11 +28,16 @@ "@tailwindcss/vite": "^4.1.18", "@types/lodash-es": "^4.17.12", "@types/luxon": "^3.7.2", + "@types/semver": "^7.8.0", + "@types/sql.js": "^1.4.11", "bits-ui": "^2.18.1", "clsx": "^2.1.1", + "drizzle-kit": "^0.31.11", + "openapi-typescript": "^7.13.0", "prettier": "^3.8.1", "prettier-plugin-svelte": "^3.4.1", "prettier-plugin-tailwindcss": "^0.7.2", + "sql.js": "1.11.0", "svelte": "^5.49.2", "svelte-check": "^4.3.6", "tailwind-merge": "^3.4.0", @@ -36,10 +45,14 @@ "tailwindcss": "^4.1.18", "tw-animate-css": "^1.4.0", "typescript": "^5.9.3", - "vite": "^7.3.1" + "vite": "^7.3.1", + "vitest": "^5.0.2" }, "dependencies": { + "@capacitor-community/sqlite": "^8.1.1", "@capacitor/android": "8.3.0", + "@capacitor/app": "^8.1.1", + "@capacitor/app-launcher": "^8.0.1", "@capacitor/core": "^8.3.0", "@capacitor/filesystem": "^8.1.2", "@capacitor/geolocation": "^8.0.0", @@ -48,13 +61,16 @@ "@googlemaps/polyline-codec": "^1.0.28", "@leveluptuts/svelte-fit": "^1.0.3", "@tanstack/svelte-query": "^6.0.18", - "aggie-spirit-api": "^1.3.4", + "drizzle-orm": "^0.45.3", + "jeep-sqlite": "^2.8.0", "lodash-es": "^4.18.1", "luxon": "^3.7.2", "maplibre-gl": "^5.17.0", "mode-watcher": "^1.1.0", - "moment": "^2.30.1", + "openapi-fetch": "^0.17.0", "pmtiles": "^4.4.0", + "runed": "^0.37.1", + "semver": "^7.8.5", "zod": "^4.3.6" } } diff --git a/pmtiles/cstat.sh b/pmtiles/cstat.sh index b7d9b5d..d8c72a8 100755 --- a/pmtiles/cstat.sh +++ b/pmtiles/cstat.sh @@ -15,3 +15,27 @@ pmtiles extract \ --bbox="$BBOX" \ --minzoom=0 \ --maxzoom=15 + +ASSETS_BASE="https://protomaps.github.io/basemaps-assets" +MAP_DIR="$SCRIPT_DIR/../static/map" + +SPRITE_THEMES=(light dark) +SPRITE_FILES=(".json" ".png" "@2x.json" "@2x.png") + +for theme in "${SPRITE_THEMES[@]}"; do + mkdir -p "$MAP_DIR/sprites" + for file in "${SPRITE_FILES[@]}"; do + curl -fsSL "$ASSETS_BASE/sprites/v4/$theme$file" -o "$MAP_DIR/sprites/$theme$file" + done +done + +FONTS=("Noto Sans Regular" "Noto Sans Medium" "Noto Sans Italic") +# Basic Latin, Latin-1, Latin Extended A/B, IPA, combining diacritics, general punctuation, currency/letterlike symbols +GLYPH_RANGES=(0-255 256-511 512-767 768-1023 8192-8447 8448-8703) + +for font in "${FONTS[@]}"; do + mkdir -p "$MAP_DIR/fonts/$font" + for range in "${GLYPH_RANGES[@]}"; do + curl -fsSL "$ASSETS_BASE/fonts/${font// /%20}/$range.pbf" -o "$MAP_DIR/fonts/$font/$range.pbf" + done +done diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 67cdaa6..e9ff8ec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,9 +11,18 @@ importers: .: dependencies: + '@capacitor-community/sqlite': + specifier: ^8.1.1 + version: 8.1.1(@capacitor/core@8.3.0) '@capacitor/android': specifier: 8.3.0 version: 8.3.0(patch_hash=5f151b861cf2cde88167eece495aecb0862a61bea5115b27870240ddf729efdb)(@capacitor/core@8.3.0) + '@capacitor/app': + specifier: ^8.1.1 + version: 8.1.1(@capacitor/core@8.3.0) + '@capacitor/app-launcher': + specifier: ^8.0.1 + version: 8.0.1(@capacitor/core@8.3.0) '@capacitor/core': specifier: ^8.3.0 version: 8.3.0 @@ -38,9 +47,12 @@ importers: '@tanstack/svelte-query': specifier: ^6.0.18 version: 6.0.18(svelte@5.50.0) - aggie-spirit-api: - specifier: ^1.3.4 - version: 1.3.4 + drizzle-orm: + specifier: ^0.45.3 + version: 0.45.3(@types/sql.js@1.4.11)(sql.js@1.11.0) + jeep-sqlite: + specifier: ^2.8.0 + version: 2.8.0 lodash-es: specifier: ^4.18.1 version: 4.18.1 @@ -53,19 +65,25 @@ importers: mode-watcher: specifier: ^1.1.0 version: 1.1.0(svelte@5.50.0) - moment: - specifier: ^2.30.1 - version: 2.30.1 + openapi-fetch: + specifier: ^0.17.0 + version: 0.17.0 pmtiles: specifier: ^4.4.0 version: 4.4.0 + runed: + specifier: ^0.37.1 + version: 0.37.1(@sveltejs/kit@2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0)(zod@4.3.6) + semver: + specifier: ^7.8.5 + version: 7.8.5 zod: specifier: ^4.3.6 version: 4.3.6 devDependencies: '@capacitor/cli': specifier: ^8.0.2 - version: 8.0.2 + version: 8.0.2(supports-color@10.2.2) '@internationalized/date': specifier: ^3.12.2 version: 3.12.2 @@ -74,28 +92,40 @@ importers: version: 0.561.0(svelte@5.50.0) '@sveltejs/adapter-static': specifier: ^3.0.10 - version: 3.0.10(@sveltejs/kit@2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2))) + version: 3.0.10(@sveltejs/kit@2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15))) '@sveltejs/kit': specifier: ^2.50.2 - version: 2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)) + version: 2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)) '@sveltejs/vite-plugin-svelte': specifier: ^6.2.4 - version: 6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)) + version: 6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)) '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)) + version: 4.1.18(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)) '@types/lodash-es': specifier: ^4.17.12 version: 4.17.12 '@types/luxon': specifier: ^3.7.2 version: 3.7.2 + '@types/semver': + specifier: ^7.8.0 + version: 7.8.0 + '@types/sql.js': + specifier: ^1.4.11 + version: 1.4.11 bits-ui: specifier: ^2.18.1 - version: 2.18.1(@internationalized/date@3.12.2)(@sveltejs/kit@2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.50.0) + version: 2.18.1(@internationalized/date@3.12.2)(@sveltejs/kit@2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0) clsx: specifier: ^2.1.1 version: 2.1.1 + drizzle-kit: + specifier: ^0.31.11 + version: 0.31.11 + openapi-typescript: + specifier: ^7.13.0 + version: 7.13.0(typescript@5.9.3) prettier: specifier: ^3.8.1 version: 3.8.1 @@ -105,6 +135,9 @@ importers: prettier-plugin-tailwindcss: specifier: ^0.7.2 version: 0.7.2(prettier-plugin-svelte@3.4.1(prettier@3.8.1)(svelte@5.50.0))(prettier@3.8.1) + sql.js: + specifier: 1.11.0 + version: 1.11.0 svelte: specifier: ^5.49.2 version: 5.50.0 @@ -128,15 +161,42 @@ importers: version: 5.9.3 vite: specifier: ^7.3.1 - version: 7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2) + version: 7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15) + vitest: + specifier: ^5.0.2 + version: 5.0.2(@types/node@25.2.2)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)) packages: + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@capacitor-community/sqlite@8.1.1': + resolution: {integrity: sha512-wsqscMOMveDeIvB9WHLm38jkUV2317LmuWvvbhvmOB1REdr8GH6weFZpAiKmLimbpP2CQ2eVs8nmRcrTqbd9ng==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@capacitor/core': '>=8.0.0' + '@capacitor/android@8.3.0': resolution: {integrity: sha512-EQy6ByUuKayQBJmMm/e0byJiHavqsQHrvW23BuT2GNVQvenAvipqwaePiJHzrv2PZr7A0T0+se4kgDCeROj0mQ==} peerDependencies: '@capacitor/core': ^8.3.0 + '@capacitor/app-launcher@8.0.1': + resolution: {integrity: sha512-23D8zi74sn7kxvISix8qYwgqdxGJN+4NImcNGvHen98LB1zb4eZfkJvFvp7pwntxGw4OjIE7yuf4wbzZxQHpog==} + peerDependencies: + '@capacitor/core': '>=8.0.0' + + '@capacitor/app@8.1.1': + resolution: {integrity: sha512-xM2ZTX5jK60tFtmjsmJv+Cdj1Qsb6NcavkqmdEnCPQBeya9oKhamZJxYOnQNj1ZvcJM7sWfG6BEtSLx42pisbA==} + peerDependencies: + '@capacitor/core': '>=8.0.0' + '@capacitor/cli@8.0.2': resolution: {integrity: sha512-/8qLYxhytMyUKTHK8i6YU+DMD3AuFiQgSuJCyMltcg9MN3W9En7zqQZSo/WN4eC7qif/oyZACzm7OkAZKani7g==} engines: {node: '>=22.0.0'} @@ -168,162 +228,617 @@ packages: '@capacitor/synapse@1.0.4': resolution: {integrity: sha512-/C1FUo8/OkKuAT4nCIu/34ny9siNHr9qtFezu4kxm6GY1wNFxrCFWjfYx5C1tUhVGz3fxBABegupkpjXvjCHrw==} + '@drizzle-team/brocli@0.10.2': + resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} + + '@esbuild-kit/core-utils@3.3.2': + resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} + deprecated: 'Merged into tsx: https://tsx.hirok.io' + + '@esbuild-kit/esm-loader@2.6.5': + resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} + deprecated: 'Merged into tsx: https://tsx.hirok.io' + + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.27.3': resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.27.3': resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.27.3': resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.27.3': resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.27.3': resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.27.3': resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.27.3': resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.27.3': resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.27.3': resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.27.3': resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.27.3': resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.27.3': resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.27.3': resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.27.3': resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.27.3': resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.27.3': resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.27.3': resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-arm64@0.27.3': resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.27.3': resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-arm64@0.27.3': resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.27.3': resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/openharmony-arm64@0.27.3': resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.27.3': resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.27.3': resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.27.3': resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.27.3': resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@floating-ui/core@1.7.4': resolution: {integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==} @@ -396,6 +911,9 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} + '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} @@ -447,6 +965,16 @@ packages: '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + '@redocly/ajv@8.11.2': + resolution: {integrity: sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==} + + '@redocly/config@0.22.0': + resolution: {integrity: sha512-gAy93Ddo01Z3bHuVdPWfCwzgfaYgMdaZPcfL7JZ7hWJoK9V0lXDbigTWkhiPFAaLWzbOJ+kbUQG1+XwIm0KRGQ==} + + '@redocly/openapi-core@1.34.20': + resolution: {integrity: sha512-ypeBZ/6BKXR9+7/TtbKhbl4UgD7raHhPS12oknlKno2A8+lnFkxIwiE/Aklu6L2cd/ioH+fCWuMxi9/p3EyAPw==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + '@rollup/rollup-android-arm-eabi@4.57.1': resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} cpu: [arm] @@ -457,11 +985,21 @@ packages: cpu: [arm64] os: [android] + '@rollup/rollup-darwin-arm64@4.44.0': + resolution: {integrity: sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-arm64@4.57.1': resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-x64@4.44.0': + resolution: {integrity: sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.57.1': resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} cpu: [x64] @@ -489,12 +1027,24 @@ packages: os: [linux] libc: [musl] + '@rollup/rollup-linux-arm64-gnu@4.44.0': + resolution: {integrity: sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-arm64-gnu@4.57.1': resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} cpu: [arm64] os: [linux] libc: [glibc] + '@rollup/rollup-linux-arm64-musl@4.44.0': + resolution: {integrity: sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==} + cpu: [arm64] + os: [linux] + libc: [musl] + '@rollup/rollup-linux-arm64-musl@4.57.1': resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} cpu: [arm64] @@ -543,12 +1093,24 @@ packages: os: [linux] libc: [glibc] + '@rollup/rollup-linux-x64-gnu@4.44.0': + resolution: {integrity: sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==} + cpu: [x64] + os: [linux] + libc: [glibc] + '@rollup/rollup-linux-x64-gnu@4.57.1': resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} cpu: [x64] os: [linux] libc: [glibc] + '@rollup/rollup-linux-x64-musl@4.44.0': + resolution: {integrity: sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==} + cpu: [x64] + os: [linux] + libc: [musl] + '@rollup/rollup-linux-x64-musl@4.57.1': resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} cpu: [x64] @@ -565,6 +1127,11 @@ packages: cpu: [arm64] os: [openharmony] + '@rollup/rollup-win32-arm64-msvc@4.44.0': + resolution: {integrity: sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.57.1': resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} cpu: [arm64] @@ -580,6 +1147,11 @@ packages: cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.44.0': + resolution: {integrity: sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==} + cpu: [x64] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.57.1': resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} cpu: [x64] @@ -588,6 +1160,11 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@stencil/core@4.45.1': + resolution: {integrity: sha512-/b8CItmSwOzZwafxXwomJnN9X/Ic/Fxum9ka/RDHmADVf4DA4152uY7zitzLV+vk8JdXxKA7FKyLT3GKNo9R3A==} + engines: {node: '>=16.0.0', npm: '>=7.10.0'} + hasBin: true + '@sveltejs/acorn-typescript@1.0.8': resolution: {integrity: sha512-esgN+54+q0NjB0Y/4BomT9samII7jGwNy/2a3wNZbT2A2RpmXsXwUt24LvLhx6jUq2gVk4cWEvcRO6MFQbOfNA==} peerDependencies: @@ -734,9 +1311,18 @@ packages: peerDependencies: svelte: ^5.25.0 + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/emscripten@1.41.6': + resolution: {integrity: sha512-uN+9i8bFT5CUcZfyIEYDrSueACEyKGbUs5kC/72DGlZZoinh84sJfVV0i8UOJD1asdzkvLPBRrKs41kZ8MdEXg==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -758,12 +1344,32 @@ packages: '@types/node@25.2.2': resolution: {integrity: sha512-BkmoP5/FhRYek5izySdkOneRyXYN35I860MFAGupTdebyE66uZaR+bXLHq8k4DirE5DwQi3NuhvRU1jqTVwUrQ==} + '@types/semver@7.8.0': + resolution: {integrity: sha512-1mAINjtQCXXeLkJ9ehXkwOcBpqtLxiVtKhpUf83DdRNdQKV0iXZpaHYqRr7nj+wvxuJzoAmAwXI+sCNMv1CzLQ==} + '@types/slice-ansi@4.0.0': resolution: {integrity: sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==} + '@types/sql.js@1.4.11': + resolution: {integrity: sha512-QXIx38p2ZThJaK9vP5ZdqdlRe1FG9I8SmCZOS7FHfB/2qPAjZwkL7/vlfPg6N/oWHuuOaGg/P/IRwfP2W0kWVQ==} + '@types/supercluster@7.1.3': resolution: {integrity: sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==} + '@vitest/mocker@5.0.2': + resolution: {integrity: sha512-Z5FS00Q1SJHkB35xATsmWGdQ5WA1/0MV3CDjqyv7GavHv1OfOj145MNfHOlHk7QLes21dKFDHr8EO2zvL+9WGA==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/spy@5.0.2': + resolution: {integrity: sha512-Ijc7T1nT9efNb5LxvjaBrEqw3f/QwUv5EE0nKqZxgqsaV/FxAAZ8baGylA8X/Z2oS4Lp+K74Jr6dTJsDKxJDeg==} + '@xmldom/xmldom@0.8.11': resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} engines: {node: '>=10.0.0'} @@ -774,8 +1380,13 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - aggie-spirit-api@1.3.4: - resolution: {integrity: sha512-OlVEnN+4ikAYj4dugJJzmUlyT58lS59ULjZJBgUAd98stvSzF0D5J9CIb6az+aEbqbl54ksyq4f5CIeKEAxQrw==} + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} @@ -785,10 +1396,17 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -801,6 +1419,9 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -819,9 +1440,25 @@ packages: resolution: {integrity: sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==} engines: {node: '>= 5.10.0'} + brace-expansion@2.1.7: + resolution: {integrity: sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==} + + browser-fs-access@0.35.0: + resolution: {integrity: sha512-sLoadumpRfsjprP8XzVjpQc0jK8yqHBx0PtUTGYj2fftT+P/t+uyDAQdMgGAPKD011in/O+YYGh7fIs0oG/viw==} + buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + + change-case@5.4.4: + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -841,6 +1478,9 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + commander@12.1.0: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} @@ -849,6 +1489,9 @@ packages: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -881,6 +1524,105 @@ packages: devalue@5.6.2: resolution: {integrity: sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==} + drizzle-kit@0.31.11: + resolution: {integrity: sha512-YCYqxTLIB2OCqf6w9/Vef13baBVbwQIPcbT4Y56AfO6B9ajZhDhD8Jkveg/hJvT/iuMloKD/IYYkyMMNhr7Kqg==} + hasBin: true + + drizzle-orm@0.45.3: + resolution: {integrity: sha512-CAloER21cDdcgZ1OmjrZX82EeRNsdP+y0onX/eyoYDaYzki/adrAa91lzM5jWh7zZPK4qUbw/6LGv9J+A+uizA==} + peerDependencies: + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=4' + '@electric-sql/pglite': '>=0.2.0' + '@libsql/client': '>=0.10.0' + '@libsql/client-wasm': '>=0.10.0' + '@neondatabase/serverless': '>=0.10.0' + '@netlify/db': '>=0.4.0' + '@op-engineering/op-sqlite': '>=2' + '@opentelemetry/api': ^1.4.1 + '@planetscale/database': '>=1.13' + '@prisma/client': '*' + '@tidbcloud/serverless': '*' + '@types/better-sqlite3': '*' + '@types/pg': '*' + '@types/sql.js': '*' + '@upstash/redis': '>=1.34.7' + '@vercel/postgres': '>=0.8.0' + '@xata.io/client': '*' + better-sqlite3: '>=7' + bun-types: '*' + expo-sqlite: '>=14.0.0' + gel: '>=2' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + prisma: '*' + sql.js: '>=1' + sqlite3: '>=5' + peerDependenciesMeta: + '@aws-sdk/client-rds-data': + optional: true + '@cloudflare/workers-types': + optional: true + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + '@libsql/client-wasm': + optional: true + '@neondatabase/serverless': + optional: true + '@netlify/db': + optional: true + '@op-engineering/op-sqlite': + optional: true + '@opentelemetry/api': + optional: true + '@planetscale/database': + optional: true + '@prisma/client': + optional: true + '@tidbcloud/serverless': + optional: true + '@types/better-sqlite3': + optional: true + '@types/pg': + optional: true + '@types/sql.js': + optional: true + '@upstash/redis': + optional: true + '@vercel/postgres': + optional: true + '@xata.io/client': + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + gel: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + prisma: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + earcut@3.0.2: resolution: {integrity: sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==} @@ -899,17 +1641,45 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} + es-module-lexer@2.3.2: + resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + esbuild@0.27.3: resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} engines: {node: '>=18'} hasBin: true + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} + engines: {node: '>=18'} + hasBin: true + esm-env@1.2.2: resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} esrap@2.2.2: resolution: {integrity: sha512-zA6497ha+qKvoWIK+WM9NAh5ni17sKZKhbS5B3PoYbBvaYHZWoS33zmFybmyqpn07RLUxSmn+RCls2/XF+d0oQ==} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} + engines: {node: '>=12.0.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} @@ -942,6 +1712,9 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + get-tsconfig@4.14.3: + resolution: {integrity: sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==} + gl-matrix@3.4.4: resolution: {integrity: sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==} @@ -952,6 +1725,17 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + index-to-position@1.2.0: + resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} + engines: {node: '>=18'} + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -978,19 +1762,42 @@ packages: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + jeep-sqlite@2.8.0: + resolution: {integrity: sha512-FWNUP6OAmrUHwiW7H1xH5YUQ8tN2O4l4psT1sLd7DQtHd5PfrA1nvNdeKPNj+wQBtu7elJa8WoUibTytNTaaCg==} + jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true + js-levenshtein@1.1.6: + resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} + engines: {node: '>=0.10.0'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} + hasBin: true + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-stringify-pretty-compact@4.0.0: resolution: {integrity: sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==} jsonfile@6.2.0: resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + jszip@3.10.2: + resolution: {integrity: sha512-3l+rb15IOWtUhU0H5MFqES/T6Kh7abYwjosBey/vD6hDt8zoEffkSC5Ws5SGtgVw3gBx2NEbhTeSW1+kWkpyTQ==} + kdbush@4.0.2: resolution: {integrity: sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==} @@ -1002,6 +1809,12 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} + lie@3.1.1: + resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} + + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + lightningcss-android-arm64@1.30.2: resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} engines: {node: '>= 12.0.0'} @@ -1076,6 +1889,9 @@ packages: resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} engines: {node: '>= 12.0.0'} + localforage@1.10.0: + resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + locate-character@3.0.0: resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} @@ -1097,6 +1913,9 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magic-string@1.4.2: + resolution: {integrity: sha512-vG+rjFRj1PqdIBozIxAGMjPlOhaVe+GXpbttY/iSK7rGcJRMlwNJO7dcUwmUqkymsFLJiNGI06t4D7Fr7yRC9g==} + maplibre-gl@5.17.0: resolution: {integrity: sha512-gwS6NpXBfWD406dtT5YfEpl2hmpMm+wcPqf04UAez/TxY1OBjiMdK2ZoMGcNIlGHelKc4+Uet6zhDdDEnlJVHA==} engines: {node: '>=16.14.0', npm: '>=8.1.0'} @@ -1105,6 +1924,10 @@ packages: resolution: {integrity: sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==} engines: {node: 20 || >=22} + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -1121,9 +1944,6 @@ packages: peerDependencies: svelte: ^5.27.0 - moment@2.30.1: - resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} - mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -1151,13 +1971,36 @@ packages: obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + obug@2.2.1: + resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==} + engines: {node: '>=12.20.0'} + open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} + openapi-fetch@0.17.0: + resolution: {integrity: sha512-PsbZR1wAPcG91eEthKhN+Zn92FMHxv+/faECIwjXdxfTODGSGegYv0sc1Olz+HYPvKOuoXfp+0pA2XVt2cI0Ig==} + + openapi-typescript-helpers@0.1.0: + resolution: {integrity: sha512-OKTGPthhivLw/fHz6c3OPtg72vi86qaMlqbJuVJ23qOvQ+53uw1n7HdmkJFibloF7QEjDrDkzJiOJuockM/ljw==} + + openapi-typescript@7.13.0: + resolution: {integrity: sha512-EFP392gcqXS7ntPvbhBzbF8TyBA+baIYEm791Hy5YkjDYKTnk/Tn5OQeKm5BIZvJihpp8Zzr4hzx0Irde1LNGQ==} + hasBin: true + peerDependencies: + typescript: ^5.x + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + parse-json@8.3.0: + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} + engines: {node: '>=18'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -1180,10 +2023,18 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + plist@3.1.0: resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} engines: {node: '>=10.4.0'} + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + pmtiles@4.4.0: resolution: {integrity: sha512-tCLI1C5134MR54i8izUWhse0QUtO/EC33n9yWp1N5dYLLvyc197U0fkF5gAJhq1TdWO9Tvl+9hgvFvM0fR27Zg==} @@ -1260,6 +2111,9 @@ packages: engines: {node: '>=14'} hasBin: true + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -1270,6 +2124,9 @@ packages: quickselect@3.0.0: resolution: {integrity: sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==} + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -1278,6 +2135,13 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve-protobuf-schema@2.1.0: resolution: {integrity: sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==} @@ -1310,6 +2174,18 @@ packages: '@sveltejs/kit': optional: true + runed@0.37.1: + resolution: {integrity: sha512-MeFY73xBW8IueWBm012nNFIGy19WUGPLtknavyUPMpnyt350M47PhGSGrGoSLbidwn+Zlt/O0cp8/OZE3LASWA==} + peerDependencies: + '@sveltejs/kit': ^2.21.0 + svelte: ^5.7.0 + zod: ^4.1.0 + peerDependenciesMeta: + '@sveltejs/kit': + optional: true + zod: + optional: true + rw@1.3.3: resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} @@ -1317,6 +2193,9 @@ packages: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -1327,14 +2206,17 @@ packages: resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} engines: {node: '>=11.0.0'} - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} hasBin: true set-cookie-parser@3.0.1: resolution: {integrity: sha512-n7Z7dXZhJbwuAHhNzkTti6Aw9QDDjZtm3JTpTGATIdNzdQz5GuFs22w90BcvF4INfnrL5xrX3oGsuqO5Dx3A1Q==} + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1361,14 +2243,33 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} + sql.js@1.11.0: + resolution: {integrity: sha512-GsLUDU3vhOo14Pd5ME0y2te49JQyby6HuoCuadevEV+CGgTUjmYRrm7B7lhRyzOgrmcWmspUfyjNb6sOAEqdsA==} + + sql.js@1.14.2: + resolution: {integrity: sha512-3ZGPovObMFrdw79zrUHbfdE/DLIsy8jdNdssmMSQuRAymedU6q84asPt0kgiqrdMYlPegDItiIMfmIXzZnYFcw==} + + std-env@4.3.0: + resolution: {integrity: sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -1382,6 +2283,10 @@ packages: supercluster@8.0.1: resolution: {integrity: sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==} + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + svelte-check@4.3.6: resolution: {integrity: sha512-uBkz96ElE3G4pt9E1Tw0xvBfIUQkeH794kDQZdAUk795UVMr+NJZpuFSS62vcmO/DuSalK83LyOwhgWq8YGU1Q==} engines: {node: '>= 18.0.0'} @@ -1437,10 +2342,22 @@ packages: through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + tinybench@6.2.0: + resolution: {integrity: sha512-78U2TlB2CnVenajOFzf3BKSm0J6oz5L0NV7g32LCPccvYc0lbWvys4d3uUUCS2B1N8PAf2+aekR8i1KbC3HO7Q==} + engines: {node: '>=20.0.0'} + + tinyexec@1.3.1: + resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} + engines: {node: '>=18'} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + tinyqueue@3.0.0: resolution: {integrity: sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==} @@ -1455,9 +2372,18 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.23.15: + resolution: {integrity: sha512-Yiex1Ovn8z2xPpOWckIiysV1SSyRMY9BkLF++q0yKiDxCqRhosKfMg3janKkiLBwZ5c/YryloKwGZcrEmtwxKw==} + engines: {node: '>=18.0.0'} + hasBin: true + tw-animate-css@1.4.0: resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -1474,6 +2400,9 @@ packages: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} + uri-js-replace@1.0.1: + resolution: {integrity: sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -1525,11 +2454,57 @@ packages: vite: optional: true + vitest@5.0.2: + resolution: {integrity: sha512-7MQrx9pDv5aHiUcovIb/70Ys3tgtkUVgCtledvKdCmEO+/1Dicq5ZqoSxOW034m03oqC+oHOKui2dM6qtMLoJg==} + engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 5.0.2 + '@vitest/browser-preview': 5.0.2 + '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0 + '@vitest/coverage-istanbul': 5.0.2 + '@vitest/coverage-v8': 5.0.2 + '@vitest/ui': 5.0.2 + happy-dom: '*' + jsdom: '*' + vite: ^6.4.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true + why-is-node-running@3.2.2: + resolution: {integrity: sha512-NKUzAelcoCXhXL4dJzKIwXeR8iEVqsA0Lq6Vnd0UXvgaKbzVo4ZTHROF2Jidrv+SgxOQ03fMinnNhzZATxOD3A==} + engines: {node: '>=20.11'} + hasBin: true + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -1550,6 +2525,13 @@ packages: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} + yaml-ast-parser@0.0.43: + resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} @@ -1561,26 +2543,47 @@ packages: snapshots: + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.29.7': {} + + '@capacitor-community/sqlite@8.1.1(@capacitor/core@8.3.0)': + dependencies: + '@capacitor/core': 8.3.0 + jeep-sqlite: 2.8.0 + '@capacitor/android@8.3.0(patch_hash=5f151b861cf2cde88167eece495aecb0862a61bea5115b27870240ddf729efdb)(@capacitor/core@8.3.0)': dependencies: '@capacitor/core': 8.3.0 - '@capacitor/cli@8.0.2': + '@capacitor/app-launcher@8.0.1(@capacitor/core@8.3.0)': + dependencies: + '@capacitor/core': 8.3.0 + + '@capacitor/app@8.1.1(@capacitor/core@8.3.0)': + dependencies: + '@capacitor/core': 8.3.0 + + '@capacitor/cli@8.0.2(supports-color@10.2.2)': dependencies: - '@ionic/cli-framework-output': 2.2.8 - '@ionic/utils-subprocess': 3.0.1 - '@ionic/utils-terminal': 2.3.5 + '@ionic/cli-framework-output': 2.2.8(supports-color@10.2.2) + '@ionic/utils-subprocess': 3.0.1(supports-color@10.2.2) + '@ionic/utils-terminal': 2.3.5(supports-color@10.2.2) commander: 12.1.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) env-paths: 2.2.1 fs-extra: 11.3.3 kleur: 4.1.5 - native-run: 2.0.3 + native-run: 2.0.3(supports-color@10.2.2) open: 8.4.2 plist: 3.1.0 prompts: 2.4.2 rimraf: 6.1.2 - semver: 7.7.4 + semver: 7.8.5 tar: 7.5.7 tslib: 2.8.1 xml2js: 0.6.2 @@ -1609,86 +2612,320 @@ snapshots: dependencies: '@capacitor/core': 8.3.0 - '@capacitor/synapse@1.0.4': {} + '@capacitor/synapse@1.0.4': {} + + '@drizzle-team/brocli@0.10.2': {} + + '@esbuild-kit/core-utils@3.3.2': + dependencies: + esbuild: 0.18.20 + source-map-support: 0.5.21 + + '@esbuild-kit/esm-loader@2.6.5': + dependencies: + '@esbuild-kit/core-utils': 3.3.2 + get-tsconfig: 4.14.3 + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/aix-ppc64@0.27.3': + optional: true + + '@esbuild/aix-ppc64@0.28.2': + optional: true + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.27.3': + optional: true + + '@esbuild/android-arm64@0.28.2': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-arm@0.27.3': + optional: true + + '@esbuild/android-arm@0.28.2': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/android-x64@0.27.3': + optional: true + + '@esbuild/android-x64@0.28.2': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.27.3': + optional: true + + '@esbuild/darwin-arm64@0.28.2': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.27.3': + optional: true + + '@esbuild/darwin-x64@0.28.2': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.27.3': + optional: true + + '@esbuild/freebsd-arm64@0.28.2': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.27.3': + optional: true + + '@esbuild/freebsd-x64@0.28.2': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.27.3': + optional: true + + '@esbuild/linux-arm64@0.28.2': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true - '@esbuild/aix-ppc64@0.27.3': + '@esbuild/linux-arm@0.27.3': optional: true - '@esbuild/android-arm64@0.27.3': + '@esbuild/linux-arm@0.28.2': optional: true - '@esbuild/android-arm@0.27.3': + '@esbuild/linux-ia32@0.18.20': optional: true - '@esbuild/android-x64@0.27.3': + '@esbuild/linux-ia32@0.25.12': optional: true - '@esbuild/darwin-arm64@0.27.3': + '@esbuild/linux-ia32@0.27.3': optional: true - '@esbuild/darwin-x64@0.27.3': + '@esbuild/linux-ia32@0.28.2': optional: true - '@esbuild/freebsd-arm64@0.27.3': + '@esbuild/linux-loong64@0.18.20': optional: true - '@esbuild/freebsd-x64@0.27.3': + '@esbuild/linux-loong64@0.25.12': optional: true - '@esbuild/linux-arm64@0.27.3': + '@esbuild/linux-loong64@0.27.3': optional: true - '@esbuild/linux-arm@0.27.3': + '@esbuild/linux-loong64@0.28.2': optional: true - '@esbuild/linux-ia32@0.27.3': + '@esbuild/linux-mips64el@0.18.20': optional: true - '@esbuild/linux-loong64@0.27.3': + '@esbuild/linux-mips64el@0.25.12': optional: true '@esbuild/linux-mips64el@0.27.3': optional: true + '@esbuild/linux-mips64el@0.28.2': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + '@esbuild/linux-ppc64@0.27.3': optional: true + '@esbuild/linux-ppc64@0.28.2': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + '@esbuild/linux-riscv64@0.27.3': optional: true + '@esbuild/linux-riscv64@0.28.2': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + '@esbuild/linux-s390x@0.27.3': optional: true + '@esbuild/linux-s390x@0.28.2': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + '@esbuild/linux-x64@0.27.3': optional: true + '@esbuild/linux-x64@0.28.2': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + '@esbuild/netbsd-arm64@0.27.3': optional: true + '@esbuild/netbsd-arm64@0.28.2': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + '@esbuild/netbsd-x64@0.27.3': optional: true + '@esbuild/netbsd-x64@0.28.2': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + '@esbuild/openbsd-arm64@0.27.3': optional: true + '@esbuild/openbsd-arm64@0.28.2': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + '@esbuild/openbsd-x64@0.27.3': optional: true + '@esbuild/openbsd-x64@0.28.2': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + '@esbuild/openharmony-arm64@0.27.3': optional: true + '@esbuild/openharmony-arm64@0.28.2': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + '@esbuild/sunos-x64@0.27.3': optional: true + '@esbuild/sunos-x64@0.28.2': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + '@esbuild/win32-arm64@0.27.3': optional: true + '@esbuild/win32-arm64@0.28.2': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + '@esbuild/win32-ia32@0.27.3': optional: true + '@esbuild/win32-ia32@0.28.2': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + '@esbuild/win32-x64@0.27.3': optional: true + '@esbuild/win32-x64@0.28.2': + optional: true + '@floating-ui/core@1.7.4': dependencies: '@floating-ui/utils': 0.2.10 @@ -1706,72 +2943,72 @@ snapshots: dependencies: '@swc/helpers': 0.5.18 - '@ionic/cli-framework-output@2.2.8': + '@ionic/cli-framework-output@2.2.8(supports-color@10.2.2)': dependencies: - '@ionic/utils-terminal': 2.3.5 - debug: 4.4.3 + '@ionic/utils-terminal': 2.3.5(supports-color@10.2.2) + debug: 4.4.3(supports-color@10.2.2) tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@ionic/utils-array@2.1.6': + '@ionic/utils-array@2.1.6(supports-color@10.2.2)': dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@ionic/utils-fs@3.1.7': + '@ionic/utils-fs@3.1.7(supports-color@10.2.2)': dependencies: '@types/fs-extra': 8.1.5 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) fs-extra: 9.1.0 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@ionic/utils-object@2.1.6': + '@ionic/utils-object@2.1.6(supports-color@10.2.2)': dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@ionic/utils-process@2.1.12': + '@ionic/utils-process@2.1.12(supports-color@10.2.2)': dependencies: - '@ionic/utils-object': 2.1.6 - '@ionic/utils-terminal': 2.3.5 - debug: 4.4.3 + '@ionic/utils-object': 2.1.6(supports-color@10.2.2) + '@ionic/utils-terminal': 2.3.5(supports-color@10.2.2) + debug: 4.4.3(supports-color@10.2.2) signal-exit: 3.0.7 tree-kill: 1.2.2 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@ionic/utils-stream@3.1.7': + '@ionic/utils-stream@3.1.7(supports-color@10.2.2)': dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@ionic/utils-subprocess@3.0.1': + '@ionic/utils-subprocess@3.0.1(supports-color@10.2.2)': dependencies: - '@ionic/utils-array': 2.1.6 - '@ionic/utils-fs': 3.1.7 - '@ionic/utils-process': 2.1.12 - '@ionic/utils-stream': 3.1.7 - '@ionic/utils-terminal': 2.3.5 + '@ionic/utils-array': 2.1.6(supports-color@10.2.2) + '@ionic/utils-fs': 3.1.7(supports-color@10.2.2) + '@ionic/utils-process': 2.1.12(supports-color@10.2.2) + '@ionic/utils-stream': 3.1.7(supports-color@10.2.2) + '@ionic/utils-terminal': 2.3.5(supports-color@10.2.2) cross-spawn: 7.0.6 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@ionic/utils-terminal@2.3.5': + '@ionic/utils-terminal@2.3.5(supports-color@10.2.2)': dependencies: '@types/slice-ansi': 4.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) signal-exit: 3.0.7 slice-ansi: 4.0.0 string-width: 4.2.3 @@ -1806,6 +3043,8 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/sourcemap-codec@1.6.0': {} + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -1866,15 +3105,44 @@ snapshots: '@polka/url@1.0.0-next.29': {} + '@redocly/ajv@8.11.2': + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js-replace: 1.0.1 + + '@redocly/config@0.22.0': {} + + '@redocly/openapi-core@1.34.20(supports-color@10.2.2)': + dependencies: + '@redocly/ajv': 8.11.2 + '@redocly/config': 0.22.0 + colorette: 1.4.0 + https-proxy-agent: 7.0.6(supports-color@10.2.2) + js-levenshtein: 1.1.6 + js-yaml: 4.3.2 + minimatch: 5.1.9 + pluralize: 8.0.0 + yaml-ast-parser: 0.0.43 + transitivePeerDependencies: + - supports-color + '@rollup/rollup-android-arm-eabi@4.57.1': optional: true '@rollup/rollup-android-arm64@4.57.1': optional: true + '@rollup/rollup-darwin-arm64@4.44.0': + optional: true + '@rollup/rollup-darwin-arm64@4.57.1': optional: true + '@rollup/rollup-darwin-x64@4.44.0': + optional: true + '@rollup/rollup-darwin-x64@4.57.1': optional: true @@ -1890,9 +3158,15 @@ snapshots: '@rollup/rollup-linux-arm-musleabihf@4.57.1': optional: true + '@rollup/rollup-linux-arm64-gnu@4.44.0': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.57.1': optional: true + '@rollup/rollup-linux-arm64-musl@4.44.0': + optional: true + '@rollup/rollup-linux-arm64-musl@4.57.1': optional: true @@ -1917,9 +3191,15 @@ snapshots: '@rollup/rollup-linux-s390x-gnu@4.57.1': optional: true + '@rollup/rollup-linux-x64-gnu@4.44.0': + optional: true + '@rollup/rollup-linux-x64-gnu@4.57.1': optional: true + '@rollup/rollup-linux-x64-musl@4.44.0': + optional: true + '@rollup/rollup-linux-x64-musl@4.57.1': optional: true @@ -1929,6 +3209,9 @@ snapshots: '@rollup/rollup-openharmony-arm64@4.57.1': optional: true + '@rollup/rollup-win32-arm64-msvc@4.44.0': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.57.1': optional: true @@ -1938,24 +3221,38 @@ snapshots: '@rollup/rollup-win32-x64-gnu@4.57.1': optional: true + '@rollup/rollup-win32-x64-msvc@4.44.0': + optional: true + '@rollup/rollup-win32-x64-msvc@4.57.1': optional: true '@standard-schema/spec@1.1.0': {} + '@stencil/core@4.45.1': + optionalDependencies: + '@rollup/rollup-darwin-arm64': 4.44.0 + '@rollup/rollup-darwin-x64': 4.44.0 + '@rollup/rollup-linux-arm64-gnu': 4.44.0 + '@rollup/rollup-linux-arm64-musl': 4.44.0 + '@rollup/rollup-linux-x64-gnu': 4.44.0 + '@rollup/rollup-linux-x64-musl': 4.44.0 + '@rollup/rollup-win32-arm64-msvc': 4.44.0 + '@rollup/rollup-win32-x64-msvc': 4.44.0 + '@sveltejs/acorn-typescript@1.0.8(acorn@8.15.0)': dependencies: acorn: 8.15.0 - '@sveltejs/adapter-static@3.0.10(@sveltejs/kit@2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)))': + '@sveltejs/adapter-static@3.0.10(@sveltejs/kit@2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))': dependencies: - '@sveltejs/kit': 2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)) + '@sveltejs/kit': 2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)) - '@sveltejs/kit@2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2))': + '@sveltejs/kit@2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15))': dependencies: '@standard-schema/spec': 1.1.0 '@sveltejs/acorn-typescript': 1.0.8(acorn@8.15.0) - '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)) + '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)) '@types/cookie': 0.6.0 acorn: 8.15.0 cookie: 0.6.0 @@ -1968,26 +3265,26 @@ snapshots: set-cookie-parser: 3.0.1 sirv: 3.0.2 svelte: 5.50.0 - vite: 7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15) optionalDependencies: typescript: 5.9.3 - '@sveltejs/vite-plugin-svelte-inspector@5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2))': + '@sveltejs/vite-plugin-svelte-inspector@5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15))': dependencies: - '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)) + '@sveltejs/vite-plugin-svelte': 6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)) obug: 2.1.1 svelte: 5.50.0 - vite: 7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15) - '@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2))': + '@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)) + '@sveltejs/vite-plugin-svelte-inspector': 5.0.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)) deepmerge: 4.3.1 magic-string: 0.30.21 obug: 2.1.1 svelte: 5.50.0 - vite: 7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2) - vitefu: 1.1.1(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)) + vite: 7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15) + vitefu: 1.1.1(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)) '@swc/helpers@0.5.18': dependencies: @@ -2054,12 +3351,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 - '@tailwindcss/vite@4.1.18(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2))': + '@tailwindcss/vite@4.1.18(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15))': dependencies: '@tailwindcss/node': 4.1.18 '@tailwindcss/oxide': 4.1.18 tailwindcss: 4.1.18 - vite: 7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15) '@tanstack/query-core@5.90.20': {} @@ -2068,8 +3365,17 @@ snapshots: '@tanstack/query-core': 5.90.20 svelte: 5.50.0 + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + '@types/cookie@0.6.0': {} + '@types/deep-eql@4.0.2': {} + + '@types/emscripten@1.41.6': {} + '@types/estree@1.0.8': {} '@types/fs-extra@8.1.5': @@ -2090,19 +3396,37 @@ snapshots: dependencies: undici-types: 7.16.0 + '@types/semver@7.8.0': {} + '@types/slice-ansi@4.0.0': {} + '@types/sql.js@1.4.11': + dependencies: + '@types/emscripten': 1.41.6 + '@types/node': 25.2.2 + '@types/supercluster@7.1.3': dependencies: '@types/geojson': 7946.0.16 + '@vitest/mocker@5.0.2(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15))': + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + '@vitest/spy': 5.0.2 + estree-walker: 3.0.3 + magic-string: 1.4.2 + optionalDependencies: + vite: 7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15) + + '@vitest/spy@5.0.2': {} + '@xmldom/xmldom@0.8.11': {} acorn@8.15.0: {} - aggie-spirit-api@1.3.4: - dependencies: - moment: 2.30.1 + agent-base@7.1.4: {} + + ansi-colors@4.1.3: {} ansi-regex@5.0.1: {} @@ -2110,27 +3434,33 @@ snapshots: dependencies: color-convert: 2.0.1 + argparse@2.0.1: {} + aria-query@5.3.2: {} + assertion-error@2.0.1: {} + astral-regex@2.0.0: {} at-least-node@1.0.0: {} axobject-query@4.1.0: {} + balanced-match@1.0.2: {} + base64-js@1.5.1: {} big-integer@1.6.52: {} - bits-ui@2.18.1(@internationalized/date@3.12.2)(@sveltejs/kit@2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.50.0): + bits-ui@2.18.1(@internationalized/date@3.12.2)(@sveltejs/kit@2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0): dependencies: '@floating-ui/core': 1.7.4 '@floating-ui/dom': 1.7.5 '@internationalized/date': 3.12.2 esm-env: 1.2.2 - runed: 0.35.1(@sveltejs/kit@2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.50.0) + runed: 0.35.1(@sveltejs/kit@2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0) svelte: 5.50.0 - svelte-toolbelt: 0.10.6(@sveltejs/kit@2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.50.0) + svelte-toolbelt: 0.10.6(@sveltejs/kit@2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0) tabbable: 6.4.0 transitivePeerDependencies: - '@sveltejs/kit' @@ -2139,8 +3469,20 @@ snapshots: dependencies: big-integer: 1.6.52 + brace-expansion@2.1.7: + dependencies: + balanced-match: 1.0.2 + + browser-fs-access@0.35.0: {} + buffer-crc32@0.2.13: {} + buffer-from@1.1.2: {} + + chai@6.2.2: {} + + change-case@5.4.4: {} + chokidar@4.0.3: dependencies: readdirp: 4.1.2 @@ -2155,19 +3497,25 @@ snapshots: color-name@1.1.4: {} + colorette@1.4.0: {} + commander@12.1.0: {} cookie@0.6.0: {} + core-util-is@1.0.3: {} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - debug@4.4.3: + debug@4.4.3(supports-color@10.2.2): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 10.2.2 deepmerge@4.3.1: {} @@ -2179,6 +3527,18 @@ snapshots: devalue@5.6.2: {} + drizzle-kit@0.31.11: + dependencies: + '@drizzle-team/brocli': 0.10.2 + '@esbuild-kit/esm-loader': 2.6.5 + esbuild: 0.25.12 + tsx: 4.23.15 + + drizzle-orm@0.45.3(@types/sql.js@1.4.11)(sql.js@1.11.0): + optionalDependencies: + '@types/sql.js': 1.4.11 + sql.js: 1.11.0 + earcut@3.0.2: {} elementtree@0.1.7: @@ -2194,6 +3554,62 @@ snapshots: env-paths@2.2.1: {} + es-module-lexer@2.3.2: {} + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + esbuild@0.27.3: optionalDependencies: '@esbuild/aix-ppc64': 0.27.3 @@ -2223,12 +3639,49 @@ snapshots: '@esbuild/win32-ia32': 0.27.3 '@esbuild/win32-x64': 0.27.3 + esbuild@0.28.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 + esm-env@1.2.2: {} esrap@2.2.2: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + expect-type@1.4.0: {} + + fast-deep-equal@3.1.3: {} + fd-slicer@1.1.0: dependencies: pend: 1.2.0 @@ -2237,6 +3690,10 @@ snapshots: optionalDependencies: picomatch: 4.0.3 + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 + fflate@0.8.2: {} fs-extra@11.3.3: @@ -2257,6 +3714,10 @@ snapshots: get-stream@6.0.1: {} + get-tsconfig@4.14.3: + dependencies: + resolve-pkg-maps: 1.0.0 + gl-matrix@3.4.4: {} glob@13.0.1: @@ -2267,6 +3728,17 @@ snapshots: graceful-fs@4.2.11: {} + https-proxy-agent@7.0.6(supports-color@10.2.2): + dependencies: + agent-base: 7.1.4 + debug: 4.4.3(supports-color@10.2.2) + transitivePeerDependencies: + - supports-color + + immediate@3.0.6: {} + + index-to-position@1.2.0: {} + inherits@2.0.4: {} ini@4.1.3: {} @@ -2285,10 +3757,30 @@ snapshots: dependencies: is-docker: 2.2.1 + isarray@1.0.0: {} + isexe@2.0.0: {} + jeep-sqlite@2.8.0: + dependencies: + '@stencil/core': 4.45.1 + browser-fs-access: 0.35.0 + jszip: 3.10.2 + localforage: 1.10.0 + sql.js: 1.14.2 + jiti@2.6.1: {} + js-levenshtein@1.1.6: {} + + js-tokens@4.0.0: {} + + js-yaml@4.3.2: + dependencies: + argparse: 2.0.1 + + json-schema-traverse@1.0.0: {} + json-stringify-pretty-compact@4.0.0: {} jsonfile@6.2.0: @@ -2297,12 +3789,27 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + jszip@3.10.2: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + kdbush@4.0.2: {} kleur@3.0.3: {} kleur@4.1.5: {} + lie@3.1.1: + dependencies: + immediate: 3.0.6 + + lie@3.3.0: + dependencies: + immediate: 3.0.6 + lightningcss-android-arm64@1.30.2: optional: true @@ -2352,6 +3859,10 @@ snapshots: lightningcss-win32-arm64-msvc: 1.30.2 lightningcss-win32-x64-msvc: 1.30.2 + localforage@1.10.0: + dependencies: + lie: 3.1.1 + locate-character@3.0.0: {} lodash-es@4.18.1: {} @@ -2366,6 +3877,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + magic-string@1.4.2: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + maplibre-gl@5.17.0: dependencies: '@mapbox/geojson-rewind': 0.5.2 @@ -2395,6 +3910,10 @@ snapshots: dependencies: '@isaacs/brace-expansion': 5.0.1 + minimatch@5.1.9: + dependencies: + brace-expansion: 2.1.7 + minimist@1.2.8: {} minipass@7.1.2: {} @@ -2409,8 +3928,6 @@ snapshots: svelte: 5.50.0 svelte-toolbelt: 0.7.1(svelte@5.50.0) - moment@2.30.1: {} - mri@1.2.0: {} mrmime@2.0.1: {} @@ -2421,12 +3938,12 @@ snapshots: nanoid@3.3.11: {} - native-run@2.0.3: + native-run@2.0.3(supports-color@10.2.2): dependencies: - '@ionic/utils-fs': 3.1.7 - '@ionic/utils-terminal': 2.3.5 + '@ionic/utils-fs': 3.1.7(supports-color@10.2.2) + '@ionic/utils-terminal': 2.3.5(supports-color@10.2.2) bplist-parser: 0.3.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) elementtree: 0.1.7 ini: 4.1.3 plist: 3.1.0 @@ -2439,14 +3956,40 @@ snapshots: obug@2.1.1: {} + obug@2.2.1: {} + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 is-docker: 2.2.1 is-wsl: 2.2.0 + openapi-fetch@0.17.0: + dependencies: + openapi-typescript-helpers: 0.1.0 + + openapi-typescript-helpers@0.1.0: {} + + openapi-typescript@7.13.0(typescript@5.9.3): + dependencies: + '@redocly/openapi-core': 1.34.20(supports-color@10.2.2) + ansi-colors: 4.1.3 + change-case: 5.4.4 + parse-json: 8.3.0 + supports-color: 10.2.2 + typescript: 5.9.3 + yargs-parser: 21.1.1 + package-json-from-dist@1.0.1: {} + pako@1.0.11: {} + + parse-json@8.3.0: + dependencies: + '@babel/code-frame': 7.29.7 + index-to-position: 1.2.0 + type-fest: 4.41.0 + path-key@3.1.1: {} path-scurry@2.0.1: @@ -2464,12 +4007,16 @@ snapshots: picomatch@4.0.3: {} + picomatch@4.0.7: {} + plist@3.1.0: dependencies: '@xmldom/xmldom': 0.8.11 base64-js: 1.5.1 xmlbuilder: 15.1.1 + pluralize@8.0.0: {} + pmtiles@4.4.0: dependencies: fflate: 0.8.2 @@ -2495,6 +4042,8 @@ snapshots: prettier@3.8.1: {} + process-nextick-args@2.0.1: {} + prompts@2.4.2: dependencies: kleur: 3.0.3 @@ -2504,6 +4053,16 @@ snapshots: quickselect@3.0.0: {} + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -2512,6 +4071,10 @@ snapshots: readdirp@4.1.2: {} + require-from-string@2.0.2: {} + + resolve-pkg-maps@1.0.0: {} + resolve-protobuf-schema@2.1.0: dependencies: protocol-buffers-schema: 3.6.0 @@ -2562,14 +4125,24 @@ snapshots: esm-env: 1.2.2 svelte: 5.50.0 - runed@0.35.1(@sveltejs/kit@2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.50.0): + runed@0.35.1(@sveltejs/kit@2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0): + dependencies: + dequal: 2.0.3 + esm-env: 1.2.2 + lz-string: 1.5.0 + svelte: 5.50.0 + optionalDependencies: + '@sveltejs/kit': 2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)) + + runed@0.37.1(@sveltejs/kit@2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0)(zod@4.3.6): dependencies: dequal: 2.0.3 esm-env: 1.2.2 lz-string: 1.5.0 svelte: 5.50.0 optionalDependencies: - '@sveltejs/kit': 2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)) + '@sveltejs/kit': 2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)) + zod: 4.3.6 rw@1.3.3: {} @@ -2577,16 +4150,20 @@ snapshots: dependencies: mri: 1.2.0 + safe-buffer@5.1.2: {} + safe-buffer@5.2.1: {} sax@1.1.4: {} sax@1.4.4: {} - semver@7.7.4: {} + semver@7.8.5: {} set-cookie-parser@3.0.1: {} + setimmediate@1.0.5: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -2611,14 +4188,31 @@ snapshots: source-map-js@1.2.1: {} + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + split2@4.2.0: {} + sql.js@1.11.0: {} + + sql.js@1.14.2: {} + + std-env@4.3.0: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -2635,6 +4229,8 @@ snapshots: dependencies: kdbush: 4.0.2 + supports-color@10.2.2: {} + svelte-check@4.3.6(picomatch@4.0.3)(svelte@5.50.0)(typescript@5.9.3): dependencies: '@jridgewell/trace-mapping': 0.3.31 @@ -2647,10 +4243,10 @@ snapshots: transitivePeerDependencies: - picomatch - svelte-toolbelt@0.10.6(@sveltejs/kit@2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.50.0): + svelte-toolbelt@0.10.6(@sveltejs/kit@2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0): dependencies: clsx: 2.1.1 - runed: 0.35.1(@sveltejs/kit@2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.50.0) + runed: 0.35.1(@sveltejs/kit@2.50.2(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.50.0)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)))(svelte@5.50.0) style-to-object: 1.0.14 svelte: 5.50.0 transitivePeerDependencies: @@ -2707,11 +4303,20 @@ snapshots: dependencies: readable-stream: 3.6.2 + tinybench@6.2.0: {} + + tinyexec@1.3.1: {} + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + tinyqueue@3.0.0: {} totalist@3.0.1: {} @@ -2720,8 +4325,16 @@ snapshots: tslib@2.8.1: {} + tsx@4.23.15: + dependencies: + esbuild: 0.28.2 + optionalDependencies: + fsevents: 2.3.3 + tw-animate-css@1.4.0: {} + type-fest@4.41.0: {} + typescript@5.9.3: {} undici-types@7.16.0: {} @@ -2730,9 +4343,11 @@ snapshots: untildify@4.0.0: {} + uri-js-replace@1.0.1: {} + util-deprecate@1.0.2: {} - vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2): + vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15): dependencies: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) @@ -2745,15 +4360,39 @@ snapshots: fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 + tsx: 4.23.15 - vitefu@1.1.1(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)): + vitefu@1.1.1(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)): optionalDependencies: - vite: 7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2) + vite: 7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15) + + vitest@5.0.2(@types/node@25.2.2)(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)): + dependencies: + '@types/chai': 5.2.3 + '@vitest/mocker': 5.0.2(vite@7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15)) + chai: 6.2.2 + es-module-lexer: 2.3.2 + expect-type: 1.4.0 + magic-string: 1.4.2 + obug: 2.2.1 + picomatch: 4.0.7 + std-env: 4.3.0 + tinybench: 6.2.0 + tinyexec: 1.3.1 + tinyglobby: 0.2.17 + vite: 7.3.1(@types/node@25.2.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.23.15) + why-is-node-running: 3.2.2 + optionalDependencies: + '@types/node': 25.2.2 + transitivePeerDependencies: + - msw which@2.0.2: dependencies: isexe: 2.0.0 + why-is-node-running@3.2.2: {} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -2771,6 +4410,10 @@ snapshots: yallist@5.0.0: {} + yaml-ast-parser@0.0.43: {} + + yargs-parser@21.1.1: {} + yauzl@2.10.0: dependencies: buffer-crc32: 0.2.13 diff --git a/src/app.d.ts b/src/app.d.ts index faf8f87..4248e0e 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -1,4 +1,6 @@ declare global { + const __APP_VERSION__: string; + interface WindowEventMap { dynamictypechange: CustomEvent<{ bodyPointSize: number }>; } diff --git a/src/lib/api/client.ts b/src/lib/api/client.ts new file mode 100644 index 0000000..5c36e20 --- /dev/null +++ b/src/lib/api/client.ts @@ -0,0 +1,59 @@ +import createClient from 'openapi-fetch'; +import type { components, paths } from './openapi'; +import { SyncLineError, SyncStatusError } from '$lib/sync/sync-errors'; +import { syncStreamLineSchema } from './sync-lines'; + +const PRODUCTION_API_URL = 'https://api.maroonrides.app'; +const LINE_SEPARATOR = '\n'; + +export const API_URL: string = import.meta.env.VITE_API_URL ?? PRODUCTION_API_URL; +export const WEBSOCKET_URL = `${API_URL.replace(/^http/, 'ws')}/api/ws`; + +type Schemas = components['schemas']; +export type SyncRequest = Schemas['SyncRequest']; +export type SyncRequestType = Schemas['SyncRequestType']; +export type SyncEntityType = Schemas['SyncEntityType']; +export type SyncStreamLine = Schemas['SyncStreamLine']; +export type ReportEvent = Schemas['ReportEvent']; +export type TripPlanRequest = Schemas['TripPlanRequest']; +export type TripItinerary = Schemas['TripItinerary']; +export type TripLeg = Schemas['TripLeg']; +export type TripWalkStep = Schemas['TripWalkStep']; +export type TripLegType = Schemas['TripLegType']; +export type TripTimeKind = Schemas['TripTimeKind']; + +const client = createClient({ baseUrl: API_URL }); + +export async function getSupportedVersion(): Promise { + const { data, error } = await client.GET('/api/version/supported'); + if (error) throw new Error(`version check failed: ${error.detail}`); + return data.version; +} + +export async function syncStream(body: SyncRequest): Promise { + const { data, error, response } = await client.POST('/api/sync/stream', { + body, + parseAs: 'text', + }); + if (error) throw new SyncStatusError(response.status, error.detail); + + try { + return data + .split(LINE_SEPARATOR) + .filter(Boolean) + .map((line) => syncStreamLineSchema.parse(JSON.parse(line)) satisfies SyncStreamLine); + } catch (cause) { + throw new SyncLineError(`unreadable sync line: ${cause}`, { cause }); + } +} + +export async function report(events: ReportEvent[]): Promise { + const { error, response } = await client.POST('/api/reports', { body: { events } }); + if (error) throw new Error(`report failed with ${response.status}: ${error.detail}`); +} + +export async function planTrip(body: TripPlanRequest): Promise { + const { data, error } = await client.POST('/api/trip-plan', { body }); + if (error) throw new Error(`trip plan failed: ${error.detail}`); + return data.itineraries ?? []; +} diff --git a/src/lib/api/openapi.d.ts b/src/lib/api/openapi.d.ts new file mode 100644 index 0000000..fe8c9ae --- /dev/null +++ b/src/lib/api/openapi.d.ts @@ -0,0 +1,776 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +export interface paths { + '/api/reports': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Report client events + * @description #### Controller: + * + * `github.com/MaroonRides/api/apps/gateway/controllers.(*ReportController).report` + * + * #### Middlewares: + * + * - `github.com/MaroonRides/api/apps/gateway/controllers.limitBody` + * + * --- + * + * Records each event. An event with an unknown type or a bad payload is dropped without failing the rest. + */ + post: operations['report']; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/sync/stream': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Stream sync changes + * @description #### Controller: + * + * `github.com/MaroonRides/api/apps/gateway/controllers.(*SyncController).stream` + * + * #### Middlewares: + * + * - `github.com/MaroonRides/api/apps/gateway/controllers.gzipped` + * + * --- + * + * Streams every change after the given acks as JSON lines. Each line is one SyncStreamLine. + */ + post: operations['syncStream']; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/trip-plan': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Plan a trip between two coordinates + * @description #### Controller: + * + * `github.com/MaroonRides/api/apps/gateway/controllers.(*TripPlanController).plan` + * + * --- + */ + post: operations['planTrip']; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + '/api/version/supported': { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get the minimum supported version that the server supports communicating with + * @description #### Controller: + * + * `github.com/MaroonRides/api/apps/gateway/controllers.(*VersionController).supportedVersion` + * + * --- + */ + get: operations['getSupportedVersion']; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: { + AlertDeleteV1Line: { + ack: string; + data: components['schemas']['SyncAlertDeleteV1']; + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + type: 'AlertDeleteV1'; + }; + AlertDirectionDeleteV1Line: { + ack: string; + data: components['schemas']['SyncAlertDirectionDeleteV1']; + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + type: 'AlertDirectionDeleteV1'; + }; + AlertDirectionV1Line: { + ack: string; + data: components['schemas']['SyncAlertDirectionV1']; + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + type: 'AlertDirectionV1'; + }; + AlertV1Line: { + ack: string; + data: components['schemas']['SyncAlertV1']; + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + type: 'AlertV1'; + }; + DirectionDeleteV1Line: { + ack: string; + data: components['schemas']['SyncDirectionDeleteV1']; + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + type: 'DirectionDeleteV1'; + }; + DirectionV1Line: { + ack: string; + data: components['schemas']['SyncDirectionV1']; + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + type: 'DirectionV1'; + }; + ErrorItem: { + /** @description Additional information about the error */ + more?: { + [key: string]: unknown; + } | null; + /** @description For example, name of the parameter that caused the error */ + name: string; + /** @description Human readable error message */ + reason: string; + }; + /** @description HTTPError schema */ + HTTPError: { + /** @description Human readable error message */ + detail?: string; + errors?: components['schemas']['ErrorItem'][] | null; + instance?: string; + /** + * @description HTTP status code + * @example 403 + */ + status?: number; + /** @description Short title of the error */ + title?: string; + /** @description URL of the error type. Can be used to lookup the error in a documentation */ + type?: string; + }; + ReportEvent: + | components['schemas']['SyncFailedHTTPStatusV1Event'] + | components['schemas']['SyncFailedInvalidLineV1Event'] + | components['schemas']['SyncFailedApplyV1Event']; + /** + * ReportEventType + * @description ReportEventType schema + * @enum {string} + */ + ReportEventType: 'SyncFailedHTTPStatusV1' | 'SyncFailedInvalidLineV1' | 'SyncFailedApplyV1'; + /** @description ReportRequest schema */ + ReportRequest: { + events: components['schemas']['ReportEvent'][] | null; + }; + RouteDeleteV1Line: { + ack: string; + data: components['schemas']['SyncRouteDeleteV1']; + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + type: 'RouteDeleteV1'; + }; + RouteV1Line: { + ack: string; + data: components['schemas']['SyncRouteV1']; + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + type: 'RouteV1'; + }; + StopDeleteV1Line: { + ack: string; + data: components['schemas']['SyncStopDeleteV1']; + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + type: 'StopDeleteV1'; + }; + StopV1Line: { + ack: string; + data: components['schemas']['SyncStopV1']; + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + type: 'StopV1'; + }; + /** @description SupportedVersionResponse schema */ + SupportedVersionResponse: { + version: string; + }; + /** @description SyncAlertDeleteV1 schema */ + SyncAlertDeleteV1: { + /** Format: uuid */ + alertId: string; + }; + /** @description SyncAlertDirectionDeleteV1 schema */ + SyncAlertDirectionDeleteV1: { + /** Format: uuid */ + alertDirectionId: string; + }; + /** @description SyncAlertDirectionV1 schema */ + SyncAlertDirectionV1: { + /** Format: uuid */ + alertId: string; + /** Format: uuid */ + directionId: string; + /** Format: uuid */ + id: string; + }; + /** @description SyncAlertV1 schema */ + SyncAlertV1: { + dailyEndTime: string; + dailyStartTime: string; + description: string; + /** Format: date-time */ + endsAt: string | null; + /** Format: uuid */ + id: string; + /** Format: date-time */ + startsAt: string; + timeRangeText: string; + title: string; + }; + /** @description SyncCompleteV1 schema */ + SyncCompleteV1: unknown; + SyncCompleteV1Line: { + ack: string; + data: components['schemas']['SyncCompleteV1']; + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + type: 'SyncCompleteV1'; + }; + /** @description SyncDirectionDeleteV1 schema */ + SyncDirectionDeleteV1: { + /** Format: uuid */ + directionId: string; + }; + /** @description SyncDirectionV1 schema */ + SyncDirectionV1: { + destination: string; + /** Format: uuid */ + id: string; + path: string; + /** Format: uuid */ + routeId: string; + sequence: number; + }; + /** + * SyncEntityType + * @description SyncEntityType schema + * @enum {string} + */ + SyncEntityType: + | 'RouteV1' + | 'RouteDeleteV1' + | 'DirectionV1' + | 'DirectionDeleteV1' + | 'StopV1' + | 'StopDeleteV1' + | 'AlertV1' + | 'AlertDeleteV1' + | 'AlertDirectionV1' + | 'AlertDirectionDeleteV1' + | 'TimetableV1' + | 'TimetableDeleteV1' + | 'SyncResetV1' + | 'SyncCompleteV1'; + /** @description SyncFailedApplyV1 schema */ + SyncFailedApplyV1: { + acks: string[] | null; + message?: string; + protocol: components['schemas']['SyncProtocolVersion']; + }; + SyncFailedApplyV1Event: { + payload: components['schemas']['SyncFailedApplyV1']; + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + type: 'SyncFailedApplyV1'; + }; + /** @description SyncFailedHTTPStatusV1 schema */ + SyncFailedHTTPStatusV1: { + acks: string[] | null; + message?: string; + protocol: components['schemas']['SyncProtocolVersion']; + status: number; + }; + SyncFailedHTTPStatusV1Event: { + payload: components['schemas']['SyncFailedHTTPStatusV1']; + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + type: 'SyncFailedHTTPStatusV1'; + }; + /** @description SyncFailedInvalidLineV1 schema */ + SyncFailedInvalidLineV1: { + acks: string[] | null; + message?: string; + protocol: components['schemas']['SyncProtocolVersion']; + }; + SyncFailedInvalidLineV1Event: { + payload: components['schemas']['SyncFailedInvalidLineV1']; + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + type: 'SyncFailedInvalidLineV1'; + }; + /** @enum {integer} */ + SyncProtocolVersion: 1; + /** @description SyncRequest schema */ + SyncRequest: { + acks: string[] | null; + protocol: components['schemas']['SyncProtocolVersion']; + types: components['schemas']['SyncRequestType'][] | null; + }; + /** @enum {string} */ + SyncRequestType: + | 'RoutesV1' + | 'DirectionsV1' + | 'StopsV1' + | 'AlertsV1' + | 'AlertDirectionsV1' + | 'TimetablesV1'; + /** @description SyncResetV1 schema */ + SyncResetV1: unknown; + SyncResetV1Line: { + ack: string; + data: components['schemas']['SyncResetV1']; + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + type: 'SyncResetV1'; + }; + /** @description SyncRouteDeleteV1 schema */ + SyncRouteDeleteV1: { + /** Format: uuid */ + routeId: string; + }; + /** @description SyncRouteV1 schema */ + SyncRouteV1: { + active: boolean; + darkColor: string; + /** Format: uuid */ + id: string; + lightColor: string; + longName: string; + shortName: string; + }; + /** @description SyncStopDeleteV1 schema */ + SyncStopDeleteV1: { + /** Format: uuid */ + stopId: string; + }; + /** @description SyncStopV1 schema */ + SyncStopV1: { + amenities: string[] | null; + /** Format: uuid */ + directionId: string; + /** Format: uuid */ + id: string; + isTimepoint: boolean; + /** Format: double */ + lat: number; + /** Format: double */ + lon: number; + name: string; + sequence: number; + }; + SyncStreamLine: + | components['schemas']['RouteV1Line'] + | components['schemas']['RouteDeleteV1Line'] + | components['schemas']['DirectionV1Line'] + | components['schemas']['DirectionDeleteV1Line'] + | components['schemas']['StopV1Line'] + | components['schemas']['StopDeleteV1Line'] + | components['schemas']['AlertV1Line'] + | components['schemas']['AlertDeleteV1Line'] + | components['schemas']['AlertDirectionV1Line'] + | components['schemas']['AlertDirectionDeleteV1Line'] + | components['schemas']['TimetableV1Line'] + | components['schemas']['TimetableDeleteV1Line'] + | components['schemas']['SyncResetV1Line'] + | components['schemas']['SyncCompleteV1Line']; + /** @description SyncTimetableDeleteV1 schema */ + SyncTimetableDeleteV1: { + /** Format: uuid */ + timetableId: string; + }; + /** @description SyncTimetableV1 schema */ + SyncTimetableV1: { + departures: string[] | null; + /** Format: uuid */ + id: string; + /** Format: date */ + serviceDate: string; + /** Format: uuid */ + stopId: string; + }; + TimetableDeleteV1Line: { + ack: string; + data: components['schemas']['SyncTimetableDeleteV1']; + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + type: 'TimetableDeleteV1'; + }; + TimetableV1Line: { + ack: string; + data: components['schemas']['SyncTimetableV1']; + /** + * @description discriminator enum property added by openapi-typescript + * @enum {string} + */ + type: 'TimetableV1'; + }; + TripBounds: { + /** Format: double */ + neLat: number; + /** Format: double */ + neLon: number; + /** Format: double */ + swLat: number; + /** Format: double */ + swLon: number; + }; + TripEndpoint: { + /** Format: double */ + lat: number; + /** Format: double */ + lon: number; + name: string; + }; + TripItinerary: { + /** Format: date-time */ + arriveAt: string; + bounds: components['schemas']['TripBounds']; + /** Format: date-time */ + departAt: string; + legs: components['schemas']['TripLeg'][] | null; + /** Format: double */ + walkingDistanceMeters: number; + walkingSeconds: number; + warnings: string[] | null; + }; + TripLeg: { + /** Format: date-time */ + endAt: string; + from: components['schemas']['TripPlace']; + path: string; + ride?: components['schemas']['TripRide']; + /** Format: date-time */ + startAt: string; + to: components['schemas']['TripPlace']; + type: components['schemas']['TripLegType']; + walk?: components['schemas']['TripWalk']; + }; + /** @enum {string} */ + TripLegType: 'walk' | 'ride' | 'wait'; + TripPlace: { + /** Format: double */ + lat: number; + /** Format: double */ + lon: number; + name: string; + stopCode: string | null; + /** Format: uuid */ + stopId: string | null; + }; + /** @description TripPlanRequest schema */ + TripPlanRequest: { + destination: components['schemas']['TripEndpoint']; + origin: components['schemas']['TripEndpoint']; + preference?: components['schemas']['TripPreference']; + /** Format: date-time */ + time?: string; + timeKind?: components['schemas']['TripTimeKind']; + }; + /** @description TripPlanResponse schema */ + TripPlanResponse: { + itineraries: components['schemas']['TripItinerary'][] | null; + }; + /** @enum {string} */ + TripPreference: 'best' | 'fewerTransfers' | 'lessWalking'; + TripRide: { + /** Format: uuid */ + directionId: string | null; + headsign: string; + /** Format: uuid */ + routeId: string | null; + routeShortName: string; + stopCount: number; + }; + /** @enum {string} */ + TripTimeKind: 'departAt' | 'arriveBy'; + TripWalk: { + /** Format: double */ + distanceMeters: number; + steps: components['schemas']['TripWalkStep'][] | null; + }; + TripWalkStep: { + instruction: string; + path: string; + }; + /** @description unknown-interface schema */ + 'unknown-interface': unknown; + }; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export interface operations { + report: { + parameters: { + query?: never; + header?: { + Accept?: string; + }; + path?: never; + cookie?: never; + }; + /** @description Request body for dtos.ReportRequest */ + requestBody: { + content: { + 'application/json': components['schemas']['ReportRequest']; + }; + }; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['unknown-interface']; + }; + }; + /** @description Bad Request _(validation or deserialization error)_ */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPError']; + 'application/xml': components['schemas']['HTTPError']; + }; + }; + /** @description Internal Server Error _(panics)_ */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPError']; + 'application/xml': components['schemas']['HTTPError']; + }; + }; + }; + }; + syncStream: { + parameters: { + query?: never; + header?: { + Accept?: string; + }; + path?: never; + cookie?: never; + }; + /** @description Request body for dtos.SyncRequest */ + requestBody: { + content: { + 'application/json': components['schemas']['SyncRequest']; + }; + }; + responses: { + /** @description One SyncStreamLine per line */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/jsonlines+json': components['schemas']['SyncStreamLine']; + }; + }; + /** @description Bad Request _(validation or deserialization error)_ */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPError']; + 'application/xml': components['schemas']['HTTPError']; + }; + }; + /** @description Internal Server Error _(panics)_ */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPError']; + 'application/xml': components['schemas']['HTTPError']; + }; + }; + }; + }; + planTrip: { + parameters: { + query?: never; + header?: { + Accept?: string; + }; + path?: never; + cookie?: never; + }; + /** @description Request body for dtos.TripPlanRequest */ + requestBody: { + content: { + 'application/json': components['schemas']['TripPlanRequest']; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['TripPlanResponse']; + }; + }; + /** @description Bad Request _(validation or deserialization error)_ */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPError']; + 'application/xml': components['schemas']['HTTPError']; + }; + }; + /** @description Internal Server Error _(panics)_ */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPError']; + 'application/xml': components['schemas']['HTTPError']; + }; + }; + /** @description The upstream trip planner failed */ + 502: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPError']; + }; + }; + }; + }; + getSupportedVersion: { + parameters: { + query?: never; + header?: { + Accept?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['SupportedVersionResponse']; + }; + }; + /** @description Bad Request _(validation or deserialization error)_ */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPError']; + 'application/xml': components['schemas']['HTTPError']; + }; + }; + /** @description Internal Server Error _(panics)_ */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + 'application/json': components['schemas']['HTTPError']; + 'application/xml': components['schemas']['HTTPError']; + }; + }; + }; + }; +} diff --git a/src/lib/api/sync-lines.test.ts b/src/lib/api/sync-lines.test.ts new file mode 100644 index 0000000..71cd390 --- /dev/null +++ b/src/lib/api/sync-lines.test.ts @@ -0,0 +1,19 @@ +import { describe, expect, it } from 'vitest'; +import { syncStreamLineSchema } from './sync-lines'; + +const timetableLine = { + type: 'TimetableV1', + ack: 'TimetablesV1|1', + data: { id: 't', stopId: 's', serviceDate: '2026-10-10', departures: null }, +}; + +describe('syncStreamLineSchema', () => { + it('accepts a line the server sends', () => { + expect(syncStreamLineSchema.parse(timetableLine)).toEqual(timetableLine); + }); + + it('rejects a line missing a column', () => { + const { stopId: _, ...data } = timetableLine.data; + expect(syncStreamLineSchema.safeParse({ ...timetableLine, data }).success).toBe(false); + }); +}); diff --git a/src/lib/api/sync-lines.ts b/src/lib/api/sync-lines.ts new file mode 100644 index 0000000..d5c0f00 --- /dev/null +++ b/src/lib/api/sync-lines.ts @@ -0,0 +1,77 @@ +import { z } from 'zod'; + +const line = (type: T, data: D) => + z.object({ type: z.literal(type), ack: z.string(), data }); + +const nullableStrings = z.array(z.string()).nullable(); + +export const syncStreamLineSchema = z.discriminatedUnion('type', [ + line( + 'RouteV1', + z.object({ + id: z.string(), + shortName: z.string(), + longName: z.string(), + lightColor: z.string(), + darkColor: z.string(), + active: z.boolean(), + }), + ), + line('RouteDeleteV1', z.object({ routeId: z.string() })), + line( + 'DirectionV1', + z.object({ + id: z.string(), + routeId: z.string(), + destination: z.string(), + path: z.string(), + sequence: z.number(), + }), + ), + line('DirectionDeleteV1', z.object({ directionId: z.string() })), + line( + 'StopV1', + z.object({ + id: z.string(), + directionId: z.string(), + name: z.string(), + lat: z.number(), + lon: z.number(), + sequence: z.number(), + isTimepoint: z.boolean(), + amenities: nullableStrings, + }), + ), + line('StopDeleteV1', z.object({ stopId: z.string() })), + line( + 'AlertV1', + z.object({ + id: z.string(), + title: z.string(), + description: z.string(), + timeRangeText: z.string(), + startsAt: z.string(), + endsAt: z.string().nullable(), + dailyStartTime: z.string(), + dailyEndTime: z.string(), + }), + ), + line('AlertDeleteV1', z.object({ alertId: z.string() })), + line( + 'AlertDirectionV1', + z.object({ id: z.string(), alertId: z.string(), directionId: z.string() }), + ), + line('AlertDirectionDeleteV1', z.object({ alertDirectionId: z.string() })), + line( + 'TimetableV1', + z.object({ + id: z.string(), + stopId: z.string(), + serviceDate: z.string(), + departures: nullableStrings, + }), + ), + line('TimetableDeleteV1', z.object({ timetableId: z.string() })), + line('SyncResetV1', z.unknown()), + line('SyncCompleteV1', z.unknown()), +]); diff --git a/src/lib/api/websocket.ts b/src/lib/api/websocket.ts new file mode 100644 index 0000000..71806ba --- /dev/null +++ b/src/lib/api/websocket.ts @@ -0,0 +1,59 @@ +import { z } from 'zod'; + +// The gateway does not publish these in openapi.json, they mirror apps/gateway/dtos/websocket.go. + +export enum WebsocketMessageType { + SUBSCRIBE = 'subscribe', + UNSUBSCRIBE = 'unsubscribe', + PING = 'ping', + PONG = 'pong', + ERROR = 'error', + VEHICLES = 'vehicles', + DEPARTURES = 'departures', +} + +export type WebsocketClientMessage = + | { type: WebsocketMessageType.SUBSCRIBE; routeId: string } + | { type: WebsocketMessageType.UNSUBSCRIBE } + | { type: WebsocketMessageType.PING }; + +const websocketVehicleSchema = z.object({ + id: z.string(), + directionId: z.string(), + name: z.string(), + lat: z.number(), + lon: z.number(), + heading: z.number(), + speed: z.number(), + passengers: z.number(), + capacity: z.number(), + amenities: z.array(z.string()).nullable(), + seenAt: z.string(), +}); + +const websocketDepartureSchema = z.object({ + id: z.string(), + stopId: z.string(), + scheduledAt: z.string(), + estimatedAt: z.string().nullable(), + isCancelled: z.boolean(), +}); + +export const websocketServerMessageSchema = z.discriminatedUnion('type', [ + z.object({ type: z.literal(WebsocketMessageType.PONG) }), + z.object({ type: z.literal(WebsocketMessageType.ERROR), message: z.string() }), + z.object({ + type: z.literal(WebsocketMessageType.VEHICLES), + routeId: z.string(), + vehicles: z.array(websocketVehicleSchema).nullable(), + }), + z.object({ + type: z.literal(WebsocketMessageType.DEPARTURES), + routeId: z.string(), + departures: z.array(websocketDepartureSchema).nullable(), + }), +]); + +export type WebsocketVehicle = z.infer; +export type WebsocketDeparture = z.infer; +export type WebsocketServerMessage = z.infer; diff --git a/src/lib/components/OfflinePill.svelte b/src/lib/components/OfflinePill.svelte new file mode 100644 index 0000000..2900584 --- /dev/null +++ b/src/lib/components/OfflinePill.svelte @@ -0,0 +1,20 @@ + + +
+
+ + Offline +
+
diff --git a/src/lib/components/RouteBubble.svelte b/src/lib/components/RouteBubble.svelte index 3776b97..6c959eb 100644 --- a/src/lib/components/RouteBubble.svelte +++ b/src/lib/components/RouteBubble.svelte @@ -1,7 +1,6 @@ -
+
{#each timetable as row, i}
+ import Button from '$lib/components/ui/button/button.svelte'; + import { openAppStore } from '$lib/utils/app-version'; + import { CircleArrowUp } from '@lucide/svelte'; + + +
+ +

Update Required

+

+ This version of Maroon Rides is no longer supported. Update the app to keep tracking buses. +

+ +
diff --git a/src/lib/components/map/MapElements.svelte b/src/lib/components/map/MapElements.svelte index 6d627bd..fe8d7ed 100644 --- a/src/lib/components/map/MapElements.svelte +++ b/src/lib/components/map/MapElements.svelte @@ -6,11 +6,9 @@ type MapCircleStyle, } from '$lib/components/ui/map/MapCircleLayer.svelte'; import { useRoutes, useVehicles } from '$lib/data/app'; - import { isTimepoint, useTimepointsAPI } from '$lib/data/timepoints'; import { type Bus, type Direction, type Location, type Route, type Stop } from '$lib/data/types'; import { mapManager } from '$lib/managers/map.manager.svelte'; import { themeManager } from '$lib/managers/theme.manager.svelte'; - import { getRouteTint } from '$lib/utils/tints'; import { getLighterColor } from '$lib/utils/utils'; import { Geolocation } from '@capacitor/geolocation'; import { uniqBy } from 'lodash-es'; @@ -26,7 +24,6 @@ const STOPS_ID = 'stops'; const routes = useRoutes(); - const timepoints = useTimepointsAPI(); const busLocations = $derived(useVehicles(() => ({ route: mapManager.selectedRoute }))); let userLocation: Location | null = $state(null); @@ -84,16 +81,11 @@ })), ); - function isStopTimepoint(stop: Stop) { - const routeCode = mapManager.selectedRoute?.routeCode; - return !!routeCode && isTimepoint(timepoints.data ?? {}, routeCode, stop.id); - } - // Timepoints are square DOM markers, not circles. const stopCircles = $derived( stopsByDirection.flatMap(({ direction, stops }) => stops - .filter((stop) => !isStopTimepoint(stop)) + .filter((stop) => !stop.isTimepoint) .map( (stop): MapCircle => ({ id: `${direction.id}-${stop.id}`, @@ -106,7 +98,7 @@ const timepointStops = $derived( stopsByDirection.flatMap(({ direction, stops }) => - stops.filter(isStopTimepoint).map((stop) => ({ direction, stop })), + stops.filter((stop) => stop.isTimepoint).map((stop) => ({ direction, stop })), ), ); @@ -114,7 +106,7 @@ const route = mapManager.selectedRoute; if (!route) return null; - const color = getRouteTint(route, themeManager.theme); + const color = themeManager.tintFor(route); return { color, strokeColor: getLighterColor(color) }; }); @@ -157,13 +149,10 @@ if (!route || mapManager.selected?.type !== 'stop') return null; const stopId = mapManager.selected.id; - const matches = stopsByDirection.flatMap(({ direction, stops }) => { - const stop = stops.find((candidate) => candidate.id === stopId); - return stop ? [{ route, direction, stop }] : []; - }); - - // a stop belongs to several directions; the shown one supplies the estimates - return matches.find((match) => isDirectionSelected(match.direction.id)) ?? matches[0] ?? null; + const stop = stopsByDirection + .flatMap(({ stops }) => stops) + .find((candidate) => candidate.id === stopId); + return stop ? { route, stop } : null; }); @@ -175,7 +164,7 @@ [point.longitude, point.latitude])} - color={getRouteTint(route, themeManager.theme)} + color={themeManager.tintFor(route)} id={`${route.id}-${direction.id}`} onclick={() => { // Unselected directions still draw faded, so isShown would let them take taps. @@ -253,7 +242,6 @@ {:else if selectedStop} (mapManager.selected = null)} /> diff --git a/src/lib/components/map/marker/BusMarker.svelte b/src/lib/components/map/marker/BusMarker.svelte index 41d5b3d..0ceb0ab 100644 --- a/src/lib/components/map/marker/BusMarker.svelte +++ b/src/lib/components/map/marker/BusMarker.svelte @@ -2,7 +2,6 @@ import MarkerContent from '$lib/components/ui/map/MarkerContent.svelte'; import type { Bus } from '$lib/data/types'; import { themeManager } from '$lib/managers/theme.manager.svelte'; - import { getRouteTint } from '$lib/utils/tints'; import { getLighterColor } from '$lib/utils/utils'; import { BusFrontIcon } from '@lucide/svelte'; @@ -13,7 +12,7 @@ let { bus, isSelected }: Props = $props(); - const tint = $derived(getRouteTint(bus.route, themeManager.theme)); + const tint = $derived(themeManager.tintFor(bus.route)); const borderTint = $derived(getLighterColor(tint)); diff --git a/src/lib/components/map/popup/StopPopup.svelte b/src/lib/components/map/popup/StopPopup.svelte index c7d83a3..ddfbaa3 100644 --- a/src/lib/components/map/popup/StopPopup.svelte +++ b/src/lib/components/map/popup/StopPopup.svelte @@ -3,26 +3,23 @@ import MapPopup from '$lib/components/ui/map/MapPopup.svelte'; import Spinner from '$lib/components/ui/spinner/spinner.svelte'; import TimeBubble from '$lib/components/TimeBubble.svelte'; - import { useStopAmenities, useStopEstimate } from '$lib/data/app'; - import { Amenity, type Direction, type Route, type Stop } from '$lib/data/types'; + import { useStopEstimate } from '$lib/data/app'; + import { estimateStatusMessage } from '$lib/data/stop_estimates'; + import { Amenity, EstimateSource, type Route, type Stop } from '$lib/data/types'; import { themeManager } from '$lib/managers/theme.manager.svelte'; - import { getRouteTint } from '$lib/utils/tints'; type Props = { route: Route; stop: Stop; - direction: Direction; onclose?: () => void; }; - let { stop, route, direction, onclose }: Props = $props(); + let { stop, route, onclose }: Props = $props(); - const tint = $derived(getRouteTint(route, themeManager.theme)); + const tint = $derived(themeManager.tintFor(route)); - const { data: amenities } = $derived(useStopAmenities(() => ({ route, direction, stop }))); - const { data: estimates, isLoading } = $derived( - useStopEstimate(() => ({ route, direction, stop })), - ); + const stopEstimates = useStopEstimate(() => ({ stop })); + const estimates = $derived(stopEstimates.data.estimates);
- {#each (amenities ?? []).filter((amenity) => amenity !== Amenity.TIME_POINT) as amenity} - {@const AmenityIcon = Amenity.getIcon(amenity)} - + {#each stop.amenities as amenity} + {#if amenity !== Amenity.TIME_POINT} + {@const AmenityIcon = Amenity.getIcon(amenity)} + + {/if} {/each}
- {#if isLoading} + {#if stopEstimates.data.source === EstimateSource.LOADING} - {:else if estimates?.length === 0} -

No upcoming departures

+ {:else if estimates.length === 0} +

+ {estimateStatusMessage(stopEstimates.data)} +

{/if} - {#each estimates ?? [] as estimate, i} + {#each estimates as estimate, i} {/each}
diff --git a/src/lib/components/ui/date-stepper/date-stepper.svelte b/src/lib/components/ui/date-stepper/date-stepper.svelte index e477e51..49bd0fb 100644 --- a/src/lib/components/ui/date-stepper/date-stepper.svelte +++ b/src/lib/components/ui/date-stepper/date-stepper.svelte @@ -1,20 +1,27 @@ @@ -24,12 +31,12 @@ size="sm" class="mt-2 rounded-full" onclick={() => offsetDate(-1)} - disabled={minDate ? selectedDate.isSameOrBefore(minDate ?? moment(), 'day') : false} + disabled={minDate ? selectedDate.startOf('day') <= minDate.startOf('day') : false} > diff --git a/src/lib/components/ui/map/Map.svelte b/src/lib/components/ui/map/Map.svelte index 9361454..6fec874 100644 --- a/src/lib/components/ui/map/Map.svelte +++ b/src/lib/components/ui/map/Map.svelte @@ -1,5 +1,5 @@ @@ -57,3 +70,9 @@ {@render children()}
+ + + +{#if syncManager.versionStatus === VersionStatus.UNSUPPORTED} + +{/if} diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 5da15f6..b4d0e1c 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -10,11 +10,16 @@ import { useRoutes } from '$lib/data/app'; import { frontPageManager } from '$lib/managers/frontpage.manager.svelte'; import { mapManager } from '$lib/managers/map.manager.svelte'; + import { syncManager } from '$lib/managers/sync.manager.svelte'; import { Preferences } from '@capacitor/preferences'; import { Cog, Route } from '@lucide/svelte'; import { onMount } from 'svelte'; let routes = useRoutes(); + // On first launch the database stays empty until the first sync lands. + const isLoading = $derived( + routes.isLoading || (routes.data?.length === 0 && syncManager.isSyncing), + ); const favRoutes = $derived( routes.data?.filter((route) => frontPageManager.favorites.includes(route.routeCode)) ?? [], ); @@ -67,7 +72,7 @@ {#if frontPageManager.selectedTab === 'all'} - {#if routes.isLoading} + {#if isLoading} {:else if routes.isError}

Error loading routes: {routes.error.message}

@@ -79,11 +84,11 @@
{:else if frontPageManager.selectedTab === 'favorites'} - {#if favRoutes.length === 0 && !routes.isLoading} + {#if favRoutes.length === 0 && !isLoading}

There are no favorited routes.

{/if} - {#if routes.isLoading} + {#if isLoading} {/if} diff --git a/src/routes/plan/+page.svelte b/src/routes/plan/+page.svelte index 68f5bde..dbcb48c 100644 --- a/src/routes/plan/+page.svelte +++ b/src/routes/plan/+page.svelte @@ -9,13 +9,13 @@ import { Spinner } from '$lib/components/ui/spinner'; import * as Tabs from '$lib/components/ui/tabs'; import { MyLocation, PlanOption } from '$lib/data/types'; - import { planManager, usePlanState } from '$lib/managers/plan.manager.svelte'; + import { planManager } from '$lib/managers/plan.manager.svelte'; import { ArrowUpDown, Circle, CircleAlert, MapPin } from '@lucide/svelte'; - import { Duration } from 'luxon'; + import { arrivalLabel, formatTripDuration, hasBusLeg } from '$lib/utils/route-planning'; import LocationInput from './LocationInput.svelte'; import SelectionRow from './SelectionRow.svelte'; - usePlanState(); + planManager.attachQueries(); async function onClose() { await goto('/'); @@ -26,16 +26,6 @@ planManager.swapLocations(); if (document.activeElement instanceof HTMLElement) document.activeElement.blur(); } - - function relTime(seconds: number): string { - const { hours, minutes } = Duration.fromMillis(seconds * 1e3) - .shiftTo('hours', 'minutes') - .toObject(); - return Duration.fromObject({ - minutes: Math.floor(minutes ?? 0), - ...(hours && { hours }), - }).toHuman(); - } {#key page.url.pathname} @@ -58,7 +48,7 @@ bind:value={planManager.start.searchTerm} location={planManager.start.location?.type} component={Circle} - oninput={() => (planManager.start.location = null)} + oninput={() => planManager.start.clear()} onfocus={() => planManager.focus('start')} /> @@ -72,7 +62,7 @@ bind:value={planManager.end.searchTerm} location={planManager.end.location?.type} component={MapPin} - oninput={() => (planManager.end.location = null)} + oninput={() => planManager.end.clear()} onfocus={() => planManager.focus('end')} />
@@ -129,7 +119,7 @@ planManager.selectSuggestion(suggestion)} /> @@ -142,9 +132,9 @@ {/if} { planManager.selectedPlan = plan; diff --git a/src/routes/plan/selection/+page.svelte b/src/routes/plan/selection/+page.svelte index e2e4607..6cf39c0 100644 --- a/src/routes/plan/selection/+page.svelte +++ b/src/routes/plan/selection/+page.svelte @@ -3,9 +3,9 @@ import { page } from '$app/state'; import * as Accordion from '$lib/components/ui/accordion'; import * as BottomSheet from '$lib/components/ui/bottom-sheet'; - import { PlanOption } from '$lib/data/types'; import { mapManager } from '$lib/managers/map.manager.svelte'; import { planManager } from '$lib/managers/plan.manager.svelte'; + import { arrivalLabel, toTimelineSteps } from '$lib/utils/route-planning'; import StepRow from './StepRow.svelte'; $effect(() => { @@ -16,23 +16,11 @@ let mapRoutes = [...mapManager.drawnRoutes]; $effect(() => { mapManager.setDrawnRoutes([], false); - planManager.shownInstruction = -1; + planManager.shownInstruction = null; }); - // Strips the API's inline HTML, so @html renders only the markup added here. - const domParser = new DOMParser(); - const format = (s: string) => - ( - domParser.parseFromString(s.replaceAll(/\(ID: \d+\)/g, '!br!'), 'text/html').body - .textContent ?? '' - ) - .replaceAll(/!br!/g, '
') - .replaceAll(/(My Location)/g, '$1
') - .replace(/(
)*$/, ''); - const plan = $derived(planManager.selectedPlan); - const instructions = $derived(plan?.instructions ?? []); - const formattedContent = $derived(instructions.map((instr) => format(instr.instruction))); + const steps = $derived(plan ? toTimelineSteps(plan) : []); function onClose() { mapManager.setDrawnRoutes(mapRoutes); @@ -49,7 +37,7 @@ ]} > {#snippet header()} - + {#snippet actions()} {/snippet} @@ -60,19 +48,19 @@ (planManager.shownInstruction === -1 ? '' : String(planManager.shownInstruction)), - (value) => (planManager.shownInstruction = value === '' ? -1 : Number(value)) + () => String(planManager.shownInstruction ?? ''), + (value) => (planManager.shownInstruction = value === '' ? null : Number(value)) } class="px-4 pt-3" > - {#each instructions as step, i} + {#each steps as step, i} {/each} diff --git a/src/routes/plan/selection/InstructionsList.svelte b/src/routes/plan/selection/InstructionsList.svelte index 07f8e54..ef761ae 100644 --- a/src/routes/plan/selection/InstructionsList.svelte +++ b/src/routes/plan/selection/InstructionsList.svelte @@ -1,52 +1,15 @@
    - {#each instructions as instr, i} -
  • - {instr.stepNumber}. {@html formattedContent[i].text} - {#each formattedContent[i].notes as note} -
    - {@html note.text} -
    - {/each} -
  • + {#each instructions as step, i} +
  • {i + 1}. {step.instruction}
  • {/each}
diff --git a/src/routes/plan/selection/StepRow.svelte b/src/routes/plan/selection/StepRow.svelte index 99cc6bc..6dd958d 100644 --- a/src/routes/plan/selection/StepRow.svelte +++ b/src/routes/plan/selection/StepRow.svelte @@ -1,7 +1,8 @@ -
- {#if isLoading} +
+ {#if estimates.source === EstimateSource.LOADING} {/if} - {#each estimates as estimate, i} + {#each estimates.estimates as estimate, i} {/each}
diff --git a/src/routes/route/[id]/StopRow.svelte b/src/routes/route/[id]/StopRow.svelte index acdea86..e019027 100644 --- a/src/routes/route/[id]/StopRow.svelte +++ b/src/routes/route/[id]/StopRow.svelte @@ -6,7 +6,8 @@ import TimepointAttribute from '$lib/components/TimepointAttribute.svelte'; import Button from '$lib/components/ui/button/button.svelte'; import { mapManager } from '$lib/managers/map.manager.svelte'; - import { useStopAmenities, useStopEstimate } from '$lib/data/app'; + import { useStopEstimate } from '$lib/data/app'; + import { estimateStatusMessage } from '$lib/data/stop_estimates'; import { Amenity, type Direction, type Route, type Stop } from '$lib/data/types'; import { CalendarIcon } from '@lucide/svelte'; import { getContext } from 'svelte'; @@ -15,49 +16,17 @@ stop: Stop; route: Route; direction: Direction; - estimateDirection?: Direction; estimateStop?: Stop; }; - let { stop, route, direction, estimateDirection, estimateStop }: Props = $props(); + let { stop, route, direction, estimateStop }: Props = $props(); const sheet = getContext('bottom-sheet'); - const effectiveDirection = $derived(estimateDirection ?? direction); const effectiveStop = $derived(estimateStop ?? stop); - const { data: estimates, isLoading } = $derived( - useStopEstimate(() => ({ - route: route, - direction: effectiveDirection, - stop: effectiveStop, - })), - ); - - const { data: stopAmenities } = $derived(useStopAmenities(() => ({ route, direction, stop }))); - - let subtitle = $derived.by(() => { - if (!estimates || estimates.length === 0) { - return 'No upcoming departures'; - } - - const firstEstimate = estimates.find((estimate) => estimate.estimatedTime); - if (!firstEstimate?.estimatedTime) { - return 'On time'; - } - - const deviationMinutes = Math.round( - firstEstimate.estimatedTime.diff(firstEstimate.scheduledTime, 'minutes'), - ); - - if (deviationMinutes === 0) { - return 'On time'; - } else if (deviationMinutes > 0) { - return `${deviationMinutes} min late`; - } else { - return `${Math.abs(deviationMinutes)} min early`; - } - }); + const stopEstimates = useStopEstimate(() => ({ stop: effectiveStop })); + const subtitle = $derived(estimateStatusMessage(stopEstimates.data));
@@ -77,10 +46,11 @@
- {#each stopAmenities ?? [] as amenity} - {#if amenity === Amenity.TIME_POINT} - - {:else} + {#if stop.isTimepoint} + + {/if} + {#each stop.amenities as amenity} + {#if amenity !== Amenity.TIME_POINT} {@const AmenityIcon = Amenity.getIcon(amenity)} {/if} @@ -89,7 +59,7 @@
{#if route && direction} - + {/if}