-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
109 lines (94 loc) · 2.62 KB
/
index.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
const STACK_FRAME_LIMIT = 50;
const UNKNOWN_FUNCTION = "?";
function createStackFrame(url, func, lineno, colno) {
const frame = {
url,
function: func,
};
if (lineno !== undefined) {
frame.lineno = lineno;
}
if (colno !== undefined) {
frame.colno = colno;
}
return frame;
}
const chromeParser = (line) => {
const chromeRegex =
/^\s*at (?:(.+?\)(?: \[.+\])?|.*?) ?\((?:address at )?)?(?:async )?((?:<anonymous>|[-a-z]+:|.*bundle|\/)?.*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i;
const chromeEvalRegex = /\((\S*)(?::(\d+))(?::(\d+))\)/;
const parts = chromeRegex.exec(line);
if (parts) {
const isEval = parts[2] && parts[2].indexOf("eval") === 0;
if (isEval) {
const subMatch = chromeEvalRegex.exec(parts[2]);
if (subMatch) {
parts[2] = subMatch[1]; // url
parts[3] = subMatch[2]; // line
parts[4] = subMatch[3]; // column
}
}
return createStackFrame(
parts[2],
parts[1] || UNKNOWN_FUNCTION,
parts[3] ? +parts[3] : undefined,
parts[4] ? +parts[4] : undefined
);
}
return;
};
const geckoParser = (line) => {
const geckoREgex =
/^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:[-a-z]+)?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js)|\/[\w\-. /=]+)(?::(\d+))?(?::(\d+))?\s*$/i;
const geckoEvalRegex = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i;
const parts = geckoREgex.exec(line);
if (parts) {
const isEval = parts[3] && parts[3].indexOf(" > eval") > -1;
if (isEval) {
const subMatch = geckoEvalRegex.exec(parts[3]);
if (subMatch) {
parts[1] = parts[1] || "eval";
parts[3] = subMatch[1];
parts[4] = subMatch[2];
parts[5] = ""; // no column when eval
}
}
return createStackFrame(
parts[3],
parts[1] || UNKNOWN_FUNCTION,
parts[4] ? +parts[4] : undefined,
parts[5] ? +parts[5] : undefined
);
}
return;
};
function createStackParser(parsers) {
const stackFrames = [];
return (e) => {
const lines = e.stack.split("\n");
for (let i = 0; i < lines.length; i++) {
const line = lines[i];
// unlikely to be an Error object
if (line.length > 1024) {
return;
}
for (let i = 0; i < parsers.length; i++) {
const frame = parsers[i](line);
if (frame) {
stackFrames.push(frame);
break;
}
}
if (stackFrames.length >= STACK_FRAME_LIMIT) {
break;
}
}
return {
name: e.name,
message: e.message,
stack: stackFrames,
};
};
}
const errorParser = createStackParser([chromeParser, geckoParser]);
export { errorParser };