{"ScriptPreparationCode":null,"TestCases":[{"Name":"es-toolkit (isEqual)","Code":"const makeObject = (count) =\u003E {\r\n const obj = {};\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n obj[\u0027k\u0027 \u002B i] = {\r\n id: i,\r\n value: i * 3,\r\n flag: (i \u0026 1) === 0,\r\n text: \u0027value\u0027 \u002B i,\r\n };\r\n }\r\n\r\n return obj;\r\n};\r\n\r\nconst makeArray = (count) =\u003E {\r\n const arr = new Array(count);\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n arr[i] = {\r\n id: i,\r\n name: \u0027item\u0027 \u002B i,\r\n values: [i, i \u002B 1, i \u002B 2, i \u002B 3],\r\n enabled: (i \u0026 1) === 0,\r\n };\r\n }\r\n\r\n return arr;\r\n};\r\n\r\nconst makeDeepObject = (depth) =\u003E {\r\n let root = {\r\n value: 0\r\n };\r\n let current = root;\r\n\r\n for (let i = 1; i \u003C depth; i\u002B\u002B) {\r\n current.next = {\r\n value: i,\r\n payload: {\r\n left: i,\r\n right: i \u002B 1,\r\n flag: (i \u0026 1) === 0,\r\n },\r\n };\r\n\r\n current = current.next;\r\n }\r\n\r\n return root;\r\n};\r\n\r\nconst makeWideObject = (width, depth) =\u003E {\r\n if (depth === 0) {\r\n return {\r\n value: 1,\r\n text: \u0027leaf\u0027,\r\n };\r\n }\r\n\r\n const obj = {};\r\n\r\n for (let i = 0; i \u003C width; i\u002B\u002B) {\r\n obj[\u0027k\u0027 \u002B i] = makeWideObject(width, depth - 1);\r\n }\r\n\r\n return obj;\r\n};\r\n\r\nconst shuffleKeys = (obj) =\u003E {\r\n const entries = Object.entries(obj);\r\n\r\n entries.reverse();\r\n\r\n const out = {};\r\n\r\n for (const [k, v] of entries)\r\n out[k] = v;\r\n\r\n return out;\r\n};\r\n\r\nconst makeMap = (count) =\u003E {\r\n const map = new Map();\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n map.set({\r\n id: i\r\n }, {\r\n value: i,\r\n nested: {\r\n x: i,\r\n y: i \u002B 1,\r\n z: i \u002B 2,\r\n },\r\n })\r\n }\r\n return map;\r\n};\r\n\r\nconst makeObjectKeyMap = (count) =\u003E {\r\n const map = new Map();\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n map.set({\r\n id: i,\r\n nested: {\r\n x: i,\r\n u: i \u002B 2\r\n }\r\n }, {\r\n value: i,\r\n nested: {\r\n x: i,\r\n y: i \u002B 1,\r\n z: i \u002B 2,\r\n },\r\n }, )\r\n }\r\n\r\n return map;\r\n};\r\n\r\nconst makeSet = (count) =\u003E {\r\n const set = new Set();\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n set.add({\r\n id: i,\r\n value: i,\r\n nested: {\r\n x: i,\r\n y: i * 2,\r\n },\r\n });\r\n }\r\n\r\n return set;\r\n};\r\n\r\nfunction makeNestedObjectSetMap(count) {\r\n const map = new Map();\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n map.set({\r\n id: i\r\n }, {\r\n values: new Set([{\r\n x: i\r\n },\r\n {\r\n y: i\r\n },\r\n {\r\n z: i\r\n },\r\n ]),\r\n }, );\r\n }\r\n\r\n return map;\r\n};\r\n\r\nconst makeTypedArray = (count) =\u003E {\r\n const arr = new Float64Array(count);\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n arr[i] = i;\r\n }\r\n\r\n return arr;\r\n};\r\n\r\nfunction buildErrorType(idxVal) {\r\n return [new Error(\u0060${idxVal}\u0060), new TypeError(\u0060${idxVal}\u0060), new RangeError(\u0060${idxVal}\u0060)][idxVal % 3];\r\n}\r\n\r\nfunction makeErrorCollection(count) {\r\n const arr = new Array(count);\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n arr[i] = buildErrorType(i);\r\n }\r\n\r\n return arr;\r\n}\r\n\r\nconst makeBuffer = (bytes) =\u003E {\r\n const buffer = new ArrayBuffer(bytes);\r\n const view = new Uint8Array(buffer);\r\n\r\n for (let i = 0; i \u003C bytes; i\u002B\u002B) {\r\n view[i] = i \u0026 255;\r\n }\r\n\r\n return buffer;\r\n};\r\n\r\nconst makeUser = (count) =\u003E ({\r\n id: 123,\r\n name: \u0027John\u0027,\r\n enabled: true,\r\n created: new Date(1700000000000),\r\n\r\n profile: {\r\n age: 42,\r\n country: \u0027US\u0027,\r\n verified: true,\r\n },\r\n\r\n tags: Array.from({\r\n length: count\r\n }, (_, i) =\u003E \u0027tag\u0027 \u002B i),\r\n\r\n addresses: Array.from({\r\n length: count\r\n }, (_, i) =\u003E ({\r\n city: \u0027City\u0027 \u002B i,\r\n zip: i,\r\n active: (i \u0026 1) === 0,\r\n })),\r\n\r\n scores: new Float64Array(count),\r\n});\r\n \r\nconst objA = makeObject(10000);\r\nconst lateMismatchObjB = makeObject(10000);\r\nlateMismatchObjB.k9999 = -1;\r\n\r\nconst data = [{\r\n description: \u0027equal numbers\u0027,\r\n value1: 1,\r\n value2: 1,\r\n equal: true,\r\n },\r\n {\r\n description: \u0027not equal numbers\u0027,\r\n value1: 1,\r\n value2: 2,\r\n equal: false,\r\n },\r\n {\r\n description: \u0027number and array are not equal\u0027,\r\n value1: 1,\r\n value2: [],\r\n equal: false,\r\n },\r\n {\r\n description: \u00270 and object are not equal\u0027,\r\n value1: 0,\r\n value2: {},\r\n equal: false,\r\n },\r\n {\r\n description: \u0027equal strings\u0027,\r\n value1: \u0027a\u0027,\r\n value2: \u0027a\u0027,\r\n equal: true,\r\n },\r\n {\r\n description: \u0027big object\u0027,\r\n value1: {\r\n prop1: \u0027value1\u0027,\r\n prop2: \u0027value2\u0027,\r\n prop3: \u0027value3\u0027,\r\n prop4: {\r\n subProp1: \u0027sub value1\u0027,\r\n subProp2: {\r\n subSubProp1: \u0027sub sub value1\u0027,\r\n subSubProp2: [\r\n 1,\r\n 2,\r\n {\r\n prop2: 1,\r\n prop: 2\r\n },\r\n 4,\r\n 5,\r\n ],\r\n },\r\n },\r\n prop5: 1000,\r\n prop6: new Date(2016, 2, 10),\r\n },\r\n value2: {\r\n prop5: 1000,\r\n prop3: \u0027value3\u0027,\r\n prop1: \u0027value1\u0027,\r\n prop2: \u0027value2\u0027,\r\n prop6: new Date(\u00272016/03/10\u0027),\r\n prop4: {\r\n subProp2: {\r\n subSubProp1: \u0027sub sub value1\u0027,\r\n subSubProp2: [\r\n 1,\r\n 2,\r\n {\r\n prop2: 1,\r\n prop: 2\r\n },\r\n 4,\r\n 5,\r\n ],\r\n },\r\n subProp1: \u0027sub value1\u0027,\r\n },\r\n },\r\n equal: true,\r\n },\r\n // Stress Testing\r\n {\r\n description: \u0027100-level linked object\u0027,\r\n value1: makeDeepObject(100),\r\n value2: makeDeepObject(100),\r\n equal: true,\r\n },\r\n {\r\n description: \u0027200-level linked object\u0027,\r\n value1: makeDeepObject(200),\r\n value2: makeDeepObject(200),\r\n equal: true,\r\n },\r\n {\r\n description: \u00272500-property object\u0027,\r\n value1: makeObject(2500),\r\n value2: makeObject(2500),\r\n equal: true,\r\n },\r\n {\r\n description: \u002710000-property nested object-key map\u0027,\r\n value1: makeObjectKeyMap(10000),\r\n value2: makeObjectKeyMap(10000),\r\n equal: true,\r\n },\r\n {\r\n description: \u00276x5 object tree (~9,300 nodes)\u0027,\r\n value1: makeWideObject(6, 5),\r\n value2: makeWideObject(6, 5),\r\n equal: true,\r\n },\r\n {\r\n description: \u002710x2 object tree\u0027,\r\n value1: makeWideObject(10, 2),\r\n value2: makeWideObject(10, 2),\r\n equal: true,\r\n },\r\n {\r\n description: \u002710x2 object tree, shuffled\u0027,\r\n value1: makeWideObject(10, 2),\r\n value2: shuffleKeys(makeWideObject(10, 2)),\r\n equal: true,\r\n },\r\n {\r\n description: \u00272500-object array\u0027,\r\n value1: makeArray(2500),\r\n value2: makeArray(2500),\r\n equal: true,\r\n },\r\n {\r\n description: \u002710000-object array\u0027,\r\n value1: makeArray(10000),\r\n value2: makeArray(10000),\r\n equal: true,\r\n },\r\n {\r\n description: \u00272000-entry Map\u0027,\r\n value1: makeMap(2000),\r\n value2: makeMap(2000),\r\n equal: true,\r\n },\r\n {\r\n description: \u00274000-entry Map\u0027,\r\n value1: makeMap(4000),\r\n value2: makeMap(4000),\r\n equal: true,\r\n },\r\n {\r\n description: \u00272000-entry Set\u0027,\r\n value1: makeSet(2000),\r\n value2: makeSet(2000),\r\n equal: true,\r\n },\r\n {\r\n description: \u00272000-element Map with nested Object Set\u0027,\r\n value1: makeNestedObjectSetMap(2000),\r\n value2: makeNestedObjectSetMap(2000),\r\n equal: true,\r\n },\r\n {\r\n description: \u0027250-element Error Collection\u0027,\r\n value1: makeErrorCollection(250),\r\n value2: makeErrorCollection(250),\r\n equal: true,\r\n },\r\n {\r\n description: \u0027250000-element Float64Array\u0027,\r\n value1: makeTypedArray(250000),\r\n value2: makeTypedArray(250000),\r\n equal: true,\r\n },\r\n {\r\n description: \u00272MB ArrayBuffer\u0027,\r\n value1: makeBuffer(2 * 1024 * 1024),\r\n value2: makeBuffer(2 * 1024 * 1024),\r\n equal: true,\r\n },\r\n {\r\n description: \u0027realistic user object (2000 items)\u0027,\r\n value1: makeUser(2000),\r\n value2: makeUser(2000),\r\n equal: true,\r\n },\r\n {\r\n description: \u0027user object (10000 items)\u0027,\r\n value1: makeUser(10000),\r\n value2: makeUser(10000),\r\n equal: true,\r\n },\r\n {\r\n description: \u0027late mismatch object (10000 items)\u0027,\r\n value1: objA,\r\n value2: lateMismatchObjB,\r\n equal: false,\r\n },\r\n];\r\n\r\nconst failureCollection = [];\r\ndata.forEach((item) =\u003E {\r\n const result = _.isEqual(item.value1, item.value2);\r\n \tif (item.equal === result) return;\r\n \r\n const description = \u0060Failed: ${item.description}\u0060;\r\n \tconst message = (\u0060library test result: (${result}) does not match expected output: (${item.equal})\u0060);\r\n \tfailureCollection.push({description, message})\r\n});\r\nconsole.assert(failureCollection.length === 0, \u0022%o\u0022, failureCollection);\r\n\r\n","IsDeferred":false},{"Name":"fast-deep-equal","Code":"function oldFastDeepEqual(a, b) {\r\n if (a === b) return true;\r\n\r\n if (a \u0026\u0026 b \u0026\u0026 typeof a == \u0027object\u0027 \u0026\u0026 typeof b == \u0027object\u0027) {\r\n if (a.constructor !== b.constructor) return false;\r\n\r\n var length, i, keys;\r\n if (Array.isArray(a)) {\r\n length = a.length;\r\n if (length != b.length) return false;\r\n for (i = length; i-- !== 0;)\r\n if (!oldFastDeepEqual(a[i], b[i])) return false;\r\n return true;\r\n }\r\n\r\n if ((a instanceof Map) \u0026\u0026 (b instanceof Map)) {\r\n if (a.size !== b.size) return false;\r\n for (i of a.entries())\r\n if (!b.has(i[0])) return false;\r\n for (i of a.entries())\r\n if (!oldFastDeepEqual(i[1], b.get(i[0]))) return false;\r\n return true;\r\n }\r\n\r\n if ((a instanceof Set) \u0026\u0026 (b instanceof Set)) {\r\n if (a.size !== b.size) return false;\r\n for (i of a.entries())\r\n if (!b.has(i[0])) return false;\r\n return true;\r\n }\r\n\r\n if (ArrayBuffer.isView(a) \u0026\u0026 ArrayBuffer.isView(b)) {\r\n length = a.length;\r\n if (length != b.length) return false;\r\n for (i = length; i-- !== 0;)\r\n if (a[i] !== b[i]) return false;\r\n return true;\r\n }\r\n\r\n if (a.constructor === RegExp) return a.source === b.source \u0026\u0026 a.flags === b.flags;\r\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\r\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\r\n\r\n keys = Object.keys(a);\r\n length = keys.length;\r\n if (length !== Object.keys(b).length) return false;\r\n\r\n for (i = length; i-- !== 0;)\r\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\r\n\r\n for (i = length; i-- !== 0;) {\r\n var key = keys[i];\r\n if (key === \u0027_owner\u0027 \u0026\u0026 a.$$typeof) {\r\n // React-specific: avoid traversing React elements\u0027 _owner.\r\n // _owner contains circular references\r\n // and is not needed when comparing the actual elements (and not their owners)\r\n continue;\r\n }\r\n if (!oldFastDeepEqual(a[key], b[key])) return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n // true if both NaN, false otherwise\r\n return a!==a \u0026\u0026 b!==b;\r\n};\r\n\r\nconst makeObject = (count) =\u003E {\r\n const obj = {};\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n obj[\u0027k\u0027 \u002B i] = {\r\n id: i,\r\n value: i * 3,\r\n flag: (i \u0026 1) === 0,\r\n text: \u0027value\u0027 \u002B i,\r\n };\r\n }\r\n\r\n return obj;\r\n};\r\n\r\nconst makeArray = (count) =\u003E {\r\n const arr = new Array(count);\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n arr[i] = {\r\n id: i,\r\n name: \u0027item\u0027 \u002B i,\r\n values: [i, i \u002B 1, i \u002B 2, i \u002B 3],\r\n enabled: (i \u0026 1) === 0,\r\n };\r\n }\r\n\r\n return arr;\r\n};\r\n\r\nconst makeDeepObject = (depth) =\u003E {\r\n let root = {\r\n value: 0\r\n };\r\n let current = root;\r\n\r\n for (let i = 1; i \u003C depth; i\u002B\u002B) {\r\n current.next = {\r\n value: i,\r\n payload: {\r\n left: i,\r\n right: i \u002B 1,\r\n flag: (i \u0026 1) === 0,\r\n },\r\n };\r\n\r\n current = current.next;\r\n }\r\n\r\n return root;\r\n};\r\n\r\nconst makeWideObject = (width, depth) =\u003E {\r\n if (depth === 0) {\r\n return {\r\n value: 1,\r\n text: \u0027leaf\u0027,\r\n };\r\n }\r\n\r\n const obj = {};\r\n\r\n for (let i = 0; i \u003C width; i\u002B\u002B) {\r\n obj[\u0027k\u0027 \u002B i] = makeWideObject(width, depth - 1);\r\n }\r\n\r\n return obj;\r\n};\r\n\r\nconst shuffleKeys = (obj) =\u003E {\r\n const entries = Object.entries(obj);\r\n\r\n entries.reverse();\r\n\r\n const out = {};\r\n\r\n for (const [k, v] of entries)\r\n out[k] = v;\r\n\r\n return out;\r\n};\r\n\r\nconst makeMap = (count) =\u003E {\r\n const map = new Map();\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n map.set({\r\n id: i\r\n }, {\r\n value: i,\r\n nested: {\r\n x: i,\r\n y: i \u002B 1,\r\n z: i \u002B 2,\r\n },\r\n })\r\n }\r\n return map;\r\n};\r\n\r\nconst makeObjectKeyMap = (count) =\u003E {\r\n const map = new Map();\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n map.set({\r\n id: i,\r\n nested: {\r\n x: i,\r\n u: i \u002B 2\r\n }\r\n }, {\r\n value: i,\r\n nested: {\r\n x: i,\r\n y: i \u002B 1,\r\n z: i \u002B 2,\r\n },\r\n }, )\r\n }\r\n\r\n return map;\r\n};\r\n\r\nconst makeSet = (count) =\u003E {\r\n const set = new Set();\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n set.add({\r\n id: i,\r\n value: i,\r\n nested: {\r\n x: i,\r\n y: i * 2,\r\n },\r\n });\r\n }\r\n\r\n return set;\r\n};\r\n\r\nfunction makeNestedObjectSetMap(count) {\r\n const map = new Map();\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n map.set({\r\n id: i\r\n }, {\r\n values: new Set([{\r\n x: i\r\n },\r\n {\r\n y: i\r\n },\r\n {\r\n z: i\r\n },\r\n ]),\r\n }, );\r\n }\r\n\r\n return map;\r\n};\r\n\r\nconst makeTypedArray = (count) =\u003E {\r\n const arr = new Float64Array(count);\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n arr[i] = i;\r\n }\r\n\r\n return arr;\r\n};\r\n\r\nfunction buildErrorType(idxVal) {\r\n return [new Error(\u0060${idxVal}\u0060), new TypeError(\u0060${idxVal}\u0060), new RangeError(\u0060${idxVal}\u0060)][idxVal % 3];\r\n}\r\n\r\nfunction makeErrorCollection(count) {\r\n const arr = new Array(count);\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n arr[i] = buildErrorType(i);\r\n }\r\n\r\n return arr;\r\n}\r\n\r\nconst makeBuffer = (bytes) =\u003E {\r\n const buffer = new ArrayBuffer(bytes);\r\n const view = new Uint8Array(buffer);\r\n\r\n for (let i = 0; i \u003C bytes; i\u002B\u002B) {\r\n view[i] = i \u0026 255;\r\n }\r\n\r\n return buffer;\r\n};\r\n\r\nconst makeUser = (count) =\u003E ({\r\n id: 123,\r\n name: \u0027John\u0027,\r\n enabled: true,\r\n created: new Date(1700000000000),\r\n\r\n profile: {\r\n age: 42,\r\n country: \u0027US\u0027,\r\n verified: true,\r\n },\r\n\r\n tags: Array.from({\r\n length: count\r\n }, (_, i) =\u003E \u0027tag\u0027 \u002B i),\r\n\r\n addresses: Array.from({\r\n length: count\r\n }, (_, i) =\u003E ({\r\n city: \u0027City\u0027 \u002B i,\r\n zip: i,\r\n active: (i \u0026 1) === 0,\r\n })),\r\n\r\n scores: new Float64Array(count),\r\n});\r\n \r\nconst objA = makeObject(10000);\r\nconst lateMismatchObjB = makeObject(10000);\r\nlateMismatchObjB.k9999 = -1;\r\n\r\nconst data = [{\r\n description: \u0027equal numbers\u0027,\r\n value1: 1,\r\n value2: 1,\r\n equal: true,\r\n },\r\n {\r\n description: \u0027not equal numbers\u0027,\r\n value1: 1,\r\n value2: 2,\r\n equal: false,\r\n },\r\n {\r\n description: \u0027number and array are not equal\u0027,\r\n value1: 1,\r\n value2: [],\r\n equal: false,\r\n },\r\n {\r\n description: \u00270 and object are not equal\u0027,\r\n value1: 0,\r\n value2: {},\r\n equal: false,\r\n },\r\n {\r\n description: \u0027equal strings\u0027,\r\n value1: \u0027a\u0027,\r\n value2: \u0027a\u0027,\r\n equal: true,\r\n },\r\n {\r\n description: \u0027big object\u0027,\r\n value1: {\r\n prop1: \u0027value1\u0027,\r\n prop2: \u0027value2\u0027,\r\n prop3: \u0027value3\u0027,\r\n prop4: {\r\n subProp1: \u0027sub value1\u0027,\r\n subProp2: {\r\n subSubProp1: \u0027sub sub value1\u0027,\r\n subSubProp2: [\r\n 1,\r\n 2,\r\n {\r\n prop2: 1,\r\n prop: 2\r\n },\r\n 4,\r\n 5,\r\n ],\r\n },\r\n },\r\n prop5: 1000,\r\n prop6: new Date(2016, 2, 10),\r\n },\r\n value2: {\r\n prop5: 1000,\r\n prop3: \u0027value3\u0027,\r\n prop1: \u0027value1\u0027,\r\n prop2: \u0027value2\u0027,\r\n prop6: new Date(\u00272016/03/10\u0027),\r\n prop4: {\r\n subProp2: {\r\n subSubProp1: \u0027sub sub value1\u0027,\r\n subSubProp2: [\r\n 1,\r\n 2,\r\n {\r\n prop2: 1,\r\n prop: 2\r\n },\r\n 4,\r\n 5,\r\n ],\r\n },\r\n subProp1: \u0027sub value1\u0027,\r\n },\r\n },\r\n equal: true,\r\n },\r\n // Stress Testing\r\n {\r\n description: \u0027100-level linked object\u0027,\r\n value1: makeDeepObject(100),\r\n value2: makeDeepObject(100),\r\n equal: true,\r\n },\r\n {\r\n description: \u0027200-level linked object\u0027,\r\n value1: makeDeepObject(200),\r\n value2: makeDeepObject(200),\r\n equal: true,\r\n },\r\n {\r\n description: \u00272500-property object\u0027,\r\n value1: makeObject(2500),\r\n value2: makeObject(2500),\r\n equal: true,\r\n },\r\n {\r\n description: \u002710000-property nested object-key map\u0027,\r\n value1: makeObjectKeyMap(10000),\r\n value2: makeObjectKeyMap(10000),\r\n equal: true,\r\n },\r\n {\r\n description: \u00276x5 object tree (~9,300 nodes)\u0027,\r\n value1: makeWideObject(6, 5),\r\n value2: makeWideObject(6, 5),\r\n equal: true,\r\n },\r\n {\r\n description: \u002710x2 object tree\u0027,\r\n value1: makeWideObject(10, 2),\r\n value2: makeWideObject(10, 2),\r\n equal: true,\r\n },\r\n {\r\n description: \u002710x2 object tree, shuffled\u0027,\r\n value1: makeWideObject(10, 2),\r\n value2: shuffleKeys(makeWideObject(10, 2)),\r\n equal: true,\r\n },\r\n {\r\n description: \u00272500-object array\u0027,\r\n value1: makeArray(2500),\r\n value2: makeArray(2500),\r\n equal: true,\r\n },\r\n {\r\n description: \u002710000-object array\u0027,\r\n value1: makeArray(10000),\r\n value2: makeArray(10000),\r\n equal: true,\r\n },\r\n {\r\n description: \u00272000-entry Map\u0027,\r\n value1: makeMap(2000),\r\n value2: makeMap(2000),\r\n equal: true,\r\n },\r\n {\r\n description: \u00274000-entry Map\u0027,\r\n value1: makeMap(4000),\r\n value2: makeMap(4000),\r\n equal: true,\r\n },\r\n {\r\n description: \u00272000-entry Set\u0027,\r\n value1: makeSet(2000),\r\n value2: makeSet(2000),\r\n equal: true,\r\n },\r\n {\r\n description: \u00272000-element Map with nested Object Set\u0027,\r\n value1: makeNestedObjectSetMap(2000),\r\n value2: makeNestedObjectSetMap(2000),\r\n equal: true,\r\n },\r\n {\r\n description: \u0027250-element Error Collection\u0027,\r\n value1: makeErrorCollection(250),\r\n value2: makeErrorCollection(250),\r\n equal: true,\r\n },\r\n {\r\n description: \u0027250000-element Float64Array\u0027,\r\n value1: makeTypedArray(250000),\r\n value2: makeTypedArray(250000),\r\n equal: true,\r\n },\r\n {\r\n description: \u00272MB ArrayBuffer\u0027,\r\n value1: makeBuffer(2 * 1024 * 1024),\r\n value2: makeBuffer(2 * 1024 * 1024),\r\n equal: true,\r\n },\r\n {\r\n description: \u0027realistic user object (2000 items)\u0027,\r\n value1: makeUser(2000),\r\n value2: makeUser(2000),\r\n equal: true,\r\n },\r\n {\r\n description: \u0027user object (10000 items)\u0027,\r\n value1: makeUser(10000),\r\n value2: makeUser(10000),\r\n equal: true,\r\n },\r\n {\r\n description: \u0027late mismatch object (10000 items)\u0027,\r\n value1: objA,\r\n value2: lateMismatchObjB,\r\n equal: false,\r\n },\r\n];\r\n\r\nconst failureCollection = [];\r\ndata.forEach((item) =\u003E {\r\n const result = oldFastDeepEqual(item.value1, item.value2);\r\n \t \tif (item.equal === result) return;\r\n \r\n const description = \u0060Failed: ${item.description}\u0060;\r\n \tconst message = (\u0060library test result: (${result}) does not match expected output: (${item.equal})\u0060);\r\n \tfailureCollection.push({description, message})\r\n});\r\nconsole.assert(failureCollection.length === 0, \u0022%o\u0022, failureCollection);","IsDeferred":false},{"Name":"updated fast-deep-equal","Code":"/**\r\n * Fast, strict deep-equality comparison.\r\n *\r\n * Supports: primitives (incl. NaN), Date, RegExp, Array, Map, Set,\r\n * ArrayBuffer views (TypedArrays, including BigInt64Array / BigUint64Array\r\n * where the environment provides them), and plain objects compared by\r\n * their own enumerable string-keyed properties.\r\n *\r\n * This is a port of the ajv-validator/fast-deep-equal \u0022es6\u0022\r\n * template, with the following algorithmic changes over the original:\r\n *\r\n * - Map comparison is a single pass instead of two (\u0060has\u0060 \u002B \u0060equal\u0060 are\r\n * checked together while iterating \u0060a\u0060 once).\r\n * - Set comparison iterates values directly instead of \u0060.entries()\u0060,\r\n * avoiding an unnecessary [value, value] tuple allocation per item.\r\n * - Plain-object comparison merges the \u0022own property\u0022 check and the\r\n * \u0022recursive equality\u0022 check into a single reverse pass over the keys\r\n * instead of two separate passes.\r\n * - \u0060Object.prototype.hasOwnProperty\u0060 / \u0060valueOf\u0060 / \u0060toString\u0060 are\r\n * resolved once at module scope instead of being looked up on every\r\n * call, since \u0060Object.prototype.x\u0060 is otherwise re-resolved on every\r\n * invocation of \u0060equal\u0060.\r\n * - The \u0060it.react\u0060-specific \u0060_owner\u0060 skip from the original template was\r\n * dropped; it was optional/templated behavior outside the core\r\n * equality semantics. Reintroduce it as an explicit key-skip predicate\r\n * if you need it back.\r\n */\r\n\r\nconst objectProto = Object.prototype;\r\nconst hasOwnProperty = objectProto.hasOwnProperty;\r\nconst defaultValueOf = objectProto.valueOf;\r\nconst defaultToString = objectProto.toString;\r\n\r\nfunction updatedFastDeepEqual(a, b) {\r\n if (a === b) return true;\r\n\r\n if (a \u0026\u0026 b \u0026\u0026 typeof a === \u0027object\u0027 \u0026\u0026 typeof b === \u0027object\u0027) {\r\n const objA = a;\r\n const objB = b;\r\n\r\n if (objA.constructor !== objB.constructor) return false;\r\n\r\n let length;\r\n let i;\r\n\r\n if (Array.isArray(objA)) {\r\n const arrA = objA;\r\n const arrB = objB;\r\n length = arrA.length;\r\n if (length !== arrB.length) return false;\r\n for (i = length; i-- !== 0;) {\r\n if (!updatedFastDeepEqual(arrA[i], arrB[i])) return false;\r\n }\r\n return true;\r\n }\r\n\r\n if (objA instanceof Map \u0026\u0026 objB instanceof Map) {\r\n if (objA.size !== objB.size) return false;\r\n for (const [key, value] of objA) {\r\n if (!objB.has(key) || !updatedFastDeepEqual(value, objB.get(key))) return false;\r\n }\r\n return true;\r\n }\r\n\r\n if (objA instanceof Set \u0026\u0026 objB instanceof Set) {\r\n if (objA.size !== objB.size) return false;\r\n for (const value of objA) {\r\n if (!objB.has(value)) return false;\r\n }\r\n return true;\r\n }\r\n\r\n if (ArrayBuffer.isView(objA) \u0026\u0026 ArrayBuffer.isView(objB)) {\r\n // Note: like the original, this assumes TypedArray-style \u0060.length\u0060.\r\n // A bare DataView has \u0060.byteLength\u0060, not \u0060.length\u0060; DataView equality\r\n // is out of scope here, matching upstream fast-deep-equal behavior.\r\n const viewA = objA;\r\n const viewB = objB;\r\n length = viewA.length;\r\n if (length !== viewB.length) return false;\r\n for (i = length; i-- !== 0;) {\r\n if (viewA[i] !== viewB[i]) return false;\r\n }\r\n return true;\r\n }\r\n\r\n if (objA.constructor === RegExp) {\r\n const reA = objA;\r\n const reB = objB;\r\n return reA.source === reB.source \u0026\u0026 reA.flags === reB.flags;\r\n }\r\n\r\n const valueOfA = (objA).valueOf;\r\n if (valueOfA !== defaultValueOf) {\r\n return valueOfA.call(objA) === (objB).valueOf.call(objB);\r\n }\r\n\r\n const toStringA = (objA).toString;\r\n if (toStringA !== defaultToString) {\r\n return toStringA.call(objA) === (objB).toString.call(objB);\r\n }\r\n\r\n const keys = Object.keys(objA);\r\n length = keys.length;\r\n if (length !== Object.keys(objB).length) return false;\r\n\r\n // Single combined pass: own-property check \u002B recursive equality.\r\n for (i = length; i-- !== 0;) {\r\n const key = keys[i];\r\n if (!hasOwnProperty.call(objB, key) || !updatedFastDeepEqual(objA[key], objB[key])) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n // Reached only for non-object values that failed \u0060a === b\u0060:\r\n // true iff both are NaN, false otherwise.\r\n return a !== a \u0026\u0026 b !== b;\r\n}\r\n\r\n\r\nconst makeObject = (count) =\u003E {\r\n const obj = {};\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n obj[\u0027k\u0027 \u002B i] = {\r\n id: i,\r\n value: i * 3,\r\n flag: (i \u0026 1) === 0,\r\n text: \u0027value\u0027 \u002B i,\r\n };\r\n }\r\n\r\n return obj;\r\n};\r\n\r\nconst makeArray = (count) =\u003E {\r\n const arr = new Array(count);\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n arr[i] = {\r\n id: i,\r\n name: \u0027item\u0027 \u002B i,\r\n values: [i, i \u002B 1, i \u002B 2, i \u002B 3],\r\n enabled: (i \u0026 1) === 0,\r\n };\r\n }\r\n\r\n return arr;\r\n};\r\n\r\nconst makeDeepObject = (depth) =\u003E {\r\n let root = {\r\n value: 0\r\n };\r\n let current = root;\r\n\r\n for (let i = 1; i \u003C depth; i\u002B\u002B) {\r\n current.next = {\r\n value: i,\r\n payload: {\r\n left: i,\r\n right: i \u002B 1,\r\n flag: (i \u0026 1) === 0,\r\n },\r\n };\r\n\r\n current = current.next;\r\n }\r\n\r\n return root;\r\n};\r\n\r\nconst makeWideObject = (width, depth) =\u003E {\r\n if (depth === 0) {\r\n return {\r\n value: 1,\r\n text: \u0027leaf\u0027,\r\n };\r\n }\r\n\r\n const obj = {};\r\n\r\n for (let i = 0; i \u003C width; i\u002B\u002B) {\r\n obj[\u0027k\u0027 \u002B i] = makeWideObject(width, depth - 1);\r\n }\r\n\r\n return obj;\r\n};\r\n\r\nconst shuffleKeys = (obj) =\u003E {\r\n const entries = Object.entries(obj);\r\n\r\n entries.reverse();\r\n\r\n const out = {};\r\n\r\n for (const [k, v] of entries)\r\n out[k] = v;\r\n\r\n return out;\r\n};\r\n\r\nconst makeMap = (count) =\u003E {\r\n const map = new Map();\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n map.set({\r\n id: i\r\n }, {\r\n value: i,\r\n nested: {\r\n x: i,\r\n y: i \u002B 1,\r\n z: i \u002B 2,\r\n },\r\n })\r\n }\r\n return map;\r\n};\r\n\r\nconst makeObjectKeyMap = (count) =\u003E {\r\n const map = new Map();\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n map.set({\r\n id: i,\r\n nested: {\r\n x: i,\r\n u: i \u002B 2\r\n }\r\n }, {\r\n value: i,\r\n nested: {\r\n x: i,\r\n y: i \u002B 1,\r\n z: i \u002B 2,\r\n },\r\n },)\r\n }\r\n\r\n return map;\r\n};\r\n\r\nconst makeSet = (count) =\u003E {\r\n const set = new Set();\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n set.add({\r\n id: i,\r\n value: i,\r\n nested: {\r\n x: i,\r\n y: i * 2,\r\n },\r\n });\r\n }\r\n\r\n return set;\r\n};\r\n\r\nfunction makeNestedObjectSetMap(count) {\r\n const map = new Map();\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n map.set({\r\n id: i\r\n }, {\r\n values: new Set([{\r\n x: i\r\n },\r\n {\r\n y: i\r\n },\r\n {\r\n z: i\r\n },\r\n ]),\r\n },);\r\n }\r\n\r\n return map;\r\n};\r\n\r\nconst makeTypedArray = (count) =\u003E {\r\n const arr = new Float64Array(count);\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n arr[i] = i;\r\n }\r\n\r\n return arr;\r\n};\r\n\r\nfunction buildErrorType(idxVal) {\r\n return [new Error(\u0060${idxVal}\u0060), new TypeError(\u0060${idxVal}\u0060), new RangeError(\u0060${idxVal}\u0060)][idxVal % 3];\r\n}\r\n\r\nfunction makeErrorCollection(count) {\r\n const arr = new Array(count);\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n arr[i] = buildErrorType(i);\r\n }\r\n\r\n return arr;\r\n}\r\n\r\nconst makeBuffer = (bytes) =\u003E {\r\n const buffer = new ArrayBuffer(bytes);\r\n const view = new Uint8Array(buffer);\r\n\r\n for (let i = 0; i \u003C bytes; i\u002B\u002B) {\r\n view[i] = i \u0026 255;\r\n }\r\n\r\n return buffer;\r\n};\r\n\r\nconst makeUser = (count) =\u003E ({\r\n id: 123,\r\n name: \u0027John\u0027,\r\n enabled: true,\r\n created: new Date(1700000000000),\r\n\r\n profile: {\r\n age: 42,\r\n country: \u0027US\u0027,\r\n verified: true,\r\n },\r\n\r\n tags: Array.from({\r\n length: count\r\n }, (_, i) =\u003E \u0027tag\u0027 \u002B i),\r\n\r\n addresses: Array.from({\r\n length: count\r\n }, (_, i) =\u003E ({\r\n city: \u0027City\u0027 \u002B i,\r\n zip: i,\r\n active: (i \u0026 1) === 0,\r\n })),\r\n\r\n scores: new Float64Array(count),\r\n});\r\n\r\nconst objA = makeObject(10000);\r\nconst lateMismatchObjB = makeObject(10000);\r\nlateMismatchObjB.k9999 = -1;\r\n\r\nconst data = [{\r\n description: \u0027equal numbers\u0027,\r\n value1: 1,\r\n value2: 1,\r\n equal: true,\r\n},\r\n{\r\n description: \u0027not equal numbers\u0027,\r\n value1: 1,\r\n value2: 2,\r\n equal: false,\r\n},\r\n{\r\n description: \u0027number and array are not equal\u0027,\r\n value1: 1,\r\n value2: [],\r\n equal: false,\r\n},\r\n{\r\n description: \u00270 and object are not equal\u0027,\r\n value1: 0,\r\n value2: {},\r\n equal: false,\r\n},\r\n{\r\n description: \u0027equal strings\u0027,\r\n value1: \u0027a\u0027,\r\n value2: \u0027a\u0027,\r\n equal: true,\r\n},\r\n{\r\n description: \u0027big object\u0027,\r\n value1: {\r\n prop1: \u0027value1\u0027,\r\n prop2: \u0027value2\u0027,\r\n prop3: \u0027value3\u0027,\r\n prop4: {\r\n subProp1: \u0027sub value1\u0027,\r\n subProp2: {\r\n subSubProp1: \u0027sub sub value1\u0027,\r\n subSubProp2: [\r\n 1,\r\n 2,\r\n {\r\n prop2: 1,\r\n prop: 2\r\n },\r\n 4,\r\n 5,\r\n ],\r\n },\r\n },\r\n prop5: 1000,\r\n prop6: new Date(2016, 2, 10),\r\n },\r\n value2: {\r\n prop5: 1000,\r\n prop3: \u0027value3\u0027,\r\n prop1: \u0027value1\u0027,\r\n prop2: \u0027value2\u0027,\r\n prop6: new Date(\u00272016/03/10\u0027),\r\n prop4: {\r\n subProp2: {\r\n subSubProp1: \u0027sub sub value1\u0027,\r\n subSubProp2: [\r\n 1,\r\n 2,\r\n {\r\n prop2: 1,\r\n prop: 2\r\n },\r\n 4,\r\n 5,\r\n ],\r\n },\r\n subProp1: \u0027sub value1\u0027,\r\n },\r\n },\r\n equal: true,\r\n},\r\n// Stress Testing\r\n{\r\n description: \u0027100-level linked object\u0027,\r\n value1: makeDeepObject(100),\r\n value2: makeDeepObject(100),\r\n equal: true,\r\n},\r\n{\r\n description: \u0027200-level linked object\u0027,\r\n value1: makeDeepObject(200),\r\n value2: makeDeepObject(200),\r\n equal: true,\r\n},\r\n{\r\n description: \u00272500-property object\u0027,\r\n value1: makeObject(2500),\r\n value2: makeObject(2500),\r\n equal: true,\r\n},\r\n{\r\n description: \u002710000-property nested object-key map\u0027,\r\n value1: makeObjectKeyMap(10000),\r\n value2: makeObjectKeyMap(10000),\r\n equal: true,\r\n},\r\n{\r\n description: \u00276x5 object tree (~9,300 nodes)\u0027,\r\n value1: makeWideObject(6, 5),\r\n value2: makeWideObject(6, 5),\r\n equal: true,\r\n},\r\n{\r\n description: \u002710x2 object tree\u0027,\r\n value1: makeWideObject(10, 2),\r\n value2: makeWideObject(10, 2),\r\n equal: true,\r\n},\r\n{\r\n description: \u002710x2 object tree, shuffled\u0027,\r\n value1: makeWideObject(10, 2),\r\n value2: shuffleKeys(makeWideObject(10, 2)),\r\n equal: true,\r\n},\r\n{\r\n description: \u00272500-object array\u0027,\r\n value1: makeArray(2500),\r\n value2: makeArray(2500),\r\n equal: true,\r\n},\r\n{\r\n description: \u002710000-object array\u0027,\r\n value1: makeArray(10000),\r\n value2: makeArray(10000),\r\n equal: true,\r\n},\r\n{\r\n description: \u00272000-entry Map\u0027,\r\n value1: makeMap(2000),\r\n value2: makeMap(2000),\r\n equal: true,\r\n},\r\n{\r\n description: \u00274000-entry Map\u0027,\r\n value1: makeMap(4000),\r\n value2: makeMap(4000),\r\n equal: true,\r\n},\r\n{\r\n description: \u00272000-entry Set\u0027,\r\n value1: makeSet(2000),\r\n value2: makeSet(2000),\r\n equal: true,\r\n},\r\n{\r\n description: \u00272000-element Map with nested Object Set\u0027,\r\n value1: makeNestedObjectSetMap(2000),\r\n value2: makeNestedObjectSetMap(2000),\r\n equal: true,\r\n},\r\n{\r\n description: \u0027250-element Error Collection\u0027,\r\n value1: makeErrorCollection(250),\r\n value2: makeErrorCollection(250),\r\n equal: true,\r\n},\r\n{\r\n description: \u0027250000-element Float64Array\u0027,\r\n value1: makeTypedArray(250000),\r\n value2: makeTypedArray(250000),\r\n equal: true,\r\n},\r\n{\r\n description: \u00272MB ArrayBuffer\u0027,\r\n value1: makeBuffer(2 * 1024 * 1024),\r\n value2: makeBuffer(2 * 1024 * 1024),\r\n equal: true,\r\n},\r\n{\r\n description: \u0027realistic user object (2000 items)\u0027,\r\n value1: makeUser(2000),\r\n value2: makeUser(2000),\r\n equal: true,\r\n},\r\n{\r\n description: \u0027user object (10000 items)\u0027,\r\n value1: makeUser(10000),\r\n value2: makeUser(10000),\r\n equal: true,\r\n},\r\n{\r\n description: \u0027late mismatch object (10000 items)\u0027,\r\n value1: objA,\r\n value2: lateMismatchObjB,\r\n equal: false,\r\n},\r\n];\r\n\r\nconst failureCollection = [];\r\ndata.forEach((item) =\u003E {\r\n const result = updatedFastDeepEqual(item.value1, item.value2);\r\n \tif (item.equal === result) return;\r\n \r\n const description = \u0060Failed: ${item.description}\u0060;\r\n \tconst message = (\u0060library test result: (${result}) does not match expected output: (${item.equal})\u0060);\r\n \tfailureCollection.push({description, message})\r\n});\r\nconsole.assert(failureCollection.length === 0, \u0022%o\u0022, failureCollection);","IsDeferred":false},{"Name":"original deepEqual comparison","Code":"function deepEqual(object1, object2) {\r\n const keys1 = Object.keys(object1);\r\n const keys2 = Object.keys(object2);\r\n if (keys1.length !== keys2.length) {\r\n return false;\r\n }\r\n for (const key of keys1) {\r\n const val1 = object1[key];\r\n const val2 = object2[key];\r\n const areObjects = isObject(val1) \u0026\u0026 isObject(val2);\r\n if (\r\n areObjects \u0026\u0026 !deepEqual(val1, val2) ||\r\n !areObjects \u0026\u0026 val1 !== val2\r\n ) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nfunction isObject(object) {\r\n return object != null \u0026\u0026 typeof object === \u0027object\u0027;\r\n}\r\n\r\n\r\nconst makeObject = (count) =\u003E {\r\n const obj = {};\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n obj[\u0027k\u0027 \u002B i] = {\r\n id: i,\r\n value: i * 3,\r\n flag: (i \u0026 1) === 0,\r\n text: \u0027value\u0027 \u002B i,\r\n };\r\n }\r\n\r\n return obj;\r\n};\r\n\r\nconst makeArray = (count) =\u003E {\r\n const arr = new Array(count);\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n arr[i] = {\r\n id: i,\r\n name: \u0027item\u0027 \u002B i,\r\n values: [i, i \u002B 1, i \u002B 2, i \u002B 3],\r\n enabled: (i \u0026 1) === 0,\r\n };\r\n }\r\n\r\n return arr;\r\n};\r\n\r\nconst makeDeepObject = (depth) =\u003E {\r\n let root = {\r\n value: 0\r\n };\r\n let current = root;\r\n\r\n for (let i = 1; i \u003C depth; i\u002B\u002B) {\r\n current.next = {\r\n value: i,\r\n payload: {\r\n left: i,\r\n right: i \u002B 1,\r\n flag: (i \u0026 1) === 0,\r\n },\r\n };\r\n\r\n current = current.next;\r\n }\r\n\r\n return root;\r\n};\r\n\r\nconst makeWideObject = (width, depth) =\u003E {\r\n if (depth === 0) {\r\n return {\r\n value: 1,\r\n text: \u0027leaf\u0027,\r\n };\r\n }\r\n\r\n const obj = {};\r\n\r\n for (let i = 0; i \u003C width; i\u002B\u002B) {\r\n obj[\u0027k\u0027 \u002B i] = makeWideObject(width, depth - 1);\r\n }\r\n\r\n return obj;\r\n};\r\n\r\nconst shuffleKeys = (obj) =\u003E {\r\n const entries = Object.entries(obj);\r\n\r\n entries.reverse();\r\n\r\n const out = {};\r\n\r\n for (const [k, v] of entries)\r\n out[k] = v;\r\n\r\n return out;\r\n};\r\n\r\nconst makeMap = (count) =\u003E {\r\n const map = new Map();\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n map.set({\r\n id: i\r\n }, {\r\n value: i,\r\n nested: {\r\n x: i,\r\n y: i \u002B 1,\r\n z: i \u002B 2,\r\n },\r\n })\r\n }\r\n return map;\r\n};\r\n\r\nconst makeObjectKeyMap = (count) =\u003E {\r\n const map = new Map();\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n map.set({\r\n id: i,\r\n nested: {\r\n x: i,\r\n u: i \u002B 2\r\n }\r\n }, {\r\n value: i,\r\n nested: {\r\n x: i,\r\n y: i \u002B 1,\r\n z: i \u002B 2,\r\n },\r\n },)\r\n }\r\n\r\n return map;\r\n};\r\n\r\nconst makeSet = (count) =\u003E {\r\n const set = new Set();\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n set.add({\r\n id: i,\r\n value: i,\r\n nested: {\r\n x: i,\r\n y: i * 2,\r\n },\r\n });\r\n }\r\n\r\n return set;\r\n};\r\n\r\nfunction makeNestedObjectSetMap(count) {\r\n const map = new Map();\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n map.set({\r\n id: i\r\n }, {\r\n values: new Set([{\r\n x: i\r\n },\r\n {\r\n y: i\r\n },\r\n {\r\n z: i\r\n },\r\n ]),\r\n },);\r\n }\r\n\r\n return map;\r\n};\r\n\r\nconst makeTypedArray = (count) =\u003E {\r\n const arr = new Float64Array(count);\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n arr[i] = i;\r\n }\r\n\r\n return arr;\r\n};\r\n\r\nfunction buildErrorType(idxVal) {\r\n return [new Error(\u0060${idxVal}\u0060), new TypeError(\u0060${idxVal}\u0060), new RangeError(\u0060${idxVal}\u0060)][idxVal % 3];\r\n}\r\n\r\nfunction makeErrorCollection(count) {\r\n const arr = new Array(count);\r\n\r\n for (let i = 0; i \u003C count; i\u002B\u002B) {\r\n arr[i] = buildErrorType(i);\r\n }\r\n\r\n return arr;\r\n}\r\n\r\nconst makeBuffer = (bytes) =\u003E {\r\n const buffer = new ArrayBuffer(bytes);\r\n const view = new Uint8Array(buffer);\r\n\r\n for (let i = 0; i \u003C bytes; i\u002B\u002B) {\r\n view[i] = i \u0026 255;\r\n }\r\n\r\n return buffer;\r\n};\r\n\r\nconst makeUser = (count) =\u003E ({\r\n id: 123,\r\n name: \u0027John\u0027,\r\n enabled: true,\r\n created: new Date(1700000000000),\r\n\r\n profile: {\r\n age: 42,\r\n country: \u0027US\u0027,\r\n verified: true,\r\n },\r\n\r\n tags: Array.from({\r\n length: count\r\n }, (_, i) =\u003E \u0027tag\u0027 \u002B i),\r\n\r\n addresses: Array.from({\r\n length: count\r\n }, (_, i) =\u003E ({\r\n city: \u0027City\u0027 \u002B i,\r\n zip: i,\r\n active: (i \u0026 1) === 0,\r\n })),\r\n\r\n scores: new Float64Array(count),\r\n});\r\n\r\nconst objA = makeObject(10000);\r\nconst lateMismatchObjB = makeObject(10000);\r\nlateMismatchObjB.k9999 = -1;\r\n\r\nconst data = [{\r\n description: \u0027equal numbers\u0027,\r\n value1: 1,\r\n value2: 1,\r\n equal: true,\r\n},\r\n{\r\n description: \u0027not equal numbers\u0027,\r\n value1: 1,\r\n value2: 2,\r\n equal: false,\r\n},\r\n{\r\n description: \u0027number and array are not equal\u0027,\r\n value1: 1,\r\n value2: [],\r\n equal: false,\r\n},\r\n{\r\n description: \u00270 and object are not equal\u0027,\r\n value1: 0,\r\n value2: {},\r\n equal: false,\r\n},\r\n{\r\n description: \u0027equal strings\u0027,\r\n value1: \u0027a\u0027,\r\n value2: \u0027a\u0027,\r\n equal: true,\r\n},\r\n{\r\n description: \u0027big object\u0027,\r\n value1: {\r\n prop1: \u0027value1\u0027,\r\n prop2: \u0027value2\u0027,\r\n prop3: \u0027value3\u0027,\r\n prop4: {\r\n subProp1: \u0027sub value1\u0027,\r\n subProp2: {\r\n subSubProp1: \u0027sub sub value1\u0027,\r\n subSubProp2: [\r\n 1,\r\n 2,\r\n {\r\n prop2: 1,\r\n prop: 2\r\n },\r\n 4,\r\n 5,\r\n ],\r\n },\r\n },\r\n prop5: 1000,\r\n prop6: new Date(2016, 2, 10),\r\n },\r\n value2: {\r\n prop5: 1000,\r\n prop3: \u0027value3\u0027,\r\n prop1: \u0027value1\u0027,\r\n prop2: \u0027value2\u0027,\r\n prop6: new Date(\u00272016/03/10\u0027),\r\n prop4: {\r\n subProp2: {\r\n subSubProp1: \u0027sub sub value1\u0027,\r\n subSubProp2: [\r\n 1,\r\n 2,\r\n {\r\n prop2: 1,\r\n prop: 2\r\n },\r\n 4,\r\n 5,\r\n ],\r\n },\r\n subProp1: \u0027sub value1\u0027,\r\n },\r\n },\r\n equal: true,\r\n},\r\n// Stress Testing\r\n{\r\n description: \u0027100-level linked object\u0027,\r\n value1: makeDeepObject(100),\r\n value2: makeDeepObject(100),\r\n equal: true,\r\n},\r\n{\r\n description: \u0027200-level linked object\u0027,\r\n value1: makeDeepObject(200),\r\n value2: makeDeepObject(200),\r\n equal: true,\r\n},\r\n{\r\n description: \u00272500-property object\u0027,\r\n value1: makeObject(2500),\r\n value2: makeObject(2500),\r\n equal: true,\r\n},\r\n{\r\n description: \u002710000-property nested object-key map\u0027,\r\n value1: makeObjectKeyMap(10000),\r\n value2: makeObjectKeyMap(10000),\r\n equal: true,\r\n},\r\n{\r\n description: \u00276x5 object tree (~9,300 nodes)\u0027,\r\n value1: makeWideObject(6, 5),\r\n value2: makeWideObject(6, 5),\r\n equal: true,\r\n},\r\n{\r\n description: \u002710x2 object tree\u0027,\r\n value1: makeWideObject(10, 2),\r\n value2: makeWideObject(10, 2),\r\n equal: true,\r\n},\r\n{\r\n description: \u002710x2 object tree, shuffled\u0027,\r\n value1: makeWideObject(10, 2),\r\n value2: shuffleKeys(makeWideObject(10, 2)),\r\n equal: true,\r\n},\r\n{\r\n description: \u00272500-object array\u0027,\r\n value1: makeArray(2500),\r\n value2: makeArray(2500),\r\n equal: true,\r\n},\r\n{\r\n description: \u002710000-object array\u0027,\r\n value1: makeArray(10000),\r\n value2: makeArray(10000),\r\n equal: true,\r\n},\r\n{\r\n description: \u00272000-entry Map\u0027,\r\n value1: makeMap(2000),\r\n value2: makeMap(2000),\r\n equal: true,\r\n},\r\n{\r\n description: \u00274000-entry Map\u0027,\r\n value1: makeMap(4000),\r\n value2: makeMap(4000),\r\n equal: true,\r\n},\r\n{\r\n description: \u00272000-entry Set\u0027,\r\n value1: makeSet(2000),\r\n value2: makeSet(2000),\r\n equal: true,\r\n},\r\n{\r\n description: \u00272000-element Map with nested Object Set\u0027,\r\n value1: makeNestedObjectSetMap(2000),\r\n value2: makeNestedObjectSetMap(2000),\r\n equal: true,\r\n},\r\n{\r\n description: \u0027250-element Error Collection\u0027,\r\n value1: makeErrorCollection(250),\r\n value2: makeErrorCollection(250),\r\n equal: true,\r\n},\r\n{\r\n description: \u0027250000-element Float64Array\u0027,\r\n value1: makeTypedArray(250000),\r\n value2: makeTypedArray(250000),\r\n equal: true,\r\n},\r\n{\r\n description: \u00272MB ArrayBuffer\u0027,\r\n value1: makeBuffer(2 * 1024 * 1024),\r\n value2: makeBuffer(2 * 1024 * 1024),\r\n equal: true,\r\n},\r\n{\r\n description: \u0027realistic user object (2000 items)\u0027,\r\n value1: makeUser(2000),\r\n value2: makeUser(2000),\r\n equal: true,\r\n},\r\n{\r\n description: \u0027user object (10000 items)\u0027,\r\n value1: makeUser(10000),\r\n value2: makeUser(10000),\r\n equal: true,\r\n},\r\n{\r\n description: \u0027late mismatch object (10000 items)\u0027,\r\n value1: objA,\r\n value2: lateMismatchObjB,\r\n equal: false,\r\n},\r\n];\r\n\r\nconst failureCollection = [];\r\ndata.forEach((item) =\u003E {\r\n const result = deepEqual(item.value1, item.value2);\r\n \tif (item.equal === result) return;\r\n \r\n const description = \u0060Failed: ${item.description}\u0060;\r\n \tconst message = (\u0060library test result: (${result}) does not match expected output: (${item.equal})\u0060);\r\n \tfailureCollection.push({description, message})\r\n});\r\nconsole.assert(failureCollection.length === 0, \u0022%o\u0022, failureCollection);","IsDeferred":false}],"UseTinyBench":false}