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