-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathfailing-line.js
126 lines (105 loc) · 2.55 KB
/
failing-line.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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/**
* Parse v8 stack traces.
*
* @param {Error} error JavaScript Object
* @param {Number} shift Stacks to shift.
* @returns {Object} Parsed stack trace.
* @private
*/
function safari(error, shift) {
var index = 0;
if (shift) index += shift;
var fn, filename, line, col;
var lines = error.stack.split('\n');
var stack = lines[index] || lines[0];
var fields = stack.split(/\:(\d+)\:(\d+)$/);
var numbers = fields.slice(1, 3);
fields = fields[0].split('@');
return {
fn: fields[0],
filename: fields[1],
line: Number(numbers[0]),
col: Number(numbers[1])
};
}
/**
* Parse v8 stack traces.
*
* @param {Error} error JavaScript Object
* @param {Number} shift Stacks to shift.
* @returns {Object} Parsed stack trace.
* @private
*/
function v8(error, shift) {
if (!error || !error.stack) return;
var index = 1;
if (shift) index += shift;
var fn, filename, line, col;
var lines = error.stack.split('\n');
var stack = lines[index] || lines[1];
if (!stack) return;
var match = stack.match(/at ([\(\)\w\.<>\[\]\s]+) \((.+):(\d+):(\d+)/);
if (!match) {
match = stack.match(/at (.+):(\d+):(\d+)/);
if (!match) return undefined;
filename = match[1];
line = Number(match[2]);
col = Number(match[3]);
} else {
fn = match[1];
filename = match[2];
line = Number(match[3]);
col = Number(match[4]);
}
return {
fn: fn,
filename: filename,
line: line,
col: col
};
}
/**
* Parse firefox stack traces.
*
* @param {Error} error JavaScript Object
* @param {Number} shift Stacks to shift.
* @returns {Object} Parsed stack trace.
* @private
*/
function firefox(error, shift) {
var index = 0;
if (shift) index += shift;
var fn, filename, line, col;
var lines = error.stack.split('\n');
var stack = lines[index] || lines[0];
var fields = stack.split(/\:(\d+)$/);
var numbers = fields.slice(1, 2);
fields = fields[0].split('@');
if (index == 0) {
col = error.columnNumber;
}
return {
fn: fields[0],
filename: fields[1],
line: Number(numbers[0]),
col: col
};
}
/**
* Parse the stacktrace and fine the failing line.
*
* @param {Error} error JavaScript Object
* @param {Number} shift Stacks to shift.
* @returns {Object} Parsed stack trace.
* @public
*/
function failingLine(error, shift) {
if (!error || !error.stack) return;
if (/ at /.test(error.stack)) return v8(error, shift);
if (/:\d+:\d+$/.test(error.stack)) return safari(error, shift);
return firefox(error, shift);
}
//
// Expose the module.
//
module.exports = failingLine;