From d8951b5de703ab31536da1841863f850d5a73cd4 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Thu, 1 Aug 2024 13:37:00 +0200 Subject: [PATCH] fix: correctly migrate reactive assignment with member expression From https://github.com/sveltejs/kit/pull/12519#issuecomment-2258840595 --- packages/svelte/src/compiler/migrate/index.js | 6 +++++- packages/svelte/tests/migrate/samples/effects/input.svelte | 1 + packages/svelte/tests/migrate/samples/effects/output.svelte | 3 +++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/svelte/src/compiler/migrate/index.js b/packages/svelte/src/compiler/migrate/index.js index cc5344e5c2..b46ef809da 100644 --- a/packages/svelte/src/compiler/migrate/index.js +++ b/packages/svelte/src/compiler/migrate/index.js @@ -412,7 +412,11 @@ const instance_script = { const ids = extract_identifiers(node.body.expression.left); const bindings = ids.map((id) => state.scope.get(id.name)); const reassigned_bindings = bindings.filter((b) => b?.reassigned); - if (reassigned_bindings.length === 0 && !bindings.some((b) => b?.kind === 'store_sub')) { + if ( + reassigned_bindings.length === 0 && + !bindings.some((b) => b?.kind === 'store_sub') && + node.body.expression.left.type !== 'MemberExpression' + ) { // $derived state.str.update( /** @type {number} */ (node.start), diff --git a/packages/svelte/tests/migrate/samples/effects/input.svelte b/packages/svelte/tests/migrate/samples/effects/input.svelte index f7f1edfb97..f95ad87bea 100644 --- a/packages/svelte/tests/migrate/samples/effects/input.svelte +++ b/packages/svelte/tests/migrate/samples/effects/input.svelte @@ -10,4 +10,5 @@ console.log('bar'); } $: $count = 1; + $: foo.bar = 1; diff --git a/packages/svelte/tests/migrate/samples/effects/output.svelte b/packages/svelte/tests/migrate/samples/effects/output.svelte index 006ce4b23d..054f9398e7 100644 --- a/packages/svelte/tests/migrate/samples/effects/output.svelte +++ b/packages/svelte/tests/migrate/samples/effects/output.svelte @@ -18,4 +18,7 @@ run(() => { $count = 1; }); + run(() => { + foo.bar = 1; + }); \ No newline at end of file