From 54924b39f02368794adf806b39c6ce55de935c94 Mon Sep 17 00:00:00 2001 From: Stan Runge Date: Sun, 18 Oct 2026 22:17:30 +0000 Subject: [PATCH] feat: upgrade to SvelteKit 3 and adapter-bun Run the sveltekit-3 migration and finish its manual tasks: - Move kit config into the sveltekit() Vite plugin; drop svelte.config.js - Replace $lib with #lib subpath imports - Declare env vars in src/env.ts and import them from $app/env/{private,public} - Consolidate param matchers into src/params.ts - Use error(status, message), Response.json, refreshAll and goto reset/shallow - Fall back to a full page load when goto rejects a login return path Switch from adapter-node to adapter-bun: the build script runs Vite under Bun (the adapter requires it) and the image starts with `bun ./build`. Runtime env names (PORT, BODY_SIZE_LIMIT, ADDRESS_HEADER, ...) are unchanged. Co-Authored-By: Claude Opus 5.5 --- Dockerfile | 2 +- README.md | 6 +- bun.lock | 112 ++---------------- drizzle.config.ts | 2 +- package.json | 12 +- src/app.d.ts | 6 +- src/env.ts | 27 +++++ src/hooks.server.ts | 6 +- src/lib/animaldex/AnimalDetails.svelte | 2 +- src/lib/catch-em-all/PokemonDetails.svelte | 12 +- src/lib/catch-em-all/progress.test.ts | 2 +- src/lib/catch-em-all/progress.ts | 2 +- src/lib/components/AuthForm.svelte | 18 +-- src/lib/components/CopyButton.svelte | 2 +- src/lib/components/ProgressBar.svelte | 2 +- .../alert-dialog/alert-dialog-action.svelte | 4 +- .../alert-dialog/alert-dialog-cancel.svelte | 4 +- .../alert-dialog/alert-dialog-content.svelte | 2 +- .../alert-dialog-description.svelte | 2 +- .../alert-dialog/alert-dialog-footer.svelte | 2 +- .../alert-dialog/alert-dialog-header.svelte | 2 +- .../ui/alert-dialog/alert-dialog-media.svelte | 2 +- .../alert-dialog/alert-dialog-overlay.svelte | 2 +- .../ui/alert-dialog/alert-dialog-title.svelte | 2 +- .../components/ui/alert/alert-action.svelte | 2 +- .../ui/alert/alert-description.svelte | 2 +- .../components/ui/alert/alert-title.svelte | 2 +- src/lib/components/ui/alert/alert.svelte | 2 +- src/lib/components/ui/badge/badge.svelte | 2 +- src/lib/components/ui/button/button.svelte | 2 +- src/lib/components/ui/card/card-action.svelte | 2 +- .../components/ui/card/card-content.svelte | 2 +- .../ui/card/card-description.svelte | 2 +- src/lib/components/ui/card/card-footer.svelte | 2 +- src/lib/components/ui/card/card-header.svelte | 2 +- src/lib/components/ui/card/card-title.svelte | 2 +- src/lib/components/ui/card/card.svelte | 2 +- .../components/ui/checkbox/checkbox.svelte | 2 +- .../ui/command/command-dialog.svelte | 4 +- .../ui/command/command-empty.svelte | 2 +- .../ui/command/command-group.svelte | 2 +- .../ui/command/command-input.svelte | 4 +- .../components/ui/command/command-item.svelte | 2 +- .../ui/command/command-link-item.svelte | 2 +- .../components/ui/command/command-list.svelte | 2 +- .../ui/command/command-separator.svelte | 2 +- .../ui/command/command-shortcut.svelte | 2 +- src/lib/components/ui/command/command.svelte | 2 +- .../ui/dialog/dialog-content.svelte | 4 +- .../ui/dialog/dialog-description.svelte | 2 +- .../components/ui/dialog/dialog-footer.svelte | 4 +- .../components/ui/dialog/dialog-header.svelte | 2 +- .../ui/dialog/dialog-overlay.svelte | 2 +- .../components/ui/dialog/dialog-title.svelte | 2 +- .../dropdown-menu-checkbox-item.svelte | 2 +- .../dropdown-menu-content.svelte | 2 +- .../dropdown-menu-group-heading.svelte | 2 +- .../dropdown-menu/dropdown-menu-item.svelte | 2 +- .../dropdown-menu/dropdown-menu-label.svelte | 2 +- .../dropdown-menu-radio-item.svelte | 2 +- .../dropdown-menu-separator.svelte | 2 +- .../dropdown-menu-shortcut.svelte | 2 +- .../dropdown-menu-sub-content.svelte | 2 +- .../dropdown-menu-sub-trigger.svelte | 2 +- .../ui/input-group/input-group-addon.svelte | 2 +- .../ui/input-group/input-group-button.svelte | 4 +- .../ui/input-group/input-group-input.svelte | 4 +- .../ui/input-group/input-group-text.svelte | 2 +- .../input-group/input-group-textarea.svelte | 4 +- .../ui/input-group/input-group.svelte | 2 +- src/lib/components/ui/input/input.svelte | 2 +- src/lib/components/ui/label/label.svelte | 2 +- .../native-select-opt-group.svelte | 2 +- .../native-select/native-select-option.svelte | 2 +- .../ui/native-select/native-select.svelte | 2 +- .../ui/popover/popover-content.svelte | 2 +- .../ui/popover/popover-description.svelte | 2 +- .../ui/popover/popover-header.svelte | 2 +- .../ui/popover/popover-title.svelte | 2 +- .../ui/popover/popover-trigger.svelte | 2 +- .../components/ui/progress/progress.svelte | 2 +- .../ui/select/select-content.svelte | 4 +- .../ui/select/select-group-heading.svelte | 2 +- .../components/ui/select/select-group.svelte | 2 +- .../components/ui/select/select-item.svelte | 2 +- .../components/ui/select/select-label.svelte | 2 +- .../select/select-scroll-down-button.svelte | 2 +- .../ui/select/select-scroll-up-button.svelte | 2 +- .../ui/select/select-separator.svelte | 4 +- .../ui/select/select-trigger.svelte | 2 +- .../components/ui/separator/separator.svelte | 2 +- .../components/ui/sheet/sheet-content.svelte | 4 +- .../ui/sheet/sheet-description.svelte | 2 +- .../components/ui/sheet/sheet-footer.svelte | 2 +- .../components/ui/sheet/sheet-header.svelte | 2 +- .../components/ui/sheet/sheet-overlay.svelte | 2 +- .../components/ui/sheet/sheet-title.svelte | 2 +- .../components/ui/skeleton/skeleton.svelte | 2 +- src/lib/components/ui/slider/slider.svelte | 2 +- src/lib/components/ui/table/table-body.svelte | 2 +- .../components/ui/table/table-caption.svelte | 2 +- src/lib/components/ui/table/table-cell.svelte | 2 +- .../components/ui/table/table-footer.svelte | 2 +- src/lib/components/ui/table/table-head.svelte | 2 +- .../components/ui/table/table-header.svelte | 2 +- src/lib/components/ui/table/table-row.svelte | 2 +- src/lib/components/ui/table/table.svelte | 2 +- .../components/ui/tabs/tabs-content.svelte | 2 +- src/lib/components/ui/tabs/tabs-list.svelte | 2 +- .../components/ui/tabs/tabs-trigger.svelte | 2 +- src/lib/components/ui/tabs/tabs.svelte | 2 +- .../components/ui/textarea/textarea.svelte | 2 +- src/lib/game-tracker/CatchEditor.svelte | 16 +-- src/lib/game-tracker/GameLogo.svelte | 6 +- src/lib/game-tracker/PlayerRankBadge.svelte | 6 +- src/lib/game-tracker/PokemonJournal.svelte | 32 ++--- src/lib/game-tracker/PokemonMap.svelte | 22 ++-- src/lib/game-tracker/PokemonProgress.svelte | 4 +- src/lib/game-tracker/ProgressMeter.svelte | 2 +- src/lib/game-tracker/WeaponArtwork.svelte | 6 +- src/lib/game-tracker/game-art.ts | 5 +- src/lib/game-tracker/progress.ts | 2 +- src/lib/house-tracker/ListingMap.svelte | 9 +- src/lib/house-tracker/types.ts | 2 +- src/lib/language-learner/progress.svelte.ts | 2 +- src/lib/language-learner/ui/Session.svelte | 2 +- src/lib/server/auth.ts | 34 ++++-- src/lib/server/breed-detector.ts | 4 +- src/lib/server/db/index.ts | 4 +- src/lib/server/db/schema/index.ts | 2 +- src/lib/server/finder-http.ts | 4 +- src/lib/server/finder.test.ts | 8 +- src/lib/server/house-tracker.ts | 29 +++-- src/lib/server/osu.test.ts | 9 +- src/lib/server/osu.ts | 26 ++-- src/lib/server/pokemon-detail.ts | 4 +- src/lib/server/pokemon-journal.ts | 2 +- src/lib/server/r2.ts | 40 ++++--- src/lib/server/slugify.ts | 4 +- src/lib/server/spotify.ts | 16 +-- src/lib/server/tracker-progress.ts | 2 +- src/lib/world-opinions/CultureMap.svelte | 2 +- src/lib/world-opinions/PartyCompass.svelte | 2 +- src/params.ts | 7 ++ src/params/integer.ts | 3 - src/routes/+layout.server.ts | 6 +- src/routes/+layout.svelte | 36 +++--- src/routes/+page.server.ts | 4 +- src/routes/+page.svelte | 14 +-- src/routes/account/+page.server.ts | 2 +- src/routes/account/+page.svelte | 16 +-- src/routes/blog/+page.server.ts | 10 +- src/routes/blog/+page.svelte | 10 +- src/routes/blog/[slug]/+page.server.ts | 12 +- src/routes/blog/[slug]/+page.svelte | 2 +- src/routes/blog/[slug]/edit/+page.server.ts | 16 +-- src/routes/blog/[slug]/edit/+page.svelte | 10 +- src/routes/lists/+page.server.ts | 10 +- src/routes/lists/+page.svelte | 17 ++- src/routes/lists/[slug]/+page.server.ts | 14 +-- src/routes/lists/[slug]/+page.svelte | 31 +++-- src/routes/lists/api/upload/+server.ts | 8 +- src/routes/login/+page.server.ts | 4 +- src/routes/login/+page.svelte | 2 +- src/routes/logout/+server.ts | 2 +- src/routes/projects/+page.svelte | 8 +- src/routes/projects/animaldex/+page.svelte | 28 ++--- .../animaldex/[id=integer]/+page.server.ts | 6 +- .../animaldex/[id=integer]/+page.svelte | 4 +- .../projects/animaldex/admin/+page.server.ts | 6 +- .../projects/animaldex/admin/+page.svelte | 16 +-- .../projects/animaldex/api/animals/+server.ts | 22 ++-- .../api/animals/[id]/moderate/+server.ts | 18 +-- .../api/animals/[id]/sightings/+server.ts | 24 ++-- .../[id]/sightings/[id]/moderate/+server.ts | 18 +-- .../animaldex/api/detect-breed/+server.ts | 6 +- .../projects/animaldex/api/map/+server.ts | 12 +- .../projects/animaldex/api/upload/+server.ts | 6 +- .../projects/animaldex/register/+page.svelte | 28 ++--- src/routes/projects/cs-prices/+page.server.ts | 2 +- src/routes/projects/cs-prices/+page.svelte | 12 +- .../projects/cs-prices/api/search/+server.ts | 9 +- .../projects/cs-prices/api/series/+server.ts | 11 +- src/routes/projects/derby/+page.svelte | 14 +-- src/routes/projects/derby/[race]/+page.svelte | 12 +- src/routes/projects/derby/[race]/+page.ts | 2 +- .../projects/game-tracker/+page.server.ts | 14 +-- src/routes/projects/game-tracker/+page.svelte | 18 +-- .../call-of-duty/[slug]/+page.server.ts | 16 ++- .../call-of-duty/[slug]/+page.svelte | 36 +++--- .../game-tracker/credits/+page.svelte | 2 +- .../projects/game-tracker/osu/+page.server.ts | 6 +- .../projects/game-tracker/osu/+page.svelte | 28 ++--- .../game-tracker/pokemon/+page.server.ts | 18 +-- .../game-tracker/pokemon/+page.svelte | 21 ++-- .../pokemon/api/[number=integer]/+server.ts | 6 +- .../pokemon/api/encounters/+server.ts | 8 +- .../pokemon/locations/+page.server.ts | 4 +- .../pokemon/locations/+page.svelte | 8 +- .../locations/[id=integer]/+page.server.ts | 13 +- .../locations/[id=integer]/+page.svelte | 12 +- .../projects/house-tracker/+page.server.ts | 12 +- .../projects/house-tracker/+page.svelte | 16 +-- .../api/worker/details/+server.ts | 10 +- .../api/worker/health/+server.ts | 5 +- .../api/worker/report/+server.ts | 10 +- .../house-tracker/api/worker/sync/+server.ts | 10 +- .../projects/language-learner/+layout.svelte | 2 +- .../projects/language-learner/+page.server.ts | 4 +- .../projects/language-learner/+page.svelte | 16 +-- .../language-learner/[lang]/+layout.ts | 4 +- .../language-learner/[lang]/+page.svelte | 12 +- .../[lang]/lesson/[lesson]/+page.svelte | 18 +-- .../[lang]/lesson/[lesson]/+page.ts | 2 +- .../[lang]/practice/[mode]/+page.svelte | 16 +-- .../[lang]/practice/[mode]/+page.ts | 2 +- .../[lang]/words/+page.svelte | 14 +-- .../projects/money-tracker/+page.server.ts | 8 +- .../projects/money-tracker/+page.svelte | 18 +-- src/routes/projects/progress/+page.server.ts | 2 +- src/routes/projects/progress/+page.svelte | 14 +-- .../projects/progress/[id]/+page.server.ts | 6 +- .../projects/progress/[id]/+page.svelte | 18 +-- .../projects/progress/create/+page.server.ts | 6 +- .../projects/progress/create/+page.svelte | 10 +- .../projects/progress/topics/+page.server.ts | 2 +- .../projects/progress/topics/+page.svelte | 6 +- .../progress/topics/[id]/+page.server.ts | 2 +- .../progress/topics/[id]/+page.svelte | 7 +- .../spotify-beatmap-finder/+page.server.ts | 12 +- .../spotify-beatmap-finder/+page.svelte | 12 +- .../spotify-beatmap-finder/action.test.ts | 8 +- .../projects/world-opinions/+page.svelte | 14 +-- src/routes/register/+page.server.ts | 4 +- src/routes/register/+page.svelte | 2 +- src/routes/robots.txt/+server.ts | 2 +- src/routes/sitemap.xml/+server.ts | 10 +- svelte.config.js | 27 ----- tsconfig.json | 19 +-- vite.config.ts | 27 ++++- 240 files changed, 894 insertions(+), 944 deletions(-) create mode 100644 src/env.ts create mode 100644 src/params.ts delete mode 100644 src/params/integer.ts delete mode 100755 svelte.config.js diff --git a/Dockerfile b/Dockerfile index f50f0e6..0fa306f 100755 --- a/Dockerfile +++ b/Dockerfile @@ -21,4 +21,4 @@ COPY package.json ./ EXPOSE 3000 ENV NODE_ENV=production ENV BODY_SIZE_LIMIT=6M -CMD ["bun", "build/index.js"] +CMD ["bun", "./build"] diff --git a/README.md b/README.md index 521d8d3..5112187 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ that runs at home; setup, settings and the ban-avoidance rules are in ## osu! Map Finder Available at `/projects/spotify-beatmap-finder`. Built with the existing Svelte 5, -SvelteKit, Tailwind 4, and adapter-node setup. Uses server-only direct `fetch` +SvelteKit 3, Tailwind 4, and adapter-bun setup. Uses server-only direct `fetch` calls; no Spotify/osu! SDK or additional services. Set these private variables in your local `.env` or deployment environment: @@ -29,7 +29,7 @@ OSU_CLIENT_SECRET ``` Never prefix these with `PUBLIC_` or commit `.env`. Providers read -`$env/dynamic/private`; the browser receives only display metadata and results. +`$app/env/private`; the browser receives only display metadata and results. The other projects on this personal site retain their own environment requirements. Supported inputs: song text (`Deftones Change`), Spotify track, playlist, and album @@ -70,7 +70,7 @@ up to six active searches globally, and 12 budget units per IP per 10 minutes: a single track costs one, a playlist/album six. Expired records are cleaned on requests; the limiter has a 10,000-record ceiling. It uses `getClientAddress()`, never arbitrary forwarded headers; unsupported adapters share a conservative key. -Configure adapter-node's trusted proxy/client-address settings correctly at deployment. +Configure adapter-bun's trusted proxy/client-address settings (`ADDRESS_HEADER`, `XFF_DEPTH`) correctly at deployment. Requests have a 12-second timeout and at most two retries for network errors, 429s or server errors. Backoff includes jitter. `Retry-After` is honored; delays diff --git a/bun.lock b/bun.lock index e3fc3dd..44e5a05 100644 --- a/bun.lock +++ b/bun.lock @@ -9,7 +9,6 @@ "@aws-sdk/client-s3": "^3.1121.0", "@aws-sdk/s3-request-presigner": "^3.1121.0", "@maptiler/sdk": "^4.1.0", - "@sveltejs/adapter-node": "^5.5.7", "ai": "^7.0.85", "d3-geo": "^3.1.1", "drizzle-orm": "^1.0.0-rc.4", @@ -30,8 +29,9 @@ "@internationalized/date": "^3.12.0", "@lucide/svelte": "^1.48.0", "@playwright/test": "^1.62.1", + "@sveltejs/adapter-bun": "^1.0.0", "@sveltejs/enhanced-img": "^0.11.0", - "@sveltejs/kit": "^2.70.3", + "@sveltejs/kit": "^3.0.0", "@sveltejs/vite-plugin-svelte": "^7.3.0", "@tailwindcss/typography": "^0.5.20", "@tailwindcss/vite": "^4.3.3", @@ -54,7 +54,7 @@ "prettier": "3.9.6", "prettier-plugin-svelte": "^4.1.1", "shadcn-svelte": "^1.7.0", - "svelte": "^5.57.0", + "svelte": "^5.57.1", "svelte-check": "4.7.6", "tailwind-merge": "^3.6.0", "tailwind-variants": "^3.3.1", @@ -325,8 +325,6 @@ "@melt-ui/svelte": ["@melt-ui/svelte@0.76.2", "", { "dependencies": { "@floating-ui/core": "^1.3.1", "@floating-ui/dom": "^1.4.5", "@internationalized/date": "^3.5.0", "dequal": "^2.0.3", "focus-trap": "^7.5.2", "nanoid": "^5.0.4" }, "peerDependencies": { "svelte": ">=3 <5" } }, "sha512-7SbOa11tXUS95T3fReL+dwDs5FyJtCEqrqG3inRziDws346SYLsxOQ6HmX+4BkIsQh1R8U3XNa+EMmdMt38lMA=="], - "@napi-rs/lzma-linux-x64-gnu": ["@napi-rs/lzma-linux-x64-gnu@1.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ=="], - "@noble/ciphers": ["@noble/ciphers@2.4.0", "", {}, "sha512-AnjFn0Jv92laAkvMrghlFZq4qQCIN/4DxFV/eooqtC2YTjB7kBeLMS2T9KJX4Dn+ZVXLOwK0lSgqDtx9gvxtiw=="], "@noble/hashes": ["@noble/hashes@2.4.0", "", {}, "sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA=="], @@ -371,66 +369,8 @@ "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="], - "@rollup/plugin-commonjs": ["@rollup/plugin-commonjs@29.0.3", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", "fdir": "^6.2.0", "is-reference": "1.2.1", "magic-string": "^0.30.3", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^2.68.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-ZaOxZceP7SOUW7Lqw5IRVweSQYWaeIPnXIGLiB690EBA3FGJTO40EEr2L5yZplJWsgTCogILRSpcAe7+U0Otdg=="], - - "@rollup/plugin-json": ["@rollup/plugin-json@6.1.0", "", { "dependencies": { "@rollup/pluginutils": "^5.1.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA=="], - - "@rollup/plugin-node-resolve": ["@rollup/plugin-node-resolve@16.0.3", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", "is-module": "^1.0.0", "resolve": "^1.22.1" }, "peerDependencies": { "rollup": "^2.78.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg=="], - - "@rollup/plugin-replace": ["@rollup/plugin-replace@6.0.3", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "magic-string": "^0.30.3" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA=="], - "@rollup/pluginutils": ["@rollup/pluginutils@5.4.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg=="], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.63.1", "", { "os": "android", "cpu": "arm" }, "sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ=="], - - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.63.1", "", { "os": "android", "cpu": "arm64" }, "sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ=="], - - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.63.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q=="], - - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.63.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg=="], - - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.63.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw=="], - - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.63.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q=="], - - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.63.1", "", { "os": "linux", "cpu": "arm" }, "sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw=="], - - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.63.1", "", { "os": "linux", "cpu": "arm" }, "sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw=="], - - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.63.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg=="], - - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.63.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw=="], - - "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.63.1", "", { "os": "linux", "cpu": "none" }, "sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ=="], - - "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.63.1", "", { "os": "linux", "cpu": "none" }, "sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA=="], - - "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.63.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA=="], - - "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.63.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA=="], - - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.63.1", "", { "os": "linux", "cpu": "none" }, "sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w=="], - - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.63.1", "", { "os": "linux", "cpu": "none" }, "sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ=="], - - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.63.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A=="], - - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.63.1", "", { "os": "linux", "cpu": "x64" }, "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w=="], - - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.63.1", "", { "os": "linux", "cpu": "x64" }, "sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow=="], - - "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.63.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA=="], - - "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.63.1", "", { "os": "none", "cpu": "arm64" }, "sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw=="], - - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.63.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg=="], - - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.63.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg=="], - - "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.63.1", "", { "os": "win32", "cpu": "x64" }, "sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg=="], - - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.63.1", "", { "os": "win32", "cpu": "x64" }, "sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w=="], - "@smithy/core": ["@smithy/core@3.33.3", "", { "dependencies": { "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-CsOeKq/9kA3y6VJHt+/+VTCtBaxJ4OTFpgrjIUhPpDIKxBci1k2bJaQASF2h/ELWrulGp+t97DZ0mevfAD8idg=="], "@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.5.2", "", { "dependencies": { "@smithy/core": "^3.33.2", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-A9uSdn72ozbRUSit0eib0TW7nXuNPlaeM0zcGkJ+nE6tFcSDbnmtwoxbTCFBukVQcszDAyvsd7+rTduPTXpygg=="], @@ -447,11 +387,11 @@ "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.13", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-wgKggnhZVL9Bfx1OaKKTrYY9BFRk6C8UAkQNUcIv1+llzYrIqy+RZm5HPKzn0NpEBvTVhTqB4kQyllZywsRBRQ=="], - "@sveltejs/adapter-node": ["@sveltejs/adapter-node@5.5.7", "", { "dependencies": { "@rollup/plugin-commonjs": "^29.0.0", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.0", "@rollup/plugin-replace": "^6.0.3", "rollup": "^4.59.0" }, "peerDependencies": { "@sveltejs/kit": "^2.4.0" } }, "sha512-uOfc9eVlI3A37RRSaKcgrheBYPrfJwC9VMqDp8x/O6tlKdcLLvHThSWD0KNIbjQ/d+7bwLGx3vx6aowAcRfd2g=="], + "@sveltejs/adapter-bun": ["@sveltejs/adapter-bun@1.0.0", "", { "dependencies": { "bun-types": "^1.3.14" }, "peerDependencies": { "@sveltejs/kit": "^3.0.0-next.0" } }, "sha512-CUfFNxrWrKk/0VqSM1DrXCAwpY3tWocaFwBohuBeyxKx07859shLqPdT9oo00lDti9PvVwhQMDS6bKQylTyv0g=="], "@sveltejs/enhanced-img": ["@sveltejs/enhanced-img@0.11.0", "", { "dependencies": { "magic-string": "^0.30.5", "sharp": "^0.34.1", "svelte-parse-markup": "^0.1.5", "vite-imagetools": "^9.0.3", "zimmerframe": "^1.1.2" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^6.0.0 || ^7.0.0", "svelte": "^5.0.0", "vite": "^6.3.0 || >=7.0.0" } }, "sha512-TN7VzGoqwFqvA4Faj1brUPHLtcEkyFa08nrn9bfm98yVrzr0g4bOZHjlBoPYHHX+sZNGE+cxznhTVgarECPQsA=="], - "@sveltejs/kit": ["@sveltejs/kit@2.70.3", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@sveltejs/acorn-typescript": "^1.0.9", "@types/cookie": "^0.6.0", "acorn": "^8.16.0", "cookie": "^0.6.0", "devalue": "^5.8.1", "esm-env": "^1.2.2", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "set-cookie-parser": "^3.0.0", "sirv": "^3.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": "^5.3.3 || ^6.0.0", "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0" }, "optionalPeers": ["@opentelemetry/api", "typescript"], "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-UDvEYuZqAMbfB/oXIoqKvbKcb7YczK5zYrzmsGV1zRJk03jntwp8dXiYoIJotxAndsKvcPFtx9H1GRSKFdSHgg=="], + "@sveltejs/kit": ["@sveltejs/kit@3.1.0", "", { "dependencies": { "@rolldown/pluginutils": "^1.0.1", "@standard-schema/spec": "^1.1.0", "cookie": "^2.0.1", "devalue": "^5.9.4", "esm-env": "^1.2.2", "magic-string": "^1.2.3", "mrmime": "^2.0.1", "sirv": "^3.0.2" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0", "@sveltejs/vite-plugin-svelte": "^7.0.0", "svelte": "^5.57.1", "typescript": "^6.0.0", "vite": "^8.0.12" }, "optionalPeers": ["@opentelemetry/api", "typescript"], "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-JTWlq2HQlkqx6vIoxhC0R6sc4WVqbQoRyEmr5YlqKmiYbzY1U3awtSWTmjMLlS056a49AmkQR6rnNANXIE8B0Q=="], "@sveltejs/load-config": ["@sveltejs/load-config@0.2.3", "", {}, "sha512-VT3qmUb8pRV2QrZjd8iAmtg8lf4W0TIjZbvXtz5MKei/q96teWZgGJyyidJzOjzZzvdq616eSRVeMYIQChUTAQ=="], @@ -493,8 +433,6 @@ "@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="], - "@types/cookie": ["@types/cookie@0.6.0", "", {}, "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="], - "@types/d3-geo": ["@types/d3-geo@3.1.1", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-65Emv9fQiQQqphLlRkuQ5ypPsOmWPhtBGCMv61JDPEPMvsx+gzhGf74yw1a78xFKPj6zw4AgQICJoQv0vK9M2w=="], "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], @@ -513,8 +451,6 @@ "@types/pg": ["@types/pg@8.23.1", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^2.2.0" } }, "sha512-fKVHpikPdg4GKks3JuLEhvwSyvwzF23hnabPy6DD8ljVbC7+6J5dQzdv4arV6jqq57djnMgs1HKBxX4P8aBI3A=="], - "@types/resolve": ["@types/resolve@1.20.2", "", {}, "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="], - "@types/topojson-client": ["@types/topojson-client@3.1.5", "", { "dependencies": { "@types/geojson": "*", "@types/topojson-specification": "*" } }, "sha512-C79rySTyPxnQNNguTZNI1Ct4D7IXgvyAs3p9HPecnl6mNrJ5+UhvGNYcZfpROYV2lMHI48kJPxwR+F9C6c7nmw=="], "@types/topojson-specification": ["@types/topojson-specification@1.0.5", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-C7KvcQh+C2nr6Y2Ub4YfgvWvWCgP2nOQMtfhlnwsRL4pYmmwzBS7HclGiS87eQfDOU/DLQpX6GEscviaz4yLIQ=="], @@ -631,6 +567,8 @@ "browserslist": ["browserslist@4.28.8", "", { "dependencies": { "baseline-browser-mapping": "^2.11.12", "caniuse-lite": "^1.0.30001809", "electron-to-chromium": "^1.5.402", "node-releases": "^2.0.53", "update-browserslist-db": "^1.3.0" }, "bin": "cli.js" }, "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA=="], + "bun-types": ["bun-types@1.4.3", "", { "dependencies": { "@types/node": "*", "undici-types": "*" } }, "sha512-tinRJNGOmUN+tEAsn2y2e942n9JHRHR42iUYzDH75NmhJqVBokGSQkkfSFdNWwsANIdrK6ACH9t01M452YyTwg=="], + "caniuse-lite": ["caniuse-lite@1.0.30001810", "", {}, "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg=="], "chai": ["chai@6.2.2", "", {}, "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg=="], @@ -645,13 +583,11 @@ "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], - "commondir": ["commondir@1.0.1", "", {}, "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="], - "confbox": ["confbox@0.2.4", "", {}, "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ=="], "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - "cookie": ["cookie@0.6.0", "", {}, "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="], + "cookie": ["cookie@2.0.1", "", {}, "sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w=="], "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], @@ -673,7 +609,7 @@ "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], - "devalue": ["devalue@5.9.2", "", {}, "sha512-po4PAY5c53tw5XMocSnf8A/5OHhbbUftpr93aEN6BBoAdntUmK7vu7wOATqvt7cXO7m1Cl4gMVn6p7n6n4mj0w=="], + "devalue": ["devalue@5.9.4", "", {}, "sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg=="], "drizzle-kit": ["drizzle-kit@1.0.0-rc.4", "", { "dependencies": { "@drizzle-team/brocli": "^0.12.0", "@js-temporal/polyfill": "^0.5.1", "esbuild": "^0.25.10", "get-tsconfig": "^4.13.6", "jiti": "^2.6.1" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-KZCpjRyu+oYHLj/UJogfFlOkWhHVkaEI2EOT1U3NDVXUzLoTyPjqwFxwOrlQxsY6jzRyxcz4EacqboGfhEeYrA=="], @@ -687,8 +623,6 @@ "enhanced-resolve": ["enhanced-resolve@5.24.5", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A=="], - "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], - "es-module-lexer": ["es-module-lexer@2.3.2", "", {}, "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw=="], "esbuild": ["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" }, "bin": "bin/esbuild" }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], @@ -753,8 +687,6 @@ "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], - "get-tsconfig": ["get-tsconfig@4.14.3", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA=="], "gl-matrix": ["gl-matrix@3.4.4", "", {}, "sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ=="], @@ -765,8 +697,6 @@ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - "hasown": ["hasown@2.0.4", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="], - "highlight.js": ["highlight.js@11.12.0", "", {}, "sha512-nbfWpyRMcMrPMmDwJB+dhX/eiaPKtc2RB+0QZskqJ3WjRA/FDS0e9hZrx8EC/lbEv8gXy98FcDbNa/dspAaJMg=="], "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], @@ -781,14 +711,10 @@ "internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="], - "is-core-module": ["is-core-module@2.16.2", "", { "dependencies": { "hasown": "^2.0.3" } }, "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA=="], - "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], - "is-module": ["is-module@1.0.0", "", {}, "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="], - "is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="], "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], @@ -815,8 +741,6 @@ "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], - "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], - "known-css-properties": ["known-css-properties@0.37.0", "", {}, "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ=="], "kysely": ["kysely@0.29.5", "", {}, "sha512-ooa+eSbBNPTo3MycPEuW5jdrxQdQwdtB3LC3h43FiXQbIry5tR0C5lDG7eealK0E4D7XjrnOP5DIUg/LyjRMYQ=="], @@ -909,8 +833,6 @@ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], - "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], - "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], "pbf": ["pbf@4.0.2", "", { "dependencies": { "resolve-protobuf-schema": "^2.1.0" }, "bin": "bin/pbf" }, "sha512-J0ajxARhZfpUEebxYs1vhMGMuLSXtBe1e+fFPDrf2uA2hgo+UshKfNUWOz92HJNz6/NFEXseQPddnHkTreWRqg=="], @@ -971,16 +893,12 @@ "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], - "resolve": ["resolve@1.22.12", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": "bin/resolve" }, "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA=="], - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], "resolve-protobuf-schema": ["resolve-protobuf-schema@2.1.0", "", { "dependencies": { "protocol-buffers-schema": "^3.3.1" } }, "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ=="], "rolldown": ["rolldown@1.2.6", "", { "dependencies": { "@oxc-project/types": "=0.147.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm-eabi": "1.2.6", "@rolldown/binding-android-arm64": "1.2.6", "@rolldown/binding-darwin-arm64": "1.2.6", "@rolldown/binding-darwin-x64": "1.2.6", "@rolldown/binding-freebsd-x64": "1.2.6", "@rolldown/binding-linux-arm-gnueabihf": "1.2.6", "@rolldown/binding-linux-arm64-gnu": "1.2.6", "@rolldown/binding-linux-arm64-musl": "1.2.6", "@rolldown/binding-linux-ppc64-gnu": "1.2.6", "@rolldown/binding-linux-s390x-gnu": "1.2.6", "@rolldown/binding-linux-x64-gnu": "1.2.6", "@rolldown/binding-linux-x64-musl": "1.2.6", "@rolldown/binding-openharmony-arm64": "1.2.6", "@rolldown/binding-win32-arm64-msvc": "1.2.6", "@rolldown/binding-win32-x64-msvc": "1.2.6" }, "bin": "bin/cli.mjs" }, "sha512-vMM4q3aixf46GiF1Kok8jDPFsEpXgFWGjUHXNkNHNm+Y2adXAG2dbX91jkti3i0ZRsOlcmbuzAz1poObSHCmUA=="], - "rollup": ["rollup@4.63.1", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@napi-rs/lzma-linux-x64-gnu": "1.5.1", "@rollup/rollup-android-arm-eabi": "4.63.1", "@rollup/rollup-android-arm64": "4.63.1", "@rollup/rollup-darwin-arm64": "4.63.1", "@rollup/rollup-darwin-x64": "4.63.1", "@rollup/rollup-freebsd-arm64": "4.63.1", "@rollup/rollup-freebsd-x64": "4.63.1", "@rollup/rollup-linux-arm-gnueabihf": "4.63.1", "@rollup/rollup-linux-arm-musleabihf": "4.63.1", "@rollup/rollup-linux-arm64-gnu": "4.63.1", "@rollup/rollup-linux-arm64-musl": "4.63.1", "@rollup/rollup-linux-loong64-gnu": "4.63.1", "@rollup/rollup-linux-loong64-musl": "4.63.1", "@rollup/rollup-linux-ppc64-gnu": "4.63.1", "@rollup/rollup-linux-ppc64-musl": "4.63.1", "@rollup/rollup-linux-riscv64-gnu": "4.63.1", "@rollup/rollup-linux-riscv64-musl": "4.63.1", "@rollup/rollup-linux-s390x-gnu": "4.63.1", "@rollup/rollup-linux-x64-gnu": "4.63.1", "@rollup/rollup-linux-x64-musl": "4.63.1", "@rollup/rollup-openbsd-x64": "4.63.1", "@rollup/rollup-openharmony-arm64": "4.63.1", "@rollup/rollup-win32-arm64-msvc": "4.63.1", "@rollup/rollup-win32-ia32-msvc": "4.63.1", "@rollup/rollup-win32-x64-gnu": "4.63.1", "@rollup/rollup-win32-x64-msvc": "4.63.1", "fsevents": "~2.3.2" }, "bin": "dist/bin/rollup" }, "sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg=="], - "rou3": ["rou3@0.9.2", "", {}, "sha512-3SOzvaAg8rkHrXtRjpCvCvbyO5to9oOO27Z/XqHEYXfMRVSw/qMIVdmaOk9W2lcRLtR6dlqTjo9hDeJk70QBYQ=="], "runed": ["runed@0.35.1", "", { "dependencies": { "dequal": "^2.0.3", "esm-env": "^1.0.0", "lz-string": "^1.5.0" }, "peerDependencies": { "@sveltejs/kit": "^2.21.0", "svelte": "^5.7.0" }, "optionalPeers": ["@sveltejs/kit"] }, "sha512-2F4Q/FZzbeJTFdIS/PuOoPRSm92sA2LhzTnv6FXhCoENb3huf5+fDuNOg1LNvGOouy3u/225qxmuJvcV3IZK5Q=="], @@ -1011,9 +929,7 @@ "style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="], - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], - - "svelte": ["svelte@5.57.0", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.10", "@types/estree": "^1.0.5", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.8.1", "esm-env": "^1.2.1", "esrap": "^2.2.12", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-NdbDn7fl4be1ViUG0oq/lvG6OZy3oENolV2ONjiqqsfVoeAfzaQAKUcEX3MrQod/Bebv1PgwET9rfXhgn9s4Kg=="], + "svelte": ["svelte@5.57.2", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "@jridgewell/sourcemap-codec": "^1.6.0", "@sveltejs/acorn-typescript": "^1.0.13", "@types/estree": "^1.0.9", "acorn": "^8.18.0", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.9.2", "esm-env": "^1.2.1", "esrap": "^2.3.6", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-1YiPCAXT0Ct6g1vOMmSLa0Nsc3QRMvtDF32ihgglGVrugIuIK38RyDiFNXVDhtQ81TJjSO57NdMw6DyYLqSGDQ=="], "svelte-check": ["svelte-check@4.7.6", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "@sveltejs/load-config": "^0.2.3", "chokidar": "^4.0.1", "fdir": "^6.2.0", "picocolors": "^1.0.0", "sade": "^1.7.4" }, "peerDependencies": { "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": "^5.0.0 || ^6.0.0" }, "bin": "bin/svelte-check" }, "sha512-t2scM//ZuVbSY/T2w6FSBw1v9s2NEmh/g+sy1lqtosW5ylBV5AF4wFb1Ts9Kf3MbfPDUDJDZ9L436YT0SPTdvw=="], @@ -1111,12 +1027,10 @@ "@maplibre/vt-pbf/pbf": ["pbf@5.1.2", "", { "dependencies": { "resolve-protobuf-schema": "^2.1.0" }, "bin": "bin/pbf" }, "sha512-mnvGdvOrIvJOBGUEdGkrVXjN8E/VkIJCkf2eS1DH2yv82ORUlLttmDt0rWY38yYZmVwciZwBUvHM20qxBZf40w=="], - "@rollup/plugin-commonjs/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], - - "@rollup/plugin-commonjs/is-reference": ["is-reference@1.2.1", "", { "dependencies": { "@types/estree": "*" } }, "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ=="], - "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + "@sveltejs/kit/magic-string": ["magic-string@1.2.3", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g=="], + "@sveltejs/vite-plugin-svelte/magic-string": ["magic-string@1.2.3", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g=="], "@tailwindcss/node/lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], @@ -1151,8 +1065,6 @@ "postcss/nanoid": ["nanoid@3.3.18", "", { "bin": "bin/nanoid.cjs" }, "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w=="], - "rollup/fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], - "shadcn-svelte/cn": ["cn@0.3.3", "", { "bin": { "cn": "bin/cn.mjs" } }, "sha512-OEiyJkSpYm2kOuNOKQ+c2wmzZRG8orrb9fnObtHTbCGNx/E9KLnGcmcocItOzREKk5KzQN5I2e3BUCj563KEpw=="], "svelte-eslint-parser/eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], diff --git a/drizzle.config.ts b/drizzle.config.ts index 3b1bd5b..6b51eb0 100755 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -7,6 +7,6 @@ export default defineConfig({ verbose: true, strict: true, dbCredentials: { - url: process.env.DB_URL + url: process.env.DB_URL! } }); diff --git a/package.json b/package.json index ec26fb9..59da4d5 100755 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "dev": "vite dev", - "build": "vite build", + "build": "bun --bun vite build", "preview": "vite preview", "test": "npm run test:integration && npm run test:unit", "check": "svelte-kit sync && svelte-check --tsgo --tsconfig ./tsconfig.json", @@ -49,8 +49,9 @@ "@internationalized/date": "^3.12.0", "@lucide/svelte": "^1.48.0", "@playwright/test": "^1.62.1", + "@sveltejs/adapter-bun": "^1.0.0", "@sveltejs/enhanced-img": "^0.11.0", - "@sveltejs/kit": "^2.70.3", + "@sveltejs/kit": "^3.0.0", "@sveltejs/vite-plugin-svelte": "^7.3.0", "@tailwindcss/typography": "^0.5.20", "@tailwindcss/vite": "^4.3.3", @@ -73,7 +74,7 @@ "prettier": "3.9.6", "prettier-plugin-svelte": "^4.1.1", "shadcn-svelte": "^1.7.0", - "svelte": "^5.57.0", + "svelte": "^5.57.1", "svelte-check": "4.7.6", "tailwind-merge": "^3.6.0", "tailwind-variants": "^3.3.1", @@ -91,7 +92,6 @@ "@aws-sdk/client-s3": "^3.1121.0", "@aws-sdk/s3-request-presigner": "^3.1121.0", "@maptiler/sdk": "^4.1.0", - "@sveltejs/adapter-node": "^5.5.7", "ai": "^7.0.85", "d3-geo": "^3.1.1", "drizzle-orm": "^1.0.0-rc.4", @@ -104,5 +104,9 @@ "topojson-client": "^3.1.0", "world-atlas": "^2.0.2", "zod": "^4.5.4" + }, + "imports": { + "#lib": "./src/lib/index.js", + "#lib/*": "./src/lib/*" } } diff --git a/src/app.d.ts b/src/app.d.ts index 44ed404..6a21d25 100755 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -6,12 +6,12 @@ declare global { namespace App { // interface Error {} interface Locals { - user: typeof import('$lib/server/auth').auth.$Infer.Session.user | null; - session: typeof import('$lib/server/auth').auth.$Infer.Session.session | null; + user: typeof import('#lib/server/auth.js').auth.$Infer.Session.user | null; + session: typeof import('#lib/server/auth.js').auth.$Infer.Session.session | null; } // interface PageData {} interface PageState { - animal?: import('$lib/animaldex/AnimalDetails.svelte').AnimalDetail; + animal?: import('#lib/animaldex/AnimalDetails.svelte').AnimalDetail; } // interface Platform {} } diff --git a/src/env.ts b/src/env.ts new file mode 100644 index 0000000..2105297 --- /dev/null +++ b/src/env.ts @@ -0,0 +1,27 @@ +import { defineEnvVars } from '@sveltejs/kit/env'; + +// Every variable is optional and falls back to '' (falsy, like an unset $env/dynamic +// value used to be); the code that uses each one checks whether it is configured. +export const variables = defineEnvVars({ + PUBLIC_MAPTILER_API_KEY: { public: true, schema: (input) => input ?? '' }, + R2_PUBLIC_URL: { schema: (input) => input ?? '' }, + ORIGIN: { schema: (input) => input ?? '' }, + BETTER_AUTH_SECRET: { schema: (input) => input ?? '' }, + BETTER_AUTH_URL: { schema: (input) => input ?? '' }, + GOOGLE_CLIENT_ID: { schema: (input) => input ?? '' }, + GOOGLE_CLIENT_SECRET: { schema: (input) => input ?? '' }, + OSU_CLIENT_ID: { schema: (input) => input ?? '' }, + OSU_CLIENT_SECRET: { schema: (input) => input ?? '' }, + ANTHROPIC_API_KEY: { schema: (input) => input ?? '' }, + HOUSE_WORKER_TOKEN: { schema: (input) => input ?? '' }, + HOUSE_DISCORD_WEBHOOK_URL: { schema: (input) => input ?? '' }, + HOUSE_NTFY_URL: { schema: (input) => input ?? '' }, + HOUSE_NTFY_TOKEN: { schema: (input) => input ?? '' }, + R2_ACCESS_KEY_ID: { schema: (input) => input ?? '' }, + R2_SECRET_ACCESS_KEY: { schema: (input) => input ?? '' }, + R2_ACCOUNT_ID: { schema: (input) => input ?? '' }, + R2_BUCKET: { schema: (input) => input ?? '' }, + SPOTIFY_CLIENT_ID: { schema: (input) => input ?? '' }, + SPOTIFY_CLIENT_SECRET: { schema: (input) => input ?? '' }, + DB_URL: { schema: (input) => input ?? '' } +}); diff --git a/src/hooks.server.ts b/src/hooks.server.ts index 9e2f4ba..ce4a248 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -1,6 +1,6 @@ -import { building } from '$app/environment'; -import { auth } from '$lib/server/auth'; -import type { Handle } from '@sveltejs/kit'; +import type { Handle } from '@sveltejs/kit/hooks'; +import { building } from '$app/env'; +import { auth } from '#lib/server/auth.js'; export const handle: Handle = async ({ event, resolve }) => { // Match the endpoint path here: the dev proxy may terminate HTTPS before Vite. diff --git a/src/lib/animaldex/AnimalDetails.svelte b/src/lib/animaldex/AnimalDetails.svelte index be989ce..3a3dc70 100644 --- a/src/lib/animaldex/AnimalDetails.svelte +++ b/src/lib/animaldex/AnimalDetails.svelte @@ -101,7 +101,7 @@ i saw this animal too
Sign in to save progressSign in to save progress{:else}Artwork creditsArtwork credits{/if}
@@ -87,7 +87,7 @@ {#each data.pokemon.games as game (game.id)} {:else}Choose your games in “set rules” to build your collection here.{/if}
@@ -135,7 +135,7 @@
{#each data.callOfDuty as game (game.slug)} @@ -169,7 +169,7 @@
diff --git a/src/routes/projects/game-tracker/call-of-duty/[slug]/+page.server.ts b/src/routes/projects/game-tracker/call-of-duty/[slug]/+page.server.ts index aa371da..30524bb 100644 --- a/src/routes/projects/game-tracker/call-of-duty/[slug]/+page.server.ts +++ b/src/routes/projects/game-tracker/call-of-duty/[slug]/+page.server.ts @@ -3,7 +3,7 @@ import achievementArt from '../../../../../../data/cod-achievement-art.json'; const achievementImages: Record = achievementArt; import { and, asc, eq, sql } from 'drizzle-orm'; import type { AnyPgColumn } from 'drizzle-orm/pg-core'; -import { db } from '$lib/server/db'; +import { db } from '#lib/server/db/index.js'; import { trackerGames, trackerItems, @@ -12,11 +12,15 @@ import { trackerWeaponRanks, trackerChallenges, trackerChallengeProgress -} from '$lib/server/db/schema'; -import { boundedInteger } from '$lib/game-tracker/journal'; -import { appliesTo } from '$lib/game-tracker/mastery'; -import { playerRankLimits, weaponRankLimits, type RankLimits } from '$lib/game-tracker/rank-limits'; -import { maxUncappedLevel, stepRank } from '$lib/game-tracker/rank-progress'; +} from '#lib/server/db/schema/index.js'; +import { boundedInteger } from '#lib/game-tracker/journal.js'; +import { appliesTo } from '#lib/game-tracker/mastery.js'; +import { + playerRankLimits, + weaponRankLimits, + type RankLimits +} from '#lib/game-tracker/rank-limits.js'; +import { maxUncappedLevel, stepRank } from '#lib/game-tracker/rank-progress.js'; import type { Actions, PageServerLoad } from './$types'; async function findGame(slug: string) { diff --git a/src/routes/projects/game-tracker/call-of-duty/[slug]/+page.svelte b/src/routes/projects/game-tracker/call-of-duty/[slug]/+page.svelte index 4c35140..68d627c 100644 --- a/src/routes/projects/game-tracker/call-of-duty/[slug]/+page.svelte +++ b/src/routes/projects/game-tracker/call-of-duty/[slug]/+page.svelte @@ -1,11 +1,11 @@ diff --git a/src/routes/projects/language-learner/[lang]/lesson/[lesson]/+page.svelte b/src/routes/projects/language-learner/[lang]/lesson/[lesson]/+page.svelte index 62e37bd..de154ec 100644 --- a/src/routes/projects/language-learner/[lang]/lesson/[lesson]/+page.svelte +++ b/src/routes/projects/language-learner/[lang]/lesson/[lesson]/+page.svelte @@ -3,15 +3,15 @@ import { onMount } from 'svelte'; import ArrowLeft from 'lucide-svelte/icons/arrow-left'; import ArrowRight from 'lucide-svelte/icons/arrow-right'; - import { lessonSession } from '$lib/language-learner/exercises'; - import { romanize } from '$lib/language-learner/hangul'; - import { progress } from '$lib/language-learner/progress.svelte'; - import { seeded } from '$lib/language-learner/random'; - import { hasVoice } from '$lib/language-learner/speech'; - import type { Exercise, SessionResult } from '$lib/language-learner/types'; - import Results from '$lib/language-learner/ui/Results.svelte'; - import Session from '$lib/language-learner/ui/Session.svelte'; - import Speak from '$lib/language-learner/ui/Speak.svelte'; + import { lessonSession } from '#lib/language-learner/exercises.js'; + import { romanize } from '#lib/language-learner/hangul.js'; + import { progress } from '#lib/language-learner/progress.svelte.js'; + import { seeded } from '#lib/language-learner/random.js'; + import { hasVoice } from '#lib/language-learner/speech.js'; + import type { Exercise, SessionResult } from '#lib/language-learner/types.js'; + import Results from '#lib/language-learner/ui/Results.svelte'; + import Session from '#lib/language-learner/ui/Session.svelte'; + import Speak from '#lib/language-learner/ui/Speak.svelte'; let { data } = $props(); const course = $derived(data.course); diff --git a/src/routes/projects/language-learner/[lang]/lesson/[lesson]/+page.ts b/src/routes/projects/language-learner/[lang]/lesson/[lesson]/+page.ts index b617c7f..1097d88 100644 --- a/src/routes/projects/language-learner/[lang]/lesson/[lesson]/+page.ts +++ b/src/routes/projects/language-learner/[lang]/lesson/[lesson]/+page.ts @@ -1,6 +1,6 @@ import { error } from '@sveltejs/kit'; import { marked } from 'marked'; -import { allLessons } from '$lib/language-learner/course'; +import { allLessons } from '#lib/language-learner/course.js'; import type { PageLoad } from './$types'; export const load: PageLoad = async ({ parent, params }) => { diff --git a/src/routes/projects/language-learner/[lang]/practice/[mode]/+page.svelte b/src/routes/projects/language-learner/[lang]/practice/[mode]/+page.svelte index 47fc8a3..8e38a06 100644 --- a/src/routes/projects/language-learner/[lang]/practice/[mode]/+page.svelte +++ b/src/routes/projects/language-learner/[lang]/practice/[mode]/+page.svelte @@ -2,14 +2,14 @@ import { resolve } from '$app/paths'; import { onMount } from 'svelte'; import ArrowLeft from 'lucide-svelte/icons/arrow-left'; - import { mixed, reviews, scopeOf } from '$lib/language-learner/challenges'; - import { progress } from '$lib/language-learner/progress.svelte'; - import { seeded, type Rng } from '$lib/language-learner/random'; - import { hasVoice } from '$lib/language-learner/speech'; - import { dayKey } from '$lib/language-learner/srs'; - import type { Exercise, SessionResult } from '$lib/language-learner/types'; - import Results from '$lib/language-learner/ui/Results.svelte'; - import Session from '$lib/language-learner/ui/Session.svelte'; + import { mixed, reviews, scopeOf } from '#lib/language-learner/challenges.js'; + import { progress } from '#lib/language-learner/progress.svelte.js'; + import { seeded, type Rng } from '#lib/language-learner/random.js'; + import { hasVoice } from '#lib/language-learner/speech.js'; + import { dayKey } from '#lib/language-learner/srs.js'; + import type { Exercise, SessionResult } from '#lib/language-learner/types.js'; + import Results from '#lib/language-learner/ui/Results.svelte'; + import Session from '#lib/language-learner/ui/Session.svelte'; let { data } = $props(); const course = $derived(data.course); diff --git a/src/routes/projects/language-learner/[lang]/practice/[mode]/+page.ts b/src/routes/projects/language-learner/[lang]/practice/[mode]/+page.ts index 1c78bc1..0e0f145 100644 --- a/src/routes/projects/language-learner/[lang]/practice/[mode]/+page.ts +++ b/src/routes/projects/language-learner/[lang]/practice/[mode]/+page.ts @@ -1,5 +1,5 @@ import { error } from '@sveltejs/kit'; -import { MODES } from '$lib/language-learner/modes'; +import { MODES } from '#lib/language-learner/modes.js'; import type { PageLoad } from './$types'; export type Mode = diff --git a/src/routes/projects/language-learner/[lang]/words/+page.svelte b/src/routes/projects/language-learner/[lang]/words/+page.svelte index ccb3b53..360cbc6 100644 --- a/src/routes/projects/language-learner/[lang]/words/+page.svelte +++ b/src/routes/projects/language-learner/[lang]/words/+page.svelte @@ -2,13 +2,13 @@ import { resolve } from '$app/paths'; import { onMount } from 'svelte'; import ArrowLeft from 'lucide-svelte/icons/arrow-left'; - import { allLessons } from '$lib/language-learner/course'; - import { romanize } from '$lib/language-learner/hangul'; - import { progress } from '$lib/language-learner/progress.svelte'; - import { hasVoice } from '$lib/language-learner/speech'; - import { mastery, type Mastery } from '$lib/language-learner/srs'; - import { normalize } from '$lib/language-learner/text'; - import Speak from '$lib/language-learner/ui/Speak.svelte'; + import { allLessons } from '#lib/language-learner/course.js'; + import { romanize } from '#lib/language-learner/hangul.js'; + import { progress } from '#lib/language-learner/progress.svelte.js'; + import { hasVoice } from '#lib/language-learner/speech.js'; + import { mastery, type Mastery } from '#lib/language-learner/srs.js'; + import { normalize } from '#lib/language-learner/text.js'; + import Speak from '#lib/language-learner/ui/Speak.svelte'; let { data } = $props(); const course = $derived(data.course); diff --git a/src/routes/projects/money-tracker/+page.server.ts b/src/routes/projects/money-tracker/+page.server.ts index 6907484..fe82f92 100644 --- a/src/routes/projects/money-tracker/+page.server.ts +++ b/src/routes/projects/money-tracker/+page.server.ts @@ -1,4 +1,4 @@ -import { db } from '$lib/server/db'; +import { db } from '#lib/server/db/index.js'; import { moneyAccounts, moneyTransactions, @@ -9,8 +9,8 @@ import { moneyWishlist, moneyInsurances, moneyProjectionSettings -} from '$lib/server/db/schema'; -import { requireAdmin } from '$lib/server/authorization'; +} from '#lib/server/db/schema/index.js'; +import { requireAdmin } from '#lib/server/authorization.js'; import { type ImportedTransaction, cadence, @@ -22,7 +22,7 @@ import { textField, utilityKind, validDate -} from '$lib/server/money-tracker'; +} from '#lib/server/money-tracker.js'; import { and, asc, desc, eq } from 'drizzle-orm'; import { error, redirect } from '@sveltejs/kit'; import type { Actions, PageServerLoad } from './$types'; diff --git a/src/routes/projects/money-tracker/+page.svelte b/src/routes/projects/money-tracker/+page.svelte index 3a2a7fa..13b16ab 100644 --- a/src/routes/projects/money-tracker/+page.svelte +++ b/src/routes/projects/money-tracker/+page.svelte @@ -4,10 +4,10 @@ onMount(() => { hydrated = true; }); - import { NativeSelect } from '$lib/components/ui/native-select/index.js'; - import { Textarea } from '$lib/components/ui/textarea/index.js'; - import { Checkbox } from '$lib/components/ui/checkbox/index.js'; - import * as Dialog from '$lib/components/ui/dialog/index.js'; + import { NativeSelect } from '#lib/components/ui/native-select/index.js'; + import { Textarea } from '#lib/components/ui/textarea/index.js'; + import { Checkbox } from '#lib/components/ui/checkbox/index.js'; + import * as Dialog from '#lib/components/ui/dialog/index.js'; import './money-tracker.css'; import { enhance } from '$app/forms'; import Plus from 'lucide-svelte/icons/plus'; @@ -15,10 +15,10 @@ import Trash2 from 'lucide-svelte/icons/trash-2'; import Upload from 'lucide-svelte/icons/upload'; import Download from 'lucide-svelte/icons/download'; - import MoneyChart from '$lib/money-tracker/MoneyChart.svelte'; - import { Button } from '$lib/components/ui/button/index.js'; - import { Input } from '$lib/components/ui/input/index.js'; - import * as Tabs from '$lib/components/ui/tabs/index.js'; + import MoneyChart from '#lib/money-tracker/MoneyChart.svelte'; + import { Button } from '#lib/components/ui/button/index.js'; + import { Input } from '#lib/components/ui/input/index.js'; + import * as Tabs from '#lib/components/ui/tabs/index.js'; import { accountBalances, accountColor, @@ -27,7 +27,7 @@ utilityEstimate, wealthProjection, wealthTimeline - } from '$lib/money-tracker/charts'; + } from '#lib/money-tracker/charts.js'; import type { PageProps } from './$types'; let { data, form }: PageProps = $props(); diff --git a/src/routes/projects/progress/+page.server.ts b/src/routes/projects/progress/+page.server.ts index 253d2cb..239d54f 100755 --- a/src/routes/projects/progress/+page.server.ts +++ b/src/routes/projects/progress/+page.server.ts @@ -1,4 +1,4 @@ -import { db } from '$lib/server/db'; +import { db } from '#lib/server/db/index.js'; export const load = async () => { return { diff --git a/src/routes/projects/progress/+page.svelte b/src/routes/projects/progress/+page.svelte index 1e751c9..15359fe 100755 --- a/src/routes/projects/progress/+page.svelte +++ b/src/routes/projects/progress/+page.svelte @@ -1,10 +1,10 @@
- + {#if data.task}

{data.task.name}

diff --git a/src/routes/projects/progress/create/+page.server.ts b/src/routes/projects/progress/create/+page.server.ts index 8476c85..b479302 100755 --- a/src/routes/projects/progress/create/+page.server.ts +++ b/src/routes/projects/progress/create/+page.server.ts @@ -1,7 +1,7 @@ -import { requireAdmin } from '$lib/server/authorization'; +import { requireAdmin } from '#lib/server/authorization.js'; import type { Actions } from './$types'; -import { db } from '$lib/server/db'; -import { tasks } from '$lib/server/db/schema'; +import { db } from '#lib/server/db/index.js'; +import { tasks } from '#lib/server/db/schema/index.js'; import { redirect } from '@sveltejs/kit'; export const actions: Actions = { diff --git a/src/routes/projects/progress/create/+page.svelte b/src/routes/projects/progress/create/+page.svelte index c05fcca..6ba9aa5 100755 --- a/src/routes/projects/progress/create/+page.svelte +++ b/src/routes/projects/progress/create/+page.svelte @@ -1,13 +1,13 @@
- + Create task
diff --git a/src/routes/projects/progress/topics/+page.server.ts b/src/routes/projects/progress/topics/+page.server.ts index 05e20eb..c7eeb13 100644 --- a/src/routes/projects/progress/topics/+page.server.ts +++ b/src/routes/projects/progress/topics/+page.server.ts @@ -1,4 +1,4 @@ -import { db } from '$lib/server/db'; +import { db } from '#lib/server/db/index.js'; import type { PageServerLoad } from './$types'; export const load: PageServerLoad = async () => { diff --git a/src/routes/projects/progress/topics/+page.svelte b/src/routes/projects/progress/topics/+page.svelte index 8c206bb..4b11cd2 100644 --- a/src/routes/projects/progress/topics/+page.svelte +++ b/src/routes/projects/progress/topics/+page.svelte @@ -1,13 +1,13 @@
- +

topics

{ return { diff --git a/src/routes/projects/progress/topics/[id]/+page.svelte b/src/routes/projects/progress/topics/[id]/+page.svelte index 649b038..9413276 100644 --- a/src/routes/projects/progress/topics/[id]/+page.svelte +++ b/src/routes/projects/progress/topics/[id]/+page.svelte @@ -1,14 +1,13 @@
- + {#if data.topic}

{data.topic.name}

{data.topic.topicsToTasks.length} tasks

diff --git a/src/routes/projects/spotify-beatmap-finder/+page.server.ts b/src/routes/projects/spotify-beatmap-finder/+page.server.ts index 8b664d6..93b7d2b 100644 --- a/src/routes/projects/spotify-beatmap-finder/+page.server.ts +++ b/src/routes/projects/spotify-beatmap-finder/+page.server.ts @@ -1,11 +1,11 @@ import type { Actions } from './$types'; import { fail } from '@sveltejs/kit'; -import { parseSpotifyInput } from '$lib/map-finder/input'; -import type { TrackMatchResult } from '$lib/map-finder/types'; -import { getSpotifyMetadata } from '$lib/server/spotify'; -import { getOsuMaps, MATCH_CONCURRENCY } from '$lib/server/osu'; -import { ApiError, publicError, logApiError, mapConcurrent } from '$lib/server/finder-http'; -import { acquireSearch } from '$lib/server/finder-limit'; +import { parseSpotifyInput } from '#lib/map-finder/input.js'; +import type { TrackMatchResult } from '#lib/map-finder/types.js'; +import { getSpotifyMetadata } from '#lib/server/spotify.js'; +import { getOsuMaps, MATCH_CONCURRENCY } from '#lib/server/osu.js'; +import { ApiError, publicError, logApiError, mapConcurrent } from '#lib/server/finder-http.js'; +import { acquireSearch } from '#lib/server/finder-limit.js'; export const actions: Actions = { default: async ({ request, fetch, getClientAddress }) => { const data = await request.formData(); diff --git a/src/routes/projects/spotify-beatmap-finder/+page.svelte b/src/routes/projects/spotify-beatmap-finder/+page.svelte index 69a9789..b90531c 100644 --- a/src/routes/projects/spotify-beatmap-finder/+page.svelte +++ b/src/routes/projects/spotify-beatmap-finder/+page.svelte @@ -1,12 +1,12 @@ diff --git a/src/routes/robots.txt/+server.ts b/src/routes/robots.txt/+server.ts index d008139..ce7d7e5 100644 --- a/src/routes/robots.txt/+server.ts +++ b/src/routes/robots.txt/+server.ts @@ -1,4 +1,4 @@ -import { SITE_ORIGIN } from '$lib/seo'; +import { SITE_ORIGIN } from '#lib/seo.js'; import type { RequestHandler } from './$types'; export const GET: RequestHandler = ({ url }) => { diff --git a/src/routes/sitemap.xml/+server.ts b/src/routes/sitemap.xml/+server.ts index 86f2b2c..76a3019 100644 --- a/src/routes/sitemap.xml/+server.ts +++ b/src/routes/sitemap.xml/+server.ts @@ -1,8 +1,8 @@ -import { db } from '$lib/server/db'; -import { blogArticles } from '$lib/server/db/schema'; -import { SITE_ORIGIN } from '$lib/seo'; -import { races } from '$lib/derby/races'; -import { COURSES } from '$lib/language-learner/courses'; +import { db } from '#lib/server/db/index.js'; +import { blogArticles } from '#lib/server/db/schema/index.js'; +import { SITE_ORIGIN } from '#lib/seo.js'; +import { races } from '#lib/derby/races.js'; +import { COURSES } from '#lib/language-learner/courses/index.js'; import { eq } from 'drizzle-orm'; import type { RequestHandler } from './$types'; diff --git a/svelte.config.js b/svelte.config.js deleted file mode 100755 index 10bf3f2..0000000 --- a/svelte.config.js +++ /dev/null @@ -1,27 +0,0 @@ -import adapter from '@sveltejs/adapter-node'; -import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; - -/** @type {import('@sveltejs/kit').Config} */ -const config = { - // Consult https://kit.svelte.dev/docs/integrations#preprocessors - // for more information about preprocessors - preprocess: vitePreprocess(), - - kit: { - // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. - // If your environment is not supported, or you settled on a specific environment, switch out the adapter. - // See https://kit.svelte.dev/docs/adapters for more information about adapters. - adapter: adapter(), - csrf: { - // vite dev has no way to trust X-Forwarded-Proto, so it thinks every - // request is http:// even though Caddy terminates TLS in front of it, - // causing a scheme mismatch against the browser's https Origin header. - // The built adapter-node server (production) handles this correctly via - // ORIGIN/PROTOCOL_HEADER, so only relax the check in dev. - // checkOrigin: process.env.NODE_ENV === 'production', - trustedOrigins: ['https://dev.stanrunge.dev'] - } - } -}; - -export default config; diff --git a/tsconfig.json b/tsconfig.json index aa36266..2e9f6a2 100755 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,15 +1,8 @@ { - "extends": "./.svelte-kit/tsconfig.json", + "extends": "$app/tsconfig", "compilerOptions": { - "allowJs": true, - "checkJs": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "skipLibCheck": true, "sourceMap": true, - "strict": true, - "moduleResolution": "bundler" + "strict": true }, "exclude": [ "node_modules/**", @@ -20,10 +13,6 @@ "src/service-worker/**/*.ts", "src/service-worker.d.ts", "src/service-worker/**/*.d.ts" - ] - // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias - // except $lib which is handled by https://kit.svelte.dev/docs/configuration#files - // - // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes - // from the referenced tsconfig.json - TypeScript does not merge them in + ], + "include": ["src", "vite.config.ts", "drizzle.config.ts", "playwright.config.ts", "tests"] } diff --git a/vite.config.ts b/vite.config.ts index 0d4c8c9..9a42542 100755 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,3 +1,5 @@ +import adapter from '@sveltejs/adapter-bun'; +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; import { sveltekit } from '@sveltejs/kit/vite'; import tailwindcss from '@tailwindcss/vite'; import { defineConfig } from 'vitest/config'; @@ -5,10 +7,27 @@ import Icons from 'unplugin-icons/vite'; import { enhancedImages } from '@sveltejs/enhanced-img'; export default defineConfig({ - plugins: [tailwindcss(), enhancedImages(), sveltekit(), Icons({ compiler: 'svelte' })], - test: { - include: ['src/**/*.{test,spec}.{js,ts}'] - }, + plugins: [ + tailwindcss(), + enhancedImages(), + sveltekit({ + // Consult https://svelte.dev/docs/kit/integrations#preprocessors + // for more information about preprocessors + preprocess: vitePreprocess(), + + // Production runs `bun ./build` behind Caddy, which terminates TLS. Without + // paths.origin the server takes the host from the Host header and assumes + // https, which is right for both staging and production from one image. + adapter: adapter(), + + csrf: { + // Allow form posts from the dev site, which Caddy also serves over https. + trustedOrigins: ['https://dev.stanrunge.dev'] + } + }), + Icons({ compiler: 'svelte' }) + ], + test: { include: ['src/**/*.{test,spec}.{js,ts}'] }, server: { host: '127.0.0.1', allowedHosts: ['dev.stanrunge.dev'],