diff --git a/.changeset/red-phones-brake.md b/.changeset/red-phones-brake.md new file mode 100644 index 0000000000..7d60764649 --- /dev/null +++ b/.changeset/red-phones-brake.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: allow `await` in `{@const }` in more blocks diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/AwaitBlock.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/AwaitBlock.js index e2e8e93f76..d8924c4b4c 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/AwaitBlock.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/AwaitBlock.js @@ -37,7 +37,11 @@ export function AwaitBlock(node, context) { const declarations = argument?.declarations ?? []; const block = /** @type {BlockStatement} */ (then_context.visit(node.then, then_context.state)); - then_block = b.arrow(args, b.block([...declarations, ...block.body])); + then_block = b.arrow( + args, + b.block([...declarations, ...block.body]), + node.then.metadata.has_await + ); } if (node.catch) { @@ -53,7 +57,11 @@ export function AwaitBlock(node, context) { catch_context.visit(node.catch, catch_context.state) ); - catch_block = b.arrow(args, b.block([...declarations, ...block.body])); + catch_block = b.arrow( + args, + b.block([...declarations, ...block.body]), + node.catch.metadata.has_await + ); } context.state.init.push( @@ -63,7 +71,11 @@ export function AwaitBlock(node, context) { context.state.node, expression, node.pending - ? b.arrow([b.id('$$anchor')], /** @type {BlockStatement} */ (context.visit(node.pending))) + ? b.arrow( + [b.id('$$anchor')], + /** @type {BlockStatement} */ (context.visit(node.pending)), + node.pending.metadata.has_await + ) : b.null, then_block, catch_block diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/EachBlock.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/EachBlock.js index 225a4f617c..af9405b89a 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/EachBlock.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/EachBlock.js @@ -326,12 +326,16 @@ export function EachBlock(node, context) { b.literal(flags), thunk, key_function, - b.arrow(render_args, b.block(declarations.concat(block.body))) + b.arrow(render_args, b.block(declarations.concat(block.body)), node.body.metadata.has_await) ]; if (node.fallback) { args.push( - b.arrow([b.id('$$anchor')], /** @type {BlockStatement} */ (context.visit(node.fallback))) + b.arrow( + [b.id('$$anchor')], + /** @type {BlockStatement} */ (context.visit(node.fallback)), + node.fallback.metadata.has_await + ) ); } diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/IfBlock.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/IfBlock.js index 3dd36b180b..3f487bcb85 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/IfBlock.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/IfBlock.js @@ -15,14 +15,21 @@ export function IfBlock(node, context) { const consequent = /** @type {BlockStatement} */ (context.visit(node.consequent)); const consequent_id = b.id(context.state.scope.generate('consequent')); - statements.push(b.var(consequent_id, b.arrow([b.id('$$anchor')], consequent))); + statements.push( + b.var( + consequent_id, + b.arrow([b.id('$$anchor')], consequent, node.consequent.metadata.has_await) + ) + ); let alternate_id; if (node.alternate) { const alternate = /** @type {BlockStatement} */ (context.visit(node.alternate)); alternate_id = b.id(context.state.scope.generate('alternate')); - statements.push(b.var(alternate_id, b.arrow([b.id('$$anchor')], alternate))); + statements.push( + b.var(alternate_id, b.arrow([b.id('$$anchor')], alternate, node.alternate.metadata.has_await)) + ); } const { has_await } = node.metadata.expression; diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/KeyBlock.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/KeyBlock.js index 52850090e3..cf27ab6276 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/KeyBlock.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/KeyBlock.js @@ -18,7 +18,12 @@ export function KeyBlock(node, context) { const body = /** @type {Expression} */ (context.visit(node.fragment)); let statement = add_svelte_meta( - b.call('$.key', context.state.node, key, b.arrow([b.id('$$anchor')], body)), + b.call( + '$.key', + context.state.node, + key, + b.arrow([b.id('$$anchor')], body, node.fragment.metadata.has_await) + ), node, 'key' ); diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteBoundary.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteBoundary.js index 70df022355..ae6d51c3c5 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteBoundary.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteBoundary.js @@ -86,7 +86,12 @@ export function SvelteBoundary(node, context) { block.body.unshift(...const_tags); const boundary = b.stmt( - b.call('$.boundary', context.state.node, props, b.arrow([b.id('$$anchor')], block)) + b.call( + '$.boundary', + context.state.node, + props, + b.arrow([b.id('$$anchor')], block, node.fragment.metadata.has_await) + ) ); context.state.template.push_comment();