errobj
Version:
☠️ Serialise errors to literal (JSONable) object
8 lines (7 loc) • 5.06 kB
Source Map (JSON)
{
"version": 3,
"sources": ["src/lib/props/index.ts", "src/lib/verify/index.ts", "src/lib/parseStack/index.ts", "src/index.ts"],
"sourcesContent": ["type Field =\n\t| \"message\"\n\t| \"stack\"\n\t| \"code\"\n\t| \"name\"\n\t| \"fileName\"\n\t| \"lineNumber\"\n\t| \"columnNumber\"\n\t| \"address\"\n\t| \"dest\"\n\t| \"errno\"\n\t| \"info\"\n\t| \"path\"\n\t| \"port\"\n\t| \"syscall\"\n\t| \"opensslErrorStack\"\n\t| \"function\"\n\t| \"library\"\n\t| \"reason\"\n\t| \"details\"\n\t| \"description\";\n\nconst FIELDS: Field[] = [\n\t// Error native getters\n\t\"message\",\n\t\"stack\",\n\t\"code\",\n\n\t// inherited (not own property)\n\t\"name\",\n\n\t// non standard browser fields\n\t\"fileName\",\n\t\"lineNumber\",\n\t\"columnNumber\",\n\n\t// SystemError\n\t\"address\",\n\t\"dest\",\n\t\"errno\",\n\t\"info\",\n\t\"path\",\n\t\"port\",\n\t\"syscall\",\n\n\t// OpenSSL error properties\n\t\"opensslErrorStack\",\n\t\"function\",\n\t\"library\",\n\t\"reason\",\n\n\t// custom\n\t\"details\",\n\t\"description\",\n];\n\n/**\n * Get property names of an error, including sone constructor getters\n */\nexport const props = (error: Error): string[] =>\n\tArray.from(new Set(Object.getOwnPropertyNames(error).concat(FIELDS)));\n", "/**\n * Throws an error unless it accepts an error\n */\nexport function verify(error: Error): void {\n\tif (!(error instanceof Error)) {\n\t\tthrow new RangeError(\n\t\t\t`Expected an error. Insead got ${typeof error}: ${error}`\n\t\t);\n\t}\n}\n", "import errorStackParser from \"error-stack-parser\";\n\n/**\n * Parse the error stack into a list of frames\n */\nexport function parseStack(\n\terror,\n\t{ offset, parsedStack }: { offset?: number; parsedStack?: number } = {}\n): object[] {\n\ttry {\n\t\tconst parsed = errorStackParser.parse(error);\n\n\t\t// Remove lines off the top of the stack\n\t\tif (typeof offset === \"number\" && offset > 0) {\n\t\t\tparsed.splice(0, offset);\n\t\t}\n\n\t\t// trim stack\n\t\tif (parsedStack) {\n\t\t\tparsed.length = Math.min(parsed.length, parsedStack);\n\t\t}\n\n\t\treturn parsed;\n\t} catch (_) {\n\t\treturn [{}];\n\t}\n}\n", "import { props } from \"./lib/props/index\";\nimport { verify } from \"./lib/verify/index\";\nimport { parseStack } from \"./lib/parseStack/index\";\n\ndeclare global {\n\tinterface Error {\n\t\ttoJSON?(): any;\n\t\tcause?: unknown;\n\t}\n}\n\n/**\n * Serialise error (1) into a JSONable object. Include fields from an enrichment object (2).\n */\nexport function errobj(\n\terror: Error,\n\tenrichment: { [key: string]: any } = {},\n\t{ offset = 0, parsedStack = 0 } = {}\n): { [key: string]: any } {\n\tverify(error);\n\n\tif (typeof error.toJSON === \"function\") {\n\t\terror = error.toJSON();\n\t}\n\n\tconst parsed = parseStack(error, { offset, parsedStack });\n\n\tparsedStack && Object.assign(error, { parsedStack: parsed });\n\n\tconst cause = getCause(error);\n\n\treturn Object.assign(\n\t\tprops(error).reduce(\n\t\t\t(accumulator, key) =>\n\t\t\t\terror[key]\n\t\t\t\t\t? Object.assign(accumulator, { [key]: error[key] })\n\t\t\t\t\t: accumulator,\n\t\t\t{ ...parsed[0] }\n\t\t),\n\t\tcause ? { cause } : {},\n\t\tenrichment\n\t);\n}\n\n/**\n * Get a string representation of cause property of an error\n */\nfunction getCause(error: Error): string | undefined {\n\tlet { cause } = error;\n\n\tif (cause instanceof Error) {\n\t\tif (cause === error) {\n\t\t\tcause = \"[Circular]\";\n\t\t} else {\n\t\t\tcause = errobj(cause);\n\t\t}\n\t}\n\n\treturn typeof cause === \"undefined\" ? cause : String(cause);\n}\n"],
"mappings": ";;;;;;;;;;;;;;;;;;AAsBA,IAAM,SAAkB;AAAA,EAEvB;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AACD;AAKO,IAAM,QAAQ,CAAC,UACrB,MAAM,KAAK,IAAI,IAAI,OAAO,oBAAoB,KAAK,EAAE,OAAO,MAAM,CAAC,CAAC;;;ACzD9D,SAAS,OAAO,OAAoB;AAC1C,MAAI,EAAE,iBAAiB,QAAQ;AAC9B,UAAM,IAAI;AAAA,MACT,iCAAiC,OAAO,UAAU;AAAA,IACnD;AAAA,EACD;AACD;;;ACTA,OAAO,sBAAsB;AAKtB,SAAS,WACf,OACA,EAAE,QAAQ,YAAY,IAA+C,CAAC,GAC3D;AACX,MAAI;AACH,UAAM,SAAS,iBAAiB,MAAM,KAAK;AAG3C,QAAI,OAAO,WAAW,YAAY,SAAS,GAAG;AAC7C,aAAO,OAAO,GAAG,MAAM;AAAA,IACxB;AAGA,QAAI,aAAa;AAChB,aAAO,SAAS,KAAK,IAAI,OAAO,QAAQ,WAAW;AAAA,IACpD;AAEA,WAAO;AAAA,EACR,SAAS,GAAP;AACD,WAAO,CAAC,CAAC,CAAC;AAAA,EACX;AACD;;;ACZO,SAAS,OACf,OACA,aAAqC,CAAC,GACtC,EAAE,SAAS,GAAG,cAAc,EAAE,IAAI,CAAC,GACV;AACzB,SAAO,KAAK;AAEZ,MAAI,OAAO,MAAM,WAAW,YAAY;AACvC,YAAQ,MAAM,OAAO;AAAA,EACtB;AAEA,QAAM,SAAS,WAAW,OAAO,EAAE,QAAQ,YAAY,CAAC;AAExD,iBAAe,OAAO,OAAO,OAAO,EAAE,aAAa,OAAO,CAAC;AAE3D,QAAM,QAAQ,SAAS,KAAK;AAE5B,SAAO,OAAO;AAAA,IACb,MAAM,KAAK,EAAE;AAAA,MACZ,CAAC,aAAa,QACb,MAAM,OACH,OAAO,OAAO,aAAa,EAAE,CAAC,MAAM,MAAM,KAAK,CAAC,IAChD;AAAA,MACJ,mBAAK,OAAO;AAAA,IACb;AAAA,IACA,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IACrB;AAAA,EACD;AACD;AAKA,SAAS,SAAS,OAAkC;AACnD,MAAI,EAAE,MAAM,IAAI;AAEhB,MAAI,iBAAiB,OAAO;AAC3B,QAAI,UAAU,OAAO;AACpB,cAAQ;AAAA,IACT,OAAO;AACN,cAAQ,OAAO,KAAK;AAAA,IACrB;AAAA,EACD;AAEA,SAAO,OAAO,UAAU,cAAc,QAAQ,OAAO,KAAK;AAC3D;",
"names": []
}