From 9905a6b8fd0bafd1f03499f1f13a4189dfda5a04 Mon Sep 17 00:00:00 2001 From: ComputerGuy <63362464+Ocean-OS@users.noreply.github.com> Date: Sun, 20 Jul 2025 22:33:14 -0700 Subject: [PATCH 1/4] fix: correctly transform `{@const foo = await ...}` --- .changeset/fluffy-ducks-happen.md | 5 +++++ .../phases/3-transform/client/visitors/ConstTag.js | 7 ++++--- 2 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 .changeset/fluffy-ducks-happen.md diff --git a/.changeset/fluffy-ducks-happen.md b/.changeset/fluffy-ducks-happen.md new file mode 100644 index 000000000000..0fc6fefc9e97 --- /dev/null +++ b/.changeset/fluffy-ducks-happen.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: correctly transform `{@const foo = await ...}` diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/ConstTag.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/ConstTag.js index 34acdd6bb975..ff1dde11307e 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/ConstTag.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/ConstTag.js @@ -2,7 +2,7 @@ /** @import { AST } from '#compiler' */ /** @import { ComponentContext } from '../types' */ import { dev } from '../../../../state.js'; -import { extract_identifiers } from '../../../../utils/ast.js'; +import { extract_identifiers, is_expression_async } from '../../../../utils/ast.js'; import * as b from '#compiler/builders'; import { create_derived } from '../utils.js'; import { get_value } from './shared/declarations.js'; @@ -17,7 +17,7 @@ export function ConstTag(node, context) { // TODO we can almost certainly share some code with $derived(...) if (declaration.id.type === 'Identifier') { const init = build_expression(context, declaration.init, node.metadata.expression); - let expression = create_derived(context.state, b.thunk(init)); + let expression = create_derived(context.state, b.thunk(init, is_expression_async(init))); if (dev) { expression = b.call('$.tag', expression, b.literal(declaration.id.name)); @@ -58,7 +58,8 @@ export function ConstTag(node, context) { b.block([ b.const(/** @type {Pattern} */ (context.visit(declaration.id, child_state)), init), b.return(b.object(identifiers.map((node) => b.prop('init', node, node)))) - ]) + ]), + is_expression_async(init) ); let expression = create_derived(context.state, fn); From d9db9e3dc24458bb0e5c9d90ede44482aef2aa07 Mon Sep 17 00:00:00 2001 From: ComputerGuy <63362464+Ocean-OS@users.noreply.github.com> Date: Sun, 20 Jul 2025 22:38:58 -0700 Subject: [PATCH 2/4] fix --- .../compiler/phases/3-transform/client/visitors/ConstTag.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/ConstTag.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/ConstTag.js index ff1dde11307e..b2ad1fbb49a0 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/ConstTag.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/ConstTag.js @@ -17,7 +17,10 @@ export function ConstTag(node, context) { // TODO we can almost certainly share some code with $derived(...) if (declaration.id.type === 'Identifier') { const init = build_expression(context, declaration.init, node.metadata.expression); - let expression = create_derived(context.state, b.thunk(init, is_expression_async(init))); + let expression = create_derived( + context.state, + is_expression_async(init) ? b.arrow([], init, true) : b.thunk(init) + ); if (dev) { expression = b.call('$.tag', expression, b.literal(declaration.id.name)); From 69f1ed84bc3419e4e4a22a06a26c5b06ef786456 Mon Sep 17 00:00:00 2001 From: ComputerGuy <63362464+Ocean-OS@users.noreply.github.com> Date: Sun, 20 Jul 2025 22:41:33 -0700 Subject: [PATCH 3/4] wrap in async derived instead of derived --- .../svelte/src/compiler/phases/3-transform/client/utils.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/utils.js b/packages/svelte/src/compiler/phases/3-transform/client/utils.js index 6d9dac8a33d3..389ac093d0f4 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/utils.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/utils.js @@ -291,6 +291,9 @@ export function should_proxy(node, scope) { * @param {ComponentClientTransformState} state * @param {Expression} arg */ -export function create_derived(state, arg) { - return b.call(state.analysis.runes ? '$.derived' : '$.derived_safe_equal', arg); +export function create_derived(state, arg, async = false) { + return b.call( + state.analysis.runes ? `$.${async ? 'async_' : ''}derived` : '$.derived_safe_equal', + arg + ); } From 2e15163219797d7cdbda521e25befffdeb76fd53 Mon Sep 17 00:00:00 2001 From: ComputerGuy <63362464+Ocean-OS@users.noreply.github.com> Date: Sun, 20 Jul 2025 22:42:04 -0700 Subject: [PATCH 4/4] doh --- .../compiler/phases/3-transform/client/visitors/ConstTag.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/ConstTag.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/ConstTag.js index b2ad1fbb49a0..be820b1c0ea9 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/ConstTag.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/ConstTag.js @@ -19,7 +19,8 @@ export function ConstTag(node, context) { const init = build_expression(context, declaration.init, node.metadata.expression); let expression = create_derived( context.state, - is_expression_async(init) ? b.arrow([], init, true) : b.thunk(init) + is_expression_async(init) ? b.arrow([], init, true) : b.thunk(init), + is_expression_async(init) ); if (dev) { @@ -65,7 +66,7 @@ export function ConstTag(node, context) { is_expression_async(init) ); - let expression = create_derived(context.state, fn); + let expression = create_derived(context.state, fn, is_expression_async(init)); if (dev) { expression = b.call('$.tag', expression, b.literal('[@const]'));