From 974bd7062b06b2d4c94a84b9c0210f7c89d47ef2 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Thu, 21 May 2020 11:16:06 +0100 Subject: [PATCH] fix: Object.isFrozen dies on non objects in Internet Explorer. Fixes #600 --- src/core/finalize.ts | 5 +++-- src/utils/common.ts | 8 +++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/core/finalize.ts b/src/core/finalize.ts index f4ee8b77..200b264f 100644 --- a/src/core/finalize.ts +++ b/src/core/finalize.ts @@ -19,7 +19,8 @@ import { ProxyTypeSet, getPlugin, die, - revokeScope + revokeScope, + isFrozen } from "../internal" export function processResult(result: any, scope: ImmerScope) { @@ -59,7 +60,7 @@ export function processResult(result: any, scope: ImmerScope) { function finalize(rootScope: ImmerScope, value: any, path?: PatchPath) { // Don't recurse in tho recursive data structures - if (Object.isFrozen(value)) return value + if (isFrozen(value)) return value const state: ImmerState = value[DRAFT_STATE] // A plain object, might need freezing, might contain drafts diff --git a/src/utils/common.ts b/src/utils/common.ts index 53a9fe74..fa1ea8a5 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -176,7 +176,7 @@ export function shallowCopy(base: any, invokeGetters = false) { } export function freeze(obj: any, deep: boolean): void { - if (isDraft(obj) || Object.isFrozen(obj) || !isDraftable(obj)) return + if (isDraft(obj) || isFrozen(obj) || !isDraftable(obj)) return if (getArchtype(obj) > 1 /* Map or Set */) { obj.set = obj.add = obj.clear = obj.delete = dontMutateFrozenCollections as any } @@ -187,3 +187,9 @@ export function freeze(obj: any, deep: boolean): void { function dontMutateFrozenCollections() { die(2) } + +export function isFrozen(obj: any): boolean { + if (obj == null || typeof obj !== "object") return true + // See #600, IE dies on non-objects in Object.isFrozen + return Object.isFrozen(obj) +}