1 | 'use strict'
|
2 | const stack = require('./stack.js')
|
3 |
|
4 | module.exports = (er, extra, options) => {
|
5 |
|
6 | if (er.source && typeof er.source === 'object' && er.source.context)
|
7 | er.source = { ...er.source, context: null }
|
8 |
|
9 | extra = Object.keys(options || {}).reduce((set, k) => {
|
10 | if (!(k in set) && !/^tapChild/.test(k))
|
11 | set[k] = options[k]
|
12 | return set
|
13 | }, extra || {})
|
14 |
|
15 | if (!er || typeof er !== 'object') {
|
16 | extra.error = er
|
17 | return extra
|
18 | }
|
19 |
|
20 | const message = er.message ? er.message
|
21 | : er.stack ? er.stack.split('\n')[0]
|
22 | : ''
|
23 | const addName = er.message || !er.stack
|
24 |
|
25 | if (er.message) {
|
26 | try {
|
27 | Object.defineProperty(er, 'message', {
|
28 | value: '',
|
29 | configurable: true
|
30 | })
|
31 | } catch (e) {}
|
32 | }
|
33 |
|
34 | const st = er.stack && er.stack.substr(
|
35 | er._babel ? (message + er.codeFrame).length : 0)
|
36 | if (st) {
|
37 | const splitst = st.split('\n')
|
38 | if (er._babel && er.loc) {
|
39 | const msplit = message.split(':')
|
40 | const f = msplit[0].trim()
|
41 | extra.message = msplit.slice(1).join(':')
|
42 | .replace(/ \([0-9]+:[0-9]+\)$/, '').trim()
|
43 | const file = f.indexOf(process.cwd()) === 0
|
44 | ? f.substr(process.cwd().length + 1) : f
|
45 | if (file !== 'unknown')
|
46 | delete er.codeFrame
|
47 | extra.at = {
|
48 | file,
|
49 | line: er.loc.line,
|
50 | column: er.loc.column + 1,
|
51 | }
|
52 | } else {
|
53 |
|
54 | extra.at = stack.parseLine(splitst[1])
|
55 | }
|
56 | extra.stack = stack.clean(splitst)
|
57 | }
|
58 |
|
59 | if (message) {
|
60 | try {
|
61 | Object.defineProperty(er, 'message', {
|
62 | value: message,
|
63 | configurable: true
|
64 | })
|
65 | } catch (e) {}
|
66 | }
|
67 |
|
68 | if (er.name && er.name !== 'Error')
|
69 | extra.type = er.name
|
70 |
|
71 | Object.keys(er).forEach(k => {
|
72 | if (k === 'message' ||
|
73 | k === 'domainEmitter' ||
|
74 | k === 'domainThrown' ||
|
75 | k === 'domain' ||
|
76 | k === 'domainBound')
|
77 | return
|
78 | extra[k] = er[k]
|
79 | })
|
80 |
|
81 | return extra
|
82 | }
|