diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/VariableDeclaration.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/VariableDeclaration.js index c88db8b6d9..6e9bcb0009 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/VariableDeclaration.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/VariableDeclaration.js @@ -167,7 +167,7 @@ export function VariableDeclaration(node, context) { b.arrow( [b.id('$$fn')], b.sequence([ - b.call(b.id('$$fn'), b.member(state_id, b.id('v'))), + b.chain_call(b.id('$$fn'), b.member(state_id, b.id('v'))), b.call('$.set', state_id, b.member(state_id, b.id('v'))) ]) ) diff --git a/packages/svelte/src/compiler/phases/3-transform/server/visitors/VariableDeclaration.js b/packages/svelte/src/compiler/phases/3-transform/server/visitors/VariableDeclaration.js index a70f2852b8..122e664f4b 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/visitors/VariableDeclaration.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/visitors/VariableDeclaration.js @@ -98,7 +98,7 @@ export function VariableDeclaration(node, context) { const invalidation_id = /** @type {Identifier} */ (pattern.elements[1]); declarations.push( b.declarator(state_id, value), - b.declarator(invalidation_id, b.arrow([b.id('$$fn')], b.call(b.id('$$fn'), state_id))) + b.declarator(invalidation_id, b.arrow([b.id('$$fn')], b.chain_call(b.id('$$fn'), state_id))) ); continue; } diff --git a/packages/svelte/src/compiler/utils/builders.js b/packages/svelte/src/compiler/utils/builders.js index ecb595d74d..c1e68363a0 100644 --- a/packages/svelte/src/compiler/utils/builders.js +++ b/packages/svelte/src/compiler/utils/builders.js @@ -130,6 +130,17 @@ export function call(callee, ...args) { }; } +/** + * @param {string | ESTree.Expression} callee + * @param {...(ESTree.Expression | ESTree.SpreadElement | false | undefined)} args + * @returns {ESTree.ChainExpression} + */ +export function chain_call(callee, ...args) { + const expression = /** @type {ESTree.SimpleCallExpression} */ (call(callee, ...args)); + expression.optional = true; + return { type: 'ChainExpression', expression }; +} + /** * @param {string | ESTree.Expression} callee * @param {...ESTree.Expression} args