diff --git a/.changeset/common-parrots-do.md b/.changeset/common-parrots-do.md new file mode 100644 index 0000000000..d40260f8d1 --- /dev/null +++ b/.changeset/common-parrots-do.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: hydration failing with settled async blocks diff --git a/packages/svelte/src/internal/client/dom/blocks/async.js b/packages/svelte/src/internal/client/dom/blocks/async.js index c2ae07fd17..0e3ab33dda 100644 --- a/packages/svelte/src/internal/client/dom/blocks/async.js +++ b/packages/svelte/src/internal/client/dom/blocks/async.js @@ -19,6 +19,12 @@ import { get_boundary } from './boundary.js'; * @param {(anchor: TemplateNode, ...deriveds: Value[]) => void} fn */ export function async(node, blockers = [], expressions = [], fn) { + var was_hydrating = hydrating; + + if (was_hydrating) { + hydrate_next(); + } + if (expressions.length === 0 && blockers.every((b) => b.settled)) { fn(node); return; @@ -31,11 +37,7 @@ export function async(node, blockers = [], expressions = [], fn) { boundary.update_pending_count(1); batch.increment(blocking); - var was_hydrating = hydrating; - if (was_hydrating) { - hydrate_next(); - var previous_hydrate_node = hydrate_node; var end = skip_nodes(false); set_hydrate_node(end); diff --git a/packages/svelte/tests/runtime-runes/samples/async-settled-blockers-hydration/_config.js b/packages/svelte/tests/runtime-runes/samples/async-settled-blockers-hydration/_config.js new file mode 100644 index 0000000000..f6f6c81350 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-settled-blockers-hydration/_config.js @@ -0,0 +1,14 @@ +import { tick } from 'svelte'; +import { test } from '../../test'; + +export default test({ + skip_mode: ['server'], + skip_no_async: true, + + ssrHtml: `
after
`, + + async test({ assert, target }) { + await tick(); + assert.htmlEqual(target.innerHTML, 'after
'); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/async-settled-blockers-hydration/main.svelte b/packages/svelte/tests/runtime-runes/samples/async-settled-blockers-hydration/main.svelte new file mode 100644 index 0000000000..1b1dc17242 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-settled-blockers-hydration/main.svelte @@ -0,0 +1,13 @@ + + +{#snippet child(n)} +after