{"version":3,"sources":["../src/helpers.ts","../src/index.ts"],"sourcesContent":["import { AnyObject, Primitive } from './types';\n\n/**\n * Checks if the value is of a specified type.\n */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nfunction isOfType<T extends Primitive | Function>(type: string) {\n  // eslint-disable-next-line valid-typeof\n  return (value: unknown): value is T => typeof value === type;\n}\n\n/**\n * Checks if the value is a JavaScript function.\n */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const isFunction = isOfType<Function>('function');\n\n/**\n * Check if the value is null.\n */\nexport const isNull = (value: unknown): value is null => {\n  return value === null;\n};\n\n/**\n * Checks if the input is a regular expression.\n */\nexport const isRegex = (value: unknown): value is RegExp => {\n  return Object.prototype.toString.call(value).slice(8, -1) === 'RegExp';\n};\n\n/**\n * Checks if the value is an object.\n */\nexport const isObject = (value: unknown): value is AnyObject => {\n  return !isUndefined(value) && !isNull(value) && (isFunction(value) || typeof value === 'object');\n};\n\n/**\n * Checks if the value is undefined.\n */\nexport const isUndefined = isOfType<undefined>('undefined');\n","import { isObject, isRegex } from './helpers';\nimport type { AnyObject } from './types';\n\ntype Seen = WeakMap<object, WeakSet<object>>;\n\n/**\n * Compare two objects for deep equality.\n */\nfunction compareObjects(left: AnyObject, right: AnyObject, seen: Seen): boolean {\n  if (hasSeen(seen, left, right)) {\n    return true;\n  }\n\n  markSeen(seen, left, right);\n\n  if (left.constructor !== right.constructor) {\n    return false;\n  }\n\n  if (Array.isArray(left) && Array.isArray(right)) {\n    return equalArray(left, right, seen);\n  }\n\n  if (left instanceof Map && right instanceof Map) {\n    return equalMap(left, right, seen);\n  }\n\n  if (left instanceof Set && right instanceof Set) {\n    return equalSet(left, right);\n  }\n\n  if (left instanceof WeakMap || left instanceof WeakSet) {\n    return false;\n  }\n\n  if (ArrayBuffer.isView(left) && ArrayBuffer.isView(right)) {\n    return equalArrayBuffer(left, right);\n  }\n\n  if (isRegex(left) && isRegex(right)) {\n    return left.source === right.source && left.flags === right.flags;\n  }\n\n  if (left instanceof Error && right instanceof Error) {\n    return equalError(left, right, seen);\n  }\n\n  if (left.valueOf !== Object.prototype.valueOf) {\n    return left.valueOf() === right.valueOf();\n  }\n\n  if (left.toString !== Object.prototype.toString) {\n    return left.toString() === right.toString();\n  }\n\n  return equalPlainObject(left, right, seen);\n}\n\n/**\n * Internal comparison with circular reference tracking.\n */\nfunction compareValues(left: unknown, right: unknown, seen: Seen): boolean {\n  if (left === right) {\n    return true;\n  }\n\n  if (Number.isNaN(left) && Number.isNaN(right)) {\n    return true;\n  }\n\n  if (!left || !isObject(left) || !right || !isObject(right)) {\n    return false;\n  }\n\n  return compareObjects(left, right, seen);\n}\n\n/**\n * Check if arrays are equal.\n */\nfunction equalArray(left: unknown[], right: unknown[], seen: Seen) {\n  const { length } = left;\n\n  if (length !== right.length) {\n    return false;\n  }\n\n  for (let index = length; index-- !== 0; ) {\n    if (!compareValues(left[index], right[index], seen)) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\n/**\n * Check if array buffers are equal.\n */\nfunction equalArrayBuffer(left: ArrayBufferView, right: ArrayBufferView) {\n  if (left.byteLength !== right.byteLength) {\n    return false;\n  }\n\n  const view1 = new DataView(left.buffer);\n  const view2 = new DataView(right.buffer);\n\n  let index = left.byteLength;\n\n  while (index--) {\n    if (view1.getUint8(index) !== view2.getUint8(index)) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\n/**\n * Check if errors are equal.\n */\nfunction equalError(left: Error, right: Error, seen: Seen): boolean {\n  return (\n    left.message === right.message &&\n    left.name === right.name &&\n    compareValues(left.cause, right.cause, seen)\n  );\n}\n\n/**\n * Check if maps are equal.\n */\nfunction equalMap(left: Map<unknown, unknown>, right: Map<unknown, unknown>, seen: Seen) {\n  if (left.size !== right.size) {\n    return false;\n  }\n\n  for (const entry of left.entries()) {\n    if (!right.has(entry[0])) {\n      return false;\n    }\n  }\n\n  for (const entry of left.entries()) {\n    if (!compareValues(entry[1], right.get(entry[0]), seen)) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\n/**\n * Check if plain objects are equal.\n */\nfunction equalPlainObject(left: AnyObject, right: AnyObject, seen: Seen): boolean {\n  const leftKeys = Object.keys(left);\n\n  if (leftKeys.length !== Object.keys(right).length) {\n    return false;\n  }\n\n  for (let index = leftKeys.length; index-- !== 0; ) {\n    if (!Object.prototype.hasOwnProperty.call(right, leftKeys[index])) {\n      return false;\n    }\n  }\n\n  for (let index = leftKeys.length; index-- !== 0; ) {\n    const key = leftKeys[index];\n\n    if (key === '_owner' && left.$$typeof) {\n      continue;\n    }\n\n    if (!compareValues(left[key], right[key], seen)) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\n/**\n * Check if sets are equal.\n */\nfunction equalSet(left: Set<unknown>, right: Set<unknown>) {\n  if (left.size !== right.size) {\n    return false;\n  }\n\n  for (const entry of left.entries()) {\n    if (!right.has(entry[0])) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nfunction hasSeen(seen: Seen, left: object, right: object): boolean {\n  return seen.get(left)?.has(right) ?? false;\n}\n\nfunction markSeen(seen: Seen, left: object, right: object): void {\n  let set = seen.get(left);\n\n  if (!set) {\n    set = new WeakSet();\n    seen.set(left, set);\n  }\n\n  set.add(right);\n}\n\n/**\n * Checks if two values are equal.\n */\nexport default function equal(left: unknown, right: unknown): boolean {\n  return compareValues(left, right, new WeakMap());\n}\n"],"mappings":"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","names":[]}