From 297afd057828a1bf04f15d5b22b4123fd3e522d8 Mon Sep 17 00:00:00 2001 From: Paolo Ricciuti Date: Thu, 9 Oct 2025 18:43:41 +0200 Subject: [PATCH] fix: generate correct code for `each` blocks with async body (#16923) * fix: generate correct code for `each` blocks with async body * fix: else branch of `each` block * chore: add expected html --- .changeset/wicked-goats-begin.md | 5 +++++ .../phases/3-transform/server/visitors/EachBlock.js | 6 ++++-- .../samples/each-body-async/_config.js | 5 +++++ .../samples/each-body-async/_expected.html | 1 + .../samples/each-body-async/main.svelte | 11 +++++++++++ 5 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 .changeset/wicked-goats-begin.md create mode 100644 packages/svelte/tests/server-side-rendering/samples/each-body-async/_config.js create mode 100644 packages/svelte/tests/server-side-rendering/samples/each-body-async/_expected.html create mode 100644 packages/svelte/tests/server-side-rendering/samples/each-body-async/main.svelte diff --git a/.changeset/wicked-goats-begin.md b/.changeset/wicked-goats-begin.md new file mode 100644 index 0000000000..04a22aa310 --- /dev/null +++ b/.changeset/wicked-goats-begin.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: generate correct code for `each` blocks with async body diff --git a/packages/svelte/src/compiler/phases/3-transform/server/visitors/EachBlock.js b/packages/svelte/src/compiler/phases/3-transform/server/visitors/EachBlock.js index 5a7ca8b566..2d5b0c8931 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/visitors/EachBlock.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/visitors/EachBlock.js @@ -32,7 +32,9 @@ export function EachBlock(node, context) { each.push(b.let(node.index, index)); } - each.push(.../** @type {BlockStatement} */ (context.visit(node.body)).body); + const new_body = /** @type {BlockStatement} */ (context.visit(node.body)).body; + + each.push(...(node.body.metadata.has_await ? [create_async_block(b.block(new_body))] : new_body)); const for_loop = b.for( b.declaration('let', [ @@ -55,7 +57,7 @@ export function EachBlock(node, context) { b.if( b.binary('!==', b.member(array_id, 'length'), b.literal(0)), b.block([open, for_loop]), - fallback + node.fallback.metadata.has_await ? create_async_block(fallback) : fallback ) ); } else { diff --git a/packages/svelte/tests/server-side-rendering/samples/each-body-async/_config.js b/packages/svelte/tests/server-side-rendering/samples/each-body-async/_config.js new file mode 100644 index 0000000000..05de37a8bd --- /dev/null +++ b/packages/svelte/tests/server-side-rendering/samples/each-body-async/_config.js @@ -0,0 +1,5 @@ +import { test } from '../../test'; + +export default test({ + mode: ['async'] +}); diff --git a/packages/svelte/tests/server-side-rendering/samples/each-body-async/_expected.html b/packages/svelte/tests/server-side-rendering/samples/each-body-async/_expected.html new file mode 100644 index 0000000000..605299c2ae --- /dev/null +++ b/packages/svelte/tests/server-side-rendering/samples/each-body-async/_expected.html @@ -0,0 +1 @@ +each else \ No newline at end of file diff --git a/packages/svelte/tests/server-side-rendering/samples/each-body-async/main.svelte b/packages/svelte/tests/server-side-rendering/samples/each-body-async/main.svelte new file mode 100644 index 0000000000..86e15c4e7e --- /dev/null +++ b/packages/svelte/tests/server-side-rendering/samples/each-body-async/main.svelte @@ -0,0 +1,11 @@ +{#each { length: 1 }} + {@const data = await Promise.resolve("each")} + {data} +{/each} + +{#each { length: 0 }} + should not see this +{:else} + {@const data = await Promise.resolve("else")} + {data} +{/each} \ No newline at end of file