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 9b534d2d7190..71a76f2d567e 100644 --- a/packages/svelte/src/internal/client/reactivity/sources.js +++ b/packages/svelte/src/internal/client/reactivity/sources.js @@ -329,7 +329,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..a898b909e131 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/main.svelte @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file