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