From 5e04f231441779762f1c0f2bedaf4ac2f73109ca Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Mon, 6 Apr 2026 07:38:31 +0800 Subject: [PATCH 1/9] looks good so far --- packages/sv/src/addons/paraglide.ts | 21 +++++++++++++------ .../src/routes/+layout.svelte | 8 +++++-- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/packages/sv/src/addons/paraglide.ts b/packages/sv/src/addons/paraglide.ts index 8d288183f..828629f8a 100644 --- a/packages/sv/src/addons/paraglide.ts +++ b/packages/sv/src/addons/paraglide.ts @@ -1,5 +1,5 @@ import { log } from '@clack/prompts'; -import { color, type SvelteAst, transforms } from '@sveltejs/sv-utils'; +import { color, dedent, type SvelteAst, transforms } from '@sveltejs/sv-utils'; import { defineAddon, defineAddonOptions } from '../core/config.ts'; import { addToDemoPage } from './common.ts'; @@ -196,13 +196,22 @@ export default defineAddon({ from: '$lib/paraglide/runtime' }); js.imports.addNamed(ast.instance.content, { imports: ['page'], from: '$app/state' }); + js.imports.addNamed(ast.instance.content, { imports: ['resolve'], from: '$app/paths' }); + if (language === 'ts') { + js.imports.addNamed(ast.instance.content, { + imports: ['Pathname'], + from: '$app/types', + isType: true + }); + } svelte.addFragment( ast, - `
- {#each locales as locale} - {locale} - {/each} -
` + dedent` +
+ {#each locales as locale (locale)} + {locale} + {/each} +
` ); }) ); diff --git a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/routes/+layout.svelte b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/routes/+layout.svelte index b22ec360f..68b9aa131 100644 --- a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/routes/+layout.svelte +++ b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/routes/+layout.svelte @@ -1,4 +1,6 @@ -better-auth -paraglide playwright From c40efb22cc60b75b4a8eecc73ee8760c8ba34845 Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Mon, 6 Apr 2026 13:58:42 +0800 Subject: [PATCH 3/9] . --- PR.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 PR.md diff --git a/PR.md b/PR.md new file mode 100644 index 000000000..59205cf05 --- /dev/null +++ b/PR.md @@ -0,0 +1,6 @@ +closes opral/paraglide-js#638 +supercedes #990 + +Implements [this workaround](https://github.com/opral/paraglide-js/issues/638#issuecomment-4188892016). It uses type casting. + +This seems like a decent middle ground for the time being. From a9b176a76bcc0ddf31d5c4e214ccae627f799c89 Mon Sep 17 00:00:00 2001 From: jycouet Date: Mon, 6 Apr 2026 11:35:00 +0200 Subject: [PATCH 4/9] fix: `svelte.addFragment` now accept types --- .changeset/loud-geese-change.md | 5 +++++ .../input.svelte | 7 ++++++ .../output.svelte | 6 +++++ .../to-fragment-js-with-script-ts/run.ts | 5 +++++ .../to-fragment-js-with-script/input.svelte | 7 ++++++ .../to-fragment-js-with-script/output.svelte | 6 +++++ .../common/to-fragment-js-with-script/run.ts | 5 +++++ .../input.svelte | 7 ++++++ .../output.svelte | 6 +++++ .../to-fragment-ts-with-script-ts/run.ts | 5 +++++ .../svelte/common/to-fragment-ts/input.svelte | 3 +++ .../common/to-fragment-ts/output.svelte | 4 ++++ .../svelte/common/to-fragment-ts/run.ts | 5 +++++ packages/sv-utils/src/tooling/svelte/index.ts | 22 +++++++++++-------- packages/sv/src/addons/paraglide.ts | 8 ++++--- 15 files changed, 89 insertions(+), 12 deletions(-) create mode 100644 .changeset/loud-geese-change.md create mode 100644 packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script-ts/input.svelte create mode 100644 packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script-ts/output.svelte create mode 100644 packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script-ts/run.ts create mode 100644 packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script/input.svelte create mode 100644 packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script/output.svelte create mode 100644 packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script/run.ts create mode 100644 packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts-with-script-ts/input.svelte create mode 100644 packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts-with-script-ts/output.svelte create mode 100644 packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts-with-script-ts/run.ts create mode 100644 packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts/input.svelte create mode 100644 packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts/output.svelte create mode 100644 packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts/run.ts diff --git a/.changeset/loud-geese-change.md b/.changeset/loud-geese-change.md new file mode 100644 index 000000000..49cbf1864 --- /dev/null +++ b/.changeset/loud-geese-change.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/sv-utils': patch +--- + +fix: `svelte.addFragment` now accept types diff --git a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script-ts/input.svelte b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script-ts/input.svelte new file mode 100644 index 000000000..e71212447 --- /dev/null +++ b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script-ts/input.svelte @@ -0,0 +1,7 @@ + + +
+

