diff --git a/.changeset/good-brooms-sing.md b/.changeset/good-brooms-sing.md new file mode 100644 index 000000000000..761aea148b6f --- /dev/null +++ b/.changeset/good-brooms-sing.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +Support `svelte.config.ts` as Typescript-based config file. diff --git a/packages/kit/src/cli.js b/packages/kit/src/cli.js index a8a7a9f9be28..5f3c002a5849 100755 --- a/packages/kit/src/cli.js +++ b/packages/kit/src/cli.js @@ -54,7 +54,7 @@ prog if (H) throw new Error('-H is no longer supported — use --https instead'); process.env.NODE_ENV = process.env.NODE_ENV || 'development'; - const config = await load_config(); + const config = await load_config({ mode: process.env.NODE_ENV }); const { dev } = await import('./core/dev/index.js'); @@ -89,7 +89,7 @@ prog .action(async ({ verbose }) => { try { process.env.NODE_ENV = process.env.NODE_ENV || 'production'; - const config = await load_config(); + const config = await load_config({ mode: process.env.NODE_ENV }); const { build } = await import('./core/build/index.js'); const build_data = await build(config); @@ -132,7 +132,7 @@ prog await check_port(port); process.env.NODE_ENV = process.env.NODE_ENV || 'production'; - const config = await load_config(); + const config = await load_config({ mode: process.env.NODE_ENV }); const { preview } = await import('./core/preview/index.js'); diff --git a/packages/kit/src/core/config/index.js b/packages/kit/src/core/config/index.js index 972248c36bb8..699af89c0d42 100644 --- a/packages/kit/src/core/config/index.js +++ b/packages/kit/src/core/config/index.js @@ -27,17 +27,33 @@ export function load_template(cwd, config) { return fs.readFileSync(template, 'utf-8'); } -export async function load_config({ cwd = process.cwd() } = {}) { +/** + * @param {{ + * cwd?: string; + * mode?: string; + * }} opts + */ +export async function load_config({ cwd = process.cwd(), mode = 'development' } = {}) { const config_file = path.join(cwd, 'svelte.config.js'); + const ts_config_file = path.join(cwd, 'svelte.config.ts'); + let config; - if (!fs.existsSync(config_file)) { + if (fs.existsSync(config_file)) { + config = await import(url.pathToFileURL(config_file).href); + } else if (fs.existsSync(ts_config_file)) { + const { loadConfigFromFile } = await import('vite'); + const resolved_config = await loadConfigFromFile( + { command: 'build', mode }, + ts_config_file, + cwd + ); + config = { default: resolved_config?.config }; + } else { throw new Error( 'You need to create a svelte.config.js file. See https://kit.svelte.dev/docs/configuration' ); } - const config = await import(url.pathToFileURL(config_file).href); - const validated = validate_config(config.default); validated.kit.files.assets = path.resolve(cwd, validated.kit.files.assets);