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' })) + } +