🌳
pt0/serverF/throwErrorF/getErrStrF.mts
1import * as _ from 'lodash-es'
2import { inspect } from 'util'
6import { unwrapErr } from './unwrapErrF.mts'
8const getErrType = ({err}: {err: any}) => {
9 if (err instanceof PtErr) return 'PtErr'
10 if (err instanceof PublicVisError) return 'PublicVisError'
13const cleanStackA = (linesA: string[]) => linesA
14 .map(line => line.trim())
15 .filter(Boolean)
16 .filter(line => !line.startsWith('at eval ('))
18const cleanStacksStr = (stacksH: Record<string, string[]>) => {
19 return Object.entries(stacksH).map(([stackName, linesA]) => {
20 linesA = cleanStackA(linesA)
21 return `${stackName}: ${linesA.length == 0 ? 'emptystack' : linesA.join("\n")}`
22 }).join("\n--------\n")
25export const getErrStr = ({err, prettyHumanIncompleteHash=false, forClassHash=false}: {err: any, prettyHumanIncompleteHash?: boolean, forClassHash?: boolean}) => {
26 if (err.constructor.name == 'String') {
27 return 'errstr ' + (err.toStringReplaced || err.toString()).trim()
28 }
29 err = unwrapErr(err)
30 const jsonToStr = (obj: unknown) => {
31 return inspect(obj)
32 }
33 const errType = getErrType({err})
34 if (errType) {
35 let ret = errType + ' ' + err.message
36 if (forClassHash) {
37 if (err.throwLocation) ret += ' @ ' + err.throwLocation
38 return ret
39 }
40 if (!prettyHumanIncompleteHash && err.uniqDebugH) {
41 ret += "\n" + jsonToStr(err.uniqDebugH)
42 }
43 return ret
44 }
45 if (err.originalError) {
46 console.dir(err)
47 console.log('err.originalError', err.originalError)
48 }
49 if (isJsErr(err)) {
50 return jsErrToStr({err, inclTitleLine: true, inclStack: !prettyHumanIncompleteHash})
51 }
52 if (isGqlErr(err)) {
53 return gqlErrToStr({err, inclTitleLine: true, inclStack: !prettyHumanIncompleteHash})
54 }
55 return 'fallb ' + jsonToStr(err)
58export const isGqlErr = (err: any) => {
59 const firstStackLine = err.stack
60 return _.startsWith(firstStackLine, 'GraphQLError:')
63export const isJsErr = (err: any) => _.get(err, 'extensions.code') == jsErrSym
65export const gqlErrToStr = ({err, inclTitleLine, inclStack}: {err: any, inclTitleLine: boolean, inclStack: boolean}) => {
66 const [firstLine, ...restLines] = (err.toStringReplaced || err.toString()).split("\n")
67 const retA: string[] = []
68 if (inclTitleLine) {
69 retA.push(firstLine)
70 }
71 if (inclStack) {
72 retA.push(restLines.join("\n").trim())
73 }
74 return retA.join("\n")
77export const jsErrToStr = ({err, inclTitleLine, inclStack}: {err: any, inclTitleLine: boolean, inclStack: boolean}) => {
78 let {stackA, componentStackA, message, ...restErr} = err
79 const retA: string[] = []
80 if (inclTitleLine) {
81 retA.push('ptFeError ' + message)
82 }
83 const jsStackFilterFnc = (line: string) => {
84 if (_.includes(line, '/node_modules/')) return false
85 if (_.find([
86 'at ChakraProvider',
87 'at ThemeProvider',
88 ], (bit) => _.startsWith(line, bit))) {
89 return false
90 }
91 if (line === 'at div') return false
92 return true
93 }
94 const compStackFilterFnc = (line: string) => {
95 if (_.includes(line, '/node_modules/')) return false
96 if (_.find([
97 'at ChakraProvider',
98 'at ThemeProvider',
99 ], (bit) => _.startsWith(line, bit))) {
100 return false
101 }
102 return true
103 }
104 stackA = _.filter(stackA, jsStackFilterFnc)
105 componentStackA = _.filter(componentStackA, compStackFilterFnc)
106 if (inclStack) {
107 return [...retA, cleanStacksStr({componentStackA, stackA})].join("\n")
108 }
109 return retA.join("\n")