From ec016eb253191df1c14ce75005683e3616bd0bcb Mon Sep 17 00:00:00 2001 From: 7nik Date: Sat, 6 Sep 2025 19:17:17 +0300 Subject: [PATCH 01/11] fix: emit `each_key_duplicate` error in production --- .changeset/sharp-snakes-poke.md | 5 +++++ .../src/internal/client/dom/blocks/each.js | 16 ++++++++++++++++ .../keyed-each-dev-unique-prod/_config.js | 12 ++++++++++++ .../keyed-each-dev-unique-prod/main.svelte | 8 ++++++++ 4 files changed, 41 insertions(+) create mode 100644 .changeset/sharp-snakes-poke.md create mode 100644 packages/svelte/tests/runtime-legacy/samples/keyed-each-dev-unique-prod/_config.js create mode 100644 packages/svelte/tests/runtime-legacy/samples/keyed-each-dev-unique-prod/main.svelte diff --git a/.changeset/sharp-snakes-poke.md b/.changeset/sharp-snakes-poke.md new file mode 100644 index 000000000000..7f7f8aa7b2f9 --- /dev/null +++ b/.changeset/sharp-snakes-poke.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: emit `each_key_duplicate` error in production diff --git a/packages/svelte/src/internal/client/dom/blocks/each.js b/packages/svelte/src/internal/client/dom/blocks/each.js index 006bf09257d1..9a36f29158af 100644 --- a/packages/svelte/src/internal/client/dom/blocks/each.js +++ b/packages/svelte/src/internal/client/dom/blocks/each.js @@ -42,6 +42,7 @@ import { active_effect, get } from '../../runtime.js'; import { DEV } from 'esm-env'; import { derived_safe_equal } from '../../reactivity/deriveds.js'; import { current_batch } from '../../reactivity/batch.js'; +import { each_key_duplicate } from '../../errors.js'; /** * The row of a keyed each block that is currently updating. We track this @@ -473,6 +474,21 @@ function reconcile( var start = stashed[0]; var j; + // full key uniqueness check is dev-only, + // key duplicates cause crushing only due to `matched` being empty + if (matched.length === 0) { + var map = new Map(); + for (j = 0; j < length; j += 1) { + var k = get_key(array[j], j); + if (map.has(k)) { + k = String(k); + if (k.startsWith('[object ')) k = null; + each_key_duplicate(String(j), String(map.get(k)), k); + } + map.set(k, j); + } + } + prev = start.prev; var a = matched[0]; diff --git a/packages/svelte/tests/runtime-legacy/samples/keyed-each-dev-unique-prod/_config.js b/packages/svelte/tests/runtime-legacy/samples/keyed-each-dev-unique-prod/_config.js new file mode 100644 index 000000000000..2ad5c1b3efc0 --- /dev/null +++ b/packages/svelte/tests/runtime-legacy/samples/keyed-each-dev-unique-prod/_config.js @@ -0,0 +1,12 @@ +import { flushSync } from 'svelte'; +import { test } from '../../test'; + +export default test({ + 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-dev-unique-prod/main.svelte b/packages/svelte/tests/runtime-legacy/samples/keyed-each-dev-unique-prod/main.svelte new file mode 100644 index 000000000000..38acbdee7804 --- /dev/null +++ b/packages/svelte/tests/runtime-legacy/samples/keyed-each-dev-unique-prod/main.svelte @@ -0,0 +1,8 @@ + + + +{#each data as d (d)} + {d} +{/each} From 8fdb47d050ee4936a29b92f0fb656820d764b5b9 Mon Sep 17 00:00:00 2001 From: 7nik Date: Tue, 9 Sep 2025 20:15:40 +0300 Subject: [PATCH 02/11] fix: preserve key --- packages/svelte/src/internal/client/dom/blocks/each.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/svelte/src/internal/client/dom/blocks/each.js b/packages/svelte/src/internal/client/dom/blocks/each.js index 9a36f29158af..850ddf57d30f 100644 --- a/packages/svelte/src/internal/client/dom/blocks/each.js +++ b/packages/svelte/src/internal/client/dom/blocks/each.js @@ -481,9 +481,10 @@ function reconcile( for (j = 0; j < length; j += 1) { var k = get_key(array[j], j); if (map.has(k)) { - k = String(k); - if (k.startsWith('[object ')) k = null; - each_key_duplicate(String(j), String(map.get(k)), k); + /** @type {string|null} */ + var key_name = String(k); + if (key_name.startsWith('[object ')) key_name = null; + each_key_duplicate(String(j), String(map.get(k)), key_name); } map.set(k, j); } From 93354e021a42d653c6d6f21adf29b9d3b260536a Mon Sep 17 00:00:00 2001 From: 7nik Date: Fri, 12 Sep 2025 13:08:37 +0300 Subject: [PATCH 03/11] Update packages/svelte/src/internal/client/dom/blocks/each.js Co-authored-by: Rich Harris --- .../svelte/src/internal/client/dom/blocks/each.js | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/packages/svelte/src/internal/client/dom/blocks/each.js b/packages/svelte/src/internal/client/dom/blocks/each.js index 850ddf57d30f..cfeba2b8cb00 100644 --- a/packages/svelte/src/internal/client/dom/blocks/each.js +++ b/packages/svelte/src/internal/client/dom/blocks/each.js @@ -477,17 +477,7 @@ function reconcile( // full key uniqueness check is dev-only, // key duplicates cause crushing only due to `matched` being empty if (matched.length === 0) { - var map = new Map(); - for (j = 0; j < length; j += 1) { - var k = get_key(array[j], j); - if (map.has(k)) { - /** @type {string|null} */ - var key_name = String(k); - if (key_name.startsWith('[object ')) key_name = null; - each_key_duplicate(String(j), String(map.get(k)), key_name); - } - map.set(k, j); - } + each_key_duplicate('', '', ''); } prev = start.prev; From 492b3018fd162d1cca76a1ebba4e4c3f2c25c2d7 Mon Sep 17 00:00:00 2001 From: 7nik Date: Fri, 12 Sep 2025 13:08:44 +0300 Subject: [PATCH 04/11] Update packages/svelte/src/internal/client/dom/blocks/each.js Co-authored-by: Rich Harris --- packages/svelte/src/internal/client/dom/blocks/each.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/svelte/src/internal/client/dom/blocks/each.js b/packages/svelte/src/internal/client/dom/blocks/each.js index cfeba2b8cb00..7b027ba50242 100644 --- a/packages/svelte/src/internal/client/dom/blocks/each.js +++ b/packages/svelte/src/internal/client/dom/blocks/each.js @@ -475,7 +475,7 @@ function reconcile( var j; // full key uniqueness check is dev-only, - // key duplicates cause crushing only due to `matched` being empty + // key duplicates cause crash only due to `matched` being empty if (matched.length === 0) { each_key_duplicate('', '', ''); } From e541296da4a8eae0fea0578550e5fcef48ee05f5 Mon Sep 17 00:00:00 2001 From: 7nik Date: Sat, 13 Sep 2025 15:05:16 +0300 Subject: [PATCH 05/11] fix: ensure keys are validated --- .../3-transform/client/visitors/EachBlock.js | 4 -- .../src/internal/client/dom/blocks/each.js | 6 +++ .../svelte/src/internal/client/validate.js | 38 ++++++++----------- 3 files changed, 21 insertions(+), 27 deletions(-) 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..39f61272fcb9 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 @@ -337,10 +337,6 @@ export function EachBlock(node, context) { const statements = [add_svelte_meta(b.call('$.each', ...args), node, 'each')]; - if (dev && node.metadata.keyed) { - statements.unshift(b.stmt(b.call('$.validate_each_keys', thunk, key_function))); - } - if (has_await) { context.state.init.push( b.stmt( diff --git a/packages/svelte/src/internal/client/dom/blocks/each.js b/packages/svelte/src/internal/client/dom/blocks/each.js index 7b027ba50242..3d8e7c88703e 100644 --- a/packages/svelte/src/internal/client/dom/blocks/each.js +++ b/packages/svelte/src/internal/client/dom/blocks/each.js @@ -43,6 +43,7 @@ import { DEV } from 'esm-env'; import { derived_safe_equal } from '../../reactivity/deriveds.js'; import { current_batch } from '../../reactivity/batch.js'; import { each_key_duplicate } from '../../errors.js'; +import { validate_each_keys } from '../../validate.js'; /** * The row of a keyed each block that is currently updating. We track this @@ -202,6 +203,11 @@ export function each(node, flags, get_collection, get_key, render_fn, fallback_f } was_empty = length === 0; + // skip if #each block isn't keyed + if (DEV && get_key !== index) { + validate_each_keys(array, get_key); + } + /** `true` if there was a hydration mismatch. Needs to be a `let` or else it isn't treeshaken out */ let mismatch = false; diff --git a/packages/svelte/src/internal/client/validate.js b/packages/svelte/src/internal/client/validate.js index ec3d80544787..7c8cf93fdce3 100644 --- a/packages/svelte/src/internal/client/validate.js +++ b/packages/svelte/src/internal/client/validate.js @@ -7,35 +7,27 @@ import * as w from './warnings.js'; import { capture_store_binding } from './reactivity/store.js'; /** - * @param {() => any} collection + * @param {Array} array * @param {(item: any, index: number) => string} key_fn * @returns {void} */ -export function validate_each_keys(collection, key_fn) { - render_effect(() => { - const keys = new Map(); - const maybe_array = collection(); - const array = is_array(maybe_array) - ? maybe_array - : maybe_array == null - ? [] - : Array.from(maybe_array); - const length = array.length; - for (let i = 0; i < length; i++) { - const key = key_fn(array[i], i); - if (keys.has(key)) { - const a = String(keys.get(key)); - const b = String(i); +export function validate_each_keys(array, key_fn) { + const keys = new Map(); + const length = array.length; + for (let i = 0; i < length; i++) { + const key = key_fn(array[i], i); + if (keys.has(key)) { + const a = String(keys.get(key)); + const b = String(i); - /** @type {string | null} */ - let k = String(key); - if (k.startsWith('[object ')) k = null; + /** @type {string | null} */ + let k = String(key); + if (k.startsWith('[object ')) k = null; - e.each_key_duplicate(a, b, k); - } - keys.set(key, i); + e.each_key_duplicate(a, b, k); } - }); + keys.set(key, i); + } } /** From c208ef00a0acfcf2d5b78f63bae41dcd50d7ac82 Mon Sep 17 00:00:00 2001 From: 7nik Date: Mon, 15 Sep 2025 00:11:48 +0300 Subject: [PATCH 06/11] fix silly test name --- .../_config.js | 0 .../main.svelte | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename packages/svelte/tests/runtime-legacy/samples/{keyed-each-dev-unique-prod => keyed-each-prod-unique}/_config.js (100%) rename packages/svelte/tests/runtime-legacy/samples/{keyed-each-dev-unique-prod => keyed-each-prod-unique}/main.svelte (100%) diff --git a/packages/svelte/tests/runtime-legacy/samples/keyed-each-dev-unique-prod/_config.js b/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique/_config.js similarity index 100% rename from packages/svelte/tests/runtime-legacy/samples/keyed-each-dev-unique-prod/_config.js rename to packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique/_config.js diff --git a/packages/svelte/tests/runtime-legacy/samples/keyed-each-dev-unique-prod/main.svelte b/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique/main.svelte similarity index 100% rename from packages/svelte/tests/runtime-legacy/samples/keyed-each-dev-unique-prod/main.svelte rename to packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique/main.svelte From cb89bb8a6b8569e4378587de901410abbbca2841 Mon Sep 17 00:00:00 2001 From: 7nik Date: Mon, 15 Sep 2025 00:12:20 +0300 Subject: [PATCH 07/11] fix: cover other case of duplicate keys --- .../svelte/src/internal/client/dom/blocks/each.js | 11 +++++++++++ .../samples/keyed-each-prod-unique-2/_config.js | 15 +++++++++++++++ .../samples/keyed-each-prod-unique-2/main.svelte | 8 ++++++++ 3 files changed, 34 insertions(+) create mode 100644 packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-2/_config.js create mode 100644 packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-2/main.svelte diff --git a/packages/svelte/src/internal/client/dom/blocks/each.js b/packages/svelte/src/internal/client/dom/blocks/each.js index 3d8e7c88703e..bdf3f717f21f 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 000000000000..4caa45fd3cf2 --- /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 000000000000..aedec8c57cba --- /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} From 89a3f0f453c12d635fd2af041884d8ece7d29573 Mon Sep 17 00:00:00 2001 From: 7nik Date: Mon, 15 Sep 2025 11:04:18 +0300 Subject: [PATCH 08/11] emit error on hydration --- packages/svelte/src/internal/client/dom/blocks/each.js | 2 ++ .../samples/keyed-each-prod-unique-3/_config.js | 8 ++++++++ .../samples/keyed-each-prod-unique-3/main.svelte | 7 +++++++ 3 files changed, 17 insertions(+) create mode 100644 packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-3/_config.js create mode 100644 packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-3/main.svelte diff --git a/packages/svelte/src/internal/client/dom/blocks/each.js b/packages/svelte/src/internal/client/dom/blocks/each.js index bdf3f717f21f..c6f485c9d3fb 100644 --- a/packages/svelte/src/internal/client/dom/blocks/each.js +++ b/packages/svelte/src/internal/client/dom/blocks/each.js @@ -273,6 +273,8 @@ export function each(node, flags, get_collection, get_key, render_fn, fallback_f if (hydrating) { if (length === 0 && fallback_fn) { fallback = branch(() => fallback_fn(anchor)); + } else if (length > state.items.size) { + each_key_duplicate('', '', ''); } } else { if (should_defer_append()) { diff --git a/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-3/_config.js b/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-3/_config.js new file mode 100644 index 000000000000..1f2add2a743c --- /dev/null +++ b/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-3/_config.js @@ -0,0 +1,8 @@ +import { test } from '../../test'; + +export default test({ + compileOptions: { + dev: false + }, + error: 'each_key_duplicate\nKeyed each block has duplicate key at indexes and ' +}); diff --git a/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-3/main.svelte b/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-3/main.svelte new file mode 100644 index 000000000000..a05781bcb950 --- /dev/null +++ b/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-3/main.svelte @@ -0,0 +1,7 @@ + + +{#each data as d (d)} + {d} +{/each} From 3100402574a731219a8e8b548e73f9a5b6e30e8b Mon Sep 17 00:00:00 2001 From: 7nik Date: Wed, 24 Sep 2025 14:13:08 +0300 Subject: [PATCH 09/11] ensure the error is handled --- .../src/internal/client/dom/blocks/each.js | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/packages/svelte/src/internal/client/dom/blocks/each.js b/packages/svelte/src/internal/client/dom/blocks/each.js index c6f485c9d3fb..73c10d4982e4 100644 --- a/packages/svelte/src/internal/client/dom/blocks/each.js +++ b/packages/svelte/src/internal/client/dom/blocks/each.js @@ -44,6 +44,7 @@ import { derived_safe_equal } from '../../reactivity/deriveds.js'; import { current_batch } from '../../reactivity/batch.js'; import { each_key_duplicate } from '../../errors.js'; import { validate_each_keys } from '../../validate.js'; +import { invoke_error_boundary } from '../../error-handling.js'; /** * The row of a keyed each block that is currently updating. We track this @@ -487,7 +488,14 @@ function reconcile( // full key uniqueness check is dev-only, // key duplicates cause crash only due to `matched` being empty if (matched.length === 0) { - each_key_duplicate('', '', ''); + // reconcile can be called in the batch's callbacks which are + // executed outside of the effect tree, so error are not caught + try { + each_key_duplicate('', '', ''); + } catch (error) { + invoke_error_boundary(error, each_effect); + return; + } } prev = start.prev; @@ -555,11 +563,17 @@ function reconcile( count += 1; } + // Full key uniqueness check is dev-only. If keys duplication didn't cause a crash, + // the rendered list will be shorter then the source array 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('', '', ''); + // reconcile can be called in the batch's callbacks which are + // executed outside of the effect tree, so error are not caught + try { + each_key_duplicate('', '', ''); + } catch (error) { + invoke_error_boundary(error, each_effect); + return; + } } if (current !== null || seen !== undefined) { From 65f77ef8409d6e8c91163f36853d36b05ec01ae8 Mon Sep 17 00:00:00 2001 From: 7nik Date: Wed, 24 Sep 2025 14:15:34 +0300 Subject: [PATCH 10/11] drop useless tests --- .../samples/keyed-each-prod-unique-2/_config.js | 15 --------------- .../samples/keyed-each-prod-unique-2/main.svelte | 8 -------- .../samples/keyed-each-prod-unique-3/_config.js | 8 -------- .../samples/keyed-each-prod-unique-3/main.svelte | 7 ------- .../samples/keyed-each-prod-unique/_config.js | 12 ------------ .../samples/keyed-each-prod-unique/main.svelte | 8 -------- 6 files changed, 58 deletions(-) delete mode 100644 packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-2/_config.js delete mode 100644 packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-2/main.svelte delete mode 100644 packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-3/_config.js delete mode 100644 packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-3/main.svelte delete mode 100644 packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique/_config.js delete mode 100644 packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique/main.svelte 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 deleted file mode 100644 index 4caa45fd3cf2..000000000000 --- a/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-2/_config.js +++ /dev/null @@ -1,15 +0,0 @@ -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 deleted file mode 100644 index aedec8c57cba..000000000000 --- a/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-2/main.svelte +++ /dev/null @@ -1,8 +0,0 @@ - - - -{#each data as d (d)} - {d} -{/each} diff --git a/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-3/_config.js b/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-3/_config.js deleted file mode 100644 index 1f2add2a743c..000000000000 --- a/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-3/_config.js +++ /dev/null @@ -1,8 +0,0 @@ -import { test } from '../../test'; - -export default test({ - compileOptions: { - dev: false - }, - error: 'each_key_duplicate\nKeyed each block has duplicate key at indexes and ' -}); diff --git a/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-3/main.svelte b/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-3/main.svelte deleted file mode 100644 index a05781bcb950..000000000000 --- a/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique-3/main.svelte +++ /dev/null @@ -1,7 +0,0 @@ - - -{#each data as d (d)} - {d} -{/each} diff --git a/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique/_config.js b/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique/_config.js deleted file mode 100644 index 2ad5c1b3efc0..000000000000 --- a/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique/_config.js +++ /dev/null @@ -1,12 +0,0 @@ -import { flushSync } from 'svelte'; -import { test } from '../../test'; - -export default test({ - 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/main.svelte b/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique/main.svelte deleted file mode 100644 index 38acbdee7804..000000000000 --- a/packages/svelte/tests/runtime-legacy/samples/keyed-each-prod-unique/main.svelte +++ /dev/null @@ -1,8 +0,0 @@ - - - -{#each data as d (d)} - {d} -{/each} From ba5020637d5b8b2f0ca9f831ef0daca4f82474ae Mon Sep 17 00:00:00 2001 From: 7nik Date: Wed, 24 Sep 2025 14:16:21 +0300 Subject: [PATCH 11/11] unused --- packages/svelte/src/internal/client/validate.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/svelte/src/internal/client/validate.js b/packages/svelte/src/internal/client/validate.js index 7c8cf93fdce3..2e4374065436 100644 --- a/packages/svelte/src/internal/client/validate.js +++ b/packages/svelte/src/internal/client/validate.js @@ -1,5 +1,4 @@ import { dev_current_component_function } from './context.js'; -import { is_array } from '../shared/utils.js'; import * as e from './errors.js'; import { FILENAME } from '../../constants.js'; import { render_effect } from './reactivity/effects.js';