diff --git a/.changeset/weak-terms-destroy.md b/.changeset/weak-terms-destroy.md new file mode 100644 index 0000000000..eebe8bfce3 --- /dev/null +++ b/.changeset/weak-terms-destroy.md @@ -0,0 +1,5 @@ +--- +"svelte": patch +--- + +fix: visit expression node in directives diff --git a/packages/svelte/src/compiler/phases/scope.js b/packages/svelte/src/compiler/phases/scope.js index aae6b97549..79d7877f54 100644 --- a/packages/svelte/src/compiler/phases/scope.js +++ b/packages/svelte/src/compiler/phases/scope.js @@ -331,10 +331,14 @@ export function create_scopes(ast, root, allow_reactive_declarations, parent) { } /** - * @type {import('zimmerframe').Visitor<import('#compiler').Directive, State, import('#compiler').SvelteNode>} + * @type {import('zimmerframe').Visitor<import('#compiler').AnimateDirective | import('#compiler').TransitionDirective | import('#compiler').UseDirective, State, import('#compiler').SvelteNode>} */ - const SvelteDirective = (node, context) => { - context.state.scope.reference(b.id(node.name), context.path); + const SvelteDirective = (node, { state, path, visit }) => { + state.scope.reference(b.id(node.name), path); + + if (node.expression) { + visit(node.expression); + } }; walk(ast, state, { diff --git a/packages/svelte/tests/runtime-runes/samples/store-directive/main.svelte b/packages/svelte/tests/runtime-runes/samples/store-directive/main.svelte index 48d774f39d..14166c48f2 100644 --- a/packages/svelte/tests/runtime-runes/samples/store-directive/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/store-directive/main.svelte @@ -1,9 +1,11 @@ <script> import { writable } from 'svelte/store'; - let action = writable((node) => { - node.textContent = 'mounted'; + let action = writable((node, text) => { + node.textContent = text; }); + + let text = writable('mounted') </script> -<div use:$action>hello</div> +<div use:$action={$text}>hello</div>