diff --git a/.changeset/poor-carpets-take.md b/.changeset/poor-carpets-take.md new file mode 100644 index 000000000..7931844c9 --- /dev/null +++ b/.changeset/poor-carpets-take.md @@ -0,0 +1,5 @@ +--- +'sv': patch +--- + +feat(demo): include file extensions for local imports diff --git a/packages/create/scripts/build-templates.js b/packages/create/scripts/build-templates.js index dccdc8ec7..d348d32de 100644 --- a/packages/create/scripts/build-templates.js +++ b/packages/create/scripts/build-templates.js @@ -21,6 +21,9 @@ async function convert_typescript(content) { // sucrase leaves invalid class fields intact code = code.replace(/^\s*[a-z]+;$/gm, ''); + // Replace "local import" that ends with ".ts" to ".js" + code = code.replace(/import (.+?) from ['"](.+?)\.ts['"]/g, 'import $1 from "$2.js"'); + // Prettier strips 'unnecessary' parens from .ts files, we need to hack them back in code = code.replace(/(\/\*\* @type.+? \*\/) (.+?) \/\*\*\*\//g, '$1($2)'); diff --git a/packages/create/shared/+library+typescript/tsconfig.json b/packages/create/shared/+library+typescript/tsconfig.json index 6f788f160..371777edd 100644 --- a/packages/create/shared/+library+typescript/tsconfig.json +++ b/packages/create/shared/+library+typescript/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "./.svelte-kit/tsconfig.json", "compilerOptions": { + "allowImportingTsExtensions": true, "allowJs": true, "checkJs": true, "esModuleInterop": true, diff --git a/packages/create/shared/+typescript/tsconfig.json b/packages/create/shared/+typescript/tsconfig.json index a5567ee6b..5a3b413ed 100644 --- a/packages/create/shared/+typescript/tsconfig.json +++ b/packages/create/shared/+typescript/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "./.svelte-kit/tsconfig.json", "compilerOptions": { + "allowImportingTsExtensions": true, "allowJs": true, "checkJs": true, "esModuleInterop": true, diff --git a/packages/create/templates/demo/src/routes/sverdle/+page.server.ts b/packages/create/templates/demo/src/routes/sverdle/+page.server.ts index 0f52fe8d6..4a24244f2 100644 --- a/packages/create/templates/demo/src/routes/sverdle/+page.server.ts +++ b/packages/create/templates/demo/src/routes/sverdle/+page.server.ts @@ -1,5 +1,5 @@ import { fail } from '@sveltejs/kit'; -import { Game } from './game'; +import { Game } from './game.ts'; import type { PageServerLoad, Actions } from './$types'; /** @satisfies {import('./$types').PageServerLoad} */ diff --git a/packages/create/templates/demo/src/routes/sverdle/game.ts b/packages/create/templates/demo/src/routes/sverdle/game.ts index d5cbe932e..1dba04031 100644 --- a/packages/create/templates/demo/src/routes/sverdle/game.ts +++ b/packages/create/templates/demo/src/routes/sverdle/game.ts @@ -1,4 +1,4 @@ -import { words, allowed } from './words.server'; +import { words, allowed } from './words.server.ts'; export class Game { index: number; diff --git a/packages/create/templates/demo/tsconfig.json b/packages/create/templates/demo/tsconfig.json index 81ff9770c..8b726c486 100644 --- a/packages/create/templates/demo/tsconfig.json +++ b/packages/create/templates/demo/tsconfig.json @@ -1,3 +1,6 @@ { - "extends": "./.svelte-kit/tsconfig.json" + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowImportingTsExtensions": true + } } diff --git a/packages/create/test/check.ts b/packages/create/test/check.ts index f2e459c5d..a370ae69e 100644 --- a/packages/create/test/check.ts +++ b/packages/create/test/check.ts @@ -3,7 +3,7 @@ import path from 'node:path'; import { promisify } from 'node:util'; import { fileURLToPath } from 'node:url'; import { exec, type PromiseWithChild } from 'node:child_process'; -import { beforeAll, describe, test } from 'vitest'; +import { beforeAll, describe, expect, test } from 'vitest'; import { create, type LanguageType, type TemplateType } from '../index.ts'; // Resolve the given path relative to the current file @@ -57,6 +57,17 @@ for (const template of templates) { tests.push([`${template}-${types}`, () => exec_async(`pnpm ${script}`, { cwd })]); script_test_map.set(script, tests); } + + if (template === 'demo') { + describe(`local import with extentions`, () => { + test(`${template}-${types}`, () => { + const ending = types === 'typescript' ? 'ts' : 'js'; + const gameFile = path.join(cwd, `src/routes/sverdle/game.${ending}`); + const gameFileContent = fs.readFileSync(gameFile, 'utf-8'); + expect(gameFileContent).toContain(`./words.server.${ending}`); + }); + }); + } } }