diff --git a/.changeset/giant-wombats-allow.md b/.changeset/giant-wombats-allow.md new file mode 100644 index 000000000000..e9d152a946d4 --- /dev/null +++ b/.changeset/giant-wombats-allow.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: allow to pass in TS preference to migration diff --git a/packages/svelte/src/compiler/migrate/index.js b/packages/svelte/src/compiler/migrate/index.js index ceb2ad5da231..fc271f864d27 100644 --- a/packages/svelte/src/compiler/migrate/index.js +++ b/packages/svelte/src/compiler/migrate/index.js @@ -39,10 +39,10 @@ class MigrationError extends Error { * May throw an error if the code is too complex to migrate automatically. * * @param {string} source - * @param {{filename?: string}} [options] + * @param {{ filename?: string, use_ts?: boolean }} [options] * @returns {{ code: string; }} */ -export function migrate(source, { filename } = {}) { +export function migrate(source, { filename, use_ts } = {}) { let og_source = source; try { has_migration_task = false; @@ -115,9 +115,12 @@ export function migrate(source, { filename } = {}) { derived_components: new Map(), derived_labeled_statements: new Set(), has_svelte_self: false, - uses_ts: !!parsed.instance?.attributes.some( - (attr) => attr.name === 'lang' && /** @type {any} */ (attr).value[0].data === 'ts' - ) + uses_ts: + // Some people could use jsdoc but have a tsconfig.json, so double-check file for jsdoc indicators + (use_ts && !source.includes('@type {')) || + !!parsed.instance?.attributes.some( + (attr) => attr.name === 'lang' && /** @type {any} */ (attr).value[0].data === 'ts' + ) }; if (parsed.module) { diff --git a/packages/svelte/tests/migrate/samples/slot-use_ts/_config.js b/packages/svelte/tests/migrate/samples/slot-use_ts/_config.js new file mode 100644 index 000000000000..dbc620d66e66 --- /dev/null +++ b/packages/svelte/tests/migrate/samples/slot-use_ts/_config.js @@ -0,0 +1,5 @@ +import { test } from '../../test'; + +export default test({ + use_ts: true +}); diff --git a/packages/svelte/tests/migrate/samples/slot-use_ts/input.svelte b/packages/svelte/tests/migrate/samples/slot-use_ts/input.svelte new file mode 100644 index 000000000000..0385342cef1b --- /dev/null +++ b/packages/svelte/tests/migrate/samples/slot-use_ts/input.svelte @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/svelte/tests/migrate/samples/slot-use_ts/output.svelte b/packages/svelte/tests/migrate/samples/slot-use_ts/output.svelte new file mode 100644 index 000000000000..3e92f5ceb124 --- /dev/null +++ b/packages/svelte/tests/migrate/samples/slot-use_ts/output.svelte @@ -0,0 +1,9 @@ + + +{@render children?.()} \ No newline at end of file diff --git a/packages/svelte/tests/migrate/test.ts b/packages/svelte/tests/migrate/test.ts index 048c8696a429..a4b48f2fa77d 100644 --- a/packages/svelte/tests/migrate/test.ts +++ b/packages/svelte/tests/migrate/test.ts @@ -6,6 +6,7 @@ import { suite, type BaseTest } from '../suite.js'; interface ParserTest extends BaseTest { skip_filename?: boolean; + use_ts?: boolean; logs?: any[]; errors?: any[]; } @@ -32,7 +33,8 @@ const { test, run } = suite(async (config, cwd) => { } const actual = migrate(input, { - filename: config.skip_filename ? undefined : `output.svelte` + filename: config.skip_filename ? undefined : `output.svelte`, + use_ts: config.use_ts }).code; if (config.logs) { diff --git a/packages/svelte/types/index.d.ts b/packages/svelte/types/index.d.ts index 4e57607efc9f..559cf1b26538 100644 --- a/packages/svelte/types/index.d.ts +++ b/packages/svelte/types/index.d.ts @@ -1292,8 +1292,9 @@ declare module 'svelte/compiler' { * May throw an error if the code is too complex to migrate automatically. * * */ - export function migrate(source: string, { filename }?: { + export function migrate(source: string, { filename, use_ts }?: { filename?: string; + use_ts?: boolean; } | undefined): { code: string; };