From 02a30b560261bcb80670cbfff0774aa7fb066e1e Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Sun, 8 Jun 2025 23:07:31 +0200 Subject: [PATCH 1/6] fix: mark reactions of `MAYBE_DIRTY` reactions too --- .changeset/sour-jars-sniff.md | 5 ++++ .../src/internal/client/reactivity/sources.js | 2 +- .../samples/derived-dirty-after-read/A.svelte | 10 ++++++++ .../samples/derived-dirty-after-read/B.svelte | 10 ++++++++ .../derived-dirty-after-read/_config.js | 14 +++++++++++ .../derived-dirty-after-read/main.svelte | 23 +++++++++++++++++++ 6 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 .changeset/sour-jars-sniff.md create mode 100644 packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/A.svelte create mode 100644 packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/B.svelte create mode 100644 packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/main.svelte diff --git a/.changeset/sour-jars-sniff.md b/.changeset/sour-jars-sniff.md new file mode 100644 index 000000000000..0c710d7a7b9e --- /dev/null +++ b/.changeset/sour-jars-sniff.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: mark reactions of `MAYBE_DIRTY` reactions too diff --git a/packages/svelte/src/internal/client/reactivity/sources.js b/packages/svelte/src/internal/client/reactivity/sources.js index 9d2ad2baee4e..5f2e631d6bdf 100644 --- a/packages/svelte/src/internal/client/reactivity/sources.js +++ b/packages/svelte/src/internal/client/reactivity/sources.js @@ -280,7 +280,7 @@ function mark_reactions(signal, status) { set_signal_status(reaction, status); // If the signal a) was previously clean or b) is an unowned derived, then mark it - if ((flags & (CLEAN | UNOWNED)) !== 0) { + if ((flags & (CLEAN | UNOWNED | MAYBE_DIRTY)) !== 0) { if ((flags & DERIVED) !== 0) { mark_reactions(/** @type {Derived} */ (reaction), MAYBE_DIRTY); } else { diff --git a/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/A.svelte b/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/A.svelte new file mode 100644 index 000000000000..c4b6f2e3a087 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/A.svelte @@ -0,0 +1,10 @@ + + +a \ No newline at end of file diff --git a/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/B.svelte b/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/B.svelte new file mode 100644 index 000000000000..17bc76f775de --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/B.svelte @@ -0,0 +1,10 @@ + + +b \ No newline at end of file diff --git a/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/_config.js b/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/_config.js new file mode 100644 index 000000000000..c2f95c88827a --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/_config.js @@ -0,0 +1,14 @@ +import { flushSync } from 'svelte'; +import { test } from '../../test'; + +export default test({ + html: ' a', + async test({ assert, target }) { + const btn = target.querySelector('button'); + flushSync(() => { + btn?.click(); + }); + + assert.htmlEqual(target.innerHTML, ` b`); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/main.svelte b/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/main.svelte new file mode 100644 index 000000000000..423517718fe9 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/main.svelte @@ -0,0 +1,23 @@ + + + + + \ No newline at end of file From 20cc0fe277952bb5c1b2645668230ee862c13676 Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Mon, 9 Jun 2025 15:25:40 +0200 Subject: [PATCH 2/6] fix: `set_untracked_writes` for `BLOCK_EFFECT`'s too --- packages/svelte/src/internal/client/reactivity/sources.js | 2 +- .../runtime-runes/samples/derived-dirty-after-read/main.svelte | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/svelte/src/internal/client/reactivity/sources.js b/packages/svelte/src/internal/client/reactivity/sources.js index 5f2e631d6bdf..c28b677ad3f5 100644 --- a/packages/svelte/src/internal/client/reactivity/sources.js +++ b/packages/svelte/src/internal/client/reactivity/sources.js @@ -190,7 +190,7 @@ export function internal_set(source, value) { is_runes() && active_effect !== null && (active_effect.f & CLEAN) !== 0 && - (active_effect.f & (BRANCH_EFFECT | ROOT_EFFECT)) === 0 + (active_effect.f & (BRANCH_EFFECT | ROOT_EFFECT | BLOCK_EFFECT)) === 0 ) { if (untracked_writes === null) { set_untracked_writes([source]); diff --git a/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/main.svelte b/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/main.svelte index 423517718fe9..a898b909e131 100644 --- a/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/main.svelte @@ -11,7 +11,6 @@ }); let Thing = $derived.by(() => { - console.log("comp", config); return config === "any" ? A : B; }); From 9b3677d9cbced78e9d4067485680051008e63c8a Mon Sep 17 00:00:00 2001 From: Paolo Ricciuti Date: Mon, 9 Jun 2025 15:34:13 +0200 Subject: [PATCH 3/6] chore: changeset --- .changeset/sour-jars-sniff.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/sour-jars-sniff.md b/.changeset/sour-jars-sniff.md index 0c710d7a7b9e..e8e59a029276 100644 --- a/.changeset/sour-jars-sniff.md +++ b/.changeset/sour-jars-sniff.md @@ -2,4 +2,4 @@ 'svelte': patch --- -fix: mark reactions of `MAYBE_DIRTY` reactions too +fix: update untracked writes for `BLOCK_EFFECT`s too From 88ad6630ed1de1532ea3ac47c39abd031a9dc3a2 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Tue, 10 Jun 2025 09:57:01 +0200 Subject: [PATCH 4/6] Update packages/svelte/src/internal/client/reactivity/sources.js --- packages/svelte/src/internal/client/reactivity/sources.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/svelte/src/internal/client/reactivity/sources.js b/packages/svelte/src/internal/client/reactivity/sources.js index c28b677ad3f5..71e88219cc3b 100644 --- a/packages/svelte/src/internal/client/reactivity/sources.js +++ b/packages/svelte/src/internal/client/reactivity/sources.js @@ -280,7 +280,7 @@ function mark_reactions(signal, status) { set_signal_status(reaction, status); // If the signal a) was previously clean or b) is an unowned derived, then mark it - if ((flags & (CLEAN | UNOWNED | MAYBE_DIRTY)) !== 0) { + if ((flags & (CLEAN | UNOWNED)) !== 0) { if ((flags & DERIVED) !== 0) { mark_reactions(/** @type {Derived} */ (reaction), MAYBE_DIRTY); } else { From 863f6c14b9da6ae24ba399e4f2f73d0081677ec3 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Tue, 10 Jun 2025 10:00:06 +0200 Subject: [PATCH 5/6] Update sources.js --- packages/svelte/src/internal/client/reactivity/sources.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/svelte/src/internal/client/reactivity/sources.js b/packages/svelte/src/internal/client/reactivity/sources.js index 71e88219cc3b..c28b677ad3f5 100644 --- a/packages/svelte/src/internal/client/reactivity/sources.js +++ b/packages/svelte/src/internal/client/reactivity/sources.js @@ -280,7 +280,7 @@ function mark_reactions(signal, status) { set_signal_status(reaction, status); // If the signal a) was previously clean or b) is an unowned derived, then mark it - if ((flags & (CLEAN | UNOWNED)) !== 0) { + if ((flags & (CLEAN | UNOWNED | MAYBE_DIRTY)) !== 0) { if ((flags & DERIVED) !== 0) { mark_reactions(/** @type {Derived} */ (reaction), MAYBE_DIRTY); } else { From 7c9c46c5080e0d0052e04e65a939a6b81497a3eb Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Tue, 10 Jun 2025 17:05:53 +0200 Subject: [PATCH 6/6] chore: revert --- packages/svelte/src/internal/client/reactivity/sources.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/svelte/src/internal/client/reactivity/sources.js b/packages/svelte/src/internal/client/reactivity/sources.js index c28b677ad3f5..9d2ad2baee4e 100644 --- a/packages/svelte/src/internal/client/reactivity/sources.js +++ b/packages/svelte/src/internal/client/reactivity/sources.js @@ -190,7 +190,7 @@ export function internal_set(source, value) { is_runes() && active_effect !== null && (active_effect.f & CLEAN) !== 0 && - (active_effect.f & (BRANCH_EFFECT | ROOT_EFFECT | BLOCK_EFFECT)) === 0 + (active_effect.f & (BRANCH_EFFECT | ROOT_EFFECT)) === 0 ) { if (untracked_writes === null) { set_untracked_writes([source]); @@ -280,7 +280,7 @@ function mark_reactions(signal, status) { set_signal_status(reaction, status); // If the signal a) was previously clean or b) is an unowned derived, then mark it - if ((flags & (CLEAN | UNOWNED | MAYBE_DIRTY)) !== 0) { + if ((flags & (CLEAN | UNOWNED)) !== 0) { if ((flags & DERIVED) !== 0) { mark_reactions(/** @type {Derived} */ (reaction), MAYBE_DIRTY); } else {