Skip to content

Commit 39c559a

Browse files
authored
feat: better destructuring assignments (#12872)
* preserve existing destructuring assignments where appropriate * add test * changeset
1 parent 686b086 commit 39c559a

File tree

7 files changed

+34
-18
lines changed

7 files changed

+34
-18
lines changed

.changeset/rich-elephants-relax.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
feat: better destructuring assignments

packages/svelte/src/compiler/phases/3-transform/client/visitors/AssignmentExpression.js

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,13 @@ import { visit_assignment_expression } from '../../shared/assignments.js';
1111
* @param {Context} context
1212
*/
1313
export function AssignmentExpression(node, context) {
14-
return visit_assignment_expression(node, context, build_assignment);
14+
const expression = /** @type {Expression} */ (
15+
visit_assignment_expression(node, context, build_assignment) ?? context.next()
16+
);
17+
18+
return is_ignored(node, 'ownership_invalid_mutation')
19+
? b.call('$.skip_ownership_validation', b.thunk(expression))
20+
: expression;
1521
}
1622

1723
/**
@@ -109,19 +115,17 @@ function build_assignment(operator, left, right, context) {
109115
return transform.assign(object, value);
110116
}
111117

112-
/** @type {Expression} */
113-
let mutation = b.assignment(
114-
operator,
115-
/** @type {Pattern} */ (context.visit(left)),
116-
/** @type {Expression} */ (context.visit(right))
117-
);
118-
119118
// mutation
120119
if (transform?.mutate) {
121-
mutation = transform.mutate(object, mutation);
120+
return transform.mutate(
121+
object,
122+
b.assignment(
123+
operator,
124+
/** @type {Pattern} */ (context.visit(left)),
125+
/** @type {Expression} */ (context.visit(right))
126+
)
127+
);
122128
}
123129

124-
return is_ignored(left, 'ownership_invalid_mutation')
125-
? b.call('$.skip_ownership_validation', b.thunk(mutation))
126-
: mutation;
130+
return null;
127131
}

packages/svelte/src/compiler/phases/3-transform/server/visitors/AssignmentExpression.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { visit_assignment_expression } from '../../shared/assignments.js';
1010
* @param {Context} context
1111
*/
1212
export function AssignmentExpression(node, context) {
13-
return visit_assignment_expression(node, context, build_assignment);
13+
return visit_assignment_expression(node, context, build_assignment) ?? context.next();
1414
}
1515

1616
/**

packages/svelte/src/compiler/phases/3-transform/shared/assignments.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export function visit_assignment_expression(node, context, build_assignment) {
4141

4242
if (!changed) {
4343
// No change to output -> nothing to transform -> we can keep the original assignment
44-
return context.next();
44+
return null;
4545
}
4646

4747
const is_standalone = /** @type {Node} */ (context.path.at(-1)).type.endsWith('Statement');
@@ -70,8 +70,5 @@ export function visit_assignment_expression(node, context, build_assignment) {
7070
throw new Error(`Unexpected assignment type ${node.left.type}`);
7171
}
7272

73-
return (
74-
build_assignment(node.operator, node.left, node.right, context) ??
75-
/** @type {Expression} */ (context.next())
76-
);
73+
return build_assignment(node.operator, node.left, node.right, context);
7774
}

packages/svelte/tests/snapshot/samples/destructured-assignments/_expected/client/index.svelte.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@ import * as $ from "svelte/internal/client";
33

44
let a = $.source(1);
55
let b = $.source(2);
6+
let c = 3;
7+
let d = 4;
68

79
export function update(array) {
810
(
911
$.set(a, $.proxy(array[0])),
1012
$.set(b, $.proxy(array[1]))
1113
);
14+
15+
[c, d] = array;
1216
}

packages/svelte/tests/snapshot/samples/destructured-assignments/_expected/server/index.svelte.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ import * as $ from "svelte/internal/server";
33

44
let a = 1;
55
let b = 2;
6+
let c = 3;
7+
let d = 4;
68

79
export function update(array) {
810
[a, b] = array;
11+
[c, d] = array;
912
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
let a = $state(1);
22
let b = $state(2);
3+
let c = 3;
4+
let d = 4;
35

46
export function update(array) {
57
[a, b] = array;
8+
[c, d] = array;
69
}

0 commit comments

Comments
 (0)