@storm-stack/utilities
Version:
This package includes various base utility class and various functions to assist in the development process.
86 lines (85 loc) • 2.99 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.isEqual = isEqual;
var _types = require("@storm-stack/types");
const hasMap = typeof Map === "function";
const hasSet = typeof Set === "function";
const hasArrayBuffer = typeof ArrayBuffer === "function" && Boolean(ArrayBuffer.isView);
function equal(a, b) {
if (a === b) return true;
if (a && b && typeof a === "object" && typeof b === "object") {
if (a.constructor !== b.constructor) return false;
let length;
if (Array.isArray(a)) {
length = a.length;
if (length != b.length) return false;
for (let i = length; i-- !== 0;) if (!equal(a[i], b[i])) return false;
return true;
}
let it;
if (hasMap && a instanceof Map && b instanceof Map) {
if (a.size !== b.size) return false;
it = a.entries();
let i;
while (!(i = it.next()).done) if (!b.has(i.value[0])) return false;
it = a.entries();
while (!(i = it.next()).done) {
if (!equal(i.value[1], b.get(i.value[0]))) return false;
}
return true;
}
if (hasSet && a instanceof Set && b instanceof Set) {
if (a.size !== b.size) return false;
it = a.entries();
let i;
while (!(i = it.next()).done) if (!b.has(i.value[0])) return false;
return true;
}
if (Array.isArray(a) && Array.isArray(b) && hasArrayBuffer && ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {
length = a.length;
if (length != b.length) return false;
for (let i = length; i-- !== 0;) if (a[i] !== b[i]) return false;
return true;
}
if (a.constructor === RegExp) {
return a.source === b.source && a.flags === b.flags;
}
if (a.valueOf !== Object.prototype.valueOf && typeof a.valueOf === "function" && typeof b.valueOf === "function") {
return a.valueOf() === b.valueOf();
}
if (a.toString !== Object.prototype.toString && typeof a.toString === "function" && typeof b.toString === "function") {
return a.toString() === b.toString();
}
const keys = Object.keys(a);
length = keys.length;
if (length !== Object.keys(b).length) return false;
for (let i = length; i-- !== 0;) {
if (!(0, _types.isSet)(i) || !(0, _types.isSetString)(keys[i]) || !Object.prototype.hasOwnProperty.call(b, keys[i])) {
return false;
}
}
for (let i = length; i-- !== 0;) {
if (Array.isArray(keys) && (keys[i] === "_owner" || keys[i] === "__v" || keys[i] === "__o") && a.$$typeof) {
continue;
}
if (!(0, _types.isSet)(i) || !(0, _types.isSetString)(keys[i]) || !equal(a[keys[i]], b[keys[i]])) {
return false;
}
}
return true;
}
return a !== a && b !== b;
}
function isEqual(a, b) {
try {
return equal(a, b);
} catch (error) {
if (/stack|recursion/i.test(error?.message || "")) {
console.warn("isEqual cannot handle circular refs");
return false;
}
throw error;
}
}