@web3r/flowerkit
Version:
Tree-shakable JavaScript and TypeScript utility library for frontend/browser apps: DOM, events, arrays, objects, strings, date, JSON, and network helpers (ESM/CJS, SSR-friendly).
1 lines • 4.79 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":[""],"sourcesContent":["export type TIsObjEqualArgs = Parameters<typeof isObjEqual>;\n\nexport type TIsObjEqualReturn = ReturnType<typeof isObjEqual>;\n\n/**\n * Checks if two objects are deeply equal by keys and values (not by reference)\n * @param {unknown} obj1 First object\n * @param {unknown} obj2 Second object\n * @returns {boolean} True if objects are deeply equal\n * @throws {TypeError} isObjEqual: obj1 must be an object\n * @throws {TypeError} isObjEqual: obj2 must be an object\n * @example\n * // How to compare two objects by content?\n * const a = { foo: { bar: 1 } };\n * const b = { foo: { bar: 1 } };\n * const isEqual = isObjEqual(a, b);\n * console.log(isEqual); // => true\n */\nexport const isObjEqual = (obj1: unknown, obj2: unknown): boolean => {\n const isObject = (obj: unknown): obj is object => obj !== null && typeof obj === \"object\";\n\n if (!isObject(obj1)) {\n throw new TypeError(\"isObjEqual: obj1 must be an object\");\n }\n if (!isObject(obj2)) {\n throw new TypeError(\"isObjEqual: obj2 must be an object\");\n }\n\n const deepCompare = (\n value1: unknown,\n value2: unknown,\n visitedValue1: WeakMap<object, object>,\n visitedValue2: WeakMap<object, object>\n ): boolean => {\n if (Object.is(value1, value2)) {\n return true;\n }\n if (!isObject(value1) || !isObject(value2)) {\n return false;\n }\n\n if (visitedValue1.has(value1) || visitedValue2.has(value2)) {\n return visitedValue1.get(value1) === value2 && visitedValue2.get(value2) === value1;\n }\n\n visitedValue1.set(value1, value2);\n visitedValue2.set(value2, value1);\n\n if (Array.isArray(value1) || Array.isArray(value2)) {\n if (!Array.isArray(value1) || !Array.isArray(value2) || value1.length !== value2.length) {\n return false;\n }\n for (let i = 0; i < value1.length; i += 1) {\n if (!deepCompare(value1[i], value2[i], visitedValue1, visitedValue2)) {\n return false;\n }\n }\n return true;\n }\n\n if (value1 instanceof Date || value2 instanceof Date) {\n return value1 instanceof Date && value2 instanceof Date && Object.is(value1.getTime(), value2.getTime());\n }\n\n if (value1 instanceof RegExp || value2 instanceof RegExp) {\n return value1 instanceof RegExp\n && value2 instanceof RegExp\n && value1.source === value2.source\n && value1.flags === value2.flags;\n }\n\n const value1Keys = Reflect.ownKeys(value1);\n const value2Keys = Reflect.ownKeys(value2);\n\n if (value1Keys.length !== value2Keys.length) {\n return false;\n }\n\n const value1Record = value1 as Record<PropertyKey, unknown>;\n const value2Record = value2 as Record<PropertyKey, unknown>;\n\n return value1Keys.every((key) => {\n if (!Object.prototype.hasOwnProperty.call(value2Record, key)) {\n return false;\n }\n return deepCompare(value1Record[key], value2Record[key], visitedValue1, visitedValue2);\n });\n };\n\n return deepCompare(obj1, obj2, new WeakMap<object, object>(), new WeakMap<object, object>());\n};\n"],"names":["isObjEqual","obj1","obj2","isObject","obj","TypeError","deepCompare","value1","value2","visitedValue1","visitedValue2","Object","is","has","get","set","Array","isArray","length","i","Date","getTime","RegExp","source","flags","value1Keys","Reflect","ownKeys","value2Keys","value1Record","value2Record","every","key","prototype","hasOwnProperty","call","WeakMap"],"mappings":";;;;;;;;;;;;;;MAkBaA,WAAaA,CAACC,KAAeC,QACxC,MAAMC,SAAYC,KAAgCA,MAAQ,aAAeA,MAAQ,SAEjF,IAAKD,SAASF,MACZ,MAAM,IAAII,UAAU,sCAEtB,IAAKF,SAASD,MACZ,MAAM,IAAIG,UAAU,sCAGtB,MAAMC,YAAcA,CAClBC,OACAC,OACAC,cACAC,iBAEA,GAAIC,OAAOC,GAAGL,OAAQC,QACpB,OAAO,KAET,IAAKL,SAASI,UAAYJ,SAASK,QACjC,OAAO,MAGT,GAAIC,cAAcI,IAAIN,SAAWG,cAAcG,IAAIL,QACjD,OAAOC,cAAcK,IAAIP,UAAYC,QAAUE,cAAcI,IAAIN,UAAYD,OAG/EE,cAAcM,IAAIR,OAAQC,QAC1BE,cAAcK,IAAIP,OAAQD,QAE1B,GAAIS,MAAMC,QAAQV,SAAWS,MAAMC,QAAQT,QAAS,CAClD,IAAKQ,MAAMC,QAAQV,UAAYS,MAAMC,QAAQT,SAAWD,OAAOW,SAAWV,OAAOU,OAC/E,OAAO,MAET,IAAK,IAAIC,EAAI,EAAGA,EAAIZ,OAAOW,OAAQC,GAAK,EACtC,IAAKb,YAAYC,OAAOY,GAAIX,OAAOW,GAAIV,cAAeC,eACpD,OAAO,MAGX,OAAO,IACT,CAEA,GAAIH,kBAAkBa,MAAQZ,kBAAkBY,KAC9C,OAAOb,kBAAkBa,MAAQZ,kBAAkBY,MAAQT,OAAOC,GAAGL,OAAOc,UAAWb,OAAOa,WAGhG,GAAId,kBAAkBe,QAAUd,kBAAkBc,OAChD,OAAOf,kBAAkBe,QACpBd,kBAAkBc,QAClBf,OAAOgB,SAAWf,OAAOe,QACzBhB,OAAOiB,QAAUhB,OAAOgB,MAG/B,MAAMC,WAAaC,QAAQC,QAAQpB,QACnC,MAAMqB,WAAaF,QAAQC,QAAQnB,QAEnC,GAAIiB,WAAWP,SAAWU,WAAWV,OACnC,OAAO,MAGT,MAAMW,aAAetB,OACrB,MAAMuB,aAAetB,OAErB,OAAOiB,WAAWM,MAAOC,MACvB,IAAKrB,OAAOsB,UAAUC,eAAeC,KAAKL,aAAcE,KACtD,OAAO,MAET,OAAO1B,YAAYuB,aAAaG,KAAMF,aAAaE,KAAMvB,cAAeC,kBAI5E,OAAOJ,YAAYL,KAAMC,KAAM,IAAIkC,QAA2B,IAAIA"}