From 41e34bed360bceb8419160a4cc9962f830834643 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 5 Oct 2025 17:04:07 -0400 Subject: [PATCH 1/3] fix: flush when pending boundaries resolve --- .changeset/swift-starfishes-knock.md | 5 +++++ .../svelte/src/internal/client/dom/blocks/boundary.js | 5 +++++ .../samples/async-attachment-in-block/_config.js | 11 +++++++++++ .../samples/async-attachment-in-block/main.svelte | 9 +++++++++ 4 files changed, 30 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 000000000000..790b3fe697aa --- /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 6dde40d88959..efd88b600b08 100644 --- a/packages/svelte/src/internal/client/dom/blocks/boundary.js +++ b/packages/svelte/src/internal/client/dom/blocks/boundary.js @@ -33,6 +33,7 @@ import { Batch, current_batch, effect_pending_updates } from '../../reactivity/b import { internal_set, source } from '../../reactivity/sources.js'; import { tag } from '../../dev/tracing.js'; import { createSubscriber } from '../../../../reactivity/create-subscriber.js'; +import { flushSync } from 'svelte'; /** * @typedef {{ @@ -285,6 +286,10 @@ export class Boundary { this.#anchor.before(this.#offscreen_fragment); this.#offscreen_fragment = null; } + + 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 000000000000..97da1bf83516 --- /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 000000000000..027b980bd181 --- /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} From 2f22c615dd0f1b996b2ed74bb3ea34af9da58f8b Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 5 Oct 2025 17:06:31 -0400 Subject: [PATCH 2/3] note to self --- packages/svelte/src/internal/client/dom/blocks/boundary.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/svelte/src/internal/client/dom/blocks/boundary.js b/packages/svelte/src/internal/client/dom/blocks/boundary.js index efd88b600b08..ed0c89c1e953 100644 --- a/packages/svelte/src/internal/client/dom/blocks/boundary.js +++ b/packages/svelte/src/internal/client/dom/blocks/boundary.js @@ -287,6 +287,9 @@ export class Boundary { 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(); }); From dfe4f4371812f0e3396c4902f9f46024e3fcc441 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 5 Oct 2025 17:23:57 -0400 Subject: [PATCH 3/3] Update packages/svelte/src/internal/client/dom/blocks/boundary.js --- packages/svelte/src/internal/client/dom/blocks/boundary.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/svelte/src/internal/client/dom/blocks/boundary.js b/packages/svelte/src/internal/client/dom/blocks/boundary.js index ed0c89c1e953..88f4a85e20dc 100644 --- a/packages/svelte/src/internal/client/dom/blocks/boundary.js +++ b/packages/svelte/src/internal/client/dom/blocks/boundary.js @@ -33,7 +33,6 @@ import { Batch, current_batch, effect_pending_updates } from '../../reactivity/b import { internal_set, source } from '../../reactivity/sources.js'; import { tag } from '../../dev/tracing.js'; import { createSubscriber } from '../../../../reactivity/create-subscriber.js'; -import { flushSync } from 'svelte'; /** * @typedef {{