diff --git a/.changeset/heavy-cars-ring.md b/.changeset/heavy-cars-ring.md
new file mode 100644
index 0000000000..37a94c42cf
--- /dev/null
+++ b/.changeset/heavy-cars-ring.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+fix: ensure $host rune correctly compiles in variable declarations
diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/VariableDeclaration.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/VariableDeclaration.js
index e4f6f57f72..af09af8b44 100644
--- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/VariableDeclaration.js
+++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/VariableDeclaration.js
@@ -28,7 +28,8 @@ export function VariableDeclaration(node, context) {
rune === '$effect.tracking' ||
rune === '$effect.root' ||
rune === '$inspect' ||
- rune === '$state.snapshot'
+ rune === '$state.snapshot' ||
+ rune === '$host'
) {
if (init != null && is_hoisted_function(init)) {
context.state.hoisted.push(
diff --git a/packages/svelte/tests/runtime-browser/custom-elements-samples/host-rune/_config.js b/packages/svelte/tests/runtime-browser/custom-elements-samples/host-rune/_config.js
index bf09e864fa..f05506445a 100644
--- a/packages/svelte/tests/runtime-browser/custom-elements-samples/host-rune/_config.js
+++ b/packages/svelte/tests/runtime-browser/custom-elements-samples/host-rune/_config.js
@@ -16,11 +16,13 @@ export default test({
el.shadowRoot.querySelectorAll('button')[0].click();
el.shadowRoot.querySelectorAll('button')[1].click();
- assert.deepEqual(events, ['greeting', 'hello', 'greeting', 'welcome']);
+ el.shadowRoot.querySelectorAll('button')[2].click();
+ assert.deepEqual(events, ['greeting', 'hello', 'greeting', 'welcome', 'greeting', 'bonjour']);
el.removeEventListener('greeting', handle_evt);
el.shadowRoot.querySelectorAll('button')[0].click();
el.shadowRoot.querySelectorAll('button')[1].click();
- assert.deepEqual(events, ['greeting', 'hello', 'greeting', 'welcome']);
+ el.shadowRoot.querySelectorAll('button')[2].click();
+ assert.deepEqual(events, ['greeting', 'hello', 'greeting', 'welcome', 'greeting', 'bonjour']);
}
});
diff --git a/packages/svelte/tests/runtime-browser/custom-elements-samples/host-rune/main.svelte b/packages/svelte/tests/runtime-browser/custom-elements-samples/host-rune/main.svelte
index 2eddf77e9b..02e481513a 100644
--- a/packages/svelte/tests/runtime-browser/custom-elements-samples/host-rune/main.svelte
+++ b/packages/svelte/tests/runtime-browser/custom-elements-samples/host-rune/main.svelte
@@ -8,7 +8,12 @@
function welcome() {
$host().dispatchEvent(new CustomEvent('greeting', { detail: 'welcome' }))
}
+ function bonjour() {
+ const element = $host();
+ element.dispatchEvent(new CustomEvent('greeting', { detail: 'bonjour' }))
+ }
+