mutative
Version:
A JavaScript library for efficient immutable updates
63 lines (59 loc) • 1.21 kB
text/typescript
import { Options } from './interface';
import { isDraftable } from './utils';
let readable = false;
export const checkReadable = (
value: any,
options: Options<any, any>,
ignoreCheckDraftable = false
) => {
if (
typeof value === 'object' &&
value !== null &&
(!isDraftable(value, options) || ignoreCheckDraftable) &&
!readable
) {
throw new Error(
`Strict mode: Mutable data cannot be accessed directly, please use 'unsafe(callback)' wrap.`
);
}
};
/**
* `unsafe(callback)` to access mutable data directly in strict mode.
*
* ## Example
*
* ```ts
* import { create, unsafe } from '../index';
*
* class Foobar {
* bar = 1;
* }
*
* const baseState = { foobar: new Foobar() };
* const state = create(
* baseState,
* (draft) => {
* unsafe(() => {
* draft.foobar.bar = 2;
* });
* },
* {
* strict: true,
* }
* );
*
* expect(state).toBe(baseState);
* expect(state.foobar).toBe(baseState.foobar);
* expect(state.foobar.bar).toBe(2);
* ```
*/
export function unsafe<T>(callback: () => T): T {
readable = true;
let result: T;
try {
result = callback();
} finally {
readable = false;
}
return result;
}