This is a Svelte component.

+
diff --git a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script-ts/output.svelte b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script-ts/output.svelte new file mode 100644 index 000000000..afca11d8d --- /dev/null +++ b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script-ts/output.svelte @@ -0,0 +1,6 @@ + + +

This is a Svelte component.

+{1 + 2} diff --git a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script-ts/run.ts b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script-ts/run.ts new file mode 100644 index 000000000..c92874e95 --- /dev/null +++ b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script-ts/run.ts @@ -0,0 +1,5 @@ +import { type SvelteAst, svelte } from '../../../../../index.ts'; + +export function run(ast: SvelteAst.Root): void { + svelte.addFragment(ast, '{1 + 2}'); +} diff --git a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script/input.svelte b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script/input.svelte new file mode 100644 index 000000000..d163b41a2 --- /dev/null +++ b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script/input.svelte @@ -0,0 +1,7 @@ + + +
+

This is a Svelte component.

+
diff --git a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script/output.svelte b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script/output.svelte new file mode 100644 index 000000000..819dc33be --- /dev/null +++ b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script/output.svelte @@ -0,0 +1,6 @@ + + +

This is a Svelte component.

+{1 + 2} diff --git a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script/run.ts b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script/run.ts new file mode 100644 index 000000000..c92874e95 --- /dev/null +++ b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script/run.ts @@ -0,0 +1,5 @@ +import { type SvelteAst, svelte } from '../../../../../index.ts'; + +export function run(ast: SvelteAst.Root): void { + svelte.addFragment(ast, '{1 + 2}'); +} diff --git a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts-with-script-ts/input.svelte b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts-with-script-ts/input.svelte new file mode 100644 index 000000000..e71212447 --- /dev/null +++ b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts-with-script-ts/input.svelte @@ -0,0 +1,7 @@ + + +
+

This is a Svelte component.

+
diff --git a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts-with-script-ts/output.svelte b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts-with-script-ts/output.svelte new file mode 100644 index 000000000..e67474d61 --- /dev/null +++ b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts-with-script-ts/output.svelte @@ -0,0 +1,6 @@ + + +

This is a Svelte component.

+{1 as number} diff --git a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts-with-script-ts/run.ts b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts-with-script-ts/run.ts new file mode 100644 index 000000000..68ce125d3 --- /dev/null +++ b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts-with-script-ts/run.ts @@ -0,0 +1,5 @@ +import { type SvelteAst, svelte } from '../../../../../index.ts'; + +export function run(ast: SvelteAst.Root): void { + svelte.addFragment(ast, '{1 as number}', { language: 'ts' }); +} diff --git a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts/input.svelte b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts/input.svelte new file mode 100644 index 000000000..6491ab509 --- /dev/null +++ b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts/input.svelte @@ -0,0 +1,3 @@ +
+

This is a Svelte component.

+
diff --git a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts/output.svelte b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts/output.svelte new file mode 100644 index 000000000..12b028a33 --- /dev/null +++ b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts/output.svelte @@ -0,0 +1,4 @@ + + +

This is a Svelte component.

