From 8ef693e94eddca38d92c62357efed877afd41ddf Mon Sep 17 00:00:00 2001 From: Nic Polumeyv Date: Mon, 28 Sep 2026 16:55:39 -0400 Subject: [PATCH] fix: don't hang `migrate` on a declaration that shares a line with its script tag (#18816) `migrate()` never returned when a declaration shared a line with its ` ``` The scan that removes a migrated `export let` line looked for a newline in both directions with no bound. It now stops at the script's edges. --- .changeset/migrate-tag-line.md | 5 +++++ packages/svelte/src/compiler/migrate/index.js | 6 ++++-- .../migrate/samples/props-on-script-tag-line/input.svelte | 2 ++ .../migrate/samples/props-on-script-tag-line/output.svelte | 3 +++ 4 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 .changeset/migrate-tag-line.md create mode 100644 packages/svelte/tests/migrate/samples/props-on-script-tag-line/input.svelte create mode 100644 packages/svelte/tests/migrate/samples/props-on-script-tag-line/output.svelte diff --git a/.changeset/migrate-tag-line.md b/.changeset/migrate-tag-line.md new file mode 100644 index 0000000000..414e4a249c --- /dev/null +++ b/.changeset/migrate-tag-line.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: don't hang `migrate` on a declaration that shares a line with its script tag diff --git a/packages/svelte/src/compiler/migrate/index.js b/packages/svelte/src/compiler/migrate/index.js index 3baef3ecae..00f997e054 100644 --- a/packages/svelte/src/compiler/migrate/index.js +++ b/packages/svelte/src/compiler/migrate/index.js @@ -910,8 +910,10 @@ const instance_script = { start = /** @type {number} */ (parent.start); end = /** @type {number} */ (parent.end); } - while (state.str.original[start] !== '\n') start--; - while (state.str.original[end] !== '\n') end++; + // remove the declaration's whole line, or what there is of it inside the script + const script = /** @type {{ start: number; end: number }} */ (state.analysis.instance.ast); + while (start > script.start && state.str.original[start] !== '\n') start--; + while (end < script.end && state.str.original[end] !== '\n') end++; state.str.update(start, end, ''); } }, diff --git a/packages/svelte/tests/migrate/samples/props-on-script-tag-line/input.svelte b/packages/svelte/tests/migrate/samples/props-on-script-tag-line/input.svelte new file mode 100644 index 0000000000..dd623897bd --- /dev/null +++ b/packages/svelte/tests/migrate/samples/props-on-script-tag-line/input.svelte @@ -0,0 +1,2 @@ + +

{answer}

diff --git a/packages/svelte/tests/migrate/samples/props-on-script-tag-line/output.svelte b/packages/svelte/tests/migrate/samples/props-on-script-tag-line/output.svelte new file mode 100644 index 0000000000..add32531da --- /dev/null +++ b/packages/svelte/tests/migrate/samples/props-on-script-tag-line/output.svelte @@ -0,0 +1,3 @@ + +

{answer}

\ No newline at end of file