From 3d0526535d7e6a36bca28a99117d524061df4b0e Mon Sep 17 00:00:00 2001 From: ComputerGuy <63362464+Ocean-OS@users.noreply.github.com> Date: Thu, 28 Aug 2025 17:07:28 -0700 Subject: [PATCH 1/5] fix: place store setup inside async body --- .changeset/wise-schools-report.md | 5 +++++ .../phases/3-transform/client/transform-client.js | 10 ++++------ 2 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 .changeset/wise-schools-report.md diff --git a/.changeset/wise-schools-report.md b/.changeset/wise-schools-report.md new file mode 100644 index 000000000000..47ec88725605 --- /dev/null +++ b/.changeset/wise-schools-report.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: place store setup inside async body diff --git a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js index bdd7eb3f1799..e4b69300ee17 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js @@ -358,15 +358,12 @@ export function client_component(analysis, options) { const push_args = [b.id('$$props'), b.literal(analysis.runes)]; if (dev) push_args.push(b.id(analysis.name)); - let component_block = b.block([ - store_init, - ...store_setup, - ...legacy_reactive_declarations, - ...group_binding_declarations - ]); + let component_block = b.block([...legacy_reactive_declarations, ...group_binding_declarations]); if (analysis.instance.has_await) { const body = b.block([ + store_init, + ...store_setup, ...state.instance_level_snippets, .../** @type {ESTree.Statement[]} */ (instance.body), b.if(b.call('$.aborted'), b.return()), @@ -379,6 +376,7 @@ export function client_component(analysis, options) { ...state.instance_level_snippets, .../** @type {ESTree.Statement[]} */ (instance.body) ); + component_block.body.unshift(store_init, ...store_setup); if (!analysis.runes && analysis.needs_context) { component_block.body.push(b.stmt(b.call('$.init', analysis.immutable ? b.true : undefined))); From 3f56275ff5675d32396cf84d4096ba5839cc7225 Mon Sep 17 00:00:00 2001 From: ComputerGuy <63362464+Ocean-OS@users.noreply.github.com> Date: Thu, 28 Aug 2025 17:49:23 -0700 Subject: [PATCH 2/5] fix? --- .../phases/3-transform/client/transform-client.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js index e4b69300ee17..111a9e601b37 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js @@ -370,6 +370,10 @@ export function client_component(analysis, options) { .../** @type {ESTree.Statement[]} */ (template.body) ]); + if (needs_store_cleanup) { + body.body.push(b.stmt(b.call('$$cleanup'))); + } + component_block.body.push(b.stmt(b.call(`$.async_body`, b.arrow([], body, true)))); } else { component_block.body.push( @@ -452,11 +456,12 @@ export function client_component(analysis, options) { component_block.body.push(to_push); } - if (needs_store_cleanup) { + if (needs_store_cleanup && !analysis.instance.has_await) { component_block.body.push(b.stmt(b.call('$$cleanup'))); - if (component_returned_object.length > 0) { - component_block.body.push(b.return(b.id('$$pop'))); - } + } + + if (needs_store_cleanup && component_returned_object.length > 0) { + component_block.body.push(b.return(b.id('$$pop'))); } if (analysis.uses_rest_props) { From fc33a391fca78fd76e03915a6a95a3fa0fe04d8b Mon Sep 17 00:00:00 2001 From: ComputerGuy <63362464+Ocean-OS@users.noreply.github.com> Date: Thu, 28 Aug 2025 19:53:42 -0700 Subject: [PATCH 3/5] fix --- .../3-transform/client/transform-client.js | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js index 111a9e601b37..c955295e79bb 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js @@ -360,12 +360,24 @@ export function client_component(analysis, options) { let component_block = b.block([...legacy_reactive_declarations, ...group_binding_declarations]); + const should_inject_context = + dev || + analysis.needs_context || + analysis.reactive_statements.size > 0 || + component_returned_object.length > 0; + if (analysis.instance.has_await) { + if (should_inject_context && component_returned_object.length > 0) { + component_block.body.push(b.var('$$exports')); + } const body = b.block([ store_init, ...store_setup, ...state.instance_level_snippets, .../** @type {ESTree.Statement[]} */ (instance.body), + ...(should_inject_context && component_returned_object.length > 0 + ? [b.stmt(b.assignment('=', b.id('$$exports'), b.object(component_returned_object)))] + : []), b.if(b.call('$.aborted'), b.return()), .../** @type {ESTree.Statement[]} */ (template.body) ]); @@ -380,6 +392,9 @@ export function client_component(analysis, options) { ...state.instance_level_snippets, .../** @type {ESTree.Statement[]} */ (instance.body) ); + if (should_inject_context && component_returned_object.length > 0) { + component_block.body.push(b.var('$$exports', b.object(component_returned_object))); + } component_block.body.unshift(store_init, ...store_setup); if (!analysis.runes && analysis.needs_context) { @@ -395,12 +410,6 @@ export function client_component(analysis, options) { ); } - const should_inject_context = - dev || - analysis.needs_context || - analysis.reactive_statements.size > 0 || - component_returned_object.length > 0; - let should_inject_props = should_inject_context || analysis.needs_props || @@ -447,7 +456,7 @@ export function client_component(analysis, options) { let to_push; if (component_returned_object.length > 0) { - let pop_call = b.call('$.pop', b.object(component_returned_object)); + let pop_call = b.call('$.pop', b.id('$$exports')); to_push = needs_store_cleanup ? b.var('$$pop', pop_call) : b.return(pop_call); } else { to_push = b.stmt(b.call('$.pop')); From 3c9f49639ce9f7deb488db1e94b76e798bfed0f8 Mon Sep 17 00:00:00 2001 From: ComputerGuy <63362464+Ocean-OS@users.noreply.github.com> Date: Thu, 28 Aug 2025 19:57:46 -0700 Subject: [PATCH 4/5] tweak --- .../phases/3-transform/client/transform-client.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js index c955295e79bb..7bf152d3427b 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js @@ -358,7 +358,11 @@ export function client_component(analysis, options) { const push_args = [b.id('$$props'), b.literal(analysis.runes)]; if (dev) push_args.push(b.id(analysis.name)); - let component_block = b.block([...legacy_reactive_declarations, ...group_binding_declarations]); + let component_block = b.block([ + store_init, + ...legacy_reactive_declarations, + ...group_binding_declarations + ]); const should_inject_context = dev || @@ -371,7 +375,6 @@ export function client_component(analysis, options) { component_block.body.push(b.var('$$exports')); } const body = b.block([ - store_init, ...store_setup, ...state.instance_level_snippets, .../** @type {ESTree.Statement[]} */ (instance.body), @@ -382,10 +385,6 @@ export function client_component(analysis, options) { .../** @type {ESTree.Statement[]} */ (template.body) ]); - if (needs_store_cleanup) { - body.body.push(b.stmt(b.call('$$cleanup'))); - } - component_block.body.push(b.stmt(b.call(`$.async_body`, b.arrow([], body, true)))); } else { component_block.body.push( @@ -395,7 +394,7 @@ export function client_component(analysis, options) { if (should_inject_context && component_returned_object.length > 0) { component_block.body.push(b.var('$$exports', b.object(component_returned_object))); } - component_block.body.unshift(store_init, ...store_setup); + component_block.body.unshift(...store_setup); if (!analysis.runes && analysis.needs_context) { component_block.body.push(b.stmt(b.call('$.init', analysis.immutable ? b.true : undefined))); @@ -465,7 +464,7 @@ export function client_component(analysis, options) { component_block.body.push(to_push); } - if (needs_store_cleanup && !analysis.instance.has_await) { + if (needs_store_cleanup) { component_block.body.push(b.stmt(b.call('$$cleanup'))); } From 9d6e8548e26f0332f053a4e427575f715dd87aea Mon Sep 17 00:00:00 2001 From: ComputerGuy <63362464+Ocean-OS@users.noreply.github.com> Date: Thu, 28 Aug 2025 20:01:08 -0700 Subject: [PATCH 5/5] more --- .../compiler/phases/3-transform/client/transform-client.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js index 7bf152d3427b..706d2b4e1042 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js @@ -466,10 +466,10 @@ export function client_component(analysis, options) { if (needs_store_cleanup) { component_block.body.push(b.stmt(b.call('$$cleanup'))); - } - if (needs_store_cleanup && component_returned_object.length > 0) { - component_block.body.push(b.return(b.id('$$pop'))); + if (component_returned_object.length > 0) { + component_block.body.push(b.return(b.id('$$pop'))); + } } if (analysis.uses_rest_props) {