UNPKG

deep-copy-all

Version:
1 lines 1.65 kB
"use strict";const[isPrimitive,objectType,objectActions]=require("./dca-library.js"),defaultOpts={goDeep:!0,includeNonEnumerable:!1,detectCircular:!0,maxDepth:20};function setMissingOptions(e){Object.keys(defaultOpts).forEach(t=>{void 0===e[t]&&(e[t]=defaultOpts[t])})}class Watcher{constructor(){this._seenMap=new WeakMap}setAsCopied(e,t){e instanceof Object&&this._seenMap.set(e,t)}wasCopied(e){return e instanceof Object&&this._seenMap.has(e)}getCopy(e){return this._seenMap.get(e)}}function copyElement(e,t,c){const{options:o,watcher:s}=c;let n;return t.mayDeepCopy?(n=t.makeEmpty(e),o.detectCircular&&s.setAsCopied(e,n)):n=t.makeShallow(e),n}function checkForExceededDepth(e,t){if(e>=t)throw`Error max depth of ${t} levels exceeded, possible circular reference`}const copyObjectContents=(e,t,c)=>{const{destObject:o,srcType:s,watcher:n,options:r}=t,p=r.detectCircular;checkForExceededDepth(++c,r.maxDepth);const i=objectActions(s);if(!i.mayDeepCopy)return;const a=i.addElement;i.iterate(e,r.includeNonEnumerable,e=>{const t=e.value,s=e.type,i=objectActions(s);let d,l=!1;p&&n.wasCopied(t)?(d=n.getCopy(t),l=!0):d=copyElement(t,i,{options:r,watcher:n}),a(o,e.key,d,e.descriptor),i.mayDeepCopy&&!l&&copyObjectContents(t,{destObject:d,srcType:s,watcher:n,options:r},c)})};function deepCopy(e,t=defaultOpts){if(setMissingOptions(t),isPrimitive(e))return e;const c=objectType(e),o=objectActions(c);if(!t.goDeep||!o.mayDeepCopy)return o.makeShallow(e);const s=t.detectCircular?new Watcher:null;let n=o.makeEmpty(e);return t.detectCircular&&s.setAsCopied(e,n),copyObjectContents(e,{destObject:n,srcType:c,watcher:s,options:t},0),n}module.exports=deepCopy;