From a2c2e3f167fad16427db4bc6590d3f013d79c348 Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Tue, 15 Oct 2024 23:48:54 +0200 Subject: [PATCH 1/3] fix: moving deriveds during migration deletes part of the inserted code --- .changeset/cool-apes-confess.md | 5 +++++ packages/svelte/src/compiler/migrate/index.js | 7 ++++++- .../input.svelte | 12 ++++++++++++ .../output.svelte | 16 ++++++++++++++++ 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 .changeset/cool-apes-confess.md create mode 100644 packages/svelte/tests/migrate/samples/reactive-statements-reorder-not-deleting-additions/input.svelte create mode 100644 packages/svelte/tests/migrate/samples/reactive-statements-reorder-not-deleting-additions/output.svelte diff --git a/.changeset/cool-apes-confess.md b/.changeset/cool-apes-confess.md new file mode 100644 index 000000000000..c4a1b80fe373 --- /dev/null +++ b/.changeset/cool-apes-confess.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: moving deriveds during migration deletes part of the inserted code diff --git a/packages/svelte/src/compiler/migrate/index.js b/packages/svelte/src/compiler/migrate/index.js index 5c2c1fb48413..ab78a98da8fc 100644 --- a/packages/svelte/src/compiler/migrate/index.js +++ b/packages/svelte/src/compiler/migrate/index.js @@ -273,7 +273,12 @@ export function migrate(source, { filename } = {}) { const { start, end } = get_node_range(source, node); str.appendLeft(end, '\n'); str.move(start, end, /** @type {number} */ (parsed.instance?.content.end)); - str.remove(start - (source[start - 2] === '\r' ? 2 : 1), start); + const carriage_idx = start - (source[start - 2] === '\r' ? 2 : 1); + // we might end up injecting something at the position we are about to remove + // since we only want to remove the carriage if we add the trimmed length + // of the transformed string to prevent removing something we added. + const transformed = state.str.snip(carriage_idx, start).toString().trim(); + str.remove(carriage_idx + transformed.length, start); } } diff --git a/packages/svelte/tests/migrate/samples/reactive-statements-reorder-not-deleting-additions/input.svelte b/packages/svelte/tests/migrate/samples/reactive-statements-reorder-not-deleting-additions/input.svelte new file mode 100644 index 000000000000..2b90ce8212ea --- /dev/null +++ b/packages/svelte/tests/migrate/samples/reactive-statements-reorder-not-deleting-additions/input.svelte @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/packages/svelte/tests/migrate/samples/reactive-statements-reorder-not-deleting-additions/output.svelte b/packages/svelte/tests/migrate/samples/reactive-statements-reorder-not-deleting-additions/output.svelte new file mode 100644 index 000000000000..7ebb4653dc43 --- /dev/null +++ b/packages/svelte/tests/migrate/samples/reactive-statements-reorder-not-deleting-additions/output.svelte @@ -0,0 +1,16 @@ + \ No newline at end of file From 2dffe40bf722ed8bf6f1a1d14fd6c6b7399bc525 Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Wed, 16 Oct 2024 09:39:16 +0200 Subject: [PATCH 2/3] fix: use update instead of remove --- packages/svelte/src/compiler/migrate/index.js | 7 +------ .../output.svelte | 1 - 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/svelte/src/compiler/migrate/index.js b/packages/svelte/src/compiler/migrate/index.js index ab78a98da8fc..42727ea21273 100644 --- a/packages/svelte/src/compiler/migrate/index.js +++ b/packages/svelte/src/compiler/migrate/index.js @@ -273,12 +273,7 @@ export function migrate(source, { filename } = {}) { const { start, end } = get_node_range(source, node); str.appendLeft(end, '\n'); str.move(start, end, /** @type {number} */ (parsed.instance?.content.end)); - const carriage_idx = start - (source[start - 2] === '\r' ? 2 : 1); - // we might end up injecting something at the position we are about to remove - // since we only want to remove the carriage if we add the trimmed length - // of the transformed string to prevent removing something we added. - const transformed = state.str.snip(carriage_idx, start).toString().trim(); - str.remove(carriage_idx + transformed.length, start); + str.update(start - (source[start - 2] === '\r' ? 2 : 1), start, ''); } } diff --git a/packages/svelte/tests/migrate/samples/reactive-statements-reorder-not-deleting-additions/output.svelte b/packages/svelte/tests/migrate/samples/reactive-statements-reorder-not-deleting-additions/output.svelte index 7ebb4653dc43..dffe4308fbc8 100644 --- a/packages/svelte/tests/migrate/samples/reactive-statements-reorder-not-deleting-additions/output.svelte +++ b/packages/svelte/tests/migrate/samples/reactive-statements-reorder-not-deleting-additions/output.svelte @@ -7,7 +7,6 @@ let { data } = $props(); let bar = $state() - let { foo } = $derived(data) run(() => { bar = [] From 92823979975de99660beabb5595a115d2d8376f2 Mon Sep 17 00:00:00 2001 From: Paolo Ricciuti Date: Wed, 16 Oct 2024 10:28:38 +0200 Subject: [PATCH 3/3] Update .changeset/cool-apes-confess.md Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> --- .changeset/cool-apes-confess.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/cool-apes-confess.md b/.changeset/cool-apes-confess.md index c4a1b80fe373..6142d430ffc8 100644 --- a/.changeset/cool-apes-confess.md +++ b/.changeset/cool-apes-confess.md @@ -2,4 +2,4 @@ 'svelte': patch --- -fix: moving deriveds during migration deletes part of the inserted code +fix: ensure inserted code is preserved during migration