{"version":3,"file":"isDeepEqual.mjs","names":[],"sources":["../../src/utils/isDeepEqual.ts"],"sourcesContent":["// Structural equality for prop/config-shaped values: primitives, plain\n// records, and arrays. Functions and class instances are compared by\n// reference (caller is expected to memoise callbacks via useCallback).\n// Lifted out of StreamdownRender so the same definition powers\n// `useStableValue` at the Markdown boundary — keep them in sync if you\n// extend the rules here.\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n  typeof value === 'object' && value !== null;\n\nexport const isDeepEqual = (a: unknown, b: unknown): boolean => {\n  if (a === b) return true;\n\n  if (Array.isArray(a) || Array.isArray(b)) {\n    if (!Array.isArray(a) || !Array.isArray(b)) return false;\n    if (a.length !== b.length) return false;\n    for (let i = 0; i < a.length; i++) {\n      if (!isDeepEqual(a[i], b[i])) return false;\n    }\n    return true;\n  }\n\n  if (!isRecord(a) || !isRecord(b)) return false;\n\n  const keysA = Object.keys(a);\n  const keysB = Object.keys(b);\n  if (keysA.length !== keysB.length) return false;\n\n  for (const key of keysA) {\n    if (!isDeepEqual(a[key], b[key])) return false;\n  }\n\n  return true;\n};\n"],"mappings":";AAMA,MAAM,YAAY,UAChB,OAAO,UAAU,YAAY,UAAU;AAEzC,MAAa,eAAe,GAAY,MAAwB;CAC9D,IAAI,MAAM,GAAG,OAAO;CAEpB,IAAI,MAAM,QAAQ,CAAC,KAAK,MAAM,QAAQ,CAAC,GAAG;EACxC,IAAI,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,GAAG,OAAO;EACnD,IAAI,EAAE,WAAW,EAAE,QAAQ,OAAO;EAClC,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,KAC5B,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO;EAEvC,OAAO;CACT;CAEA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,OAAO;CAEzC,MAAM,QAAQ,OAAO,KAAK,CAAC;CAC3B,MAAM,QAAQ,OAAO,KAAK,CAAC;CAC3B,IAAI,MAAM,WAAW,MAAM,QAAQ,OAAO;CAE1C,KAAK,MAAM,OAAO,OAChB,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,GAAG,OAAO;CAG3C,OAAO;AACT"}