From 04eadbc8a9ea905878fec90e61b5a62a2f9a4045 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Sun, 29 Mar 2026 21:56:27 +0200 Subject: [PATCH] fix: correctly handle bindings on the server (#18009) `item.subsume(item)` did nothing, honestly kinda weird how this only turned up now Fixes #17981 --- .changeset/eight-trees-occur.md | 5 +++++ packages/svelte/src/internal/server/renderer.js | 10 +++++++--- .../samples/async-hydration-binding/Async.svelte | 7 +++++++ .../samples/async-hydration-binding/Binding.svelte | 7 +++++++ .../samples/async-hydration-binding/Bound.svelte | 0 .../samples/async-hydration-binding/_config.js | 10 ++++++++++ .../samples/async-hydration-binding/main.svelte | 7 +++++++ 7 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 .changeset/eight-trees-occur.md create mode 100644 packages/svelte/tests/runtime-runes/samples/async-hydration-binding/Async.svelte create mode 100644 packages/svelte/tests/runtime-runes/samples/async-hydration-binding/Binding.svelte create mode 100644 packages/svelte/tests/runtime-runes/samples/async-hydration-binding/Bound.svelte create mode 100644 packages/svelte/tests/runtime-runes/samples/async-hydration-binding/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/async-hydration-binding/main.svelte diff --git a/.changeset/eight-trees-occur.md b/.changeset/eight-trees-occur.md new file mode 100644 index 0000000000..cc200b39ba --- /dev/null +++ b/.changeset/eight-trees-occur.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: correctly handle bindings on the server diff --git a/packages/svelte/src/internal/server/renderer.js b/packages/svelte/src/internal/server/renderer.js index da65811eca..4bcb45512e 100644 --- a/packages/svelte/src/internal/server/renderer.js +++ b/packages/svelte/src/internal/server/renderer.js @@ -468,10 +468,14 @@ export class Renderer { } this.local = other.local; - this.#out = other.#out.map((item) => { - if (item instanceof Renderer) { - item.subsume(item); + this.#out = other.#out.map((item, i) => { + const current = this.#out[i]; + + if (current instanceof Renderer && item instanceof Renderer) { + current.subsume(item); + return current; } + return item; }); this.promise = other.promise; diff --git a/packages/svelte/tests/runtime-runes/samples/async-hydration-binding/Async.svelte b/packages/svelte/tests/runtime-runes/samples/async-hydration-binding/Async.svelte new file mode 100644 index 0000000000..6e7dbc82bb --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-hydration-binding/Async.svelte @@ -0,0 +1,7 @@ + + +