From 8fb412f5862a53d36fa6f2a1ff6558e225a99ff0 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 12 Sep 2025 08:07:07 -0400 Subject: [PATCH] de-waterfall awaits in separate elements --- .../3-transform/server/visitors/Fragment.js | 21 +++++++++++++------ .../server/visitors/RegularElement.js | 13 ++++-------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/server/visitors/Fragment.js b/packages/svelte/src/compiler/phases/3-transform/server/visitors/Fragment.js index 5100ad34ad..d27069f831 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/visitors/Fragment.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/visitors/Fragment.js @@ -1,4 +1,5 @@ /** @import { AST } from '#compiler' */ +/** @import { Statement } from 'estree' */ /** @import { ComponentContext, ComponentServerTransformState } from '../types.js' */ import { clean_nodes, infer_namespace } from '../../utils.js'; import * as b from '#compiler/builders'; @@ -47,12 +48,20 @@ export function Fragment(node, context) { process_children(trimmed, { ...context, state }); - if (node.metadata.hoisted_promises.promises.length > 0) { - return b.block([ - b.const(node.metadata.hoisted_promises.id, b.array(node.metadata.hoisted_promises.promises)), - ...state.init, - call_child_payload(b.block(build_template(state.template)), true) - ]); + if (node.metadata.is_async) { + /** @type {Statement[]} */ + const statements = []; + + if (node.metadata.hoisted_promises.promises.length > 0) { + statements.push( + b.const(node.metadata.hoisted_promises.id, b.array(node.metadata.hoisted_promises.promises)) + ); + } + + statements.push(...state.init); + statements.push(...build_template(state.template)); + + return b.block([call_child_payload(b.block(statements), true)]); } return b.block([...state.init, ...build_template(state.template)]); diff --git a/packages/svelte/src/compiler/phases/3-transform/server/visitors/RegularElement.js b/packages/svelte/src/compiler/phases/3-transform/server/visitors/RegularElement.js index 8eaeddae99..9b4886aa7c 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/visitors/RegularElement.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/visitors/RegularElement.js @@ -192,16 +192,11 @@ export function RegularElement(node, context) { ) ); } else { - if (node.fragment.metadata.hoisted_promises.promises.length > 0) { - state.template.push( - b.const( - node.fragment.metadata.hoisted_promises.id, - b.array(node.fragment.metadata.hoisted_promises.promises) - ) - ); + if (node.fragment.metadata.is_async) { + state.template.push(/** @type {Statement} */ (context.visit(node.fragment))); + } else { + process_children(trimmed, { ...context, state }); } - - process_children(trimmed, { ...context, state }); } if (select_with_value) {