Skip to content

Commit 5d56c59

Browse files
authored
fix: delete transformers shadowed by unreassigned state (#13316)
fixes #13314
1 parent b3842d7 commit 5d56c59

File tree

4 files changed

+25
-2
lines changed

4 files changed

+25
-2
lines changed

.changeset/hot-grapes-destroy.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: delete transformers shadowed by unreassigned state

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
/** @import { Visitors, ComponentClientTransformState, ClientTransformState } from './types' */
55
import { walk } from 'zimmerframe';
66
import * as b from '../../../utils/builders.js';
7-
import { build_getter } from './utils.js';
7+
import { build_getter, is_state_source } from './utils.js';
88
import { render_stylesheet } from '../css/index.js';
99
import { dev, filename } from '../../../state.js';
1010
import { AnimateDirective } from './visitors/AnimateDirective.js';
@@ -66,7 +66,12 @@ const visitors = {
6666
const transform = { ...state.transform };
6767

6868
for (const [name, binding] of scope.declarations) {
69-
if (binding.kind === 'normal') {
69+
if (
70+
binding.kind === 'normal' ||
71+
// Reads of `$state(...)` declarations are not
72+
// transformed if they are never reassigned
73+
(binding.kind === 'state' && !is_state_source(binding, state.analysis))
74+
) {
7075
delete transform[name];
7176
}
7277
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { test } from '../../test';
2+
3+
export default test({
4+
html: `<div>0</div>`
5+
});
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<script>
2+
let value = $derived.by(() => {
3+
const value = $state(0);
4+
return value;
5+
});
6+
</script>
7+
8+
<div>{value}</div>

0 commit comments

Comments
 (0)