diff --git a/.changeset/grumpy-students-drop.md b/.changeset/grumpy-students-drop.md new file mode 100644 index 000000000000..09e4baf2dd9e --- /dev/null +++ b/.changeset/grumpy-students-drop.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: correctly handle action member expression keys diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js index a8ac31593498..f43e44e47255 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js @@ -2413,12 +2413,20 @@ export const template_visitors = { if (node.expression) { params.push(b.id('$$props')); } + let callee; + if (node.name.includes('.')) { + const parts = node.name.split('.'); + callee = serialize_get_binding(b.id(parts[0]), state); + for (let i = 1; i < parts.length; i++) { + const key = b.key(parts[i]); + callee = b.member(callee, key, key.type === 'Literal'); + } + } else { + callee = serialize_get_binding(b.id(node.name), state); + } /** @type {import('estree').Expression[]} */ - const args = [ - state.node, - b.arrow(params, b.call(serialize_get_binding(b.id(node.name), state), ...params)) - ]; + const args = [state.node, b.arrow(params, b.call(callee, ...params))]; if (node.expression) { args.push(b.thunk(/** @type {import('estree').Expression} */ (visit(node.expression)))); diff --git a/packages/svelte/tests/runtime-legacy/samples/action-object-key/_config.js b/packages/svelte/tests/runtime-legacy/samples/action-object-key/_config.js new file mode 100644 index 000000000000..59153c4162b1 --- /dev/null +++ b/packages/svelte/tests/runtime-legacy/samples/action-object-key/_config.js @@ -0,0 +1,10 @@ +import { test } from '../../test'; + +export default test({ + html: ` + Text + `, + ssrHtml: ` + Text + ` +}); diff --git a/packages/svelte/tests/runtime-legacy/samples/action-object-key/main.svelte b/packages/svelte/tests/runtime-legacy/samples/action-object-key/main.svelte new file mode 100644 index 000000000000..67f5e28ac401 --- /dev/null +++ b/packages/svelte/tests/runtime-legacy/samples/action-object-key/main.svelte @@ -0,0 +1,4 @@ + +Text