UNPKG

@storm-stack/utilities

Version:

This package includes various base utility class and various functions to assist in the development process.

81 lines (80 loc) 2.86 kB
import { isSet, isSetString } from "@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 (!isSet(i) || !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 (!isSet(i) || !isSetString(keys[i]) || !equal(a[keys[i]], b[keys[i]])) { return false; } } return true; } return a !== a && b !== b; } export 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; } }