diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/VariableDeclarator.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/VariableDeclarator.js index d98fdfca47..89320f3962 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/VariableDeclarator.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/VariableDeclarator.js @@ -19,7 +19,7 @@ export function VariableDeclarator(node, context) { if (context.state.analysis.runes) { const init = node.init; const rune = get_rune(init, context.state.scope); - const paths = extract_paths(node.id, b.id('dummy')); + const { paths } = extract_paths(node.id, b.id('dummy')); for (const path of paths) { validate_identifier_name(context.state.scope.get(/** @type {Identifier} */ (path.node).name)); diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/EachBlock.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/EachBlock.js index 4267067210..5f0c329c75 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/EachBlock.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/EachBlock.js @@ -234,7 +234,9 @@ export function EachBlock(node, context) { } else if (node.context) { const unwrapped = (flags & EACH_ITEM_REACTIVE) !== 0 ? b.call('$.get', item) : item; - for (const path of extract_paths(node.context, unwrapped)) { + const { paths } = extract_paths(node.context, unwrapped); + + for (const path of paths) { const name = /** @type {Identifier} */ (path.node).name; const needs_derived = path.has_default_value; // to ensure that default value is only called once diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/SnippetBlock.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/SnippetBlock.js index a04f817226..0dd46fafc6 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/SnippetBlock.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/SnippetBlock.js @@ -43,7 +43,7 @@ export function SnippetBlock(node, context) { let arg_alias = `$$arg${i}`; args.push(b.id(arg_alias)); - const paths = extract_paths(argument, b.maybe_call(b.id(arg_alias))); + const { paths } = extract_paths(argument, b.maybe_call(b.id(arg_alias))); for (const path of paths) { const name = /** @type {Identifier} */ (path.node).name; 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 7e11dc6336..4bb895511b 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 @@ -142,7 +142,7 @@ export function VariableDeclaration(node, context) { ); } else { const tmp = b.id(context.state.scope.generate('tmp')); - const paths = extract_paths(declarator.id, tmp); + const { paths } = extract_paths(declarator.id, tmp); declarations.push( b.declarator(tmp, value), ...paths.map((path) => { @@ -183,7 +183,9 @@ export function VariableDeclaration(node, context) { ); } - for (const path of extract_paths(declarator.id, rhs)) { + const { paths } = extract_paths(declarator.id, rhs); + + for (const path of paths) { declarations.push( b.declarator(path.node, b.call('$.derived', b.thunk(path.expression))) ); @@ -218,7 +220,7 @@ export function VariableDeclaration(node, context) { // Turn export let into props. It's really really weird because export let { x: foo, z: [bar]} = .. // means that foo and bar are the props (i.e. the leafs are the prop names), not x and z. const tmp = b.id(context.state.scope.generate('tmp')); - const paths = extract_paths(declarator.id, tmp); + const { paths } = extract_paths(declarator.id, tmp); declarations.push( b.declarator( @@ -298,7 +300,7 @@ function create_state_declarators(declarator, { scope, analysis }, value) { } const tmp = b.id(scope.generate('tmp')); - const paths = extract_paths(declarator.id, tmp); + const { paths } = extract_paths(declarator.id, tmp); return [ b.declarator(tmp, value), ...paths.map((path) => { 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 25994091ba..0e3ee40af3 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 @@ -121,7 +121,7 @@ export function VariableDeclaration(node, context) { // Turn export let into props. It's really really weird because export let { x: foo, z: [bar]} = .. // means that foo and bar are the props (i.e. the leafs are the prop names), not x and z. const tmp = b.id(context.state.scope.generate('tmp')); - const paths = extract_paths(declarator.id, tmp); + const { paths } = extract_paths(declarator.id, tmp); declarations.push( b.declarator( tmp, @@ -189,7 +189,7 @@ function create_state_declarators(declarator, scope, value) { } const tmp = b.id(scope.generate('tmp')); - const paths = extract_paths(declarator.id, tmp); + const { paths } = extract_paths(declarator.id, tmp); return [ b.declarator(tmp, value), // TODO inject declarator for opts, so we can use it below ...paths.map((path) => { diff --git a/packages/svelte/src/compiler/phases/3-transform/shared/assignments.js b/packages/svelte/src/compiler/phases/3-transform/shared/assignments.js index abd3b37c32..228ea37010 100644 --- a/packages/svelte/src/compiler/phases/3-transform/shared/assignments.js +++ b/packages/svelte/src/compiler/phases/3-transform/shared/assignments.js @@ -23,7 +23,9 @@ export function visit_assignment_expression(node, context, build_assignment) { let changed = false; - const assignments = extract_paths(node.left, rhs).map((path) => { + const { paths } = extract_paths(node.left, rhs); + + const assignments = paths.map((path) => { const value = path.expression; let assignment = build_assignment('=', path.node, value, context); diff --git a/packages/svelte/src/compiler/utils/ast.js b/packages/svelte/src/compiler/utils/ast.js index 9197815761..cfbe1557dd 100644 --- a/packages/svelte/src/compiler/utils/ast.js +++ b/packages/svelte/src/compiler/utils/ast.js @@ -237,10 +237,15 @@ export function extract_identifiers_from_destructuring(node, nodes = []) { * Extracts all destructured assignments from a pattern. * @param {ESTree.Node} param * @param {ESTree.Expression} initial - * @returns {DestructuredAssignment[]} + * @returns {{ paths: DestructuredAssignment[] }} */ export function extract_paths(param, initial) { - return _extract_paths([], param, initial, initial, false); + /** @type {DestructuredAssignment[]} */ + const paths = []; + + _extract_paths(paths, param, initial, initial, false); + + return { paths }; } /**