diff --git a/.changeset/rude-vans-retire.md b/.changeset/rude-vans-retire.md new file mode 100644 index 000000000000..c092f797055d --- /dev/null +++ b/.changeset/rude-vans-retire.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: prevent re-activated stale batches from break reactivity diff --git a/packages/svelte/src/internal/client/reactivity/batch.js b/packages/svelte/src/internal/client/reactivity/batch.js index 2956e7ed6afe..c2be841e6b1f 100644 --- a/packages/svelte/src/internal/client/reactivity/batch.js +++ b/packages/svelte/src/internal/client/reactivity/batch.js @@ -421,6 +421,13 @@ export class Batch { } static ensure() { + if (current_batch !== null && !batches.has(current_batch)) { + // A previously committed batch was reactivated via async `restore`. + // Treat it as inactive so a new batch can be created to process updates. + current_batch = null; + batch_values = null; + } + if (current_batch === null) { const batch = (current_batch = new Batch()); batches.add(current_batch); diff --git a/packages/svelte/tests/runtime-runes/samples/async-resolve-stale/_config.js b/packages/svelte/tests/runtime-runes/samples/async-resolve-stale/_config.js index 50bb414afc8b..c02abb59c633 100644 --- a/packages/svelte/tests/runtime-runes/samples/async-resolve-stale/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/async-resolve-stale/_config.js @@ -21,5 +21,9 @@ export default test({ input.dispatchEvent(new Event('input', { bubbles: true })); await macrotask(6); assert.htmlEqual(target.innerHTML, ' 3 | 12'); + input.value = ''; + input.dispatchEvent(new Event('input', { bubbles: true })); + await macrotask(); + assert.htmlEqual(target.innerHTML, ' 4 | '); } }); diff --git a/packages/svelte/tests/runtime-runes/samples/async-resolve-stale/main.svelte b/packages/svelte/tests/runtime-runes/samples/async-resolve-stale/main.svelte index dc4a157928a3..2a36942ff256 100644 --- a/packages/svelte/tests/runtime-runes/samples/async-resolve-stale/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/async-resolve-stale/main.svelte @@ -1,28 +1,32 @@