UNPKG

2.02 kBJavaScriptView Raw
1'use strict'
2const stack = require('./stack.js')
3
4module.exports = (er, extra, options) => {
5 // the yaml module puts big stuff here, pluck it off
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 // parse out the 'at' bit from the first line.
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}