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
JavaScript
;
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