UNPKG

@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
"use strict"; 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; } }