From f30faa702df64b1a89bdd068f06dad0510da3597 Mon Sep 17 00:00:00 2001 From: Rafi Strauss Date: Tue, 18 Apr 2023 11:18:21 -0400 Subject: [PATCH] feat: improve duplicate key error for keyed each blocks (#8411) Closes #8410 --------- Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> --- src/runtime/internal/keyed_each.ts | 12 +++++++++--- .../runtime/samples/keyed-each-dev-unique/_config.js | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/runtime/internal/keyed_each.ts b/src/runtime/internal/keyed_each.ts index a5cfaf7fb6..138dcbc4b8 100644 --- a/src/runtime/internal/keyed_each.ts +++ b/src/runtime/internal/keyed_each.ts @@ -108,12 +108,18 @@ export function update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list } export function validate_each_keys(ctx, list, get_context, get_key) { - const keys = new Set(); + const keys = new Map(); for (let i = 0; i < list.length; i++) { const key = get_key(get_context(ctx, list, i)); if (keys.has(key)) { - throw new Error('Cannot have duplicate keys in a keyed each'); + let value = ''; + try { + value = `with value '${String(key)}' `; + } catch (e) { + // can't stringify + } + throw new Error(`Cannot have duplicate keys in a keyed each: Keys at index ${keys.get(key)} and ${i} ${value}are duplicates`); } - keys.add(key); + keys.set(key, i); } } diff --git a/test/runtime/samples/keyed-each-dev-unique/_config.js b/test/runtime/samples/keyed-each-dev-unique/_config.js index 81728d9c15..d8a6745e16 100644 --- a/test/runtime/samples/keyed-each-dev-unique/_config.js +++ b/test/runtime/samples/keyed-each-dev-unique/_config.js @@ -3,5 +3,5 @@ export default { dev: true }, - error: 'Cannot have duplicate keys in a keyed each' + error: 'Cannot have duplicate keys in a keyed each: Keys at index 0 and 3 with value \'1\' are duplicates' };