diff --git a/.changeset/olive-tomatoes-ring.md b/.changeset/olive-tomatoes-ring.md new file mode 100644 index 000000000000..0aba6fe33cad --- /dev/null +++ b/.changeset/olive-tomatoes-ring.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: allow keyed `{#each ...}` without `as` diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/EachBlock.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/EachBlock.js index 225a4f617c50..9064db311b66 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/EachBlock.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/EachBlock.js @@ -298,12 +298,14 @@ export function EachBlock(node, context) { let key_function = b.id('$.index'); if (node.metadata.keyed) { - const pattern = /** @type {Pattern} */ (node.context); // can only be keyed when a context is provided const expression = /** @type {Expression} */ ( context.visit(/** @type {Expression} */ (node.key), key_state) ); - key_function = b.arrow(key_uses_index ? [pattern, index] : [pattern], expression); + const args = [node.context ?? b.id('$$')]; + if (key_uses_index) args.push(index); + + key_function = b.arrow(args, expression); } if (node.index && each_node_meta.contains_group_binding) { diff --git a/packages/svelte/tests/runtime-runes/samples/each-without-as-keyed/_config.js b/packages/svelte/tests/runtime-runes/samples/each-without-as-keyed/_config.js new file mode 100644 index 000000000000..82707da72e00 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/each-without-as-keyed/_config.js @@ -0,0 +1,13 @@ +import { flushSync } from 'svelte'; +import { test } from '../../test'; + +export default test({ + html: `

3

2

1

`, + + async test({ target, assert }) { + const [button] = target.querySelectorAll('button'); + + flushSync(() => button.click()); + assert.htmlEqual(target.innerHTML, `

1

2

3

`); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/each-without-as-keyed/main.svelte b/packages/svelte/tests/runtime-runes/samples/each-without-as-keyed/main.svelte new file mode 100644 index 000000000000..4276c2a36bcd --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/each-without-as-keyed/main.svelte @@ -0,0 +1,11 @@ + + + + +{#each items, i (items[i].id)} +

{items[i].id}

+{/each}