From 57fed6a267b719ff6ac49f9204a48e754f07fb3b Mon Sep 17 00:00:00 2001 From: ComputerGuy <63362464+Ocean-OS@users.noreply.github.com> Date: Mon, 25 Aug 2025 03:21:38 -0700 Subject: [PATCH] fix: place instance-level snippets inside async body (#16666) * fix: place instance-level snippets inside async body * lint --- .changeset/cool-garlics-fail.md | 5 +++++ .../phases/3-transform/client/transform-client.js | 9 ++++++--- .../samples/async-reference-in-snippet/_config.js | 9 +++++++++ .../samples/async-reference-in-snippet/app.svelte | 9 +++++++++ .../samples/async-reference-in-snippet/main.svelte | 8 ++++++++ 5 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 .changeset/cool-garlics-fail.md create mode 100644 packages/svelte/tests/runtime-runes/samples/async-reference-in-snippet/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/async-reference-in-snippet/app.svelte create mode 100644 packages/svelte/tests/runtime-runes/samples/async-reference-in-snippet/main.svelte diff --git a/.changeset/cool-garlics-fail.md b/.changeset/cool-garlics-fail.md new file mode 100644 index 0000000000..cabff1840d --- /dev/null +++ b/.changeset/cool-garlics-fail.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: place instance-level snippets 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 940d6a9e00..bdd7eb3f17 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 @@ -362,12 +362,12 @@ export function client_component(analysis, options) { store_init, ...store_setup, ...legacy_reactive_declarations, - ...group_binding_declarations, - ...state.instance_level_snippets + ...group_binding_declarations ]); if (analysis.instance.has_await) { const body = b.block([ + ...state.instance_level_snippets, .../** @type {ESTree.Statement[]} */ (instance.body), b.if(b.call('$.aborted'), b.return()), .../** @type {ESTree.Statement[]} */ (template.body) @@ -375,7 +375,10 @@ export function client_component(analysis, options) { component_block.body.push(b.stmt(b.call(`$.async_body`, b.arrow([], body, true)))); } else { - component_block.body.push(.../** @type {ESTree.Statement[]} */ (instance.body)); + component_block.body.push( + ...state.instance_level_snippets, + .../** @type {ESTree.Statement[]} */ (instance.body) + ); if (!analysis.runes && analysis.needs_context) { component_block.body.push(b.stmt(b.call('$.init', analysis.immutable ? b.true : undefined))); diff --git a/packages/svelte/tests/runtime-runes/samples/async-reference-in-snippet/_config.js b/packages/svelte/tests/runtime-runes/samples/async-reference-in-snippet/_config.js new file mode 100644 index 0000000000..c6903c3eed --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-reference-in-snippet/_config.js @@ -0,0 +1,9 @@ +import { tick } from 'svelte'; +import { test } from '../../test'; + +export default test({ + async test({ assert, target }) { + await tick(); + assert.htmlEqual(target.innerHTML, 'value'); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/async-reference-in-snippet/app.svelte b/packages/svelte/tests/runtime-runes/samples/async-reference-in-snippet/app.svelte new file mode 100644 index 0000000000..27b29cfe50 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-reference-in-snippet/app.svelte @@ -0,0 +1,9 @@ + + +{#snippet valueSnippet()} + {value} +{/snippet} + +{@render valueSnippet()} \ No newline at end of file diff --git a/packages/svelte/tests/runtime-runes/samples/async-reference-in-snippet/main.svelte b/packages/svelte/tests/runtime-runes/samples/async-reference-in-snippet/main.svelte new file mode 100644 index 0000000000..c251a5645b --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-reference-in-snippet/main.svelte @@ -0,0 +1,8 @@ + + + {#snippet pending()} + {/snippet} + + \ No newline at end of file