@tanzanite/deep-lock
Version:
Deep freeze, seal or preventExtensions typescript helper function
33 lines • 2.09 kB
TypeScript
declare type Primitive = string | number | boolean | bigint | symbol | undefined | null;
declare type Builtin = Primitive | Function | Date | Error | RegExp;
declare type IsAny<T> = 0 extends 1 & T ? true : false;
declare type IsUnknown<T> = IsAny<T> extends true ? false : unknown extends T ? true : false;
declare type DeepReadonly<T> = T extends Builtin ? T : T extends Map<infer K, infer V> ? ReadonlyMap<DeepReadonly<K>, DeepReadonly<V>> : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<DeepReadonly<K>, DeepReadonly<V>> : T extends WeakMap<infer K, infer V> ? WeakMap<DeepReadonly<K>, DeepReadonly<V>> : T extends Set<infer U> ? ReadonlySet<DeepReadonly<U>> : T extends ReadonlySet<infer U> ? ReadonlySet<DeepReadonly<U>> : T extends WeakSet<infer U> ? WeakSet<DeepReadonly<U>> : T extends Promise<infer U> ? Promise<DeepReadonly<U>> : T extends {} ? {
readonly [K in keyof T]: DeepReadonly<T[K]>;
} : IsUnknown<T> extends true ? unknown : Readonly<T>;
declare type Actions = 'freeze' | 'seal' | 'preventExtensions';
/**
* Recursively apply provided options operations on object
* and all of the object properties that are either object or function.
*
* By default freezes object.
*
* @param obj - The object to which will be applied `freeze`, `seal` or `preventExtensions`
* @param options default `{ action: 'freeze' }`
* @param options.action
* ```
* | action | Add | Modify | Delete | Reconfigure |
* | ----------------- | --- | ------ | ------ | ----------- |
* | preventExtensions | - | + | + | + |
* | seal | - | + | - | - |
* | freeze | - | - | - | - |
* ```
*
* @returns {Object} Initial object with applied options action
*/
export declare function deepLock<T extends Record<any, any>>(obj: T): DeepReadonly<T>;
export declare function deepLock<T extends Record<any, any>, Action extends Actions>(obj: T, options: {
action?: Action;
}): 'freeze' extends Action ? DeepReadonly<T> : T;
export default deepLock;
//# sourceMappingURL=index.d.ts.map