From 2b49a5e3c0851ddba87d78b48551bd5f40e1ee13 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 5 Oct 2025 17:59:58 -0400 Subject: [PATCH] fix: flush when pending boundaries resolve (#16897) * fix: flush when pending boundaries resolve * note to self * Update packages/svelte/src/internal/client/dom/blocks/boundary.js --- .changeset/swift-starfishes-knock.md | 5 +++++ .../svelte/src/internal/client/dom/blocks/boundary.js | 7 +++++++ .../samples/async-attachment-in-block/_config.js | 11 +++++++++++ .../samples/async-attachment-in-block/main.svelte | 9 +++++++++ 4 files changed, 32 insertions(+) create mode 100644 .changeset/swift-starfishes-knock.md create mode 100644 packages/svelte/tests/runtime-runes/samples/async-attachment-in-block/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/async-attachment-in-block/main.svelte diff --git a/.changeset/swift-starfishes-knock.md b/.changeset/swift-starfishes-knock.md new file mode 100644 index 0000000000..790b3fe697 --- /dev/null +++ b/.changeset/swift-starfishes-knock.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: flush when pending boundaries resolve diff --git a/packages/svelte/src/internal/client/dom/blocks/boundary.js b/packages/svelte/src/internal/client/dom/blocks/boundary.js index 6dde40d889..88f4a85e20 100644 --- a/packages/svelte/src/internal/client/dom/blocks/boundary.js +++ b/packages/svelte/src/internal/client/dom/blocks/boundary.js @@ -285,6 +285,13 @@ export class Boundary { this.#anchor.before(this.#offscreen_fragment); this.#offscreen_fragment = null; } + + // TODO this feels like a little bit of a kludge, but until we + // overhaul the boundary/batch relationship it's probably + // the most pragmatic solution available to us + queue_micro_task(() => { + Batch.ensure().flush(); + }); } } diff --git a/packages/svelte/tests/runtime-runes/samples/async-attachment-in-block/_config.js b/packages/svelte/tests/runtime-runes/samples/async-attachment-in-block/_config.js new file mode 100644 index 0000000000..97da1bf835 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-attachment-in-block/_config.js @@ -0,0 +1,11 @@ +import { tick } from 'svelte'; +import { test } from '../../test'; + +export default test({ + mode: ['client', 'hydrate'], + + async test({ assert, target }) { + await tick(); + assert.htmlEqual(target.innerHTML, '
attachment ran
'); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/async-attachment-in-block/main.svelte b/packages/svelte/tests/runtime-runes/samples/async-attachment-in-block/main.svelte new file mode 100644 index 0000000000..027b980bd1 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-attachment-in-block/main.svelte @@ -0,0 +1,9 @@ +{#if await true} +
{ + node.textContent = 'attachment ran'; + }} + > + attachment did not run +
+{/if}