From 0a7de87eb5ef0e825145c82d20e70984ee71dada Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Mon, 3 Jun 2024 11:04:58 +0100 Subject: [PATCH] fix: address map reactivity regression (#11882) --- .changeset/lovely-zebras-own.md | 5 +++++ packages/svelte/src/reactivity/map.js | 11 ++++++++-- packages/svelte/src/reactivity/map.test.ts | 25 +++++++++++++++++++++- 3 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 .changeset/lovely-zebras-own.md diff --git a/.changeset/lovely-zebras-own.md b/.changeset/lovely-zebras-own.md new file mode 100644 index 0000000000..e41c6dcb9e --- /dev/null +++ b/.changeset/lovely-zebras-own.md @@ -0,0 +1,5 @@ +--- +"svelte": patch +--- + +fix: address map reactivity regression diff --git a/packages/svelte/src/reactivity/map.js b/packages/svelte/src/reactivity/map.js index ece3d1845d..400f607083 100644 --- a/packages/svelte/src/reactivity/map.js +++ b/packages/svelte/src/reactivity/map.js @@ -140,18 +140,25 @@ export class ReactiveMap extends Map { super.clear(); } + #read_all() { + get(this.#version); + for (var [, s] of this.#sources) { + get(s); + } + } + keys() { get(this.#version); return super.keys(); } values() { - get(this.#version); + this.#read_all(); return super.values(); } entries() { - get(this.#version); + this.#read_all(); return super.entries(); } diff --git a/packages/svelte/src/reactivity/map.test.ts b/packages/svelte/src/reactivity/map.test.ts index 3cdba4bb38..6dda7bf802 100644 --- a/packages/svelte/src/reactivity/map.test.ts +++ b/packages/svelte/src/reactivity/map.test.ts @@ -36,7 +36,30 @@ test('map.values()', () => { map.clear(); }); - assert.deepEqual(log, [5, true, [1, 2, 3, 4, 5], 4, false, [1, 2, 4, 5], 0, false, []]); + flushSync(() => { + map.set(3, 3); + }); + + flushSync(() => { + map.set(3, 4); + }); + + assert.deepEqual(log, [ + 5, + true, + [1, 2, 3, 4, 5], + 4, + false, + [1, 2, 4, 5], + 0, + false, + [], + 1, + true, + [3], + true, + [4] + ]); cleanup(); });