diff --git a/.changeset/loose-baboons-visit.md b/.changeset/loose-baboons-visit.md new file mode 100644 index 0000000000..09c50deb5e --- /dev/null +++ b/.changeset/loose-baboons-visit.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: emit state_referenced_locally warning for non-destructured props diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/Identifier.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/Identifier.js index 9daae33dd7..5c1e8031b8 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/Identifier.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/Identifier.js @@ -115,7 +115,8 @@ export function Identifier(node, context) { !should_proxy(binding.initial.arguments[0], context.state.scope)))) || binding.kind === 'raw_state' || binding.kind === 'derived' || - binding.kind === 'prop') && + binding.kind === 'prop' || + binding.kind === 'rest_prop') && // We're only concerned with reads here (parent.type !== 'AssignmentExpression' || parent.left !== node) && parent.type !== 'UpdateExpression' diff --git a/packages/svelte/tests/snapshot/samples/props-identifier/_expected/client/index.svelte.warnings.json b/packages/svelte/tests/snapshot/samples/props-identifier/_expected/client/index.svelte.warnings.json new file mode 100644 index 0000000000..81149a92f8 --- /dev/null +++ b/packages/svelte/tests/snapshot/samples/props-identifier/_expected/client/index.svelte.warnings.json @@ -0,0 +1,142 @@ +[ + { + "code": "state_referenced_locally", + "message": "This reference only captures the initial value of `props`. Did you mean to reference it inside a closure instead?\nhttps://svelte.dev/e/state_referenced_locally", + "filename": "packages/svelte/tests/snapshot/samples/props-identifier/index.svelte", + "start": { + "line": 3, + "column": 1, + "character": 33 + }, + "end": { + "line": 3, + "column": 6, + "character": 38 + }, + "position": [ + 33, + 38 + ], + "frame": "1: " + }, + { + "code": "state_referenced_locally", + "message": "This reference only captures the initial value of `props`. Did you mean to reference it inside a closure instead?\nhttps://svelte.dev/e/state_referenced_locally", + "filename": "packages/svelte/tests/snapshot/samples/props-identifier/index.svelte", + "start": { + "line": 9, + "column": 1, + "character": 120 + }, + "end": { + "line": 9, + "column": 6, + "character": 125 + }, + "position": [ + 120, + 125 + ], + "frame": " 7: props.a = true;\n 8: props[a] = true;\n 9: props;\n ^\n10: \n11: " + } +] \ No newline at end of file diff --git a/packages/svelte/tests/snapshot/samples/props-identifier/_expected/server/index.svelte.warnings.json b/packages/svelte/tests/snapshot/samples/props-identifier/_expected/server/index.svelte.warnings.json new file mode 100644 index 0000000000..81149a92f8 --- /dev/null +++ b/packages/svelte/tests/snapshot/samples/props-identifier/_expected/server/index.svelte.warnings.json @@ -0,0 +1,142 @@ +[ + { + "code": "state_referenced_locally", + "message": "This reference only captures the initial value of `props`. Did you mean to reference it inside a closure instead?\nhttps://svelte.dev/e/state_referenced_locally", + "filename": "packages/svelte/tests/snapshot/samples/props-identifier/index.svelte", + "start": { + "line": 3, + "column": 1, + "character": 33 + }, + "end": { + "line": 3, + "column": 6, + "character": 38 + }, + "position": [ + 33, + 38 + ], + "frame": "1: " + }, + { + "code": "state_referenced_locally", + "message": "This reference only captures the initial value of `props`. Did you mean to reference it inside a closure instead?\nhttps://svelte.dev/e/state_referenced_locally", + "filename": "packages/svelte/tests/snapshot/samples/props-identifier/index.svelte", + "start": { + "line": 9, + "column": 1, + "character": 120 + }, + "end": { + "line": 9, + "column": 6, + "character": 125 + }, + "position": [ + 120, + 125 + ], + "frame": " 7: props.a = true;\n 8: props[a] = true;\n 9: props;\n ^\n10: \n11: " + } +] \ No newline at end of file diff --git a/packages/svelte/tests/validator/samples/state-referenced-locally-props-identifier/input.svelte b/packages/svelte/tests/validator/samples/state-referenced-locally-props-identifier/input.svelte new file mode 100644 index 0000000000..980debdfaf --- /dev/null +++ b/packages/svelte/tests/validator/samples/state-referenced-locally-props-identifier/input.svelte @@ -0,0 +1,6 @@ + diff --git a/packages/svelte/tests/validator/samples/state-referenced-locally-props-identifier/warnings.json b/packages/svelte/tests/validator/samples/state-referenced-locally-props-identifier/warnings.json new file mode 100644 index 0000000000..b1385037e1 --- /dev/null +++ b/packages/svelte/tests/validator/samples/state-referenced-locally-props-identifier/warnings.json @@ -0,0 +1,26 @@ +[ + { + "code": "state_referenced_locally", + "message": "This reference only captures the initial value of `props`. Did you mean to reference it inside a closure instead?", + "start": { + "line": 3, + "column": 19 + }, + "end": { + "line": 3, + "column": 24 + } + }, + { + "code": "state_referenced_locally", + "message": "This reference only captures the initial value of `props`. Did you mean to reference it inside a closure instead?", + "start": { + "line": 4, + "column": 15 + }, + "end": { + "line": 4, + "column": 20 + } + } +]