UNPKG

circular-reference-remover

Version:

Removes the inner circular references from objects

59 lines (58 loc) 2.13 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.removeSync = exports.remove = void 0; function remove(src, options) { if (undefined === src) return Promise.resolve(undefined); else if (null === src) return Promise.resolve(null); return new Promise((res) => { setTimeout(() => { res(referenceRemover(src, options)); }, 0); }); } exports.remove = remove; function removeSync(src, options) { if (undefined === src) return undefined; else if (null === src) return null; return referenceRemover(src, options); } exports.removeSync = removeSync; function referenceRemover(src, options) { const weakReferenceValue = new WeakRef(options && options.setUndefined ? { value: undefined } : { value: null }); function internalRemover(target, src, references) { for (const key in src) { const srcValue = src[key]; if ('object' !== typeof srcValue) { target[key] = srcValue; continue; } else { let referenceFound = false; for (const reference of references) { if (reference === srcValue) { target[key] = weakReferenceValue.deref().value; referenceFound = true; break; } } if (!referenceFound) { if (srcValue instanceof Map) { const entries = Array.from(srcValue); target[key] = entries; internalRemover(entries, entries, [...references, entries]); } else { target[key] = Object.assign({}, srcValue); internalRemover(target[key], srcValue, [...references, srcValue]); } } } } return target; } return internalRemover({}, src, [src]); }