diff --git a/packages/svelte/src/compiler/phases/3-transform/server/visitors/HtmlTag.js b/packages/svelte/src/compiler/phases/3-transform/server/visitors/HtmlTag.js index 9a3d2830ac..a5e044d5d2 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/visitors/HtmlTag.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/visitors/HtmlTag.js @@ -2,6 +2,7 @@ /** @import { AST } from '#compiler' */ /** @import { ComponentContext } from '../types.js' */ import * as b from '#compiler/builders'; +import { create_push } from './shared/utils.js'; /** * @param {AST.HtmlTag} node @@ -10,9 +11,6 @@ import * as b from '#compiler/builders'; export function HtmlTag(node, context) { const expression = /** @type {Expression} */ (context.visit(node.expression)); const call = b.call('$.html', expression); - context.state.template.push( - node.metadata.expression.has_await - ? b.stmt(b.call('$$renderer.push', b.thunk(call, true))) - : call - ); + + context.state.template.push(create_push(call, node.metadata.expression)); } 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 9d4da0b006..2d54ab0644 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 @@ -284,6 +284,27 @@ export function create_async_block(body, blockers = b.array([]), has_await = tru ); } +/** + * @param {Expression} expression + * @param {ExpressionMetadata} metadata + * @returns {Expression | Statement} + */ +export function create_push(expression, metadata) { + if (metadata.is_async()) { + let statement = b.stmt(b.call('$$renderer.push', b.thunk(expression, metadata.has_await))); + + const blockers = metadata.blockers(); + + if (blockers.elements.length > 0) { + statement = create_async_block(b.block([statement]), blockers, false); + } + + return statement; + } + + return expression; +} + /** * @param {BlockStatement | Expression} body * @param {Identifier | false} component_fn_id