From eda1dd9becbbbdc7e1014406e6ae6f17523ce588 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 25 Oct 2025 22:03:55 -0400 Subject: [PATCH] WIP --- .../phases/3-transform/server/visitors/EachBlock.js | 13 ++++++++----- .../3-transform/server/visitors/shared/utils.js | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) 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 d1aa27ea25..80cbb4e690 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 @@ -37,9 +37,7 @@ export function EachBlock(node, context) { if (node.body) each.push( // TODO get rid of fragment.has_await - ...(node.body.metadata.has_await - ? [create_async_block(b.block(new_body), b.array([]), node.body.metadata.has_await)] - : new_body) + ...(node.body.metadata.has_await ? [create_async_block(b.block(new_body))] : new_body) ); const for_loop = b.for( @@ -71,8 +69,13 @@ export function EachBlock(node, context) { block.body.push(for_loop); } - if (node.metadata.expression.has_await) { - state.template.push(create_async_block(block), block_close); + const blockers = node.metadata.expression.blockers(); + + if (node.metadata.expression.has_await || blockers.elements.length > 0) { + state.template.push( + create_async_block(block, blockers, node.metadata.expression.has_await), + block_close + ); } else { state.template.push(...block.body, block_close); } diff --git a/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/utils.js b/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/utils.js index 1e4ac69608..2fff258411 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/utils.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/utils.js @@ -278,7 +278,7 @@ export function create_child_block(body, async) { * @param {ArrayExpression} blockers * @param {boolean} has_await */ -export function create_async_block(body, blockers, has_await) { +export function create_async_block(body, blockers = b.array([]), has_await = true) { return b.stmt( b.call('$$renderer.async', blockers, b.arrow([b.id('$$renderer')], body, has_await)) );