{"version":3,"file":"details.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","let","newPayload","index","length","auto","meta","const","details","key","value","Object","keys","obj","seen","WeakSet","JSON","parse","stringify","_key","has","add","ctor","constructor","name","_error","proto","prototype","toString","call"],"mappings":"AAUO,IAAMA,EAAW,SAACC,GAA4C,OAAA,SAACC,EAASC,GAI7E,IAHAC,IAAIC,EAAyCH,EAGpCI,EAAQ,EAAGA,EAAQL,EAAMM,SAChCF,EAAaJ,EAAMK,GAAOD,EAAYF,IADEG,KAKnC,OAAAD,CACT,CAAA,EAuBaG,EAAA,SAAwBN,EAASC,GAE1C,KAAE,YAAaD,EAAQO,OACV,MAAVN,GACkB,kBAAXA,EACV,CACAO,IAAMC,EAAmC,CAAA,EAEzC,IAAAD,IAAWE,KAAOT,EAAQ,CAClBO,IAAAG,EAASV,EAAmCS,GAClDD,EAAQC,QAAiB,IAAVC,EAAsB,cAAgBA,CACvD,CAEQX,EAAAO,KAAKE,QAAUG,OAAOC,KAAKJ,GAASJ,OAAS,GA7BtBS,EA6BkCL,EA5B7DM,MAAWC,QAEVC,KAAKC,MACVD,KAAKE,UAAUL,YAAMM,EAAcT,GACjC,GAAa,MAATA,GAAkC,kBAAVA,EAAoB,CAC1C,GAAAI,EAAKM,IAAIV,GACJ,MAAA,aAETI,EAAKO,IAAIX,EACX,CACO,OAAAA,CAAA,MAkBmE,CAAA,CAC9E,CA9Bc,IAAmBG,EAC3BC,EA8CC,MAhBD,SAAUf,EAAQO,OAEdP,EAAAO,KAAKgB,gBACP,IAEF,OAAOtB,EAAOuB,YAAYC,WACnBC,GAEA,MAAA,EACT,CACC,KAEC,UAAW1B,EAAQO,OAEvBP,EAAQO,KAAKoB,MAAQf,OAAOgB,UAAUC,SAASC,KAAK7B,IAE/CD,CACT"}