From c3eac309b39872aed9afc8fee6df545bc3840a46 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 15 Nov 2023 11:07:49 +0000 Subject: [PATCH 1/2] fix: correctly handle action member expression keys --- .changeset/grumpy-students-drop.md | 5 +++++ .../phases/3-transform/client/visitors/template.js | 13 +++++++++---- .../samples/action-object-key/_config.js | 10 ++++++++++ .../samples/action-object-key/main.svelte | 4 ++++ 4 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 .changeset/grumpy-students-drop.md create mode 100644 packages/svelte/tests/runtime-legacy/samples/action-object-key/_config.js create mode 100644 packages/svelte/tests/runtime-legacy/samples/action-object-key/main.svelte 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..e7dcb0e87021 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,17 @@ export const template_visitors = { if (node.expression) { params.push(b.id('$$props')); } + let callee; + if (node.name.includes('.')) { + const parts = node.name.split('.'); + const key = b.key(parts[1]); + callee = b.member(serialize_get_binding(b.id(parts[0]), state), 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 From 00de58f450cf33c44dc5050b7fc8096163365740 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 15 Nov 2023 11:18:45 +0000 Subject: [PATCH 2/2] Fix deep --- .../phases/3-transform/client/visitors/template.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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 e7dcb0e87021..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 @@ -2416,8 +2416,11 @@ export const template_visitors = { let callee; if (node.name.includes('.')) { const parts = node.name.split('.'); - const key = b.key(parts[1]); - callee = b.member(serialize_get_binding(b.id(parts[0]), state), key, key.type === 'Literal'); + 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); }