UNPKG

data-guardian

Version:

Tiny, zero-dependencies, package which tries to mask sensitive data in arbitrary collections, errors, objects and strings.

83 lines 2.92 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isNumber = exports.isNullish = exports.isString = exports.isObject = exports.deepClone = exports.hasCircularReference = void 0; function hasCircularReference(item) { const seenObjects = new WeakSet(); function detect(obj) { if (typeof obj !== 'object' || obj === null) { return false; } if (seenObjects.has(obj)) { return true; } seenObjects.add(obj); for (const key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { if (detect(obj[key])) { return true; } } } // No need to delete the object from seenObjects since it's now a WeakSet return false; } return detect(item); } exports.hasCircularReference = hasCircularReference; function deepClone(obj, visited = new WeakMap()) { if (obj === null || typeof obj !== 'object') { return obj; } // Check for circular references if (visited.has(obj)) { return visited.get(obj); } if (obj instanceof Date) { return new Date(obj.getTime()); } if (Array.isArray(obj)) { const arrCopy = []; // Store reference to new array visited.set(obj, arrCopy); arrCopy.push(...obj.map(item => deepClone(item, visited))); return arrCopy; } if (obj instanceof Object) { // Get the prototype of the object const proto = Object.getPrototypeOf(obj); // Create a new object with the same prototype const objCopy = Object.create(proto); // Store reference to new object visited.set(obj, objCopy); // Iterate over all keys, including inherited ones const allKeys = [...Object.getOwnPropertyNames(obj), ...Object.getOwnPropertySymbols(obj)]; allKeys.forEach(key => { const descriptor = Object.getOwnPropertyDescriptor(obj, key); if (descriptor && typeof descriptor.value === 'object' && descriptor.value !== null) { // If the value is an object, deep clone it descriptor.value = deepClone(descriptor.value, visited); } // Define the property on the new object Object.defineProperty(objCopy, key, descriptor); }); return objCopy; } } exports.deepClone = deepClone; function isObject(item) { return item && typeof item === 'object' && !Array.isArray(item); } exports.isObject = isObject; function isString(value) { return typeof value === 'string'; } exports.isString = isString; function isNullish(value) { return value === undefined || value === null; } exports.isNullish = isNullish; function isNumber(value) { return typeof value === 'number'; } exports.isNumber = isNumber; //# sourceMappingURL=helpers.js.map