diff --git a/packages/svelte/src/internal/client/dom/blocks/each.js b/packages/svelte/src/internal/client/dom/blocks/each.js index 3d8e7c8870..bdf3f717f2 100644 --- a/packages/svelte/src/internal/client/dom/blocks/each.js +++ b/packages/svelte/src/internal/client/dom/blocks/each.js @@ -370,6 +370,7 @@ function reconcile( var is_animated = (flags & EACH_IS_ANIMATED) !== 0; var should_update = (flags & (EACH_ITEM_REACTIVE | EACH_INDEX_REACTIVE)) !== 0; + var count = 0; var length = array.length; var items = state.items; var first = state.first; @@ -458,6 +459,7 @@ function reconcile( stashed = []; current = prev.next; + count += 1; continue; } @@ -519,6 +521,7 @@ function reconcile( link(state, prev, item); prev = item; + count += 1; } continue; @@ -547,6 +550,14 @@ function reconcile( matched.push(item); prev = item; current = item.next; + count += 1; + } + + if (count !== length) { + // full key uniqueness check is dev-only, + // if keys duplication didn't cause a crash, + // the rendered list will be shorter then the array + each_key_duplicate('', '', ''); } if (current !== null || seen !== undefined) { diff --git a/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-2/_config.js b/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-2/_config.js new file mode 100644 index 0000000000..4caa45fd3c --- /dev/null +++ b/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-2/_config.js @@ -0,0 +1,15 @@ +import { flushSync } from 'svelte'; +import { test } from '../../test'; + +export default test({ + compileOptions: { + dev: false + }, + test({ assert, target }) { + let button = target.querySelector('button'); + + button?.click(); + + assert.throws(flushSync, /each_key_duplicate/); + } +}); diff --git a/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-2/main.svelte b/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-2/main.svelte new file mode 100644 index 0000000000..aedec8c57c --- /dev/null +++ b/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-2/main.svelte @@ -0,0 +1,8 @@ + + + +{#each data as d (d)} + {d} +{/each}