UNPKG

@tanzanite/deep-lock

Version:

Deep freeze, seal or preventExtensions typescript helper function

31 lines 1.21 kB
// 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