From 68e7c9b5218b613c2b58be98bc5910bfa0dbacd4 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Tue, 25 Aug 2026 16:24:46 +0200 Subject: [PATCH] fix: transform derived assignments and select function bindings correctly during server-side rendering (#18669) follow-up to the fix in #18607 - there are a two more bugs related to writeable deriveds in that area --- .changeset/slow-dots-smile.md | 5 +++++ .../server/visitors/AssignmentExpression.js | 2 +- .../3-transform/server/visitors/shared/element.js | 5 ++--- .../derived-forward-ref-leading-comments/_config.js | 6 ------ .../samples/derived-leading-comments/_config.js | 6 ++++++ .../main.svelte | 10 ++++++++++ .../samples/select-function-binding-derived/_config.js | 9 +++++++++ .../select-function-binding-derived/main.svelte | 9 +++++++++ 8 files changed, 42 insertions(+), 10 deletions(-) create mode 100644 .changeset/slow-dots-smile.md delete mode 100644 packages/svelte/tests/runtime-runes/samples/derived-forward-ref-leading-comments/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/derived-leading-comments/_config.js rename packages/svelte/tests/runtime-runes/samples/{derived-forward-ref-leading-comments => derived-leading-comments}/main.svelte (55%) create mode 100644 packages/svelte/tests/runtime-runes/samples/select-function-binding-derived/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/select-function-binding-derived/main.svelte diff --git a/.changeset/slow-dots-smile.md b/.changeset/slow-dots-smile.md new file mode 100644 index 0000000000..18d2517b6c --- /dev/null +++ b/.changeset/slow-dots-smile.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: transform derived assignments and select function bindings correctly during server-side rendering diff --git a/packages/svelte/src/compiler/phases/3-transform/server/visitors/AssignmentExpression.js b/packages/svelte/src/compiler/phases/3-transform/server/visitors/AssignmentExpression.js index e6a1a86aa8..d555b6bb1d 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/visitors/AssignmentExpression.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/visitors/AssignmentExpression.js @@ -110,7 +110,7 @@ function build_assignment(operator, left, right, context) { context.visit(build_assignment_value(operator, left, right)) ); - return b.call(binding.node, value); + return b.call(object, value); } return null; diff --git a/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/element.js b/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/element.js index 5081d12c80..b4f4facb5d 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/element.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/element.js @@ -324,10 +324,9 @@ export function build_spread_object(element, attributes, context, transform) { return b.prop('init', b.key(name), value); } else if (attribute.type === 'BindDirective') { const name = get_attribute_name(element, attribute); + const expression = /** @type {Expression} */ (context.visit(attribute.expression)); const value = - attribute.expression.type === 'SequenceExpression' - ? b.call(attribute.expression.expressions[0]) - : /** @type {Expression} */ (context.visit(attribute.expression)); + expression.type === 'SequenceExpression' ? b.call(expression.expressions[0]) : expression; return b.prop('init', b.key(name), value); } diff --git a/packages/svelte/tests/runtime-runes/samples/derived-forward-ref-leading-comments/_config.js b/packages/svelte/tests/runtime-runes/samples/derived-forward-ref-leading-comments/_config.js deleted file mode 100644 index 204581389d..0000000000 --- a/packages/svelte/tests/runtime-runes/samples/derived-forward-ref-leading-comments/_config.js +++ /dev/null @@ -1,6 +0,0 @@ -import { test } from '../../test'; - -export default test({ - ssrHtml: '

LATER

', - html: '

LATER

' -}); diff --git a/packages/svelte/tests/runtime-runes/samples/derived-leading-comments/_config.js b/packages/svelte/tests/runtime-runes/samples/derived-leading-comments/_config.js new file mode 100644 index 0000000000..2048fbadf7 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/derived-leading-comments/_config.js @@ -0,0 +1,6 @@ +import { test } from '../../test'; + +export default test({ + ssrHtml: '

y:y

LATER

', + html: '

y:y

LATER

' +}); diff --git a/packages/svelte/tests/runtime-runes/samples/derived-forward-ref-leading-comments/main.svelte b/packages/svelte/tests/runtime-runes/samples/derived-leading-comments/main.svelte similarity index 55% rename from packages/svelte/tests/runtime-runes/samples/derived-forward-ref-leading-comments/main.svelte rename to packages/svelte/tests/runtime-runes/samples/derived-leading-comments/main.svelte index f9a1a1a6fb..0424d3fb15 100644 --- a/packages/svelte/tests/runtime-runes/samples/derived-forward-ref-leading-comments/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/derived-leading-comments/main.svelte @@ -1,4 +1,13 @@ +

{foo}:{bar}

{ctx.later}

diff --git a/packages/svelte/tests/runtime-runes/samples/select-function-binding-derived/_config.js b/packages/svelte/tests/runtime-runes/samples/select-function-binding-derived/_config.js new file mode 100644 index 0000000000..13b7302cee --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/select-function-binding-derived/_config.js @@ -0,0 +1,9 @@ +import { test } from '../../test'; + +export default test({ + ssrHtml: '', + test({ assert, target }) { + const select = /** @type {HTMLSelectElement} */ (target.querySelector('select')); + assert.equal(select.value, 'b'); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/select-function-binding-derived/main.svelte b/packages/svelte/tests/runtime-runes/samples/select-function-binding-derived/main.svelte new file mode 100644 index 0000000000..2c14566193 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/select-function-binding-derived/main.svelte @@ -0,0 +1,9 @@ + + +