UNPKG

5.84 kBJavaScriptView Raw
1import { __read } from "tslib";
2// global reference to slice
3var UNKNOWN_FUNCTION = '?';
4var OPERA10_PRIORITY = 10;
5var OPERA11_PRIORITY = 20;
6var CHROME_PRIORITY = 30;
7var WINJS_PRIORITY = 40;
8var GECKO_PRIORITY = 50;
9function createFrame(filename, func, lineno, colno) {
10 var frame = {
11 filename: filename,
12 function: func,
13 // All browser frames are considered in_app
14 in_app: true,
15 };
16 if (lineno !== undefined) {
17 frame.lineno = lineno;
18 }
19 if (colno !== undefined) {
20 frame.colno = colno;
21 }
22 return frame;
23}
24// Chromium based browsers: Chrome, Brave, new Opera, new Edge
25var chromeRegex = /^\s*at (?:(.*?) ?\((?:address at )?)?((?:file|https?|blob|chrome-extension|address|native|eval|webpack|<anonymous>|[-a-z]+:|.*bundle|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i;
26var chromeEvalRegex = /\((\S*)(?::(\d+))(?::(\d+))\)/;
27var chrome = function (line) {
28 var parts = chromeRegex.exec(line);
29 if (parts) {
30 var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line
31 if (isEval) {
32 var subMatch = chromeEvalRegex.exec(parts[2]);
33 if (subMatch) {
34 // throw out eval line/column and use top-most line/column number
35 parts[2] = subMatch[1]; // url
36 parts[3] = subMatch[2]; // line
37 parts[4] = subMatch[3]; // column
38 }
39 }
40 // Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now
41 // would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)
42 var _a = __read(extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2]), 2), func = _a[0], filename = _a[1];
43 return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined);
44 }
45 return;
46};
47export var chromeStackParser = [CHROME_PRIORITY, chrome];
48// gecko regex: `(?:bundle|\d+\.js)`: `bundle` is for react native, `\d+\.js` also but specifically for ram bundles because it
49// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js
50// We need this specific case for now because we want no other regex to match.
51var geckoREgex = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension|capacitor).*?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js)|\/[\w\-. /=]+)(?::(\d+))?(?::(\d+))?\s*$/i;
52var geckoEvalRegex = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i;
53var gecko = function (line) {
54 var _a;
55 var parts = geckoREgex.exec(line);
56 if (parts) {
57 var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;
58 if (isEval) {
59 var subMatch = geckoEvalRegex.exec(parts[3]);
60 if (subMatch) {
61 // throw out eval line/column and use top-most line number
62 parts[1] = parts[1] || 'eval';
63 parts[3] = subMatch[1];
64 parts[4] = subMatch[2];
65 parts[5] = ''; // no column when eval
66 }
67 }
68 var filename = parts[3];
69 var func = parts[1] || UNKNOWN_FUNCTION;
70 _a = __read(extractSafariExtensionDetails(func, filename), 2), func = _a[0], filename = _a[1];
71 return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined);
72 }
73 return;
74};
75export var geckoStackParser = [GECKO_PRIORITY, gecko];
76var winjsRegex = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i;
77var winjs = function (line) {
78 var parts = winjsRegex.exec(line);
79 return parts
80 ? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined)
81 : undefined;
82};
83export var winjsStackParser = [WINJS_PRIORITY, winjs];
84var opera10Regex = / line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i;
85var opera10 = function (line) {
86 var parts = opera10Regex.exec(line);
87 return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined;
88};
89export var opera10StackParser = [OPERA10_PRIORITY, opera10];
90var opera11Regex = / line (\d+), column (\d+)\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\(.*\))? in (.*):\s*$/i;
91var opera11 = function (line) {
92 var parts = opera11Regex.exec(line);
93 return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined;
94};
95export var opera11StackParser = [OPERA11_PRIORITY, opera11];
96/**
97 * Safari web extensions, starting version unknown, can produce "frames-only" stacktraces.
98 * What it means, is that instead of format like:
99 *
100 * Error: wat
101 * at function@url:row:col
102 * at function@url:row:col
103 * at function@url:row:col
104 *
105 * it produces something like:
106 *
107 * function@url:row:col
108 * function@url:row:col
109 * function@url:row:col
110 *
111 * Because of that, it won't be captured by `chrome` RegExp and will fall into `Gecko` branch.
112 * This function is extracted so that we can use it in both places without duplicating the logic.
113 * Unfortunately "just" changing RegExp is too complicated now and making it pass all tests
114 * and fix this case seems like an impossible, or at least way too time-consuming task.
115 */
116var extractSafariExtensionDetails = function (func, filename) {
117 var isSafariExtension = func.indexOf('safari-extension') !== -1;
118 var isSafariWebExtension = func.indexOf('safari-web-extension') !== -1;
119 return isSafariExtension || isSafariWebExtension
120 ? [
121 func.indexOf('@') !== -1 ? func.split('@')[0] : UNKNOWN_FUNCTION,
122 isSafariExtension ? "safari-extension:" + filename : "safari-web-extension:" + filename,
123 ]
124 : [func, filename];
125};
126//# sourceMappingURL=stack-parsers.js.map
\No newline at end of file