forked from DenisCarriere/sqlite3-offline
-
Notifications
You must be signed in to change notification settings - Fork 4
/
trace.js
40 lines (37 loc) · 1.2 KB
/
trace.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// Inspired by https://github.com/tlrobinson/long-stack-traces
var util = require('util')
function extendTrace (object, property, pos) {
var old = object[property]
object[property] = function () {
var error = new Error()
var name = object.constructor.name + '#' + property + '(' +
Array.prototype.slice.call(arguments).map(function (el) {
return util.inspect(el, false, 0)
}).join(', ') + ')'
if (typeof pos === 'undefined') pos = -1
if (pos < 0) pos += arguments.length
var cb = arguments[pos]
if (typeof arguments[pos] === 'function') {
arguments[pos] = function replacement () {
try {
return cb.apply(this, arguments)
} catch (err) {
if (err && err.stack && !err.__augmented) {
err.stack = filter(err).join('\n')
err.stack += '\n--> in ' + name
err.stack += '\n' + filter(error).slice(1).join('\n')
err.__augmented = true
}
throw err
}
}
}
return old.apply(this, arguments)
}
}
exports.extendTrace = extendTrace
function filter (error) {
return error.stack.split('\n').filter(function (line) {
return line.indexOf(__filename) < 0
})
}