From 237196a5570cfc4c24082b8159f5848ea5e22cf1 Mon Sep 17 00:00:00 2001 From: visciang Date: Fri, 19 Jun 2020 22:03:09 +0200 Subject: [PATCH 1/3] Update base.js --- __tests__/base.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/__tests__/base.js b/__tests__/base.js index 3382ffa5..1051ef0c 100644 --- a/__tests__/base.js +++ b/__tests__/base.js @@ -465,7 +465,7 @@ function runBaseTest(name, useProxies, autoFreeze, useListener) { it("can assign by key", () => { const nextState = produce(baseState, s => { - // Map.prototype.set should return the Map itself + // Map.prototype.set should return the Map itself const res = s.aMap.set("force", true) if (!global.USES_BUILD) expect(res).toBe(s.aMap[DRAFT_STATE].draft_) }) @@ -474,6 +474,23 @@ function runBaseTest(name, useProxies, autoFreeze, useListener) { expect(nextState.aMap.get("force")).toEqual(true) }) + it("KO ==> new key with value=undefine", () => { + const nextState = produce(baseState, s => { + // let res = s.aMap.set("new_key", 1) + + s.aMap.set("new_key", undefined) + }) + expect(nextState.aMap.has("new_key")).toBe(true) + }) + + it("OK ==> new key with value=undefine", () => { + const nextState = produce(baseState, s => { + s.aMap.set("new_key", 1) + s.aMap.set("new_key", undefined) + }) + expect(nextState.aMap.has("new_key")).toBe(true) + }) + it("can assign by a non-primitive key", () => { const key = {prop: "val"} const value = {id: 1, a: 1} From 15e221f330f1ea03837627e3300a360f649b387a Mon Sep 17 00:00:00 2001 From: visciang Date: Fri, 19 Jun 2020 22:05:58 +0200 Subject: [PATCH 2/3] Update base.js --- __tests__/base.js | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/__tests__/base.js b/__tests__/base.js index 1051ef0c..1398b274 100644 --- a/__tests__/base.js +++ b/__tests__/base.js @@ -465,7 +465,7 @@ function runBaseTest(name, useProxies, autoFreeze, useListener) { it("can assign by key", () => { const nextState = produce(baseState, s => { - // Map.prototype.set should return the Map itself + // Map.prototype.set should return the Map itself const res = s.aMap.set("force", true) if (!global.USES_BUILD) expect(res).toBe(s.aMap[DRAFT_STATE].draft_) }) @@ -474,22 +474,20 @@ function runBaseTest(name, useProxies, autoFreeze, useListener) { expect(nextState.aMap.get("force")).toEqual(true) }) - it("KO ==> new key with value=undefine", () => { + it("KO ==> new key with value=undefine", () => { const nextState = produce(baseState, s => { - // let res = s.aMap.set("new_key", 1) - - s.aMap.set("new_key", undefined) + s.aMap.set("new_key", undefined) }) expect(nextState.aMap.has("new_key")).toBe(true) - }) + }) - it("OK ==> new key with value=undefine", () => { + it("OK ==> new key with value=undefine", () => { const nextState = produce(baseState, s => { - s.aMap.set("new_key", 1) - s.aMap.set("new_key", undefined) + s.aMap.set("new_key", 1) + s.aMap.set("new_key", undefined) }) expect(nextState.aMap.has("new_key")).toBe(true) - }) + }) it("can assign by a non-primitive key", () => { const key = {prop: "val"} From 90978bcea0c69ec002622689f72167a72e910963 Mon Sep 17 00:00:00 2001 From: Giovanni Visciano Date: Mon, 22 Jun 2020 14:20:13 +0200 Subject: [PATCH 3/3] #627 - new map key with value=undefined --- __tests__/base.js | 15 --------------- __tests__/map-set.js | 9 +++++++++ src/plugins/mapset.ts | 2 +- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/__tests__/base.js b/__tests__/base.js index 1398b274..3382ffa5 100644 --- a/__tests__/base.js +++ b/__tests__/base.js @@ -474,21 +474,6 @@ function runBaseTest(name, useProxies, autoFreeze, useListener) { expect(nextState.aMap.get("force")).toEqual(true) }) - it("KO ==> new key with value=undefine", () => { - const nextState = produce(baseState, s => { - s.aMap.set("new_key", undefined) - }) - expect(nextState.aMap.has("new_key")).toBe(true) - }) - - it("OK ==> new key with value=undefine", () => { - const nextState = produce(baseState, s => { - s.aMap.set("new_key", 1) - s.aMap.set("new_key", undefined) - }) - expect(nextState.aMap.has("new_key")).toBe(true) - }) - it("can assign by a non-primitive key", () => { const key = {prop: "val"} const value = {id: 1, a: 1} diff --git a/__tests__/map-set.js b/__tests__/map-set.js index 7ba25927..faa46803 100644 --- a/__tests__/map-set.js +++ b/__tests__/map-set.js @@ -235,5 +235,14 @@ function runBaseTest(name, useProxies, autoFreeze, useListener) { }) expect(Array.from(set).sort()).toEqual([1, 2, 3]) }) + + test("#627 - new map key with value=undefined", () => { + const map = new Map() + const map1 = produce(map, draft => { + draft.set("key", undefined) + }) + expect(map1.has("key")).toBe(true) + expect(map1.get("key")).toBe(undefined) + }) }) } diff --git a/src/plugins/mapset.ts b/src/plugins/mapset.ts index 8e5b111c..8bb2d096 100644 --- a/src/plugins/mapset.ts +++ b/src/plugins/mapset.ts @@ -80,7 +80,7 @@ export function enableMapSet() { p.set = function(key: any, value: any) { const state: MapState = this[DRAFT_STATE] assertUnrevoked(state) - if (latest(state).get(key) !== value) { + if (!latest(state).has(key) || latest(state).get(key) !== value) { prepareMapCopy(state) markChanged(state) state.assigned_!.set(key, true)