From b4ddf48767785ee56b31aad5bc8e8e626dd277dc Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Mon, 22 Dec 2025 15:29:27 +0800 Subject: [PATCH 01/10] colocate assets --- .../create/templates/demo/src/routes/+page.svelte | 4 ++-- .../create/templates/demo/src/routes/Header.svelte | 4 ++-- .../demo/src/{lib/images => routes}/github.svg | 0 .../demo/src/{lib/images => routes}/svelte-logo.svg | 0 .../src/{lib/images => routes}/svelte-welcome.png | Bin .../src/{lib/images => routes}/svelte-welcome.webp | Bin 6 files changed, 4 insertions(+), 4 deletions(-) rename packages/sv/lib/create/templates/demo/src/{lib/images => routes}/github.svg (100%) rename packages/sv/lib/create/templates/demo/src/{lib/images => routes}/svelte-logo.svg (100%) rename packages/sv/lib/create/templates/demo/src/{lib/images => routes}/svelte-welcome.png (100%) rename packages/sv/lib/create/templates/demo/src/{lib/images => routes}/svelte-welcome.webp (100%) diff --git a/packages/sv/lib/create/templates/demo/src/routes/+page.svelte b/packages/sv/lib/create/templates/demo/src/routes/+page.svelte index a328ff63a..0f797fd5f 100644 --- a/packages/sv/lib/create/templates/demo/src/routes/+page.svelte +++ b/packages/sv/lib/create/templates/demo/src/routes/+page.svelte @@ -1,7 +1,7 @@ diff --git a/packages/sv/lib/create/templates/demo/src/routes/Header.svelte b/packages/sv/lib/create/templates/demo/src/routes/Header.svelte index 0e719eb08..ff378aecd 100644 --- a/packages/sv/lib/create/templates/demo/src/routes/Header.svelte +++ b/packages/sv/lib/create/templates/demo/src/routes/Header.svelte @@ -1,8 +1,8 @@
diff --git a/packages/sv/lib/create/templates/demo/src/lib/images/github.svg b/packages/sv/lib/create/templates/demo/src/routes/github.svg similarity index 100% rename from packages/sv/lib/create/templates/demo/src/lib/images/github.svg rename to packages/sv/lib/create/templates/demo/src/routes/github.svg diff --git a/packages/sv/lib/create/templates/demo/src/lib/images/svelte-logo.svg b/packages/sv/lib/create/templates/demo/src/routes/svelte-logo.svg similarity index 100% rename from packages/sv/lib/create/templates/demo/src/lib/images/svelte-logo.svg rename to packages/sv/lib/create/templates/demo/src/routes/svelte-logo.svg diff --git a/packages/sv/lib/create/templates/demo/src/lib/images/svelte-welcome.png b/packages/sv/lib/create/templates/demo/src/routes/svelte-welcome.png similarity index 100% rename from packages/sv/lib/create/templates/demo/src/lib/images/svelte-welcome.png rename to packages/sv/lib/create/templates/demo/src/routes/svelte-welcome.png diff --git a/packages/sv/lib/create/templates/demo/src/lib/images/svelte-welcome.webp b/packages/sv/lib/create/templates/demo/src/routes/svelte-welcome.webp similarity index 100% rename from packages/sv/lib/create/templates/demo/src/lib/images/svelte-welcome.webp rename to packages/sv/lib/create/templates/demo/src/routes/svelte-welcome.webp From abf6329134911bebbae4e3c08947912710dcd0a4 Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Mon, 22 Dec 2025 15:58:09 +0800 Subject: [PATCH 02/10] consistent names --- packages/sv/lib/cli/add/utils.ts | 4 ++-- packages/sv/lib/cli/add/workspace.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/sv/lib/cli/add/utils.ts b/packages/sv/lib/cli/add/utils.ts index d2e4e8216..95089cb1f 100644 --- a/packages/sv/lib/cli/add/utils.ts +++ b/packages/sv/lib/cli/add/utils.ts @@ -130,8 +130,8 @@ export const commonFilePaths = { packageJson: 'package.json', svelteConfig: 'svelte.config.js', svelteConfigTS: 'svelte.config.ts', - jsconfig: 'jsconfig.json', - tsconfig: 'tsconfig.json', + jsConfig: 'jsconfig.json', + tsConfig: 'tsconfig.json', viteConfig: 'vite.config.js', viteConfigTS: 'vite.config.ts' } as const; diff --git a/packages/sv/lib/cli/add/workspace.ts b/packages/sv/lib/cli/add/workspace.ts index 886ca7468..e80040700 100644 --- a/packages/sv/lib/cli/add/workspace.ts +++ b/packages/sv/lib/cli/add/workspace.ts @@ -24,9 +24,9 @@ export async function createWorkspace({ const resolvedCwd = path.resolve(cwd); // Will go up and prioritize jsconfig.json as it's first in the array - const tjsconfig = find.any([commonFilePaths.jsconfig, commonFilePaths.tsconfig], { cwd }); + const tjsconfig = find.any([commonFilePaths.jsConfig, commonFilePaths.tsConfig], { cwd }); // If the file is not ending with jsconfig.json, then we are using typescript - const usesTypescript = !tjsconfig?.endsWith(commonFilePaths.jsconfig); + const usesTypescript = !tjsconfig?.endsWith(commonFilePaths.jsConfig); // This is not linked with typescript detection const viteConfigPath = path.join(resolvedCwd, commonFilePaths.viteConfigTS); From 2cb17441a3dbcd71730b45d51955e341383dd7f3 Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Mon, 22 Dec 2025 15:59:18 +0800 Subject: [PATCH 03/10] easier to read --- packages/sv/lib/cli/add/workspace.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/sv/lib/cli/add/workspace.ts b/packages/sv/lib/cli/add/workspace.ts index e80040700..9d1ac3bc1 100644 --- a/packages/sv/lib/cli/add/workspace.ts +++ b/packages/sv/lib/cli/add/workspace.ts @@ -24,9 +24,8 @@ export async function createWorkspace({ const resolvedCwd = path.resolve(cwd); // Will go up and prioritize jsconfig.json as it's first in the array - const tjsconfig = find.any([commonFilePaths.jsConfig, commonFilePaths.tsConfig], { cwd }); - // If the file is not ending with jsconfig.json, then we are using typescript - const usesTypescript = !tjsconfig?.endsWith(commonFilePaths.jsConfig); + const tsConfigPath = find.any([commonFilePaths.jsConfig, commonFilePaths.tsConfig], { cwd }); + const typescript = tsConfigPath?.endsWith(commonFilePaths.tsConfig) ?? false; // This is not linked with typescript detection const viteConfigPath = path.join(resolvedCwd, commonFilePaths.viteConfigTS); @@ -82,7 +81,7 @@ export async function createWorkspace({ return { cwd: resolvedCwd, packageManager: packageManager ?? (await detect({ cwd }))?.name ?? getUserAgent() ?? 'npm', - typescript: usesTypescript, + typescript, files: { viteConfig, svelteConfig, From 4e8bf5ec43f7d48c20da9782c618d93d415d6729 Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Mon, 22 Dec 2025 16:05:38 +0800 Subject: [PATCH 04/10] use `commonFilePaths` --- packages/sv/lib/cli/add/workspace.ts | 9 ++++++--- packages/sv/lib/create/index.ts | 5 +++-- packages/sv/lib/create/playground.ts | 5 +++-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/sv/lib/cli/add/workspace.ts b/packages/sv/lib/cli/add/workspace.ts index 9d1ac3bc1..e699f81ee 100644 --- a/packages/sv/lib/cli/add/workspace.ts +++ b/packages/sv/lib/cli/add/workspace.ts @@ -134,7 +134,7 @@ function parseKitOptions(cwd: string) { const { ast } = parseScript(configSource); const defaultExport = ast.body.find((s) => s.type === 'ExportDefaultDeclaration'); - if (!defaultExport) throw Error('Missing default export in `svelte.config.js`'); + if (!defaultExport) throw Error(`Missing default export in \`${commonFilePaths.svelteConfig}\``); let objectExpression: AstTypes.ObjectExpression | undefined; if (defaultExport.declaration.type === 'Identifier') { @@ -156,14 +156,17 @@ function parseKitOptions(cwd: string) { } if (!objectExpression) - throw Error('Unable to find svelte config object expression from `svelte.config.js`'); + throw Error( + `Unable to find svelte config object expression from \`${commonFilePaths.svelteConfig}\`` + ); } else if (defaultExport.declaration.type === 'ObjectExpression') { // e.g. `export default { ... };` objectExpression = defaultExport.declaration; } // We'll error out since we can't safely determine the config object - if (!objectExpression) throw new Error('Unexpected svelte config shape from `svelte.config.js`'); + if (!objectExpression) + throw new Error(`Unexpected svelte config shape from \`${commonFilePaths.svelteConfig}\``); const kit = object.property(objectExpression, { name: 'kit', fallback: object.create({}) }); const files = object.property(kit, { name: 'files', fallback: object.create({}) }); diff --git a/packages/sv/lib/create/index.ts b/packages/sv/lib/create/index.ts index 59b1ba8fb..89dad90b5 100644 --- a/packages/sv/lib/create/index.ts +++ b/packages/sv/lib/create/index.ts @@ -1,6 +1,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { mkdirp, copy, dist, getSharedFiles } from './utils.ts'; +import { commonFilePaths } from '../cli/add/utils.ts'; export type TemplateType = (typeof templateTypes)[number]; export type LanguageType = (typeof languageTypes)[number]; @@ -68,7 +69,7 @@ function write_template_files(template: string, types: LanguageType, name: strin function write_common_files(cwd: string, options: Options, name: string) { const files = getSharedFiles(); - const pkg_file = path.join(cwd, 'package.json'); + const pkg_file = path.join(cwd, commonFilePaths.packageJson); const pkg = /** @type {any} */ JSON.parse(fs.readFileSync(pkg_file, 'utf-8')); sort_files(files).forEach((file) => { @@ -77,7 +78,7 @@ function write_common_files(cwd: string, options: Options, name: string) { if (exclude || !include) return; - if (file.name === 'package.json') { + if (file.name === commonFilePaths.packageJson) { const new_pkg = JSON.parse(file.contents); merge(pkg, new_pkg); } else { diff --git a/packages/sv/lib/create/playground.ts b/packages/sv/lib/create/playground.ts index 6ec216415..4ee2c3252 100644 --- a/packages/sv/lib/create/playground.ts +++ b/packages/sv/lib/create/playground.ts @@ -6,6 +6,7 @@ import { parseJson, parseScript, parseSvelte } from '../core/tooling/parsers.ts' import { isVersionUnsupportedBelow } from '../core/index.ts'; import { getSharedFiles } from './utils.ts'; import { walk } from 'zimmerframe'; +import { commonFilePaths } from '../cli/add/utils.ts'; export function validatePlaygroundUrl(link: string): boolean { try { @@ -231,7 +232,7 @@ export function setupPlaygroundProject( fs.writeFileSync(filePath, newContent, 'utf-8'); // add packages as dependencies to package.json if requested - const pkgPath = path.join(cwd, 'package.json'); + const pkgPath = path.join(cwd, commonFilePaths.packageJson); const pkgSource = fs.readFileSync(pkgPath, 'utf-8'); const pkgJson = parseJson(pkgSource); let updatePackageJson = false; @@ -245,7 +246,7 @@ export function setupPlaygroundProject( let experimentalAsyncNeeded = true; const addExperimentalAsync = () => { - const svelteConfigPath = path.join(cwd, 'svelte.config.js'); + const svelteConfigPath = path.join(cwd, commonFilePaths.svelteConfig); const svelteConfig = fs.readFileSync(svelteConfigPath, 'utf-8'); const { ast, generateCode } = parseScript(svelteConfig); const { value: config } = js.exports.createDefault(ast, { fallback: js.object.create({}) }); From fe67658a8113a3ccd6edab55fe89ea068030fb47 Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Mon, 22 Dec 2025 16:06:28 +0800 Subject: [PATCH 05/10] comment on no ecosystem support for `svelte.config.ts` --- packages/sv/lib/cli/add/workspace.ts | 3 +++ packages/sv/lib/cli/create.ts | 3 ++- packages/sv/lib/create/playground.ts | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/sv/lib/cli/add/workspace.ts b/packages/sv/lib/cli/add/workspace.ts index e699f81ee..dde127b9c 100644 --- a/packages/sv/lib/cli/add/workspace.ts +++ b/packages/sv/lib/cli/add/workspace.ts @@ -32,6 +32,9 @@ export async function createWorkspace({ const viteConfig = fs.existsSync(viteConfigPath) ? commonFilePaths.viteConfigTS : commonFilePaths.viteConfig; + + // ecosystem doesn't support `svelte.config.ts` https://github.com/sveltejs/cli/issues/816#issuecomment-3568032867 + // but the user may have opt in to it const svelteConfigPath = path.join(resolvedCwd, commonFilePaths.svelteConfigTS); const svelteConfig = fs.existsSync(svelteConfigPath) ? commonFilePaths.svelteConfigTS diff --git a/packages/sv/lib/cli/create.ts b/packages/sv/lib/cli/create.ts index e02d2eeb6..7a5b7a4fe 100644 --- a/packages/sv/lib/cli/create.ts +++ b/packages/sv/lib/cli/create.ts @@ -390,7 +390,8 @@ export async function createVirtualWorkspace({ files: { ...tentativeWorkspace.files, viteConfig: type === 'typescript' ? commonFilePaths.viteConfigTS : commonFilePaths.viteConfig, - svelteConfig: commonFilePaths.svelteConfig // currently we always use js files, never typescript files + // ecosystem doesn't support `svelte.config.ts` https://github.com/sveltejs/cli/issues/816#issuecomment-3568032867 + svelteConfig: commonFilePaths.svelteConfig } }; diff --git a/packages/sv/lib/create/playground.ts b/packages/sv/lib/create/playground.ts index 4ee2c3252..c7a108757 100644 --- a/packages/sv/lib/create/playground.ts +++ b/packages/sv/lib/create/playground.ts @@ -246,6 +246,7 @@ export function setupPlaygroundProject( let experimentalAsyncNeeded = true; const addExperimentalAsync = () => { + // ecosystem doesn't support `svelte.config.ts` https://github.com/sveltejs/cli/issues/816#issuecomment-3568032867 const svelteConfigPath = path.join(cwd, commonFilePaths.svelteConfig); const svelteConfig = fs.readFileSync(svelteConfigPath, 'utf-8'); const { ast, generateCode } = parseScript(svelteConfig); From 483cf0f2f71cdec652cf3b5be9c00f65965efa0e Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Mon, 22 Dec 2025 16:06:32 +0800 Subject: [PATCH 06/10] typo --- packages/sv/lib/create/playground.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sv/lib/create/playground.ts b/packages/sv/lib/create/playground.ts index c7a108757..189de81a1 100644 --- a/packages/sv/lib/create/playground.ts +++ b/packages/sv/lib/create/playground.ts @@ -255,7 +255,7 @@ export function setupPlaygroundProject( fs.writeFileSync(svelteConfigPath, generateCode(), 'utf-8'); }; - // we want to change the svelte version, even if the user decieded + // we want to change the svelte version, even if the user decided // to not install external dependencies if (playground.svelteVersion) { updatePackageJson = true; From df9037a42485771f86cd751408770dc3825560f5 Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Mon, 22 Dec 2025 21:28:27 +0800 Subject: [PATCH 07/10] Update packages/sv/lib/cli/add/workspace.ts Co-authored-by: jyc.dev --- packages/sv/lib/cli/add/workspace.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/sv/lib/cli/add/workspace.ts b/packages/sv/lib/cli/add/workspace.ts index dde127b9c..f49eec346 100644 --- a/packages/sv/lib/cli/add/workspace.ts +++ b/packages/sv/lib/cli/add/workspace.ts @@ -24,8 +24,8 @@ export async function createWorkspace({ const resolvedCwd = path.resolve(cwd); // Will go up and prioritize jsconfig.json as it's first in the array - const tsConfigPath = find.any([commonFilePaths.jsConfig, commonFilePaths.tsConfig], { cwd }); - const typescript = tsConfigPath?.endsWith(commonFilePaths.tsConfig) ?? false; + const jtsConfigPath = find.any([commonFilePaths.jsConfig, commonFilePaths.tsConfig], { cwd }); + const typescript = jtsConfigPath?.endsWith(commonFilePaths.tsConfig) ?? false; // This is not linked with typescript detection const viteConfigPath = path.join(resolvedCwd, commonFilePaths.viteConfigTS); From 2d7cd69c04399a2fb63608296280db1e5ddd5a0f Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Wed, 24 Dec 2025 15:53:46 +0800 Subject: [PATCH 08/10] Revert "consistent names" This reverts commit abf6329134911bebbae4e3c08947912710dcd0a4. --- packages/sv/lib/cli/add/utils.ts | 4 ++-- packages/sv/lib/cli/add/workspace.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/sv/lib/cli/add/utils.ts b/packages/sv/lib/cli/add/utils.ts index 95089cb1f..d2e4e8216 100644 --- a/packages/sv/lib/cli/add/utils.ts +++ b/packages/sv/lib/cli/add/utils.ts @@ -130,8 +130,8 @@ export const commonFilePaths = { packageJson: 'package.json', svelteConfig: 'svelte.config.js', svelteConfigTS: 'svelte.config.ts', - jsConfig: 'jsconfig.json', - tsConfig: 'tsconfig.json', + jsconfig: 'jsconfig.json', + tsconfig: 'tsconfig.json', viteConfig: 'vite.config.js', viteConfigTS: 'vite.config.ts' } as const; diff --git a/packages/sv/lib/cli/add/workspace.ts b/packages/sv/lib/cli/add/workspace.ts index f49eec346..d11b4488b 100644 --- a/packages/sv/lib/cli/add/workspace.ts +++ b/packages/sv/lib/cli/add/workspace.ts @@ -24,8 +24,8 @@ export async function createWorkspace({ const resolvedCwd = path.resolve(cwd); // Will go up and prioritize jsconfig.json as it's first in the array - const jtsConfigPath = find.any([commonFilePaths.jsConfig, commonFilePaths.tsConfig], { cwd }); - const typescript = jtsConfigPath?.endsWith(commonFilePaths.tsConfig) ?? false; + const jtsConfigPath = find.any([commonFilePaths.jsconfig, commonFilePaths.tsconfig], { cwd }); + const typescript = jtsConfigPath?.endsWith(commonFilePaths.tsconfig) ?? false; // This is not linked with typescript detection const viteConfigPath = path.join(resolvedCwd, commonFilePaths.viteConfigTS); From 1a8e28eb799b4a05f5667dc42af17fc00bebc204 Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Wed, 24 Dec 2025 15:54:34 +0800 Subject: [PATCH 09/10] Revert "comment on no ecosystem support for `svelte.config.ts`" This reverts commit fe67658a8113a3ccd6edab55fe89ea068030fb47. --- packages/sv/lib/cli/add/workspace.ts | 3 --- packages/sv/lib/cli/create.ts | 3 +-- packages/sv/lib/create/playground.ts | 1 - 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/sv/lib/cli/add/workspace.ts b/packages/sv/lib/cli/add/workspace.ts index d11b4488b..29372862d 100644 --- a/packages/sv/lib/cli/add/workspace.ts +++ b/packages/sv/lib/cli/add/workspace.ts @@ -32,9 +32,6 @@ export async function createWorkspace({ const viteConfig = fs.existsSync(viteConfigPath) ? commonFilePaths.viteConfigTS : commonFilePaths.viteConfig; - - // ecosystem doesn't support `svelte.config.ts` https://github.com/sveltejs/cli/issues/816#issuecomment-3568032867 - // but the user may have opt in to it const svelteConfigPath = path.join(resolvedCwd, commonFilePaths.svelteConfigTS); const svelteConfig = fs.existsSync(svelteConfigPath) ? commonFilePaths.svelteConfigTS diff --git a/packages/sv/lib/cli/create.ts b/packages/sv/lib/cli/create.ts index 7a5b7a4fe..e02d2eeb6 100644 --- a/packages/sv/lib/cli/create.ts +++ b/packages/sv/lib/cli/create.ts @@ -390,8 +390,7 @@ export async function createVirtualWorkspace({ files: { ...tentativeWorkspace.files, viteConfig: type === 'typescript' ? commonFilePaths.viteConfigTS : commonFilePaths.viteConfig, - // ecosystem doesn't support `svelte.config.ts` https://github.com/sveltejs/cli/issues/816#issuecomment-3568032867 - svelteConfig: commonFilePaths.svelteConfig + svelteConfig: commonFilePaths.svelteConfig // currently we always use js files, never typescript files } }; diff --git a/packages/sv/lib/create/playground.ts b/packages/sv/lib/create/playground.ts index 189de81a1..33d7031dc 100644 --- a/packages/sv/lib/create/playground.ts +++ b/packages/sv/lib/create/playground.ts @@ -246,7 +246,6 @@ export function setupPlaygroundProject( let experimentalAsyncNeeded = true; const addExperimentalAsync = () => { - // ecosystem doesn't support `svelte.config.ts` https://github.com/sveltejs/cli/issues/816#issuecomment-3568032867 const svelteConfigPath = path.join(cwd, commonFilePaths.svelteConfig); const svelteConfig = fs.readFileSync(svelteConfigPath, 'utf-8'); const { ast, generateCode } = parseScript(svelteConfig); From 1cc1d50d6a6c2aa335d20384c6c259b0fb87ec9f Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Wed, 24 Dec 2025 15:57:55 +0800 Subject: [PATCH 10/10] Another take on `svelte.config.ts` --- packages/sv/lib/cli/add/utils.ts | 1 + packages/sv/lib/cli/add/workspace.ts | 2 ++ 2 files changed, 3 insertions(+) diff --git a/packages/sv/lib/cli/add/utils.ts b/packages/sv/lib/cli/add/utils.ts index d2e4e8216..2cb9601b7 100644 --- a/packages/sv/lib/cli/add/utils.ts +++ b/packages/sv/lib/cli/add/utils.ts @@ -129,6 +129,7 @@ export function fileExists(cwd: string, filePath: string): boolean { export const commonFilePaths = { packageJson: 'package.json', svelteConfig: 'svelte.config.js', + /** @deprecated `sv` uses `svelte.config.js` by default */ svelteConfigTS: 'svelte.config.ts', jsconfig: 'jsconfig.json', tsconfig: 'tsconfig.json', diff --git a/packages/sv/lib/cli/add/workspace.ts b/packages/sv/lib/cli/add/workspace.ts index 29372862d..0c8e736e1 100644 --- a/packages/sv/lib/cli/add/workspace.ts +++ b/packages/sv/lib/cli/add/workspace.ts @@ -32,6 +32,8 @@ export async function createWorkspace({ const viteConfig = fs.existsSync(viteConfigPath) ? commonFilePaths.viteConfigTS : commonFilePaths.viteConfig; + + // Users may have changed to `svelte.config.ts` const svelteConfigPath = path.join(resolvedCwd, commonFilePaths.svelteConfigTS); const svelteConfig = fs.existsSync(svelteConfigPath) ? commonFilePaths.svelteConfigTS