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 @@ + + + + +