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;
};