@tanzanite/deep-lock
Version:
Deep freeze, seal or preventExtensions typescript helper function
31 lines • 1.21 kB
JavaScript
// types from https://github.com/krzkaczor/ts-essentials
export function deepLock(obj, options) {
const { action = 'freeze' } = options ?? {};
if (!['freeze', 'seal', 'preventExtensions', 'preventExtensions'].includes(action)) {
throw new TypeError(`Invalid action: ${action}`);
}
return lock(obj, action);
}
function lock(obj, action, locked = new Set()) {
if (locked.has(obj))
return obj; // Prevent circular reference
// @ts-ignore incompatible type signatures
Object[action](obj);
locked.add(obj);
// In strict mode obj.caller and obj.arguments are non-deletable properties which throw when set or retrieved
if (obj === Function.prototype)
return obj;
const keys = Object.getOwnPropertyNames(obj);
keys.push(...Object.getOwnPropertySymbols(obj));
keys.forEach((prop) => {
if (Object.hasOwnProperty.call(obj, prop) &&
obj[prop] !== null &&
(typeof obj[prop] === 'object' || typeof obj[prop] === 'function') &&
!ArrayBuffer.isView(obj[prop])) {
lock(obj[prop], action, locked);
}
});
return obj;
}
export default deepLock;
//# sourceMappingURL=index.js.map