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 @@
+
+
+
+ {data}
+
diff --git a/packages/svelte/tests/runtime-runes/samples/async-hydration-binding/Binding.svelte b/packages/svelte/tests/runtime-runes/samples/async-hydration-binding/Binding.svelte
new file mode 100644
index 0000000000..3deba21acc
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/async-hydration-binding/Binding.svelte
@@ -0,0 +1,7 @@
+
+
+
diff --git a/packages/svelte/tests/runtime-runes/samples/async-hydration-binding/Bound.svelte b/packages/svelte/tests/runtime-runes/samples/async-hydration-binding/Bound.svelte
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/packages/svelte/tests/runtime-runes/samples/async-hydration-binding/_config.js b/packages/svelte/tests/runtime-runes/samples/async-hydration-binding/_config.js
new file mode 100644
index 0000000000..d4d36b007f
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/async-hydration-binding/_config.js
@@ -0,0 +1,10 @@
+import { test } from '../../test';
+
+// Tests that renderer.subsume (which is used when bindings are present) works correctly
+export default test({
+ mode: ['hydrate'],
+ html: 'test
',
+ async test({ assert, warnings }) {
+ assert.deepEqual(warnings, []);
+ }
+});
diff --git a/packages/svelte/tests/runtime-runes/samples/async-hydration-binding/main.svelte b/packages/svelte/tests/runtime-runes/samples/async-hydration-binding/main.svelte
new file mode 100644
index 0000000000..a38806be7c
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/async-hydration-binding/main.svelte
@@ -0,0 +1,7 @@
+
+
+
+