diff --git a/.changeset/sour-jars-sniff.md b/.changeset/sour-jars-sniff.md new file mode 100644 index 0000000000..0c710d7a7b --- /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 9d2ad2baee..5f2e631d6b 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 0000000000..c4b6f2e3a0 --- /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 0000000000..17bc76f775 --- /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 0000000000..c2f95c8882 --- /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 0000000000..423517718f --- /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