diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js index 6d3d8a68e6..d8de3fc729 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js @@ -261,10 +261,10 @@ export function build_component(node, component_name, context, anchor = context. let expression = /** @type {Expression} */ (context.visit(attribute.expression)); if (attribute.metadata.expression.has_state) { - expression = b.arrow([b.id('$$node')], b.call(expression, b.id('$$node'))); + push_prop(b.get(b.call('$.attachment'), [b.return(expression)], true)); + } else { + push_prop(b.prop('init', b.call('$.attachment'), expression, true)); } - - push_prop(b.prop('get', b.call('$.attachment'), expression, true)); } } diff --git a/packages/svelte/src/compiler/utils/builders.js b/packages/svelte/src/compiler/utils/builders.js index 736738d19f..05090b1b39 100644 --- a/packages/svelte/src/compiler/utils/builders.js +++ b/packages/svelte/src/compiler/utils/builders.js @@ -231,12 +231,18 @@ export function function_declaration(id, params, body) { } /** - * @param {string} name + * @param {ESTree.Expression | string} name * @param {ESTree.Statement[]} body + * @param {boolean} computed * @returns {ESTree.Property & { value: ESTree.FunctionExpression}}} */ -export function get(name, body) { - return prop('get', key(name), function_builder(null, [], block(body))); +export function get(name, body, computed = false) { + return prop( + 'get', + typeof name === 'string' ? key(name) : name, + function_builder(null, [], block(body)), + computed + ); } /**