diff --git a/packages/svelte/src/compiler/phases/3-transform/shared/spread_bindings.js b/packages/svelte/src/compiler/phases/3-transform/shared/spread_bindings.js
index 6414be66b5..c9e93a6a9c 100644
--- a/packages/svelte/src/compiler/phases/3-transform/shared/spread_bindings.js
+++ b/packages/svelte/src/compiler/phases/3-transform/shared/spread_bindings.js
@@ -16,15 +16,21 @@ export function init_spread_bindings(spread_expression, { state, visit }) {
? b.literal(source.slice(spread_expression.start, spread_expression.end))
: undefined;
- const id = state.scope.generate('$$spread_binding');
- const get = b.id(id + '_get');
- const set = b.id(id + '_set');
+ const id = b.id(state.scope.generate('$$spread_binding'));
state.init.push(
b.const(
- b.array_pattern([get, set]),
- b.call('$.validate_spread_bindings', expression, expression_text)
+ id,
+ b.call(
+ '$.derived',
+ b.thunk(b.call('$.validate_spread_bindings', expression, expression_text))
+ )
)
);
+ const is_server = state.options.generate === 'server';
+ const binding = is_server ? b.call(id) : b.call('$.get', id);
+
+ const get = b.thunk(b.call(b.member(binding, b.literal(0), true)));
+ const set = b.thunk(b.call(b.member(binding, b.literal(1), true), b.id('$$value')));
return { get, set };
}
diff --git a/packages/svelte/tests/runtime-runes/samples/bind-spread-reactive/_config.js b/packages/svelte/tests/runtime-runes/samples/bind-spread-reactive/_config.js
new file mode 100644
index 0000000000..25ef3b134a
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/bind-spread-reactive/_config.js
@@ -0,0 +1,17 @@
+import { flushSync } from 'svelte';
+import { test } from '../../test';
+
+export default test({
+ async test({ assert, target, logs }) {
+ assert.htmlEqual(target.innerHTML, ``);
+
+ assert.deepEqual(logs, [false]);
+
+ const button = target.querySelector('button');
+
+ button?.click();
+ flushSync();
+
+ assert.deepEqual(logs, [false, true]);
+ }
+});
diff --git a/packages/svelte/tests/runtime-runes/samples/bind-spread-reactive/main.svelte b/packages/svelte/tests/runtime-runes/samples/bind-spread-reactive/main.svelte
new file mode 100644
index 0000000000..0ef8b57fa8
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/bind-spread-reactive/main.svelte
@@ -0,0 +1,17 @@
+
+
+
+
+