diff --git a/.changeset/flat-points-kick.md b/.changeset/flat-points-kick.md new file mode 100644 index 0000000000..f9c8b8762c --- /dev/null +++ b/.changeset/flat-points-kick.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: reset `is_flushing` if `flushSync` is called and there's no scheduled effect diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 5920a05fc5..51402ac88c 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -688,6 +688,13 @@ export function flushSync(fn) { flush_tasks(); if (queued_root_effects.length === 0) { + // this would be reset in `flush_queued_root_effects` but since we are early returning here, + // we need to reset it here as well in case the first time there's 0 queued root effects + is_flushing = false; + last_scheduled_effect = null; + if (DEV) { + dev_effect_stack = []; + } return /** @type {T} */ (result); } diff --git a/packages/svelte/tests/runtime-runes/samples/flush-sync-no-scheduled/_config.js b/packages/svelte/tests/runtime-runes/samples/flush-sync-no-scheduled/_config.js new file mode 100644 index 0000000000..33a59dfbd3 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/flush-sync-no-scheduled/_config.js @@ -0,0 +1,16 @@ +import { ok, test } from '../../test'; + +export default test({ + async test({ assert, target }) { + const btn = target.querySelector('button'); + const main = target.querySelector('main'); + ok(main); + console.log(main.innerHTML); + assert.htmlEqual(main.innerHTML, `
true
`); + // we don't want to use flush sync (or tick that use it inside) since we are testing that calling `flushSync` once + // when there are no scheduled effects does not cause reactivity to break + btn?.click(); + await Promise.resolve(); + assert.htmlEqual(main.innerHTML, `
false
false
`); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/flush-sync-no-scheduled/main.svelte b/packages/svelte/tests/runtime-runes/samples/flush-sync-no-scheduled/main.svelte new file mode 100644 index 0000000000..448d495cf5 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/flush-sync-no-scheduled/main.svelte @@ -0,0 +1,23 @@ + + + + +
+
{flag}
+ + {#if !flag} +
{test}
+ {/if} +
+