From 1b896229d78b8a9a45fe787c7e9e5ecc8b787040 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Thu, 13 Mar 2025 18:48:01 +0000 Subject: [PATCH 1/4] ix: ensure transient writes to tracked parent effects works as expected --- .changeset/brown-rockets-shake.md | 5 +++++ packages/svelte/src/internal/client/runtime.js | 7 +++++++ .../samples/untracked-write-pre/_config.js | 7 +++++++ .../samples/untracked-write-pre/main.svelte | 14 ++++++++++++++ 4 files changed, 33 insertions(+) create mode 100644 .changeset/brown-rockets-shake.md create mode 100644 packages/svelte/tests/runtime-runes/samples/untracked-write-pre/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/untracked-write-pre/main.svelte diff --git a/.changeset/brown-rockets-shake.md b/.changeset/brown-rockets-shake.md new file mode 100644 index 000000000000..65470b38136c --- /dev/null +++ b/.changeset/brown-rockets-shake.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: ensure transient writes to tracked parent effects works as expected diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index bbe4dc3d9b8f..99ac0f65e586 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -460,6 +460,13 @@ export function update_reaction(reaction) { // the same version if (previous_reaction !== null) { read_version++; + if (untracked_writes !== null) { + if (previous_untracked_writes === null) { + previous_untracked_writes = untracked_writes; + } else { + previous_untracked_writes.push(.../** @type {Source[]} */ (untracked_writes)); + } + } } return result; diff --git a/packages/svelte/tests/runtime-runes/samples/untracked-write-pre/_config.js b/packages/svelte/tests/runtime-runes/samples/untracked-write-pre/_config.js new file mode 100644 index 000000000000..127ac64edec5 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/untracked-write-pre/_config.js @@ -0,0 +1,7 @@ +import { test } from '../../test'; + +export default test({ + test({ assert, target, logs }) { + assert.deepEqual(logs, ["Outer", 'Inner', "Outer", 'Inner']); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/untracked-write-pre/main.svelte b/packages/svelte/tests/runtime-runes/samples/untracked-write-pre/main.svelte new file mode 100644 index 000000000000..e615151c25c9 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/untracked-write-pre/main.svelte @@ -0,0 +1,14 @@ + From 39bab0ee95633d196d08bb3b534ca7bd1e717dd0 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Thu, 13 Mar 2025 18:53:17 +0000 Subject: [PATCH 2/4] lint --- .../tests/runtime-runes/samples/untracked-write-pre/_config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/svelte/tests/runtime-runes/samples/untracked-write-pre/_config.js b/packages/svelte/tests/runtime-runes/samples/untracked-write-pre/_config.js index 127ac64edec5..0310ec4fbb52 100644 --- a/packages/svelte/tests/runtime-runes/samples/untracked-write-pre/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/untracked-write-pre/_config.js @@ -2,6 +2,6 @@ import { test } from '../../test'; export default test({ test({ assert, target, logs }) { - assert.deepEqual(logs, ["Outer", 'Inner', "Outer", 'Inner']); + assert.deepEqual(logs, ['Outer', 'Inner', 'Outer', 'Inner']); } }); From 9249775828d08fe8d380d702b252f1e53adf2f1a Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 13 Mar 2025 15:39:34 -0400 Subject: [PATCH 3/4] format test --- packages/svelte/src/internal/client/runtime.js | 1 + .../samples/untracked-write-pre/main.svelte | 13 ++++++------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 99ac0f65e586..ee812269e69a 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -460,6 +460,7 @@ export function update_reaction(reaction) { // the same version if (previous_reaction !== null) { read_version++; + if (untracked_writes !== null) { if (previous_untracked_writes === null) { previous_untracked_writes = untracked_writes; diff --git a/packages/svelte/tests/runtime-runes/samples/untracked-write-pre/main.svelte b/packages/svelte/tests/runtime-runes/samples/untracked-write-pre/main.svelte index e615151c25c9..5e95dbfd411a 100644 --- a/packages/svelte/tests/runtime-runes/samples/untracked-write-pre/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/untracked-write-pre/main.svelte @@ -1,14 +1,13 @@ From 6003d9de3ceb8952ab49ffd65b700e9848279928 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 13 Mar 2025 15:41:51 -0400 Subject: [PATCH 4/4] tweak changeset --- .changeset/brown-rockets-shake.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/brown-rockets-shake.md b/.changeset/brown-rockets-shake.md index 65470b38136c..3772a88f6ebd 100644 --- a/.changeset/brown-rockets-shake.md +++ b/.changeset/brown-rockets-shake.md @@ -2,4 +2,4 @@ 'svelte': patch --- -fix: ensure transient writes to tracked parent effects works as expected +fix: invalidate parent effects when child effects update parent dependencies