From a2ab9b2500c1fa76bf24f4ab37a5bb53050f33c7 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Mon, 1 Sep 2025 18:04:44 +0200 Subject: [PATCH] fix: ensure batch exists when resetting a failed boundary fixes #16681 --- .changeset/ninety-ravens-join.md | 5 +++++ .../internal/client/dom/blocks/boundary.js | 3 +++ .../samples/async-boundary-reset/Test.svelte | 15 +++++++++++++++ .../samples/async-boundary-reset/_config.js | 19 +++++++++++++++++++ .../samples/async-boundary-reset/main.svelte | 12 ++++++++++++ 5 files changed, 54 insertions(+) create mode 100644 .changeset/ninety-ravens-join.md create mode 100644 packages/svelte/tests/runtime-runes/samples/async-boundary-reset/Test.svelte create mode 100644 packages/svelte/tests/runtime-runes/samples/async-boundary-reset/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/async-boundary-reset/main.svelte diff --git a/.changeset/ninety-ravens-join.md b/.changeset/ninety-ravens-join.md new file mode 100644 index 0000000000..f7bc6f8def --- /dev/null +++ b/.changeset/ninety-ravens-join.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: ensure batch exists when resetting a failed boundary diff --git a/packages/svelte/src/internal/client/dom/blocks/boundary.js b/packages/svelte/src/internal/client/dom/blocks/boundary.js index 60fe2b7d3c..12ca547608 100644 --- a/packages/svelte/src/internal/client/dom/blocks/boundary.js +++ b/packages/svelte/src/internal/client/dom/blocks/boundary.js @@ -297,6 +297,9 @@ export class Boundary { e.svelte_boundary_reset_onerror(); } + // If the failure happened while flushing effects, current_batch can be null + Batch.ensure(); + this.#pending_count = 0; if (this.#failed_effect !== null) { diff --git a/packages/svelte/tests/runtime-runes/samples/async-boundary-reset/Test.svelte b/packages/svelte/tests/runtime-runes/samples/async-boundary-reset/Test.svelte new file mode 100644 index 0000000000..2232a094cb --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-boundary-reset/Test.svelte @@ -0,0 +1,15 @@ + + + diff --git a/packages/svelte/tests/runtime-runes/samples/async-boundary-reset/_config.js b/packages/svelte/tests/runtime-runes/samples/async-boundary-reset/_config.js new file mode 100644 index 0000000000..19b273175b --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-boundary-reset/_config.js @@ -0,0 +1,19 @@ +import { tick } from 'svelte'; +import { test } from '../../test'; + +export default test({ + async test({ assert, target }) { + await tick(); + let [btn] = target.querySelectorAll('button'); + btn.click(); + await tick(); + + assert.htmlEqual(target.innerHTML, ''); + + [btn] = target.querySelectorAll('button'); + btn.click(); + await tick(); + + assert.htmlEqual(target.innerHTML, ''); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/async-boundary-reset/main.svelte b/packages/svelte/tests/runtime-runes/samples/async-boundary-reset/main.svelte new file mode 100644 index 0000000000..42242f26d6 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-boundary-reset/main.svelte @@ -0,0 +1,12 @@ + + + + + + {#snippet pending()}pending{/snippet} + {#snippet failed(_, reset)} + + {/snippet} +