196 lines
5.9 KiB
JavaScript
196 lines
5.9 KiB
JavaScript
"use strict";
|
|
var clone = function() {
|
|
function _instanceof(obj, type) {
|
|
return type != null && obj instanceof type;
|
|
}
|
|
var nativeMap;
|
|
try {
|
|
nativeMap = Map;
|
|
} catch (_) {
|
|
nativeMap = function() {
|
|
};
|
|
}
|
|
var nativeSet;
|
|
try {
|
|
nativeSet = Set;
|
|
} catch (_) {
|
|
nativeSet = function() {
|
|
};
|
|
}
|
|
var nativePromise;
|
|
try {
|
|
nativePromise = Promise;
|
|
} catch (_) {
|
|
nativePromise = function() {
|
|
};
|
|
}
|
|
function clone2(parent, circular, depth, prototype, includeNonEnumerable) {
|
|
if (typeof circular === "object") {
|
|
depth = circular.depth;
|
|
prototype = circular.prototype;
|
|
includeNonEnumerable = circular.includeNonEnumerable;
|
|
circular = circular.circular;
|
|
}
|
|
var allParents = [];
|
|
var allChildren = [];
|
|
var useBuffer = typeof Buffer != "undefined";
|
|
if (typeof circular == "undefined")
|
|
circular = true;
|
|
if (typeof depth == "undefined")
|
|
depth = Infinity;
|
|
function _clone(parent2, depth2) {
|
|
if (parent2 === null)
|
|
return null;
|
|
if (depth2 === 0)
|
|
return parent2;
|
|
var child;
|
|
var proto;
|
|
if (typeof parent2 != "object") {
|
|
return parent2;
|
|
}
|
|
if (_instanceof(parent2, nativeMap)) {
|
|
child = new nativeMap();
|
|
} else if (_instanceof(parent2, nativeSet)) {
|
|
child = new nativeSet();
|
|
} else if (_instanceof(parent2, nativePromise)) {
|
|
child = new nativePromise(function(resolve, reject) {
|
|
parent2.then(function(value) {
|
|
resolve(_clone(value, depth2 - 1));
|
|
}, function(err) {
|
|
reject(_clone(err, depth2 - 1));
|
|
});
|
|
});
|
|
} else if (clone2.__isArray(parent2)) {
|
|
child = [];
|
|
} else if (clone2.__isRegExp(parent2)) {
|
|
child = new RegExp(parent2.source, __getRegExpFlags(parent2));
|
|
if (parent2.lastIndex)
|
|
child.lastIndex = parent2.lastIndex;
|
|
} else if (clone2.__isDate(parent2)) {
|
|
child = new Date(parent2.getTime());
|
|
} else if (useBuffer && Buffer.isBuffer(parent2)) {
|
|
if (Buffer.from) {
|
|
child = Buffer.from(parent2);
|
|
} else {
|
|
child = new Buffer(parent2.length);
|
|
parent2.copy(child);
|
|
}
|
|
return child;
|
|
} else if (_instanceof(parent2, Error)) {
|
|
child = Object.create(parent2);
|
|
} else {
|
|
if (typeof prototype == "undefined") {
|
|
proto = Object.getPrototypeOf(parent2);
|
|
child = Object.create(proto);
|
|
} else {
|
|
child = Object.create(prototype);
|
|
proto = prototype;
|
|
}
|
|
}
|
|
if (circular) {
|
|
var index = allParents.indexOf(parent2);
|
|
if (index != -1) {
|
|
return allChildren[index];
|
|
}
|
|
allParents.push(parent2);
|
|
allChildren.push(child);
|
|
}
|
|
if (_instanceof(parent2, nativeMap)) {
|
|
parent2.forEach(function(value, key) {
|
|
var keyChild = _clone(key, depth2 - 1);
|
|
var valueChild = _clone(value, depth2 - 1);
|
|
child.set(keyChild, valueChild);
|
|
});
|
|
}
|
|
if (_instanceof(parent2, nativeSet)) {
|
|
parent2.forEach(function(value) {
|
|
var entryChild = _clone(value, depth2 - 1);
|
|
child.add(entryChild);
|
|
});
|
|
}
|
|
for (var i in parent2) {
|
|
var attrs = Object.getOwnPropertyDescriptor(parent2, i);
|
|
if (attrs) {
|
|
child[i] = _clone(parent2[i], depth2 - 1);
|
|
}
|
|
try {
|
|
var objProperty = Object.getOwnPropertyDescriptor(parent2, i);
|
|
if (objProperty.set === "undefined") {
|
|
continue;
|
|
}
|
|
child[i] = _clone(parent2[i], depth2 - 1);
|
|
} catch (e) {
|
|
if (e instanceof TypeError) {
|
|
continue;
|
|
} else if (e instanceof ReferenceError) {
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
if (Object.getOwnPropertySymbols) {
|
|
var symbols = Object.getOwnPropertySymbols(parent2);
|
|
for (var i = 0; i < symbols.length; i++) {
|
|
var symbol = symbols[i];
|
|
var descriptor = Object.getOwnPropertyDescriptor(parent2, symbol);
|
|
if (descriptor && !descriptor.enumerable && !includeNonEnumerable) {
|
|
continue;
|
|
}
|
|
child[symbol] = _clone(parent2[symbol], depth2 - 1);
|
|
Object.defineProperty(child, symbol, descriptor);
|
|
}
|
|
}
|
|
if (includeNonEnumerable) {
|
|
var allPropertyNames = Object.getOwnPropertyNames(parent2);
|
|
for (var i = 0; i < allPropertyNames.length; i++) {
|
|
var propertyName = allPropertyNames[i];
|
|
var descriptor = Object.getOwnPropertyDescriptor(parent2, propertyName);
|
|
if (descriptor && descriptor.enumerable) {
|
|
continue;
|
|
}
|
|
child[propertyName] = _clone(parent2[propertyName], depth2 - 1);
|
|
Object.defineProperty(child, propertyName, descriptor);
|
|
}
|
|
}
|
|
return child;
|
|
}
|
|
return _clone(parent, depth);
|
|
}
|
|
clone2.clonePrototype = function clonePrototype(parent) {
|
|
if (parent === null)
|
|
return null;
|
|
var c = function() {
|
|
};
|
|
c.prototype = parent;
|
|
return new c();
|
|
};
|
|
function __objToStr(o) {
|
|
return Object.prototype.toString.call(o);
|
|
}
|
|
clone2.__objToStr = __objToStr;
|
|
function __isDate(o) {
|
|
return typeof o === "object" && __objToStr(o) === "[object Date]";
|
|
}
|
|
clone2.__isDate = __isDate;
|
|
function __isArray(o) {
|
|
return typeof o === "object" && __objToStr(o) === "[object Array]";
|
|
}
|
|
clone2.__isArray = __isArray;
|
|
function __isRegExp(o) {
|
|
return typeof o === "object" && __objToStr(o) === "[object RegExp]";
|
|
}
|
|
clone2.__isRegExp = __isRegExp;
|
|
function __getRegExpFlags(re) {
|
|
var flags = "";
|
|
if (re.global)
|
|
flags += "g";
|
|
if (re.ignoreCase)
|
|
flags += "i";
|
|
if (re.multiline)
|
|
flags += "m";
|
|
return flags;
|
|
}
|
|
clone2.__getRegExpFlags = __getRegExpFlags;
|
|
return clone2;
|
|
}();
|
|
exports.clone = clone;
|