Skip to content

Commit d6d467b

Browse files
committed
fix: allow mutation of private derived state
1 parent b0c4fa5 commit d6d467b

File tree

6 files changed

+45
-14
lines changed

6 files changed

+45
-14
lines changed

.changeset/rare-carpets-wave.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+
fix: allow mutation of private derived state

packages/svelte/src/compiler/phases/2-analyze/visitors/shared/utils.js

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,13 @@ export function validate_assignment(node, argument, state) {
3535
}
3636
}
3737

38-
let object = /** @type {Expression | Super} */ (argument);
39-
40-
/** @type {Expression | PrivateIdentifier | null} */
41-
let property = null;
42-
43-
while (object.type === 'MemberExpression') {
44-
property = object.property;
45-
object = object.object;
46-
}
47-
48-
if (object.type === 'ThisExpression' && property?.type === 'PrivateIdentifier') {
49-
if (state.private_derived_state.includes(property.name)) {
50-
e.constant_assignment(node, 'derived state');
51-
}
38+
if (
39+
argument.type === 'MemberExpression' &&
40+
argument.object.type === 'ThisExpression' &&
41+
argument.property.type === 'PrivateIdentifier' &&
42+
state.private_derived_state.includes(argument.property.name)
43+
) {
44+
e.constant_assignment(node, 'derived state');
5245
}
5346
}
5447

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[]
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<script>
2+
class Test{
3+
#der = $derived({test: 0});
4+
5+
set test(v){
6+
this.#der.test = 45;
7+
}
8+
}
9+
</script>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[
2+
{
3+
"code": "constant_assignment",
4+
"message": "Cannot assign to derived state",
5+
"start": {
6+
"column": 3,
7+
"line": 6
8+
},
9+
"end": {
10+
"column": 27,
11+
"line": 6
12+
}
13+
}
14+
]
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<script>
2+
class Test{
3+
#der = $derived({ test: 0 });
4+
5+
set test(v){
6+
this.#der = { test: 45 };
7+
}
8+
}
9+
</script>

0 commit comments

Comments
 (0)