feat: upgrade to SvelteKit 3 and adapter-bun
Some checks failed
Test and deploy staging / staging (push) Failing after 43s

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 <noreply@anthropic.com>
This commit is contained in:
2026-10-18 22:17:30 +00:00
parent b52e9188f4
commit 54924b39f0
240 changed files with 894 additions and 944 deletions

View File

@@ -1,7 +1,7 @@
<script lang="ts">
import './language-learner.css';
import { onMount } from 'svelte';
import { progress } from '$lib/language-learner/progress.svelte';
import { progress } from '#lib/language-learner/progress.svelte.js';
let { children } = $props();

View File

@@ -1,5 +1,5 @@
import { allEntries, allLessons } from '$lib/language-learner/course';
import { COURSES, loadCourse } from '$lib/language-learner/courses';
import { allEntries, allLessons } from '#lib/language-learner/course.js';
import { COURSES, loadCourse } from '#lib/language-learner/courses/index.js';
import type { PageServerLoad } from './$types';
// Counted on the server so the overview doesn't download three full courses.

View File

@@ -1,16 +1,16 @@
<script lang="ts">
import * as AlertDialog from '$lib/components/ui/alert-dialog/index.js';
import * as AlertDialog from '#lib/components/ui/alert-dialog/index.js';
let resetTarget = $state<{ code: LangCode; name: string } | null>(null);
import { resolve } from '$app/paths';
import ArrowRight from 'lucide-svelte/icons/arrow-right';
import Flame from 'lucide-svelte/icons/flame';
import ProgressBar from '$lib/components/ProgressBar.svelte';
import { Button } from '$lib/components/ui/button/index.js';
import * as Card from '$lib/components/ui/card/index.js';
import { Badge } from '$lib/components/ui/badge/index.js';
import { COURSES } from '$lib/language-learner/courses';
import { progress } from '$lib/language-learner/progress.svelte';
import type { LangCode } from '$lib/language-learner/types';
import ProgressBar from '#lib/components/ProgressBar.svelte';
import { Button } from '#lib/components/ui/button/index.js';
import * as Card from '#lib/components/ui/card/index.js';
import { Badge } from '#lib/components/ui/badge/index.js';
import { COURSES } from '#lib/language-learner/courses/index.js';
import { progress } from '#lib/language-learner/progress.svelte.js';
import type { LangCode } from '#lib/language-learner/types.js';
let { data } = $props();

View File

@@ -1,6 +1,6 @@
import { error } from '@sveltejs/kit';
import { isLang, loadCourse } from '$lib/language-learner/courses';
import { loadDrills } from '$lib/language-learner/drills';
import { isLang, loadCourse } from '#lib/language-learner/courses/index.js';
import { loadDrills } from '#lib/language-learner/drills/index.js';
import type { LayoutLoad } from './$types';
export const load: LayoutLoad = async ({ params }) => {

View File

@@ -3,11 +3,11 @@
import ArrowLeft from 'lucide-svelte/icons/arrow-left';
import Check from 'lucide-svelte/icons/check';
import Flame from 'lucide-svelte/icons/flame';
import ProgressBar from '$lib/components/ProgressBar.svelte';
import { allLessons } from '$lib/language-learner/course';
import { progress } from '$lib/language-learner/progress.svelte';
import { dayKey } from '$lib/language-learner/srs';
import { MODES } from '$lib/language-learner/modes';
import ProgressBar from '#lib/components/ProgressBar.svelte';
import { allLessons } from '#lib/language-learner/course.js';
import { progress } from '#lib/language-learner/progress.svelte.js';
import { dayKey } from '#lib/language-learner/srs.js';
import { MODES } from '#lib/language-learner/modes.js';
let { data } = $props();
const course = $derived(data.course);
@@ -22,7 +22,7 @@
</script>
<a
href={resolve('/projects/language-learner')}
href={resolve('projects/language-learner')}
class="mb-6 inline-flex items-center gap-1 text-sm ll-muted hover:text-[var(--site-text)]"
><ArrowLeft size={14} aria-hidden="true" /> language learner</a
>

View File

@@ -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);

View File

@@ -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 }) => {

View File

@@ -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);

View File

@@ -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 =

View File

@@ -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);