{"version":3,"file":"details-node.mjs","sources":["../src/plugins/details.ts"],"sourcesContent":["/**\n * TrackX Error Details Plugin\n *\n * @see https://docs.trackx.app/#/guides/tracking-errors.md#plugins-details\n */\n\n// WARNING: This file is experimental and may be removed in the future!!\n\nimport type { OnErrorHandler } from 'trackx/types';\n\nexport const handlers = (funcs: OnErrorHandler[]): OnErrorHandler => (payload, reason) => {\n  let newPayload: ReturnType<OnErrorHandler> = payload;\n\n  // eslint-disable-next-line unicorn/no-for-loop\n  for (let index = 0; index < funcs.length; index++) {\n    newPayload = funcs[index](newPayload, reason);\n    if (!newPayload) break;\n  }\n\n  return newPayload;\n};\n\n/**\n * Safely clone an object by replacing any cyclic references with '[Circular]'.\n *\n * @param obj - A JSON-serializable object.\n */\nconst decycle = <T extends object>(obj: T): T => {\n  const seen = new WeakSet();\n\n  return JSON.parse(\n    JSON.stringify(obj, (_key: string, value: unknown) => {\n      if (value != null && typeof value === 'object') {\n        if (seen.has(value)) {\n          return '[Circular]';\n        }\n        seen.add(value);\n      }\n      return value;\n    }),\n  ) as T;\n};\n\nexport const auto: OnErrorHandler = (payload, reason) => {\n  if (\n    !('details' in payload.meta)\n    && reason != null\n    && typeof reason === 'object'\n  ) {\n    const details: Record<string, unknown> = {};\n    // eslint-disable-next-line no-restricted-syntax, guard-for-in\n    for (const key in reason) {\n      const value = (reason as Record<string, unknown>)[key];\n      details[key] = value === undefined ? '[Undefined]' : value;\n    }\n    // eslint-disable-next-line no-param-reassign\n    payload.meta.details = Object.keys(details).length > 0 ? decycle(details) : {};\n  }\n  if (!('ctor' in payload.meta)) {\n    // eslint-disable-next-line no-param-reassign\n    payload.meta.ctor = (() => {\n      try {\n        // @ts-expect-error - Access unknown in try/catch for safety\n        return reason.constructor.name; // eslint-disable-line\n      } catch (_error) {\n        // No op\n        return '';\n      }\n    })();\n  }\n  if (!('proto' in payload.meta)) {\n    // eslint-disable-next-line no-param-reassign\n    payload.meta.proto = Object.prototype.toString.call(reason);\n  }\n  return payload;\n};\n"],"names":["handlers","funcs","payload","reason","newPayload","index","decycle","obj","seen","_key","value","auto","details","key","_error"],"mappings":"AAUO,MAAMA,EAAYC,GAA4C,CAACC,EAASC,IAAW,CACxF,IAAIC,EAAyCF,EAG7C,QAASG,EAAQ,EAAGA,EAAQJ,EAAM,SAChCG,EAAaH,EAAMI,CAAK,EAAED,EAAYD,CAAM,EACxC,CAAA,CAACC,GAFmCC,IAExC,CAGF,OAAOD,CACT,EAOME,EAA6BC,GAAc,CAC/C,MAAMC,EAAO,IAAI,QAEjB,OAAO,KAAK,MACV,KAAK,UAAUD,EAAK,CAACE,EAAcC,IAAmB,CACpD,GAAIA,GAAS,MAAQ,OAAOA,GAAU,SAAU,CAC9C,GAAIF,EAAK,IAAIE,CAAK,EAChB,MAAO,aAETF,EAAK,IAAIE,CAAK,EAEhB,OAAOA,CACT,CAAC,CACH,CACF,EAEaC,EAAuB,CAACT,EAASC,IAAW,CACvD,GACE,EAAE,YAAaD,EAAQ,OACpBC,GAAU,MACV,OAAOA,GAAW,SACrB,CACA,MAAMS,EAAmC,CAEzC,EAAA,UAAWC,KAAOV,EAAQ,CACxB,MAAMO,EAASP,EAAmCU,CAAG,EACrDD,EAAQC,CAAG,EAAIH,IAAU,OAAY,cAAgBA,EAGvDR,EAAQ,KAAK,QAAU,OAAO,KAAKU,CAAO,EAAE,OAAS,EAAIN,EAAQM,CAAO,EAAI,CAAA,EAE9E,MAAM,SAAUV,EAAQ,OAEtBA,EAAQ,KAAK,MAAQ,IAAM,CACzB,GAAI,CAEF,OAAOC,EAAO,YAAY,IAC5B,OAASW,EAAT,CAEE,MAAO,EACT,CACF,GAAG,GAEC,UAAWZ,EAAQ,OAEvBA,EAAQ,KAAK,MAAQ,OAAO,UAAU,SAAS,KAAKC,CAAM,GAErDD,CACT"}