diff --git a/.changeset/calm-buses-clap.md b/.changeset/calm-buses-clap.md new file mode 100644 index 000000000000..409949443da2 --- /dev/null +++ b/.changeset/calm-buses-clap.md @@ -0,0 +1,5 @@ +--- +"svelte": patch +--- + +fix: don't warn on writes to `$state` diff --git a/packages/svelte/src/compiler/phases/2-analyze/index.js b/packages/svelte/src/compiler/phases/2-analyze/index.js index 2b8a0e9b453b..5a0adfc40c25 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/index.js +++ b/packages/svelte/src/compiler/phases/2-analyze/index.js @@ -1242,6 +1242,7 @@ const common_visitors = { if ( context.state.analysis.runes && node !== binding.node && + context.state.function_depth === binding.scope.function_depth && // If we have $state that can be proxied or frozen and isn't re-assigned, then that means // it's likely not using a primitive value and thus this warning isn't that helpful. ((binding.kind === 'state' && @@ -1252,7 +1253,9 @@ const common_visitors = { !should_proxy_or_freeze(binding.initial.arguments[0], context.state.scope)))) || binding.kind === 'frozen_state' || binding.kind === 'derived') && - context.state.function_depth === binding.scope.function_depth + // We're only concerned with reads here + (parent.type !== 'AssignmentExpression' || parent.left !== node) && + parent.type !== 'UpdateExpression' ) { w.state_referenced_locally(node); } diff --git a/packages/svelte/tests/validator/samples/static-state-reference/input.svelte b/packages/svelte/tests/validator/samples/static-state-reference/input.svelte index 2971960a1473..72590de4f4fd 100644 --- a/packages/svelte/tests/validator/samples/static-state-reference/input.svelte +++ b/packages/svelte/tests/validator/samples/static-state-reference/input.svelte @@ -6,6 +6,11 @@ console.log(obj); console.log(count); console.log(doubled); + // these are ok because they're writes + count++; + count = 1; + obj.a++; + obj.a = 1;