diff --git a/__tests__/base.js b/__tests__/base.js index 8a856bc8..96c3e1a1 100644 --- a/__tests__/base.js +++ b/__tests__/base.js @@ -1,5 +1,5 @@ "use strict" -import produce, {setAutoFreeze, setUseProxies, nothing} from "../src/immer" +import produce, {setAutoFreeze, setUseProxies, nothing, isDraft} from "../src/immer" import deepFreeze from "deep-freeze" import cloneDeep from "lodash.clonedeep" import * as lodash from "lodash" @@ -1311,6 +1311,40 @@ function runBaseTest(name, useProxies, freeze, useListener) { return freeze ? deepFreeze(data) : data } }) + + describe(`isDraft - ${name}`, () => { + beforeAll(() => { + setAutoFreeze(freeze) + setUseProxies(useProxies) + }) + + it('returns true for object drafts', () => { + produce({}, state => { + expect(isDraft(state)).toBeTruthy() + }) + }) + it('returns true for array drafts', () => { + produce([], state => { + expect(isDraft(state)).toBeTruthy() + }) + }) + it('returns true for objects nested in object drafts', () => { + produce({ a: { b: {} } }, state => { + expect(isDraft(state.a)).toBeTruthy() + expect(isDraft(state.a.b)).toBeTruthy() + }) + }) + it('returns false for new objects added to a draft', () => { + produce({}, state => { + state.a = {} + expect(isDraft(state.a)).toBeFalsy() + }) + }) + it('returns false for a returned draft', () => { + const result = produce({}, state => state) + expect(isDraft(result)).toBeFalsy() + }) + }) } function enumerableOnly(x) { diff --git a/src/immer.d.ts b/src/immer.d.ts index 72495d78..9705c8e4 100644 --- a/src/immer.d.ts +++ b/src/immer.d.ts @@ -132,3 +132,5 @@ export function setUseProxies(useProxies: boolean): void export function applyPatches(state: S, patches: Patch[]): S export function original(value: T): T | void + +export function isDraft(value: any): boolean diff --git a/src/immer.js b/src/immer.js index fcbb4686..458476a1 100644 --- a/src/immer.js +++ b/src/immer.js @@ -1,4 +1,4 @@ -export {setAutoFreeze, setUseProxies, original} from "./common" +export {setAutoFreeze, setUseProxies, original, isProxy as isDraft} from "./common" import {applyPatches as applyPatchesImpl} from "./patches" import {isProxyable, getUseProxies, NOTHING} from "./common" diff --git a/src/immer.js.flow b/src/immer.js.flow index 5702f2b3..73018431 100644 --- a/src/immer.js.flow +++ b/src/immer.js.flow @@ -87,4 +87,6 @@ declare export function setUseProxies(useProxies: boolean): void declare export function applyPatches(state: S, patches: Patch[]): S -declare export function original(value: S): ?S \ No newline at end of file +declare export function original(value: S): ?S + +declare export function isDraft(value: any): boolean