UNPKG

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