diff --git a/.changeset/sharp-spies-live.md b/.changeset/sharp-spies-live.md new file mode 100644 index 0000000000..0ddbde97ed --- /dev/null +++ b/.changeset/sharp-spies-live.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: error on `bind:this` to each block parameter diff --git a/packages/svelte/src/compiler/phases/2-analyze/validation.js b/packages/svelte/src/compiler/phases/2-analyze/validation.js index eda5ed42b0..296104b050 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/validation.js +++ b/packages/svelte/src/compiler/phases/2-analyze/validation.js @@ -385,33 +385,31 @@ const validation = { const binding = context.state.scope.get(left.name); - if ( - assignee.type === 'Identifier' && - node.name !== 'this' // bind:this also works for regular variables - ) { + if (assignee.type === 'Identifier') { // reassignment if ( - !binding || - (binding.kind !== 'state' && - binding.kind !== 'frozen_state' && - binding.kind !== 'prop' && - binding.kind !== 'bindable_prop' && - binding.kind !== 'each' && - binding.kind !== 'store_sub' && - !binding.mutated) + node.name !== 'this' && // bind:this also works for regular variables + (!binding || + (binding.kind !== 'state' && + binding.kind !== 'frozen_state' && + binding.kind !== 'prop' && + binding.kind !== 'bindable_prop' && + binding.kind !== 'each' && + binding.kind !== 'store_sub' && + !binding.mutated)) ) { e.bind_invalid_value(node.expression); } - if (binding.kind === 'derived') { + if (binding?.kind === 'derived') { e.constant_binding(node.expression, 'derived state'); } - if (context.state.analysis.runes && binding.kind === 'each') { + if (context.state.analysis.runes && binding?.kind === 'each') { e.each_item_invalid_assignment(node); } - if (binding.kind === 'snippet') { + if (binding?.kind === 'snippet') { e.snippet_parameter_assignment(node); } } diff --git a/packages/svelte/tests/compiler-errors/samples/runes-invalid-each-binding-this/_config.js b/packages/svelte/tests/compiler-errors/samples/runes-invalid-each-binding-this/_config.js new file mode 100644 index 0000000000..524c2f161c --- /dev/null +++ b/packages/svelte/tests/compiler-errors/samples/runes-invalid-each-binding-this/_config.js @@ -0,0 +1,9 @@ +import { test } from '../../test'; + +export default test({ + error: { + code: 'each_item_invalid_assignment', + message: + 'Cannot reassign or bind to each block argument in runes mode. Use the array and index variables instead (e.g. `array[i] = value` instead of `entry = value`)' + } +}); diff --git a/packages/svelte/tests/compiler-errors/samples/runes-invalid-each-binding-this/main.svelte b/packages/svelte/tests/compiler-errors/samples/runes-invalid-each-binding-this/main.svelte new file mode 100644 index 0000000000..f6d887d048 --- /dev/null +++ b/packages/svelte/tests/compiler-errors/samples/runes-invalid-each-binding-this/main.svelte @@ -0,0 +1,11 @@ + + +{#each array as { id, element } (id)} + +{/each}