From 2eb7c3bdc949eaaa1c31efbe211ca21175da780b Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Fri, 31 Jul 2026 00:23:37 +0800 Subject: [PATCH 01/20] add setting --- packages/sv/src/addons/eslint.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/sv/src/addons/eslint.ts b/packages/sv/src/addons/eslint.ts index 05b667676..df6ab9311 100644 --- a/packages/sv/src/addons/eslint.ts +++ b/packages/sv/src/addons/eslint.ts @@ -55,7 +55,7 @@ export default defineAddon({ eslintConfigs.push(jsConfig); if (typescript) { - const tsConfig = js.common.parseExpression('ts.configs.recommended'); + const tsConfig = js.common.parseExpression('ts.configs.recommendedTypeChecked'); eslintConfigs.push(tsConfig); } @@ -84,6 +84,7 @@ export default defineAddon({ const globalsConfig = js.object.create({ languageOptions: { + parserOptions: typescript ? { projectService: true } : undefined, globals: globalsObjLiteral }, rules: typescript ? rules : undefined From 15112160f178bfce794adbe0d541de85d68ce3e9 Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Fri, 31 Jul 2026 00:23:42 +0800 Subject: [PATCH 02/20] snapshot --- .../snapshots/create-with-all-addons/eslint.config.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/eslint.config.js b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/eslint.config.js index e46c5b535..d2294e1a0 100644 --- a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/eslint.config.js +++ b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/eslint.config.js @@ -11,12 +11,15 @@ const gitignorePath = path.resolve(import.meta.dirname, '.gitignore'); export default defineConfig( includeIgnoreFile(gitignorePath), js.configs.recommended, - ts.configs.recommended, + ts.configs.recommendedTypeChecked, svelte.configs.recommended, prettier, svelte.configs.prettier, { - languageOptions: { globals: { ...globals.browser, ...globals.node } }, + languageOptions: { + parserOptions: { projectService: true }, + globals: { ...globals.browser, ...globals.node } + }, rules: { // typescript-eslint strongly recommend that you do not use the no-undef lint rule on TypeScript projects. // see: https://typescript-eslint.io/troubleshooting/faqs/eslint/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors From 2f482e7f1a2308a81776a7584fa7602a96035094 Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Fri, 31 Jul 2026 04:55:40 +0800 Subject: [PATCH 03/20] changes --- packages/sv/src/addons/better-auth.ts | 10 +++++----- packages/sv/src/addons/drizzle.ts | 2 +- packages/sv/src/addons/eslint.ts | 4 +++- packages/sv/src/addons/vitest-addon.ts | 4 ++-- .../sv/src/create/shared/+typescript/tsconfig.json | 3 ++- .../create/templates/demo/src/routes/+layout.svelte | 3 ++- .../templates/demo/src/routes/sverdle/+page.server.ts | 4 ++-- .../templates/demo/src/routes/sverdle/+page.svelte | 4 ++-- 8 files changed, 19 insertions(+), 15 deletions(-) diff --git a/packages/sv/src/addons/better-auth.ts b/packages/sv/src/addons/better-auth.ts index ea1910e24..674469268 100644 --- a/packages/sv/src/addons/better-auth.ts +++ b/packages/sv/src/addons/better-auth.ts @@ -342,8 +342,8 @@ export default defineAddon({ ? ` signInEmail: async (event) => {${d1AuthLine} const formData = await event.request.formData(); - const email = formData.get('email')?.toString() ?? ''; - const password = formData.get('password')?.toString() ?? ''; + const email = (formData.get('email') as string) ?? ''; + const password = (formData.get('password') as string) ?? ''; try { await auth.api.signInEmail({ @@ -364,9 +364,9 @@ export default defineAddon({ }, signUpEmail: async (event) => {${d1AuthLine} const formData = await event.request.formData(); - const email = formData.get('email')?.toString() ?? ''; - const password = formData.get('password')?.toString() ?? ''; - const name = formData.get('name')?.toString() ?? ''; + const email = (formData.get('email') as string) ?? ''; + const password = (formData.get('password') as string) ?? ''; + const name = (formData.get('name') as string) ?? ''; try { await auth.api.signUpEmail({ diff --git a/packages/sv/src/addons/drizzle.ts b/packages/sv/src/addons/drizzle.ts index f064b0bac..3b77c0756 100644 --- a/packages/sv/src/addons/drizzle.ts +++ b/packages/sv/src/addons/drizzle.ts @@ -322,7 +322,7 @@ export default defineAddon({ override({ typescript: { config: js.common.parseExpression( - `(config) => { config.include.push('../drizzle.config.${language}')}` + `(config) => { (config.include as string[]).push('../drizzle.config.${language}')}` ) } }); diff --git a/packages/sv/src/addons/eslint.ts b/packages/sv/src/addons/eslint.ts index df6ab9311..728bb1352 100644 --- a/packages/sv/src/addons/eslint.ts +++ b/packages/sv/src/addons/eslint.ts @@ -84,7 +84,9 @@ export default defineAddon({ const globalsConfig = js.object.create({ languageOptions: { - parserOptions: typescript ? { projectService: true } : undefined, + parserOptions: typescript + ? { projectService: { allowDefaultProject: ['*.js'] } } + : undefined, globals: globalsObjLiteral }, rules: typescript ? rules : undefined diff --git a/packages/sv/src/addons/vitest-addon.ts b/packages/sv/src/addons/vitest-addon.ts index 9252d72a7..31620fb86 100644 --- a/packages/sv/src/addons/vitest-addon.ts +++ b/packages/sv/src/addons/vitest-addon.ts @@ -94,10 +94,10 @@ export default defineAddon({ if (content) return false; return dedent` -

{greet(host)}

diff --git a/packages/sv/src/create/shared/+typescript/tsconfig.json b/packages/sv/src/create/shared/+typescript/tsconfig.json index 2c2ed3c4d..709cb8322 100644 --- a/packages/sv/src/create/shared/+typescript/tsconfig.json +++ b/packages/sv/src/create/shared/+typescript/tsconfig.json @@ -10,7 +10,8 @@ "skipLibCheck": true, "sourceMap": true, "strict": true, - "moduleResolution": "bundler" + "moduleResolution": "bundler", + "types": ["node"] } // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files diff --git a/packages/sv/src/create/templates/demo/src/routes/+layout.svelte b/packages/sv/src/create/templates/demo/src/routes/+layout.svelte index 02ac943b0..a345e20db 100644 --- a/packages/sv/src/create/templates/demo/src/routes/+layout.svelte +++ b/packages/sv/src/create/templates/demo/src/routes/+layout.svelte @@ -1,9 +1,10 @@
diff --git a/packages/sv/src/create/templates/demo/src/routes/sverdle/+page.server.ts b/packages/sv/src/create/templates/demo/src/routes/sverdle/+page.server.ts index f20d00ca8..36f7d0ca5 100644 --- a/packages/sv/src/create/templates/demo/src/routes/sverdle/+page.server.ts +++ b/packages/sv/src/create/templates/demo/src/routes/sverdle/+page.server.ts @@ -35,7 +35,7 @@ export const actions = { const game = new Game(cookies.get('sverdle')); const data = await request.formData(); - const key = data.get('key'); + const key = (data.get('key') as string) ?? ''; const i = game.answers.length; @@ -65,7 +65,7 @@ export const actions = { cookies.set('sverdle', game.toString(), { path: '/' }); }, - restart: async ({ cookies }) => { + restart: ({ cookies }) => { cookies.delete('sverdle', { path: '/' }); } } satisfies Actions; diff --git a/packages/sv/src/create/templates/demo/src/routes/sverdle/+page.svelte b/packages/sv/src/create/templates/demo/src/routes/sverdle/+page.svelte index 8b2800fdd..9c89b0593 100644 --- a/packages/sv/src/create/templates/demo/src/routes/sverdle/+page.svelte +++ b/packages/sv/src/create/templates/demo/src/routes/sverdle/+page.svelte @@ -106,9 +106,9 @@ action="?/enter" use:enhance={() => { // prevent default callback from resetting the form - return ({ result, update }) => { + return async ({ result, update }) => { shake = result.type === 'failure'; - update({ reset: false }); + await update({ reset: false }); }; }} > From 35a21d1e54c3467d67fbfae9f5d91d1a940d73ab Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Fri, 31 Jul 2026 04:57:48 +0800 Subject: [PATCH 04/20] snapshots --- .../src/routes/demo/better-auth/login/+page.server.ts | 10 +++++----- .../tests/snapshots/create-experimental/tsconfig.json | 1 + .../tests/snapshots/create-experimental/vite.config.ts | 2 +- .../src/cli/tests/snapshots/create-only/tsconfig.json | 3 ++- .../snapshots/create-with-all-addons/eslint.config.js | 2 +- .../src/lib/vitest-examples/Welcome.svelte | 4 ++-- .../src/routes/demo/better-auth/login/+page.server.ts | 10 +++++----- .../snapshots/create-with-all-addons/tsconfig.json | 3 ++- .../snapshots/create-with-all-addons/vite.config.ts | 2 +- 9 files changed, 20 insertions(+), 17 deletions(-) diff --git a/packages/sv/src/cli/tests/snapshots/create-experimental/src/routes/demo/better-auth/login/+page.server.ts b/packages/sv/src/cli/tests/snapshots/create-experimental/src/routes/demo/better-auth/login/+page.server.ts index d97509ba9..7643c11b3 100644 --- a/packages/sv/src/cli/tests/snapshots/create-experimental/src/routes/demo/better-auth/login/+page.server.ts +++ b/packages/sv/src/cli/tests/snapshots/create-experimental/src/routes/demo/better-auth/login/+page.server.ts @@ -14,8 +14,8 @@ export const load: PageServerLoad = (event) => { export const actions: Actions = { signInEmail: async (event) => { const formData = await event.request.formData(); - const email = formData.get('email')?.toString() ?? ''; - const password = formData.get('password')?.toString() ?? ''; + const email = (formData.get('email') as string) ?? ''; + const password = (formData.get('password') as string) ?? ''; try { await auth.api.signInEmail({ @@ -36,9 +36,9 @@ export const actions: Actions = { }, signUpEmail: async (event) => { const formData = await event.request.formData(); - const email = formData.get('email')?.toString() ?? ''; - const password = formData.get('password')?.toString() ?? ''; - const name = formData.get('name')?.toString() ?? ''; + const email = (formData.get('email') as string) ?? ''; + const password = (formData.get('password') as string) ?? ''; + const name = (formData.get('name') as string) ?? ''; try { await auth.api.signUpEmail({ diff --git a/packages/sv/src/cli/tests/snapshots/create-experimental/tsconfig.json b/packages/sv/src/cli/tests/snapshots/create-experimental/tsconfig.json index 333f76845..0642ae6fe 100644 --- a/packages/sv/src/cli/tests/snapshots/create-experimental/tsconfig.json +++ b/packages/sv/src/cli/tests/snapshots/create-experimental/tsconfig.json @@ -12,6 +12,7 @@ "strict": true, "moduleResolution": "bundler", "types": [ + "node", "./worker-configuration.d.ts" ] } diff --git a/packages/sv/src/cli/tests/snapshots/create-experimental/vite.config.ts b/packages/sv/src/cli/tests/snapshots/create-experimental/vite.config.ts index 2b5f79213..660efa77e 100644 --- a/packages/sv/src/cli/tests/snapshots/create-experimental/vite.config.ts +++ b/packages/sv/src/cli/tests/snapshots/create-experimental/vite.config.ts @@ -13,7 +13,7 @@ export default defineConfig({ experimental: { explicitEnvironmentVariables: true }, typescript: { config: (config) => { - config.include.push('../drizzle.config.ts'); + (config.include as string[]).push('../drizzle.config.ts'); } } }) diff --git a/packages/sv/src/cli/tests/snapshots/create-only/tsconfig.json b/packages/sv/src/cli/tests/snapshots/create-only/tsconfig.json index 2c2ed3c4d..709cb8322 100644 --- a/packages/sv/src/cli/tests/snapshots/create-only/tsconfig.json +++ b/packages/sv/src/cli/tests/snapshots/create-only/tsconfig.json @@ -10,7 +10,8 @@ "skipLibCheck": true, "sourceMap": true, "strict": true, - "moduleResolution": "bundler" + "moduleResolution": "bundler", + "types": ["node"] } // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files diff --git a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/eslint.config.js b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/eslint.config.js index d2294e1a0..6cd9d5f90 100644 --- a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/eslint.config.js +++ b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/eslint.config.js @@ -17,7 +17,7 @@ export default defineConfig( svelte.configs.prettier, { languageOptions: { - parserOptions: { projectService: true }, + parserOptions: { projectService: { allowDefaultProject: ['*.js'] } }, globals: { ...globals.browser, ...globals.node } }, rules: { diff --git a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/lib/vitest-examples/Welcome.svelte b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/lib/vitest-examples/Welcome.svelte index c7b846031..e8f7c31c5 100644 --- a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/lib/vitest-examples/Welcome.svelte +++ b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/lib/vitest-examples/Welcome.svelte @@ -1,7 +1,7 @@ -

{greet(host)}

diff --git a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/routes/demo/better-auth/login/+page.server.ts b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/routes/demo/better-auth/login/+page.server.ts index d97509ba9..7643c11b3 100644 --- a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/routes/demo/better-auth/login/+page.server.ts +++ b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/routes/demo/better-auth/login/+page.server.ts @@ -14,8 +14,8 @@ export const load: PageServerLoad = (event) => { export const actions: Actions = { signInEmail: async (event) => { const formData = await event.request.formData(); - const email = formData.get('email')?.toString() ?? ''; - const password = formData.get('password')?.toString() ?? ''; + const email = (formData.get('email') as string) ?? ''; + const password = (formData.get('password') as string) ?? ''; try { await auth.api.signInEmail({ @@ -36,9 +36,9 @@ export const actions: Actions = { }, signUpEmail: async (event) => { const formData = await event.request.formData(); - const email = formData.get('email')?.toString() ?? ''; - const password = formData.get('password')?.toString() ?? ''; - const name = formData.get('name')?.toString() ?? ''; + const email = (formData.get('email') as string) ?? ''; + const password = (formData.get('password') as string) ?? ''; + const name = (formData.get('name') as string) ?? ''; try { await auth.api.signUpEmail({ diff --git a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/tsconfig.json b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/tsconfig.json index 2c2ed3c4d..709cb8322 100644 --- a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/tsconfig.json +++ b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/tsconfig.json @@ -10,7 +10,8 @@ "skipLibCheck": true, "sourceMap": true, "strict": true, - "moduleResolution": "bundler" + "moduleResolution": "bundler", + "types": ["node"] } // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files diff --git a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/vite.config.ts b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/vite.config.ts index 192c372b3..877f9b329 100644 --- a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/vite.config.ts +++ b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/vite.config.ts @@ -19,7 +19,7 @@ export default defineConfig({ extensions: ['.svelte', '.svx', '.md'], typescript: { config: (config) => { - config.include.push('../drizzle.config.ts'); + (config.include as string[]).push('../drizzle.config.ts'); } } }), From 5f300f9731718fe8acb0646a49dbc57ee8faa70c Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Fri, 31 Jul 2026 05:11:04 +0800 Subject: [PATCH 05/20] fix --- packages/sv/src/addons/drizzle.ts | 2 +- packages/sv/src/create/shared/+typescript/tsconfig.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/sv/src/addons/drizzle.ts b/packages/sv/src/addons/drizzle.ts index 3b77c0756..578da2b76 100644 --- a/packages/sv/src/addons/drizzle.ts +++ b/packages/sv/src/addons/drizzle.ts @@ -322,7 +322,7 @@ export default defineAddon({ override({ typescript: { config: js.common.parseExpression( - `(config) => { (config.include as string[]).push('../drizzle.config.${language}')}` + `(config) => { (config.include${ts(' as string[]')}).push('../drizzle.config.${language}')}` ) } }); diff --git a/packages/sv/src/create/shared/+typescript/tsconfig.json b/packages/sv/src/create/shared/+typescript/tsconfig.json index 709cb8322..82310a5e5 100644 --- a/packages/sv/src/create/shared/+typescript/tsconfig.json +++ b/packages/sv/src/create/shared/+typescript/tsconfig.json @@ -11,7 +11,7 @@ "sourceMap": true, "strict": true, "moduleResolution": "bundler", - "types": ["node"] + "types": ["$app/types", "node"] } // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files From 44fa5097f1d3b36b3046a4dea6253ab17aadeba1 Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Fri, 31 Jul 2026 05:15:22 +0800 Subject: [PATCH 06/20] snapshots --- .../src/cli/tests/snapshots/create-experimental/tsconfig.json | 1 + packages/sv/src/cli/tests/snapshots/create-only/tsconfig.json | 2 +- .../cli/tests/snapshots/create-with-all-addons/tsconfig.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/sv/src/cli/tests/snapshots/create-experimental/tsconfig.json b/packages/sv/src/cli/tests/snapshots/create-experimental/tsconfig.json index 0642ae6fe..d6763e2a6 100644 --- a/packages/sv/src/cli/tests/snapshots/create-experimental/tsconfig.json +++ b/packages/sv/src/cli/tests/snapshots/create-experimental/tsconfig.json @@ -12,6 +12,7 @@ "strict": true, "moduleResolution": "bundler", "types": [ + "$app/types", "node", "./worker-configuration.d.ts" ] diff --git a/packages/sv/src/cli/tests/snapshots/create-only/tsconfig.json b/packages/sv/src/cli/tests/snapshots/create-only/tsconfig.json index 709cb8322..82310a5e5 100644 --- a/packages/sv/src/cli/tests/snapshots/create-only/tsconfig.json +++ b/packages/sv/src/cli/tests/snapshots/create-only/tsconfig.json @@ -11,7 +11,7 @@ "sourceMap": true, "strict": true, "moduleResolution": "bundler", - "types": ["node"] + "types": ["$app/types", "node"] } // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files diff --git a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/tsconfig.json b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/tsconfig.json index 709cb8322..82310a5e5 100644 --- a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/tsconfig.json +++ b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/tsconfig.json @@ -11,7 +11,7 @@ "sourceMap": true, "strict": true, "moduleResolution": "bundler", - "types": ["node"] + "types": ["$app/types", "node"] } // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files From ee385e8d64c696287658c94f143fedaa2ca1b581 Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Fri, 31 Jul 2026 05:39:45 +0800 Subject: [PATCH 07/20] fix --- packages/sv/src/addons/better-auth.ts | 10 +++++----- .../tests/snapshots/create-experimental/tsconfig.json | 1 - .../src/cli/tests/snapshots/create-only/tsconfig.json | 2 +- .../snapshots/create-with-all-addons/tsconfig.json | 2 +- .../sv/src/create/shared/+typescript/tsconfig.json | 2 +- 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/packages/sv/src/addons/better-auth.ts b/packages/sv/src/addons/better-auth.ts index 674469268..3d55fcfdf 100644 --- a/packages/sv/src/addons/better-auth.ts +++ b/packages/sv/src/addons/better-auth.ts @@ -342,8 +342,8 @@ export default defineAddon({ ? ` signInEmail: async (event) => {${d1AuthLine} const formData = await event.request.formData(); - const email = (formData.get('email') as string) ?? ''; - const password = (formData.get('password') as string) ?? ''; + const email = formData.get('email')${ts(' as string')} ?? ''; + const password = formData.get('password')${ts(' as string')} ?? ''; try { await auth.api.signInEmail({ @@ -364,9 +364,9 @@ export default defineAddon({ }, signUpEmail: async (event) => {${d1AuthLine} const formData = await event.request.formData(); - const email = (formData.get('email') as string) ?? ''; - const password = (formData.get('password') as string) ?? ''; - const name = (formData.get('name') as string) ?? ''; + const email = formData.get('email')${ts(' as string')} ?? ''; + const password = formData.get('password')${ts(' as string')} ?? ''; + const name = formData.get('name')${ts(' as string')} ?? ''; try { await auth.api.signUpEmail({ diff --git a/packages/sv/src/cli/tests/snapshots/create-experimental/tsconfig.json b/packages/sv/src/cli/tests/snapshots/create-experimental/tsconfig.json index d6763e2a6..0642ae6fe 100644 --- a/packages/sv/src/cli/tests/snapshots/create-experimental/tsconfig.json +++ b/packages/sv/src/cli/tests/snapshots/create-experimental/tsconfig.json @@ -12,7 +12,6 @@ "strict": true, "moduleResolution": "bundler", "types": [ - "$app/types", "node", "./worker-configuration.d.ts" ] diff --git a/packages/sv/src/cli/tests/snapshots/create-only/tsconfig.json b/packages/sv/src/cli/tests/snapshots/create-only/tsconfig.json index 82310a5e5..709cb8322 100644 --- a/packages/sv/src/cli/tests/snapshots/create-only/tsconfig.json +++ b/packages/sv/src/cli/tests/snapshots/create-only/tsconfig.json @@ -11,7 +11,7 @@ "sourceMap": true, "strict": true, "moduleResolution": "bundler", - "types": ["$app/types", "node"] + "types": ["node"] } // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files diff --git a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/tsconfig.json b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/tsconfig.json index 82310a5e5..709cb8322 100644 --- a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/tsconfig.json +++ b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/tsconfig.json @@ -11,7 +11,7 @@ "sourceMap": true, "strict": true, "moduleResolution": "bundler", - "types": ["$app/types", "node"] + "types": ["node"] } // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files diff --git a/packages/sv/src/create/shared/+typescript/tsconfig.json b/packages/sv/src/create/shared/+typescript/tsconfig.json index 82310a5e5..709cb8322 100644 --- a/packages/sv/src/create/shared/+typescript/tsconfig.json +++ b/packages/sv/src/create/shared/+typescript/tsconfig.json @@ -11,7 +11,7 @@ "sourceMap": true, "strict": true, "moduleResolution": "bundler", - "types": ["$app/types", "node"] + "types": ["node"] } // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files From f9d34afcfc8f4a4a7b8a824c1dfd16ff30cb687d Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Fri, 31 Jul 2026 05:55:44 +0800 Subject: [PATCH 08/20] fix better-auth --- packages/sv/src/addons/better-auth.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/sv/src/addons/better-auth.ts b/packages/sv/src/addons/better-auth.ts index 3d55fcfdf..2adaf003c 100644 --- a/packages/sv/src/addons/better-auth.ts +++ b/packages/sv/src/addons/better-auth.ts @@ -342,8 +342,8 @@ export default defineAddon({ ? ` signInEmail: async (event) => {${d1AuthLine} const formData = await event.request.formData(); - const email = formData.get('email')${ts(' as string')} ?? ''; - const password = formData.get('password')${ts(' as string')} ?? ''; + const email = (formData.get('email')${ts(' as string')}) ?? ''; + const password = (formData.get('password')${ts(' as string')}) ?? ''; try { await auth.api.signInEmail({ @@ -364,9 +364,9 @@ export default defineAddon({ }, signUpEmail: async (event) => {${d1AuthLine} const formData = await event.request.formData(); - const email = formData.get('email')${ts(' as string')} ?? ''; - const password = formData.get('password')${ts(' as string')} ?? ''; - const name = formData.get('name')${ts(' as string')} ?? ''; + const email = (formData.get('email')${ts(' as string')}) ?? ''; + const password = (formData.get('password')${ts(' as string')}) ?? ''; + const name = (formData.get('name')${ts(' as string')}) ?? ''; try { await auth.api.signUpEmail({ From 722c80c9d97b52672a3c64e44c708d10dc33153d Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Fri, 31 Jul 2026 06:20:11 +0800 Subject: [PATCH 09/20] fix layout types --- .../sv/src/create/templates/minimal/src/routes/+layout.svelte | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/sv/src/create/templates/minimal/src/routes/+layout.svelte b/packages/sv/src/create/templates/minimal/src/routes/+layout.svelte index 9cebde545..891a4ef3d 100644 --- a/packages/sv/src/create/templates/minimal/src/routes/+layout.svelte +++ b/packages/sv/src/create/templates/minimal/src/routes/+layout.svelte @@ -1,7 +1,9 @@ From 9b892e4eaceb3d17312f7bad0014aab1332a468f Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Fri, 31 Jul 2026 06:30:47 +0800 Subject: [PATCH 10/20] snapshots --- .../snapshots/create-experimental/src/routes/+layout.svelte | 3 ++- .../cli/tests/snapshots/create-only/src/routes/+layout.svelte | 3 ++- .../snapshots/create-with-all-addons/src/routes/+layout.svelte | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/sv/src/cli/tests/snapshots/create-experimental/src/routes/+layout.svelte b/packages/sv/src/cli/tests/snapshots/create-experimental/src/routes/+layout.svelte index 9cebde545..dbf8844ff 100644 --- a/packages/sv/src/cli/tests/snapshots/create-experimental/src/routes/+layout.svelte +++ b/packages/sv/src/cli/tests/snapshots/create-experimental/src/routes/+layout.svelte @@ -1,7 +1,8 @@ diff --git a/packages/sv/src/cli/tests/snapshots/create-only/src/routes/+layout.svelte b/packages/sv/src/cli/tests/snapshots/create-only/src/routes/+layout.svelte index 9cebde545..dbf8844ff 100644 --- a/packages/sv/src/cli/tests/snapshots/create-only/src/routes/+layout.svelte +++ b/packages/sv/src/cli/tests/snapshots/create-only/src/routes/+layout.svelte @@ -1,7 +1,8 @@ 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 70b0cbf40..aa061e956 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 @@ -5,8 +5,9 @@ import { locales, localizeHref } from '$lib/paraglide/runtime'; import './layout.css'; import favicon from '$lib/assets/favicon.svg'; + import type { LayoutProps } from './$types'; - let { children } = $props(); + let { children }: LayoutProps = $props(); From 2b2f17ad031745f53e8d32337969c770e1a0e399 Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Fri, 31 Jul 2026 10:02:58 +0800 Subject: [PATCH 11/20] fix --- CONTRIBUTING.md | 3 +-- packages/sv/src/addons/experimental.ts | 2 ++ .../sv/src/create/shared/+library+typescript/tsconfig.json | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 77b7e0786..d6dfcea73 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -112,8 +112,7 @@ Some snapshots are testing the output of `sv` directly from the generated binary In one command: ```sh -pnpm build && pnpm test:ui --project cli -# Press `u` when prompted to update snapshots. +pnpm build && pnpm test --project cli -u all ``` ## Style Guide diff --git a/packages/sv/src/addons/experimental.ts b/packages/sv/src/addons/experimental.ts index 9cef4ad0e..0ba28148e 100644 --- a/packages/sv/src/addons/experimental.ts +++ b/packages/sv/src/addons/experimental.ts @@ -89,6 +89,8 @@ export default defineAddon({ data.extends = KIT3_TSCONFIG; data.include ??= [directory.src]; for (const [key, value] of Object.entries(data.compilerOptions ?? {})) { + if (key === 'types' && Array.isArray(value) && !value.includes('$app/types')) + value.push('$app/types'); // a differing value is a deliberate override and stays if (KIT3_TSCONFIG_DEFAULT[key] === value) delete data.compilerOptions[key]; } diff --git a/packages/sv/src/create/shared/+library+typescript/tsconfig.json b/packages/sv/src/create/shared/+library+typescript/tsconfig.json index e7c4a9a69..99a690926 100644 --- a/packages/sv/src/create/shared/+library+typescript/tsconfig.json +++ b/packages/sv/src/create/shared/+library+typescript/tsconfig.json @@ -10,6 +10,7 @@ "sourceMap": true, "strict": true, "module": "NodeNext", - "moduleResolution": "NodeNext" + "moduleResolution": "NodeNext", + "types": ["node"] } } From d0f2163de79cbc5c4ea4e6f4fe80fd4912dfd518 Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Sat, 1 Aug 2026 09:24:45 +0800 Subject: [PATCH 12/20] more robust validator --- packages/sv/src/addons/better-auth.ts | 17 ++++++++++------- .../demo/better-auth/login/+page.server.ts | 17 ++++++++++------- .../demo/better-auth/login/+page.server.ts | 17 ++++++++++------- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/packages/sv/src/addons/better-auth.ts b/packages/sv/src/addons/better-auth.ts index 2adaf003c..d643ae82b 100644 --- a/packages/sv/src/addons/better-auth.ts +++ b/packages/sv/src/addons/better-auth.ts @@ -342,8 +342,8 @@ export default defineAddon({ ? ` signInEmail: async (event) => {${d1AuthLine} const formData = await event.request.formData(); - const email = (formData.get('email')${ts(' as string')}) ?? ''; - const password = (formData.get('password')${ts(' as string')}) ?? ''; + const email = parseEntry(formData.get('email')); + const password = parseEntry(formData.get('password')); try { await auth.api.signInEmail({ @@ -364,9 +364,9 @@ export default defineAddon({ }, signUpEmail: async (event) => {${d1AuthLine} const formData = await event.request.formData(); - const email = (formData.get('email')${ts(' as string')}) ?? ''; - const password = (formData.get('password')${ts(' as string')}) ?? ''; - const name = (formData.get('name')${ts(' as string')}) ?? ''; + const email = parseEntry(formData.get('email')); + const password = parseEntry(formData.get('password')); + const name = parseEntry(formData.get('name')); try { await auth.api.signUpEmail({ @@ -392,8 +392,8 @@ export default defineAddon({ ? ` signInSocial: async (event) => {${d1AuthLine} const formData = await event.request.formData(); - const provider = formData.get('provider')?.toString() ?? 'github'; - const callbackURL = formData.get('callbackURL')?.toString() ?? '/demo/better-auth'; + const provider = parseEntry(formData.get('provider')) || 'github'; + const callbackURL = parseEntry(formData.get('callbackURL')) || '/demo/better-auth'; const result = await auth.api.signInSocial({ body: { @@ -418,6 +418,9 @@ export default defineAddon({ ${!d1 ? `import { auth } from '${lib}/server/auth';` : ''} ${needsAPIError ? "import { APIError } from 'better-auth/api';" : ''} + const parseEntry = (input${ts(' : FormDataEntryValue | null')}): string => + input instanceof File ? input.name : (input ?? ''); + export const load${ts(': PageServerLoad')} = (event) => { if (event.locals.user) { return redirect(302, '/demo/better-auth'); diff --git a/packages/sv/src/cli/tests/snapshots/create-experimental/src/routes/demo/better-auth/login/+page.server.ts b/packages/sv/src/cli/tests/snapshots/create-experimental/src/routes/demo/better-auth/login/+page.server.ts index 7643c11b3..b0bbce4b4 100644 --- a/packages/sv/src/cli/tests/snapshots/create-experimental/src/routes/demo/better-auth/login/+page.server.ts +++ b/packages/sv/src/cli/tests/snapshots/create-experimental/src/routes/demo/better-auth/login/+page.server.ts @@ -4,6 +4,9 @@ import type { PageServerLoad } from './$types'; import { auth } from '$lib/server/auth'; import { APIError } from 'better-auth/api'; +const parseEntry = (input : FormDataEntryValue | null): string => + input instanceof File ? input.name : (input ?? ''); + export const load: PageServerLoad = (event) => { if (event.locals.user) { return redirect(302, '/demo/better-auth'); @@ -14,8 +17,8 @@ export const load: PageServerLoad = (event) => { export const actions: Actions = { signInEmail: async (event) => { const formData = await event.request.formData(); - const email = (formData.get('email') as string) ?? ''; - const password = (formData.get('password') as string) ?? ''; + const email = parseEntry(formData.get('email')); + const password = parseEntry(formData.get('password')); try { await auth.api.signInEmail({ @@ -36,9 +39,9 @@ export const actions: Actions = { }, signUpEmail: async (event) => { const formData = await event.request.formData(); - const email = (formData.get('email') as string) ?? ''; - const password = (formData.get('password') as string) ?? ''; - const name = (formData.get('name') as string) ?? ''; + const email = parseEntry(formData.get('email')); + const password = parseEntry(formData.get('password')); + const name = parseEntry(formData.get('name')); try { await auth.api.signUpEmail({ @@ -60,8 +63,8 @@ export const actions: Actions = { }, signInSocial: async (event) => { const formData = await event.request.formData(); - const provider = formData.get('provider')?.toString() ?? 'github'; - const callbackURL = formData.get('callbackURL')?.toString() ?? '/demo/better-auth'; + const provider = parseEntry(formData.get('provider')) || 'github'; + const callbackURL = parseEntry(formData.get('callbackURL')) || '/demo/better-auth'; const result = await auth.api.signInSocial({ body: { diff --git a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/routes/demo/better-auth/login/+page.server.ts b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/routes/demo/better-auth/login/+page.server.ts index 7643c11b3..b0bbce4b4 100644 --- a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/routes/demo/better-auth/login/+page.server.ts +++ b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/src/routes/demo/better-auth/login/+page.server.ts @@ -4,6 +4,9 @@ import type { PageServerLoad } from './$types'; import { auth } from '$lib/server/auth'; import { APIError } from 'better-auth/api'; +const parseEntry = (input : FormDataEntryValue | null): string => + input instanceof File ? input.name : (input ?? ''); + export const load: PageServerLoad = (event) => { if (event.locals.user) { return redirect(302, '/demo/better-auth'); @@ -14,8 +17,8 @@ export const load: PageServerLoad = (event) => { export const actions: Actions = { signInEmail: async (event) => { const formData = await event.request.formData(); - const email = (formData.get('email') as string) ?? ''; - const password = (formData.get('password') as string) ?? ''; + const email = parseEntry(formData.get('email')); + const password = parseEntry(formData.get('password')); try { await auth.api.signInEmail({ @@ -36,9 +39,9 @@ export const actions: Actions = { }, signUpEmail: async (event) => { const formData = await event.request.formData(); - const email = (formData.get('email') as string) ?? ''; - const password = (formData.get('password') as string) ?? ''; - const name = (formData.get('name') as string) ?? ''; + const email = parseEntry(formData.get('email')); + const password = parseEntry(formData.get('password')); + const name = parseEntry(formData.get('name')); try { await auth.api.signUpEmail({ @@ -60,8 +63,8 @@ export const actions: Actions = { }, signInSocial: async (event) => { const formData = await event.request.formData(); - const provider = formData.get('provider')?.toString() ?? 'github'; - const callbackURL = formData.get('callbackURL')?.toString() ?? '/demo/better-auth'; + const provider = parseEntry(formData.get('provider')) || 'github'; + const callbackURL = parseEntry(formData.get('callbackURL')) || '/demo/better-auth'; const result = await auth.api.signInSocial({ body: { From 0400071ee2fe4cddd67436d5e099127ca24b42b0 Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Sat, 1 Aug 2026 13:18:19 +0800 Subject: [PATCH 13/20] void makes more sense --- .../src/create/templates/demo/src/routes/sverdle/+page.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/sv/src/create/templates/demo/src/routes/sverdle/+page.svelte b/packages/sv/src/create/templates/demo/src/routes/sverdle/+page.svelte index 9c89b0593..a911d4a64 100644 --- a/packages/sv/src/create/templates/demo/src/routes/sverdle/+page.svelte +++ b/packages/sv/src/create/templates/demo/src/routes/sverdle/+page.svelte @@ -106,9 +106,9 @@ action="?/enter" use:enhance={() => { // prevent default callback from resetting the form - return async ({ result, update }) => { + return ({ result, update }) => { shake = result.type === 'failure'; - await update({ reset: false }); + void update({ reset: false }); }; }} > From 380ef58afb8c651c37531eccd51ecc5a76abe3a3 Mon Sep 17 00:00:00 2001 From: Manuel Serret Date: Fri, 7 Aug 2026 09:50:45 +0200 Subject: [PATCH 14/20] fix --- packages/sv/src/core/formatFiles.ts | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/packages/sv/src/core/formatFiles.ts b/packages/sv/src/core/formatFiles.ts index 80a47aa1d..f9da492ab 100644 --- a/packages/sv/src/core/formatFiles.ts +++ b/packages/sv/src/core/formatFiles.ts @@ -97,22 +97,3 @@ async function run( return { error: message || (e instanceof Error ? e.message : 'unknown error') }; } } - -async function run( - command: string, - args: string[], - cwd: string -): Promise<{ error?: string; notFound?: boolean }> { - try { - await exec(command, args, { nodeOptions: { cwd, stdio: 'pipe' }, throwOnError: true }); - return {}; - } catch (e) { - // @ts-expect-error tinyexec rethrows the spawn error as-is - if (e?.code === 'ENOENT') return { notFound: true, error: `${command} not found` }; - // @ts-expect-error `output` is only present on tinyexec's `NonZeroExitError` - const output = e?.output as { stderr?: string; stdout?: string } | undefined; - // failures can land on either stream, so report both - const message = [output?.stderr, output?.stdout].filter(Boolean).join('\n').trim(); - return { error: message || (e instanceof Error ? e.message : 'unknown error') }; - } -} From 5895579523652943e7195c118cbb18329560e3a6 Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Sun, 4 Oct 2026 01:10:31 +0800 Subject: [PATCH 15/20] . --- packages/sv-utils/CHANGELOG.md | 12 ++++++------ packages/sv-utils/src/index.ts | 9 +++++++++ packages/sv/CHANGELOG.md | 14 +++++++------- .../shared/+library+typescript/tsconfig.json | 3 +-- .../sv/src/create/shared/+typescript/tsconfig.json | 3 +-- .../templates/demo/src/routes/+layout.svelte | 1 - 6 files changed, 24 insertions(+), 18 deletions(-) diff --git a/packages/sv-utils/CHANGELOG.md b/packages/sv-utils/CHANGELOG.md index 8f4f1ec88..473278b35 100644 --- a/packages/sv-utils/CHANGELOG.md +++ b/packages/sv-utils/CHANGELOG.md @@ -13,7 +13,7 @@ - feat: allow `js.function.call` to accept AST expression nodes as arguments ([#1232](https://github.com/sveltejs/cli/pull/1232)) - fix(sv-utils): detect pnpm version from the target project, and update `pnpm.allowBuilds` signature. ([#1320](https://github.com/sveltejs/cli/pull/1320)) - + ```diff -pnpm.allowBuilds('sharp') +pnpm.allowBuilds({ cwd, packages: ['sharp'] }) @@ -49,7 +49,7 @@ ### Minor Changes - fix(sv-utils): detect pnpm version from the target project, and update `pnpm.allowBuilds` signature. ([#1320](https://github.com/sveltejs/cli/pull/1320)) - + ```diff -pnpm.allowBuilds('sharp') +pnpm.allowBuilds({ cwd, packages: ['sharp'] }) @@ -181,16 +181,16 @@ - feat: decouple sv / sv-utils, explicit public API, deprecation pass ([#1046](https://github.com/sveltejs/cli/pull/1046)) - + **`@sveltejs/sv-utils`** - + - Rename file helpers: `readFile` -> `loadFile`, `writeFile` -> `saveFile`, `getPackageJson` -> `loadPackageJson` - Add `pnpm.onlyBuiltDependencies()` transform for `pnpm-workspace.yaml` - Export `YamlDocument` type from parsers - Remove `commonFilePaths`, `installPackages` (moved internal to `sv`) - + **`sv`** - + - `create()` signature changed to `create({ cwd, ...options })`. The old `create(cwd, options)` is deprecated and will be removed in the next major release. - `sv.pnpmBuildDependency()` is deprecated and will be removed in the next major release. Use `sv.file()` with `pnpm.onlyBuiltDependencies()` from `@sveltejs/sv-utils` instead. - `workspace.file.prettierignore`, `.prettierrc`, `.eslintConfig`, `.vscodeSettings`, `.vscodeExtensions` are deprecated and will be removed in the next major release. Use the raw strings directly (e.g. `'.prettierignore'`). diff --git a/packages/sv-utils/src/index.ts b/packages/sv-utils/src/index.ts index c673ce654..b372b1249 100644 --- a/packages/sv-utils/src/index.ts +++ b/packages/sv-utils/src/index.ts @@ -37,5 +37,14 @@ export { defineDemoPage, type DemoPage } from './demo-page.ts'; // Env access (abstracts over legacy `$env/dynamic/*` vs declared `$app/env/*` + `src/env.ts`) export { defineEnv } from './env.ts'; +// Kit 3 specifics (version detection, `$lib` -> `#lib`, the generated tsconfig) +export { + KIT3_TSCONFIG, + KIT3_TSCONFIG_DEFAULT, + isKit3, + libSubpathImports, + resolveLibPrefix +} from './kit3.ts'; + // Terminal styling export { color } from './color.ts'; diff --git a/packages/sv/CHANGELOG.md b/packages/sv/CHANGELOG.md index dfb7fce3b..7266edb42 100644 --- a/packages/sv/CHANGELOG.md +++ b/packages/sv/CHANGELOG.md @@ -456,16 +456,16 @@ - feat: decouple sv / sv-utils, explicit public API, deprecation pass ([#1046](https://github.com/sveltejs/cli/pull/1046)) - + **`@sveltejs/sv-utils`** - + - Rename file helpers: `readFile` -> `loadFile`, `writeFile` -> `saveFile`, `getPackageJson` -> `loadPackageJson` - Add `pnpm.onlyBuiltDependencies()` transform for `pnpm-workspace.yaml` - Export `YamlDocument` type from parsers - Remove `commonFilePaths`, `installPackages` (moved internal to `sv`) - + **`sv`** - + - `create()` signature changed to `create({ cwd, ...options })`. The old `create(cwd, options)` is deprecated and will be removed in the next major release. - `sv.pnpmBuildDependency()` is deprecated and will be removed in the next major release. Use `sv.file()` with `pnpm.onlyBuiltDependencies()` from `@sveltejs/sv-utils` instead. - `workspace.file.prettierignore`, `.prettierrc`, `.eslintConfig`, `.vscodeSettings`, `.vscodeExtensions` are deprecated and will be removed in the next major release. Use the raw strings directly (e.g. `'.prettierignore'`). @@ -877,7 +877,7 @@ - feat(vitest): update to vitest `4.0` ([#760](https://github.com/sveltejs/cli/pull/760)) - + - removing `@vitest/browser` in favor of `@vitest/browser-playwright` - run browser tests in headless mode @@ -1023,7 +1023,7 @@ - feat(cli): rework preconditions: ([#650](https://github.com/sveltejs/cli/pull/650)) - + - remove `--no-preconditions` option from `sv add` - add `--no-git-check` option to `sv add`. With this flag, even if some files are dirty, no prompt will be shown @@ -1046,7 +1046,7 @@ - feat: improve minimal template ([#643](https://github.com/sveltejs/cli/pull/643)) - + - move `favicon.svg` to `src/lib/assets` folder (to show inline/immutable assets) - add `static/robots.txt` (to keep static folder) - add `routes/+layout.svelte` (to show layout) diff --git a/packages/sv/src/create/shared/+library+typescript/tsconfig.json b/packages/sv/src/create/shared/+library+typescript/tsconfig.json index 65077d6d1..62f2df920 100644 --- a/packages/sv/src/create/shared/+library+typescript/tsconfig.json +++ b/packages/sv/src/create/shared/+library+typescript/tsconfig.json @@ -1,8 +1,7 @@ { "extends": "$app/tsconfig", "compilerOptions": { - "strict": true, - "types": ["node"] + "strict": true }, "include": ["src", "vite.config.ts"] } diff --git a/packages/sv/src/create/shared/+typescript/tsconfig.json b/packages/sv/src/create/shared/+typescript/tsconfig.json index 65077d6d1..62f2df920 100644 --- a/packages/sv/src/create/shared/+typescript/tsconfig.json +++ b/packages/sv/src/create/shared/+typescript/tsconfig.json @@ -1,8 +1,7 @@ { "extends": "$app/tsconfig", "compilerOptions": { - "strict": true, - "types": ["node"] + "strict": true }, "include": ["src", "vite.config.ts"] } diff --git a/packages/sv/src/create/templates/demo/src/routes/+layout.svelte b/packages/sv/src/create/templates/demo/src/routes/+layout.svelte index 7ad953de2..228d69e38 100644 --- a/packages/sv/src/create/templates/demo/src/routes/+layout.svelte +++ b/packages/sv/src/create/templates/demo/src/routes/+layout.svelte @@ -2,7 +2,6 @@ import type { LayoutProps } from './$types'; import Header from './Header.svelte'; import './layout.css'; - import type { LayoutProps } from './$types'; /** @type {{children: import('svelte').Snippet}} */ let { children }: LayoutProps = $props(); From b4314f099ec175584f08ff876fe434aade298990 Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Sun, 4 Oct 2026 01:14:05 +0800 Subject: [PATCH 16/20] . --- packages/sv/src/addons/eslint.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/sv/src/addons/eslint.ts b/packages/sv/src/addons/eslint.ts index 87bfe14c5..a4db484d4 100644 --- a/packages/sv/src/addons/eslint.ts +++ b/packages/sv/src/addons/eslint.ts @@ -83,11 +83,10 @@ export default defineAddon({ ' see: https://typescript-eslint.io/troubleshooting/faqs/eslint/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors' }); + const tsOptions = { projectService: { allowDefaultProject: ['*.js'] } }; const globalsConfig = js.object.create({ languageOptions: { - parserOptions: typescript - ? { projectService: { allowDefaultProject: ['*.js'] } } - : undefined, + parserOptions: typescript ? tsOptions : undefined, globals: globalsObjLiteral }, rules: typescript ? rules : undefined From 9123830821f273a15890e1912f2061e92ade1086 Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Sun, 4 Oct 2026 01:19:49 +0800 Subject: [PATCH 17/20] . --- packages/sv/src/cli/tests/snapshots/create-only/tsconfig.json | 3 +-- .../cli/tests/snapshots/create-with-all-addons/tsconfig.json | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/sv/src/cli/tests/snapshots/create-only/tsconfig.json b/packages/sv/src/cli/tests/snapshots/create-only/tsconfig.json index 65077d6d1..62f2df920 100644 --- a/packages/sv/src/cli/tests/snapshots/create-only/tsconfig.json +++ b/packages/sv/src/cli/tests/snapshots/create-only/tsconfig.json @@ -1,8 +1,7 @@ { "extends": "$app/tsconfig", "compilerOptions": { - "strict": true, - "types": ["node"] + "strict": true }, "include": ["src", "vite.config.ts"] } diff --git a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/tsconfig.json b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/tsconfig.json index 2125d37b0..ea3a1cb6a 100644 --- a/packages/sv/src/cli/tests/snapshots/create-with-all-addons/tsconfig.json +++ b/packages/sv/src/cli/tests/snapshots/create-with-all-addons/tsconfig.json @@ -1,8 +1,7 @@ { "extends": "$app/tsconfig", "compilerOptions": { - "strict": true, - "types": ["node"] + "strict": true }, "include": [ "src", From 167cefe60793419c734dd8faa7be5115a083e055 Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Sun, 4 Oct 2026 01:57:20 +0800 Subject: [PATCH 18/20] --- .../create/templates/demo/src/routes/sverdle/+page.svelte | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/sv/src/create/templates/demo/src/routes/sverdle/+page.svelte b/packages/sv/src/create/templates/demo/src/routes/sverdle/+page.svelte index 46f3054f0..9ff6ee1d1 100644 --- a/packages/sv/src/create/templates/demo/src/routes/sverdle/+page.svelte +++ b/packages/sv/src/create/templates/demo/src/routes/sverdle/+page.svelte @@ -2,7 +2,7 @@ import { enhance } from '$app/forms'; import { resolve } from '$app/paths'; import { confetti } from '@neoconfetti/svelte'; - import { MediaQuery } from 'svelte/reactivity'; + import { prefersReducedMotion } from 'svelte/motion'; import type { PageProps } from './$types'; /** @@ -10,9 +10,6 @@ */ let { data }: PageProps = $props(); - /** Whether the user prefers reduced motion */ - const reducedMotion = new MediaQuery('(prefers-reduced-motion: reduce)'); - let shake = $state(false); /** Whether or not the user has won */ @@ -197,7 +194,7 @@
Date: Sun, 4 Oct 2026 01:58:57 +0800 Subject: [PATCH 19/20] --- .../src/create/templates/demo/src/routes/sverdle/+page.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/sv/src/create/templates/demo/src/routes/sverdle/+page.svelte b/packages/sv/src/create/templates/demo/src/routes/sverdle/+page.svelte index 9ff6ee1d1..f883f132c 100644 --- a/packages/sv/src/create/templates/demo/src/routes/sverdle/+page.svelte +++ b/packages/sv/src/create/templates/demo/src/routes/sverdle/+page.svelte @@ -102,9 +102,9 @@ action="?/enter" use:enhance={() => { // prevent default callback from resetting the form - return ({ result, update }) => { + return async ({ result, update }) => { shake = result.type === 'failure'; - void update({ reset: false }); + await update({ reset: false }); }; }} > From c9141c89799bc9a0e2863d67f42cabc3b02a2ae5 Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Sun, 4 Oct 2026 03:37:01 +0800 Subject: [PATCH 20/20] removed unrelated code --- packages/sv/src/core/formatFiles.ts | 19 ++++++++----------- .../demo/src/routes/sverdle/+page.svelte | 7 +++++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/sv/src/core/formatFiles.ts b/packages/sv/src/core/formatFiles.ts index cad89299d..e14a56171 100644 --- a/packages/sv/src/core/formatFiles.ts +++ b/packages/sv/src/core/formatFiles.ts @@ -4,8 +4,7 @@ import * as p from '@clack/prompts'; import { type AgentName, loadPackageJson, resolveCommand } from '@sveltejs/sv-utils'; import * as resolve from 'empathic/resolve'; import * as walk from 'empathic/walk'; -import { exec, NonZeroExitError } from 'tinyexec'; -import { isNodeError } from './common.js'; +import { exec } from 'tinyexec'; import { detectPackageManager } from './package-manager.ts'; import { findWorkspaceRoot } from './workspace.ts'; @@ -114,14 +113,12 @@ async function run( await exec(command, args, { nodeOptions: { cwd, stdio: 'pipe' }, throwOnError: true }); return {}; } catch (e) { - if (e instanceof NonZeroExitError) { - // failures can land on either stream, so report both - const { stdout, stderr } = e.output ?? {}; - const message = [stderr, stdout].filter(Boolean).join('\n').trim(); - return { error: message }; - } - if (!isNodeError(e)) return { error: 'unknown error' }; - if (e.code === 'ENOENT') return { notFound: true, error: `${command} not found` }; - return { error: e.message }; + // @ts-expect-error tinyexec rethrows the spawn error as-is + if (e?.code === 'ENOENT') return { notFound: true, error: `${command} not found` }; + // @ts-expect-error `output` is only present on tinyexec's `NonZeroExitError` + const output = e?.output as { stderr?: string; stdout?: string } | undefined; + // failures can land on either stream, so report both + const message = [output?.stderr, output?.stdout].filter(Boolean).join('\n').trim(); + return { error: message || (e instanceof Error ? e.message : 'unknown error') }; } } diff --git a/packages/sv/src/create/templates/demo/src/routes/sverdle/+page.svelte b/packages/sv/src/create/templates/demo/src/routes/sverdle/+page.svelte index f883f132c..927ffe68a 100644 --- a/packages/sv/src/create/templates/demo/src/routes/sverdle/+page.svelte +++ b/packages/sv/src/create/templates/demo/src/routes/sverdle/+page.svelte @@ -2,7 +2,7 @@ import { enhance } from '$app/forms'; import { resolve } from '$app/paths'; import { confetti } from '@neoconfetti/svelte'; - import { prefersReducedMotion } from 'svelte/motion'; + import { MediaQuery } from 'svelte/reactivity'; import type { PageProps } from './$types'; /** @@ -10,6 +10,9 @@ */ let { data }: PageProps = $props(); + /** Whether the user prefers reduced motion */ + const reducedMotion = new MediaQuery('(prefers-reduced-motion: reduce)'); + let shake = $state(false); /** Whether or not the user has won */ @@ -194,7 +197,7 @@