diff --git a/.changeset/clean-bobcats-fail.md b/.changeset/clean-bobcats-fail.md new file mode 100644 index 0000000000..00d8286bcb --- /dev/null +++ b/.changeset/clean-bobcats-fail.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: ensure $state.snapshot clones holey arrays correctly diff --git a/packages/svelte/src/internal/shared/clone.js b/packages/svelte/src/internal/shared/clone.js index cef14bc14f..a388ea10fa 100644 --- a/packages/svelte/src/internal/shared/clone.js +++ b/packages/svelte/src/internal/shared/clone.js @@ -61,7 +61,7 @@ function clone(value, cloned, path, paths, original = null) { if (value instanceof Set) return /** @type {Snapshot} */ (new Set(value)); if (is_array(value)) { - const copy = /** @type {Snapshot} */ ([]); + const copy = /** @type {Snapshot} */ (Array(value.length)); cloned.set(value, copy); if (original !== null) { @@ -69,7 +69,9 @@ function clone(value, cloned, path, paths, original = null) { } for (let i = 0; i < value.length; i += 1) { - copy.push(clone(value[i], cloned, DEV ? `${path}[${i}]` : path, paths)); + if (value[i] !== undefined) { + copy[i] = clone(value[i], cloned, DEV ? `${path}[${i}]` : path, paths); + } } return copy; diff --git a/packages/svelte/tests/runtime-runes/samples/state-snapshot-array-holes/_config.js b/packages/svelte/tests/runtime-runes/samples/state-snapshot-array-holes/_config.js new file mode 100644 index 0000000000..707c92118b --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/state-snapshot-array-holes/_config.js @@ -0,0 +1,5 @@ +import { test } from '../../test'; + +export default test({ + html: `
false
true
` +}); diff --git a/packages/svelte/tests/runtime-runes/samples/state-snapshot-array-holes/main.svelte b/packages/svelte/tests/runtime-runes/samples/state-snapshot-array-holes/main.svelte new file mode 100644 index 0000000000..cb5c116f37 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/state-snapshot-array-holes/main.svelte @@ -0,0 +1,10 @@ + + +
{2 in $state.snapshot(state)}
+
{5 in $state.snapshot(state)}