+{1 as number} diff --git a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts/run.ts b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts/run.ts new file mode 100644 index 000000000..68ce125d3 --- /dev/null +++ b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts/run.ts @@ -0,0 +1,5 @@ +import { type SvelteAst, svelte } from '../../../../../index.ts'; + +export function run(ast: SvelteAst.Root): void { + svelte.addFragment(ast, '{1 as number}', { language: 'ts' }); +} diff --git a/packages/sv-utils/src/tooling/svelte/index.ts b/packages/sv-utils/src/tooling/svelte/index.ts index 02bbbaf7e..0824b272f 100644 --- a/packages/sv-utils/src/tooling/svelte/index.ts +++ b/packages/sv-utils/src/tooling/svelte/index.ts @@ -21,14 +21,14 @@ export function ensureScript( attributes: options?.language === 'ts' ? [ - { - type: 'Attribute', - start: 8, - end: 17, - name: 'lang', - value: [{ start: 14, end: 16, type: 'Text', raw: 'ts', data: 'ts' }] - } - ] + { + type: 'Attribute', + start: 8, + end: 17, + name: 'lang', + value: [{ start: 14, end: 16, type: 'Text', raw: 'ts', data: 'ts' }] + } + ] : [], content: parseScript('').ast }; @@ -87,9 +87,13 @@ export function addFragment( content: string, options?: { mode?: 'append' | 'prepend'; + language?: 'ts' | 'js'; } ): void { - const { ast: fragmentAst } = parseSvelte(content); + if (options?.language === 'ts') ensureScript(ast, { language: 'ts' }); + + const source = options?.language === 'ts' ? `${content}` : content; + const { ast: fragmentAst } = parseSvelte(source); if (options?.mode === 'prepend') { ast.fragment.nodes.unshift(...fragmentAst.fragment.nodes); diff --git a/packages/sv/src/addons/paraglide.ts b/packages/sv/src/addons/paraglide.ts index 11bd38445..d2f2d2f5a 100644 --- a/packages/sv/src/addons/paraglide.ts +++ b/packages/sv/src/addons/paraglide.ts @@ -1,5 +1,5 @@ import { log } from '@clack/prompts'; -import { color, dedent, type SvelteAst, transforms } from '@sveltejs/sv-utils'; +import { color, createPrinter, dedent, type SvelteAst, transforms } from '@sveltejs/sv-utils'; import { defineAddon, defineAddonOptions } from '../core/config.ts'; import { addToDemoPage } from './common.ts'; @@ -54,6 +54,7 @@ export default defineAddon({ if (!isKit) unsupported('Requires SvelteKit'); }, run: ({ sv, options, file, language, directory }) => { + const [ts] = createPrinter(language === 'ts'); const paraglideOutDir = `${directory.lib}/paraglide`; sv.devDependency('@inlang/paraglide-js', '^2.10.0'); @@ -209,9 +210,10 @@ export default defineAddon({ dedent`
{#each locales as locale (locale)} - {locale} + {locale} {/each} -
` + `, + { language } ); }) ); From 796976a846e18f94de44e92e94ce476dd3aec749 Mon Sep 17 00:00:00 2001 From: jycouet Date: Mon, 6 Apr 2026 11:35:17 +0200 Subject: [PATCH 5/9] =?UTF-8?q?fmt=C2=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/sv-utils/src/tooling/svelte/index.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/sv-utils/src/tooling/svelte/index.ts b/packages/sv-utils/src/tooling/svelte/index.ts index 0824b272f..8e4e468fd 100644 --- a/packages/sv-utils/src/tooling/svelte/index.ts +++ b/packages/sv-utils/src/tooling/svelte/index.ts @@ -21,14 +21,14 @@ export function ensureScript( attributes: options?.language === 'ts' ? [ - { - type: 'Attribute', - start: 8, - end: 17, - name: 'lang', - value: [{ start: 14, end: 16, type: 'Text', raw: 'ts', data: 'ts' }] - } - ] + { + type: 'Attribute', + start: 8, + end: 17, + name: 'lang', + value: [{ start: 14, end: 16, type: 'Text', raw: 'ts', data: 'ts' }] + } + ] : [], content: parseScript('').ast }; From 7d59346ca963bc01938385cee995f8266d03e00c Mon Sep 17 00:00:00 2001 From: jycouet Date: Mon, 6 Apr 2026 11:53:57 +0200 Subject: [PATCH 6/9] lint fmt and everything else --- .../common/to-fragment-js-with-script-ts/input.svelte | 8 ++------ .../common/to-fragment-js-with-script-ts/output.svelte | 4 +--- .../svelte/common/to-fragment-js-with-script/input.svelte | 8 ++------ .../common/to-fragment-js-with-script/output.svelte | 4 +--- .../common/to-fragment-ts-with-script-ts/input.svelte | 8 ++------ .../common/to-fragment-ts-with-script-ts/output.svelte | 4 +--- .../svelte/svelte/common/to-fragment-ts/input.svelte | 4 +--- 7 files changed, 10 insertions(+), 30 deletions(-) diff --git a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script-ts/input.svelte b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script-ts/input.svelte index e71212447..14218c793 100644 --- a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script-ts/input.svelte +++ b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script-ts/input.svelte @@ -1,7 +1,3 @@ - + -
-

This is a Svelte component.

-
+

This is a Svelte component.

diff --git a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script-ts/output.svelte b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script-ts/output.svelte index afca11d8d..755877a49 100644 --- a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script-ts/output.svelte +++ b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script-ts/output.svelte @@ -1,6 +1,4 @@ - +

This is a Svelte component.

{1 + 2} diff --git a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script/input.svelte b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script/input.svelte index d163b41a2..b6edf8bb2 100644 --- a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script/input.svelte +++ b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script/input.svelte @@ -1,7 +1,3 @@ - + -
-

This is a Svelte component.

-
+

This is a Svelte component.

diff --git a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script/output.svelte b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script/output.svelte index 819dc33be..feb1846e6 100644 --- a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script/output.svelte +++ b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-js-with-script/output.svelte @@ -1,6 +1,4 @@ - +

This is a Svelte component.

{1 + 2} diff --git a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts-with-script-ts/input.svelte b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts-with-script-ts/input.svelte index e71212447..14218c793 100644 --- a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts-with-script-ts/input.svelte +++ b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts-with-script-ts/input.svelte @@ -1,7 +1,3 @@ - + -
-

This is a Svelte component.

-
+

This is a Svelte component.

diff --git a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts-with-script-ts/output.svelte b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts-with-script-ts/output.svelte index e67474d61..12b028a33 100644 --- a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts-with-script-ts/output.svelte +++ b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts-with-script-ts/output.svelte @@ -1,6 +1,4 @@ - +

This is a Svelte component.

{1 as number} diff --git a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts/input.svelte b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts/input.svelte index 6491ab509..c106d7f93 100644 --- a/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts/input.svelte +++ b/packages/sv-utils/src/tests/svelte/svelte/common/to-fragment-ts/input.svelte @@ -1,3 +1 @@ -
-

This is a Svelte component.

-
+

This is a Svelte component.

From 89a98092078ba636fa70b628c63c8bdcf0b120d6 Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Mon, 6 Apr 2026 23:47:44 +0800 Subject: [PATCH 7/9] snapshot --- .../snapshots/create-with-all-addons/.gitignore | 2 ++ .../create-with-all-addons/.prettierignore | 1 + .../snapshots/create-with-all-addons/README.md | 7 +++++++ .../create-with-all-addons/package.json | 13 ++++++++++++- .../create-with-all-addons/src/app.d.ts | 5 ++++- .../create-with-all-addons/src/hooks.server.ts | 17 ++++++++++++++++- .../src/routes/+layout.svelte | 12 ++++++++++++ .../src/routes/demo/+page.svelte | 2 ++ 8 files changed, 56 insertions(+), 3 deletions(-) diff --git a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/.gitignore b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/.gitignore index df9f865c5..ab1e98f41 100644 --- a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/.gitignore +++ b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/.gitignore @@ -26,3 +26,5 @@ test-results # Paraglide src/lib/paraglide project.inlang/cache/ +# SQLite +*.db diff --git a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/.prettierignore b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/.prettierignore index 7d74fe246..024357648 100644 --- a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/.prettierignore +++ b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/.prettierignore @@ -7,3 +7,4 @@ bun.lockb # Miscellaneous /static/ +/drizzle/ diff --git a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/README.md b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/README.md index a0da9f54d..c65e1b6f7 100644 --- a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/README.md +++ b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/README.md @@ -11,6 +11,13 @@ If you're seeing this, you've probably already done this step. Congrats! npx sv create my-app ``` +To recreate this project with the same configuration: + +```sh +# recreate this project +npx sv@0.0.0 create --template minimal --types ts --add prettier eslint vitest="usages:unit,component" playwright tailwindcss="plugins:typography,forms" sveltekit-adapter="adapter:node" devtools-json drizzle="database:sqlite+sqlite:libsql" better-auth="demo:password,github" mdsvex paraglide="languageTags:en,es+demo:yes" mcp="ide:claude-code,cursor,gemini,opencode,vscode,other+setup:local" --no-install packages/sv/.test-output/cli/create-with-all-addons +``` + ## Developing Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: diff --git a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/package.json b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/package.json index acd71a972..1de8cbcde 100644 --- a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/package.json +++ b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/package.json @@ -14,11 +14,19 @@ "format": "prettier --write .", "test:unit": "vitest", "test": "npm run test:unit -- --run && npm run test:e2e", - "test:e2e": "playwright test" + "test:e2e": "playwright test", + "db:push": "drizzle-kit push", + "db:generate": "drizzle-kit generate", + "db:migrate": "drizzle-kit migrate", + "db:studio": "drizzle-kit studio", + "auth:schema": "better-auth generate --config src/lib/server/auth.ts --output src/lib/server/db/auth.schema.ts --yes" }, "devDependencies": { + "@better-auth/cli": "~1.4.21", "@eslint/compat": "^2.0.3", "@eslint/js": "^10.0.1", + "@inlang/paraglide-js": "^2.10.0", + "@libsql/client": "^0.17.0", "@playwright/test": "^1.58.2", "@sveltejs/adapter-node": "^5.5.2", "@sveltejs/kit": "^2.50.2", @@ -27,6 +35,9 @@ "@tailwindcss/typography": "^0.5.19", "@tailwindcss/vite": "^4.1.18", "@vitest/browser-playwright": "^4.1.0", + "better-auth": "~1.4.21", + "drizzle-kit": "^0.31.8", + "drizzle-orm": "^0.45.1", "eslint": "^10.0.3", "eslint-config-prettier": "^10.1.8", "eslint-plugin-svelte": "^3.15.2", diff --git a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/app.d.ts b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/app.d.ts index da08e6da5..87f8dbd97 100644 --- a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/app.d.ts +++ b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/app.d.ts @@ -1,9 +1,12 @@ +import type { User, Session } from 'better-auth/minimal'; + // See https://svelte.dev/docs/kit/types#app.d.ts // for information about these interfaces declare global { namespace App { + interface Locals { user?: User; session?: Session } + // interface Error {} - // interface Locals {} // interface PageData {} // interface PageState {} // interface Platform {} diff --git a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/hooks.server.ts b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/hooks.server.ts index b50c43efd..f0872bb70 100644 --- a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/hooks.server.ts +++ b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/hooks.server.ts @@ -1,3 +1,7 @@ +import { sequence } from '@sveltejs/kit/hooks'; +import { building } from '$app/environment'; +import { auth } from '$lib/server/auth'; +import { svelteKitHandler } from 'better-auth/svelte-kit'; import type { Handle } from '@sveltejs/kit'; import { getTextDirection } from '$lib/paraglide/runtime'; import { paraglideMiddleware } from '$lib/paraglide/server'; @@ -10,4 +14,15 @@ const handleParaglide: Handle = ({ event, resolve }) => paraglideMiddleware(even }); }); -export const handle: Handle = handleParaglide; +const handleBetterAuth: Handle = async ({ event, resolve }) => { + const session = await auth.api.getSession({ headers: event.request.headers }); + + if (session) { + event.locals.session = session.session; + event.locals.user = session.user; + } + + return svelteKitHandler({ event, resolve, auth, building }); +}; + +export const handle: Handle = sequence(handleParaglide, handleBetterAuth); diff --git a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/routes/+layout.svelte b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/routes/+layout.svelte index 0d8eb0307..70b0cbf40 100644 --- a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/routes/+layout.svelte +++ b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/routes/+layout.svelte @@ -1,4 +1,8 @@ +better-auth +paraglide playwright From cbdd18dbd12ccc8553b564d556d034bd8fc8aca1 Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Mon, 6 Apr 2026 23:47:46 +0800 Subject: [PATCH 8/9] cleanup --- PR.md | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 PR.md diff --git a/PR.md b/PR.md deleted file mode 100644 index 59205cf05..000000000 --- a/PR.md +++ /dev/null @@ -1,6 +0,0 @@ -closes opral/paraglide-js#638 -supercedes #990 - -Implements [this workaround](https://github.com/opral/paraglide-js/issues/638#issuecomment-4188892016). It uses type casting. - -This seems like a decent middle ground for the time being. From 7af91fdcd1201fa7119c641e9782b9374ad29949 Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Mon, 6 Apr 2026 23:57:37 +0800 Subject: [PATCH 9/9] changeset --- .changeset/olive-camels-smoke.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/olive-camels-smoke.md diff --git a/.changeset/olive-camels-smoke.md b/.changeset/olive-camels-smoke.md new file mode 100644 index 000000000..f52b86d51 --- /dev/null +++ b/.changeset/olive-camels-smoke.md @@ -0,0 +1,5 @@ +--- +"sv": patch +--- + +fix(paraglide): type and lint errors