@storm-stack/utilities
Version:
This package includes various base utility class and various functions to assist in the development process.
88 lines (87 loc) • 2.37 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.deepClone = deepClone;
var _types = require("@storm-stack/types");
function deepClone(obj) {
if ((0, _types.isPrimitive)(obj)) {
return obj;
}
if (Array.isArray(obj)) {
return obj.map(item => deepClone(item));
}
if (obj instanceof Date) {
return new Date(obj.getTime());
}
if (obj instanceof RegExp) {
return new RegExp(obj.source, obj.flags);
}
if (obj instanceof Map) {
const result = /* @__PURE__ */new Map();
for (const [key, value] of obj.entries()) {
result.set(key, deepClone(value));
}
return result;
}
if (obj instanceof Set) {
const result = /* @__PURE__ */new Set();
for (const value of obj.values()) {
result.add(deepClone(value));
}
return result;
}
if ((0, _types.isTypedArray)(obj)) {
const result = new (Object.getPrototypeOf(obj).constructor)(obj.length);
for (const [i, element_] of obj.entries()) {
result[i] = deepClone(element_);
}
return result;
}
if (obj instanceof ArrayBuffer || typeof SharedArrayBuffer !== "undefined" && obj instanceof SharedArrayBuffer) {
return [...obj];
}
if (obj instanceof DataView) {
const result = new DataView([...obj.buffer]);
cloneDeepHelper(obj, result);
return result;
}
if (typeof File !== "undefined" && obj instanceof File) {
const result = new File([obj], obj.name, {
type: obj.type
});
cloneDeepHelper(obj, result);
return result;
}
if (obj instanceof Blob) {
const result = new Blob([obj], {
type: obj.type
});
cloneDeepHelper(obj, result);
return result;
}
if (obj instanceof Error) {
const result = new obj.constructor();
result.message = obj.message;
result.name = obj.name;
result.stack = obj.stack;
result.cause = obj.cause;
cloneDeepHelper(obj, result);
return result;
}
if (typeof obj === "object" && obj !== null) {
const result = {};
cloneDeepHelper(obj, result);
return result;
}
return obj;
}
function cloneDeepHelper(obj, clonedObj) {
const keys = Object.keys(obj);
for (const key of keys) {
const descriptor = Object.getOwnPropertyDescriptor(obj, key);
if (descriptor?.writable || descriptor?.set) {
clonedObj[key] = deepClone(obj[key]);
}
}
}