posthog-js 1.167.1 → 1.169.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/all-external-dependencies.js +2 -2
- package/dist/all-external-dependencies.js.map +1 -1
- package/dist/array.full.js +2 -2
- package/dist/array.full.js.map +1 -1
- package/dist/array.full.no-external.js +2 -2
- package/dist/array.full.no-external.js.map +1 -1
- package/dist/array.js +1 -1
- package/dist/array.js.map +1 -1
- package/dist/array.no-external.js +1 -1
- package/dist/array.no-external.js.map +1 -1
- package/dist/exception-autocapture.js +1 -1
- package/dist/exception-autocapture.js.map +1 -1
- package/dist/external-scripts-loader.js.map +1 -1
- package/dist/lib/src/extensions/exception-autocapture/error-conversion.d.ts +46 -2
- package/dist/lib/src/extensions/exception-autocapture/stack-trace.d.ts +5 -5
- package/dist/lib/src/extensions/replay/sessionrecording.d.ts +11 -1
- package/dist/lib/src/types.d.ts +8 -17
- package/dist/lib/src/utils/globals.d.ts +3 -2
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/module.d.ts +20 -19
- package/dist/module.full.d.ts +20 -19
- package/dist/module.full.js +2 -2
- package/dist/module.full.js.map +1 -1
- package/dist/module.full.no-external.d.ts +20 -19
- package/dist/module.full.no-external.js +2 -2
- package/dist/module.full.no-external.js.map +1 -1
- package/dist/module.js +1 -1
- package/dist/module.js.map +1 -1
- package/dist/module.no-external.d.ts +20 -19
- package/dist/module.no-external.js +1 -1
- package/dist/module.no-external.js.map +1 -1
- package/dist/recorder-v2.js.map +1 -1
- package/dist/recorder.js.map +1 -1
- package/dist/surveys-preview.js.map +1 -1
- package/dist/surveys.js.map +1 -1
- package/dist/tracing-headers.js.map +1 -1
- package/dist/web-vitals.js.map +1 -1
- package/lib/package.json +1 -1
- package/lib/src/extensions/exception-autocapture/error-conversion.d.ts +46 -2
- package/lib/src/extensions/exception-autocapture/error-conversion.js +146 -89
- package/lib/src/extensions/exception-autocapture/error-conversion.js.map +1 -1
- package/lib/src/extensions/exception-autocapture/stack-trace.d.ts +5 -5
- package/lib/src/extensions/exception-autocapture/stack-trace.js +46 -23
- package/lib/src/extensions/exception-autocapture/stack-trace.js.map +1 -1
- package/lib/src/extensions/replay/sessionrecording.d.ts +11 -1
- package/lib/src/extensions/replay/sessionrecording.js +46 -14
- package/lib/src/extensions/replay/sessionrecording.js.map +1 -1
- package/lib/src/extensions/sentry-integration.js +1 -0
- package/lib/src/extensions/sentry-integration.js.map +1 -1
- package/lib/src/posthog-core.js +23 -16
- package/lib/src/posthog-core.js.map +1 -1
- package/lib/src/types.d.ts +8 -17
- package/lib/src/types.js.map +1 -1
- package/lib/src/utils/globals.d.ts +3 -2
- package/lib/src/utils/globals.js.map +1 -1
- package/package.json +1 -1
|
@@ -27,51 +27,100 @@ var __read = (this && this.__read) || function (o, n) {
|
|
|
27
27
|
};
|
|
28
28
|
import { isDOMError, isDOMException, isError, isErrorEvent, isErrorWithStack, isEvent, isPlainObject, isPrimitive, } from './type-checking';
|
|
29
29
|
import { defaultStackParser } from './stack-trace';
|
|
30
|
-
import { isEmptyString,
|
|
30
|
+
import { isEmptyString, isString, isUndefined } from '../../utils/type-utils';
|
|
31
31
|
import { severityLevels } from '../../types';
|
|
32
32
|
/**
|
|
33
33
|
* based on the very wonderful MIT licensed Sentry SDK
|
|
34
34
|
*/
|
|
35
35
|
var ERROR_TYPES_PATTERN = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i;
|
|
36
|
-
var reactMinifiedRegexp = /Minified React error #\d+;/i;
|
|
37
|
-
function getPopSize(ex) {
|
|
38
|
-
if (ex) {
|
|
39
|
-
if (isNumber(ex.framesToPop)) {
|
|
40
|
-
return ex.framesToPop;
|
|
41
|
-
}
|
|
42
|
-
if (reactMinifiedRegexp.test(ex.message)) {
|
|
43
|
-
return 1;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return 0;
|
|
47
|
-
}
|
|
48
36
|
export function parseStackFrames(ex) {
|
|
49
37
|
// Access and store the stacktrace property before doing ANYTHING
|
|
50
38
|
// else to it because Opera is not very good at providing it
|
|
51
39
|
// reliably in other circumstances.
|
|
52
40
|
var stacktrace = ex.stacktrace || ex.stack || '';
|
|
53
|
-
var
|
|
41
|
+
var skipLines = getSkipFirstStackStringLines(ex);
|
|
54
42
|
try {
|
|
55
|
-
return defaultStackParser(stacktrace,
|
|
43
|
+
return defaultStackParser(stacktrace, skipLines);
|
|
56
44
|
}
|
|
57
45
|
catch (_a) {
|
|
58
46
|
// no-empty
|
|
59
47
|
}
|
|
60
48
|
return [];
|
|
61
49
|
}
|
|
62
|
-
|
|
50
|
+
var reactMinifiedRegexp = /Minified React error #\d+;/i;
|
|
51
|
+
/**
|
|
52
|
+
* Certain known React errors contain links that would be falsely
|
|
53
|
+
* parsed as frames. This function check for these errors and
|
|
54
|
+
* returns number of the stack string lines to skip.
|
|
55
|
+
*/
|
|
56
|
+
function getSkipFirstStackStringLines(ex) {
|
|
57
|
+
if (ex && reactMinifiedRegexp.test(ex.message)) {
|
|
58
|
+
return 1;
|
|
59
|
+
}
|
|
60
|
+
return 0;
|
|
61
|
+
}
|
|
62
|
+
function errorPropertiesFromError(error, metadata) {
|
|
63
|
+
var _a, _b;
|
|
63
64
|
var frames = parseStackFrames(error);
|
|
65
|
+
var handled = (_a = metadata === null || metadata === void 0 ? void 0 : metadata.handled) !== null && _a !== void 0 ? _a : true;
|
|
66
|
+
var synthetic = (_b = metadata === null || metadata === void 0 ? void 0 : metadata.synthetic) !== null && _b !== void 0 ? _b : false;
|
|
67
|
+
var exceptionType = (metadata === null || metadata === void 0 ? void 0 : metadata.overrideExceptionType) ? metadata.overrideExceptionType : error.name;
|
|
68
|
+
var exceptionMessage = (metadata === null || metadata === void 0 ? void 0 : metadata.overrideExceptionMessage)
|
|
69
|
+
? metadata.overrideExceptionMessage
|
|
70
|
+
: extractMessage(error);
|
|
64
71
|
return {
|
|
65
|
-
$
|
|
66
|
-
|
|
67
|
-
|
|
72
|
+
$exception_list: [
|
|
73
|
+
{
|
|
74
|
+
type: exceptionType,
|
|
75
|
+
value: exceptionMessage,
|
|
76
|
+
stacktrace: {
|
|
77
|
+
frames: frames,
|
|
78
|
+
},
|
|
79
|
+
mechanism: {
|
|
80
|
+
handled: handled,
|
|
81
|
+
synthetic: synthetic,
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
],
|
|
68
85
|
$exception_level: 'error',
|
|
69
86
|
};
|
|
70
87
|
}
|
|
71
|
-
|
|
88
|
+
/**
|
|
89
|
+
* There are cases where stacktrace.message is an Event object
|
|
90
|
+
* https://github.com/getsentry/sentry-javascript/issues/1949
|
|
91
|
+
* In this specific case we try to extract stacktrace.message.error.message
|
|
92
|
+
*/
|
|
93
|
+
export function extractMessage(err) {
|
|
94
|
+
var message = err.message;
|
|
95
|
+
if (message.error && typeof message.error.message === 'string') {
|
|
96
|
+
return message.error.message;
|
|
97
|
+
}
|
|
98
|
+
return message;
|
|
99
|
+
}
|
|
100
|
+
function errorPropertiesFromString(candidate, metadata) {
|
|
101
|
+
var _a, _b, _c;
|
|
102
|
+
// Defaults for metadata are based on what the error candidate is.
|
|
103
|
+
var handled = (_a = metadata === null || metadata === void 0 ? void 0 : metadata.handled) !== null && _a !== void 0 ? _a : true;
|
|
104
|
+
var synthetic = (_b = metadata === null || metadata === void 0 ? void 0 : metadata.synthetic) !== null && _b !== void 0 ? _b : true;
|
|
105
|
+
var exceptionType = (metadata === null || metadata === void 0 ? void 0 : metadata.overrideExceptionType)
|
|
106
|
+
? metadata.overrideExceptionType
|
|
107
|
+
: (_c = metadata === null || metadata === void 0 ? void 0 : metadata.defaultExceptionType) !== null && _c !== void 0 ? _c : 'Error';
|
|
108
|
+
var exceptionMessage = (metadata === null || metadata === void 0 ? void 0 : metadata.overrideExceptionMessage)
|
|
109
|
+
? metadata.overrideExceptionMessage
|
|
110
|
+
: candidate
|
|
111
|
+
? candidate
|
|
112
|
+
: metadata === null || metadata === void 0 ? void 0 : metadata.defaultExceptionMessage;
|
|
72
113
|
return {
|
|
73
|
-
$
|
|
74
|
-
|
|
114
|
+
$exception_list: [
|
|
115
|
+
{
|
|
116
|
+
type: exceptionType,
|
|
117
|
+
value: exceptionMessage,
|
|
118
|
+
mechanism: {
|
|
119
|
+
handled: handled,
|
|
120
|
+
synthetic: synthetic,
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
],
|
|
75
124
|
$exception_level: 'error',
|
|
76
125
|
};
|
|
77
126
|
}
|
|
@@ -102,115 +151,123 @@ function extractExceptionKeysForMessage(exception, maxLength) {
|
|
|
102
151
|
function isSeverityLevel(x) {
|
|
103
152
|
return isString(x) && !isEmptyString(x) && severityLevels.indexOf(x) >= 0;
|
|
104
153
|
}
|
|
105
|
-
function errorPropertiesFromObject(candidate) {
|
|
154
|
+
function errorPropertiesFromObject(candidate, metadata) {
|
|
155
|
+
var _a, _b;
|
|
156
|
+
// Defaults for metadata are based on what the error candidate is.
|
|
157
|
+
var handled = (_a = metadata === null || metadata === void 0 ? void 0 : metadata.handled) !== null && _a !== void 0 ? _a : true;
|
|
158
|
+
var synthetic = (_b = metadata === null || metadata === void 0 ? void 0 : metadata.synthetic) !== null && _b !== void 0 ? _b : true;
|
|
159
|
+
var exceptionType = (metadata === null || metadata === void 0 ? void 0 : metadata.overrideExceptionType)
|
|
160
|
+
? metadata.overrideExceptionType
|
|
161
|
+
: isEvent(candidate)
|
|
162
|
+
? candidate.constructor.name
|
|
163
|
+
: 'Error';
|
|
164
|
+
var exceptionMessage = (metadata === null || metadata === void 0 ? void 0 : metadata.overrideExceptionMessage)
|
|
165
|
+
? metadata.overrideExceptionMessage
|
|
166
|
+
: "Non-Error ".concat('exception', " captured with keys: ").concat(extractExceptionKeysForMessage(candidate));
|
|
106
167
|
return {
|
|
107
|
-
$
|
|
108
|
-
|
|
168
|
+
$exception_list: [
|
|
169
|
+
{
|
|
170
|
+
type: exceptionType,
|
|
171
|
+
value: exceptionMessage,
|
|
172
|
+
mechanism: {
|
|
173
|
+
handled: handled,
|
|
174
|
+
synthetic: synthetic,
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
],
|
|
109
178
|
$exception_level: isSeverityLevel(candidate.level) ? candidate.level : 'error',
|
|
110
179
|
};
|
|
111
180
|
}
|
|
112
|
-
export function errorToProperties(
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
var
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
var groups = event.match(ERROR_TYPES_PATTERN);
|
|
120
|
-
if (groups) {
|
|
121
|
-
name_1 = groups[1];
|
|
122
|
-
message = groups[2];
|
|
123
|
-
}
|
|
124
|
-
errorProperties = {
|
|
125
|
-
$exception_type: name_1,
|
|
126
|
-
$exception_message: message,
|
|
127
|
-
};
|
|
128
|
-
}
|
|
181
|
+
export function errorToProperties(
|
|
182
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
183
|
+
_a, metadata) {
|
|
184
|
+
var
|
|
185
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
186
|
+
_b = __read(_a, 5), event = _b[0], _ = _b[1], __ = _b[2], ___ = _b[3], error = _b[4];
|
|
187
|
+
var errorProperties = { $exception_list: [] };
|
|
129
188
|
var candidate = error || event;
|
|
130
189
|
if (isDOMError(candidate) || isDOMException(candidate)) {
|
|
131
190
|
// https://developer.mozilla.org/en-US/docs/Web/API/DOMError
|
|
132
191
|
// https://developer.mozilla.org/en-US/docs/Web/API/DOMException
|
|
133
192
|
var domException = candidate;
|
|
134
193
|
if (isErrorWithStack(candidate)) {
|
|
135
|
-
errorProperties = errorPropertiesFromError(candidate);
|
|
194
|
+
errorProperties = errorPropertiesFromError(candidate, metadata);
|
|
136
195
|
}
|
|
137
196
|
else {
|
|
138
|
-
var
|
|
139
|
-
var message = domException.message ? "".concat(
|
|
140
|
-
|
|
141
|
-
errorProperties
|
|
142
|
-
errorProperties.$exception_message = errorProperties.$exception_message || message;
|
|
197
|
+
var name_1 = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException');
|
|
198
|
+
var message = domException.message ? "".concat(name_1, ": ").concat(domException.message) : name_1;
|
|
199
|
+
var exceptionType = isDOMError(domException) ? 'DOMError' : 'DOMException';
|
|
200
|
+
errorProperties = errorPropertiesFromString(message, __assign(__assign({}, metadata), { overrideExceptionType: exceptionType, defaultExceptionMessage: message }));
|
|
143
201
|
}
|
|
144
202
|
if ('code' in domException) {
|
|
145
203
|
errorProperties['$exception_DOMException_code'] = "".concat(domException.code);
|
|
146
204
|
}
|
|
205
|
+
return errorProperties;
|
|
147
206
|
}
|
|
148
207
|
else if (isErrorEvent(candidate) && candidate.error) {
|
|
149
|
-
|
|
208
|
+
return errorPropertiesFromError(candidate.error, metadata);
|
|
150
209
|
}
|
|
151
210
|
else if (isError(candidate)) {
|
|
152
|
-
|
|
211
|
+
return errorPropertiesFromError(candidate, metadata);
|
|
153
212
|
}
|
|
154
213
|
else if (isPlainObject(candidate) || isEvent(candidate)) {
|
|
155
214
|
// group these by using the keys available on the object
|
|
156
215
|
var objectException = candidate;
|
|
157
|
-
|
|
158
|
-
errorProperties.$exception_is_synthetic = true;
|
|
216
|
+
return errorPropertiesFromObject(objectException);
|
|
159
217
|
}
|
|
160
|
-
else {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
// now we make sure the mandatory fields that were made optional are present
|
|
168
|
-
$exception_type: errorProperties.$exception_type || 'UnknownErrorType', $exception_message: errorProperties.$exception_message || '', $exception_level: isSeverityLevel(errorProperties.$exception_level)
|
|
169
|
-
? errorProperties.$exception_level
|
|
170
|
-
: 'error' }), (source
|
|
171
|
-
? {
|
|
172
|
-
$exception_source: source, // TODO get this from URL if not present
|
|
218
|
+
else if (isUndefined(error) && isString(event)) {
|
|
219
|
+
var name_2 = 'Error';
|
|
220
|
+
var message = event;
|
|
221
|
+
var groups = event.match(ERROR_TYPES_PATTERN);
|
|
222
|
+
if (groups) {
|
|
223
|
+
name_2 = groups[1];
|
|
224
|
+
message = groups[2];
|
|
173
225
|
}
|
|
174
|
-
|
|
226
|
+
return errorPropertiesFromString(message, __assign(__assign({}, metadata), { overrideExceptionType: name_2, defaultExceptionMessage: message }));
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
return errorPropertiesFromString(candidate, metadata);
|
|
230
|
+
}
|
|
175
231
|
}
|
|
176
232
|
export function unhandledRejectionToProperties(_a) {
|
|
177
233
|
var _b = __read(_a, 1), ev = _b[0];
|
|
234
|
+
var error = getUnhandledRejectionError(ev);
|
|
235
|
+
if (isPrimitive(error)) {
|
|
236
|
+
return errorPropertiesFromString("Non-Error promise rejection captured with value: ".concat(String(error)), {
|
|
237
|
+
handled: false,
|
|
238
|
+
synthetic: false,
|
|
239
|
+
overrideExceptionType: 'UnhandledRejection',
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
return errorToProperties([error], {
|
|
243
|
+
handled: false,
|
|
244
|
+
overrideExceptionType: 'UnhandledRejection',
|
|
245
|
+
defaultExceptionMessage: String(error),
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
function getUnhandledRejectionError(error) {
|
|
249
|
+
if (isPrimitive(error)) {
|
|
250
|
+
return error;
|
|
251
|
+
}
|
|
178
252
|
// dig the object of the rejection out of known event types
|
|
179
|
-
var error = ev;
|
|
180
253
|
try {
|
|
181
254
|
// PromiseRejectionEvents store the object of the rejection under 'reason'
|
|
182
255
|
// see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent
|
|
183
|
-
if ('reason' in
|
|
184
|
-
error
|
|
256
|
+
if ('reason' in error) {
|
|
257
|
+
return error.reason;
|
|
185
258
|
}
|
|
186
259
|
// something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents
|
|
187
260
|
// to CustomEvents, moving the `promise` and `reason` attributes of the PRE into
|
|
188
261
|
// the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec
|
|
189
262
|
// see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and
|
|
190
263
|
// https://github.com/getsentry/sentry-javascript/issues/2380
|
|
191
|
-
|
|
192
|
-
error
|
|
264
|
+
if ('detail' in error && 'reason' in error.detail) {
|
|
265
|
+
return error.detail.reason;
|
|
193
266
|
}
|
|
194
267
|
}
|
|
195
|
-
catch (
|
|
268
|
+
catch (_a) {
|
|
196
269
|
// no-empty
|
|
197
270
|
}
|
|
198
|
-
|
|
199
|
-
var errorProperties = {};
|
|
200
|
-
if (isPrimitive(error)) {
|
|
201
|
-
errorProperties = {
|
|
202
|
-
$exception_message: "Non-Error promise rejection captured with value: ".concat(String(error)),
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
206
|
-
errorProperties = errorToProperties([error]);
|
|
207
|
-
}
|
|
208
|
-
errorProperties.$exception_handled = false;
|
|
209
|
-
return __assign(__assign({}, errorProperties), {
|
|
210
|
-
// now we make sure the mandatory fields that were made optional are present
|
|
211
|
-
$exception_type: (errorProperties.$exception_type = 'UnhandledRejection'), $exception_message: (errorProperties.$exception_message =
|
|
212
|
-
errorProperties.$exception_message || ev.reason || String(error)), $exception_level: isSeverityLevel(errorProperties.$exception_level)
|
|
213
|
-
? errorProperties.$exception_level
|
|
214
|
-
: 'error' });
|
|
271
|
+
return error;
|
|
215
272
|
}
|
|
216
273
|
//# sourceMappingURL=error-conversion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-conversion.js","sourceRoot":"","sources":["../../../../src/extensions/exception-autocapture/error-conversion.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n isDOMError,\n isDOMException,\n isError,\n isErrorEvent,\n isErrorWithStack,\n isEvent,\n isPlainObject,\n isPrimitive,\n} from './type-checking'\nimport { defaultStackParser, StackFrame } from './stack-trace'\n\nimport { isEmptyString, isNumber, isString, isUndefined } from '../../utils/type-utils'\nimport { ErrorEventArgs, ErrorProperties, SeverityLevel, severityLevels } from '../../types'\n\n/**\n * based on the very wonderful MIT licensed Sentry SDK\n */\n\nconst ERROR_TYPES_PATTERN =\n /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i\n\nconst reactMinifiedRegexp = /Minified React error #\\d+;/i\n\nfunction getPopSize(ex: Error & { framesToPop?: number }): number {\n if (ex) {\n if (isNumber(ex.framesToPop)) {\n return ex.framesToPop\n }\n\n if (reactMinifiedRegexp.test(ex.message)) {\n return 1\n }\n }\n\n return 0\n}\n\nexport function parseStackFrames(ex: Error & { framesToPop?: number; stacktrace?: string }): StackFrame[] {\n // Access and store the stacktrace property before doing ANYTHING\n // else to it because Opera is not very good at providing it\n // reliably in other circumstances.\n const stacktrace = ex.stacktrace || ex.stack || ''\n\n const popSize = getPopSize(ex)\n\n try {\n return defaultStackParser(stacktrace, popSize)\n } catch {\n // no-empty\n }\n\n return []\n}\n\nfunction errorPropertiesFromError(error: Error): ErrorProperties {\n const frames = parseStackFrames(error)\n\n return {\n $exception_type: error.name,\n $exception_message: error.message,\n $exception_stack_trace_raw: JSON.stringify(frames),\n $exception_level: 'error',\n }\n}\n\nfunction errorPropertiesFromString(candidate: string): ErrorProperties {\n return {\n $exception_type: 'Error',\n $exception_message: candidate,\n $exception_level: 'error',\n }\n}\n\n/**\n * Given any captured exception, extract its keys and create a sorted\n * and truncated list that will be used inside the event message.\n * eg. `Non-error exception captured with keys: foo, bar, baz`\n */\nfunction extractExceptionKeysForMessage(exception: Record<string, unknown>, maxLength = 40): string {\n const keys = Object.keys(exception)\n keys.sort()\n\n if (!keys.length) {\n return '[object has no keys]'\n }\n\n for (let i = keys.length; i > 0; i--) {\n const serialized = keys.slice(0, i).join(', ')\n if (serialized.length > maxLength) {\n continue\n }\n if (i === keys.length) {\n return serialized\n }\n return serialized.length <= maxLength ? serialized : `${serialized.slice(0, maxLength)}...`\n }\n\n return ''\n}\n\nfunction isSeverityLevel(x: unknown): x is SeverityLevel {\n return isString(x) && !isEmptyString(x) && severityLevels.indexOf(x as SeverityLevel) >= 0\n}\n\nfunction errorPropertiesFromObject(candidate: Record<string, unknown>): ErrorProperties {\n return {\n $exception_type: isEvent(candidate) ? candidate.constructor.name : 'Error',\n $exception_message: `Non-Error ${'exception'} captured with keys: ${extractExceptionKeysForMessage(candidate)}`,\n $exception_level: isSeverityLevel(candidate.level) ? candidate.level : 'error',\n }\n}\n\nexport function errorToProperties([event, source, lineno, colno, error]: ErrorEventArgs): ErrorProperties {\n // some properties are not optional but, it's useful to start off without them enforced\n let errorProperties: Omit<ErrorProperties, '$exception_type' | '$exception_message' | '$exception_level'> & {\n $exception_type?: string\n $exception_message?: string\n $exception_level?: string\n } = {}\n\n if (isUndefined(error) && isString(event)) {\n let name = 'Error'\n let message = event\n const groups = event.match(ERROR_TYPES_PATTERN)\n if (groups) {\n name = groups[1]\n message = groups[2]\n }\n errorProperties = {\n $exception_type: name,\n $exception_message: message,\n }\n }\n\n const candidate = error || event\n\n if (isDOMError(candidate) || isDOMException(candidate)) {\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n\n const domException = candidate as unknown as DOMException\n\n if (isErrorWithStack(candidate)) {\n errorProperties = errorPropertiesFromError(candidate as Error)\n } else {\n const name = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException')\n const message = domException.message ? `${name}: ${domException.message}` : name\n errorProperties = errorPropertiesFromString(message)\n errorProperties.$exception_type = isDOMError(domException) ? 'DOMError' : 'DOMException'\n errorProperties.$exception_message = errorProperties.$exception_message || message\n }\n if ('code' in domException) {\n errorProperties['$exception_DOMException_code'] = `${domException.code}`\n }\n } else if (isErrorEvent(candidate as ErrorEvent) && (candidate as ErrorEvent).error) {\n errorProperties = errorPropertiesFromError((candidate as ErrorEvent).error as Error)\n } else if (isError(candidate)) {\n errorProperties = errorPropertiesFromError(candidate)\n } else if (isPlainObject(candidate) || isEvent(candidate)) {\n // group these by using the keys available on the object\n const objectException = candidate as Record<string, unknown>\n errorProperties = errorPropertiesFromObject(objectException)\n errorProperties.$exception_is_synthetic = true\n } else {\n // If none of previous checks were valid, then it must be a string\n errorProperties.$exception_type = errorProperties.$exception_type || 'Error'\n errorProperties.$exception_message = errorProperties.$exception_message || candidate\n errorProperties.$exception_is_synthetic = true\n }\n\n return {\n ...errorProperties,\n // now we make sure the mandatory fields that were made optional are present\n $exception_type: errorProperties.$exception_type || 'UnknownErrorType',\n $exception_message: errorProperties.$exception_message || '',\n $exception_level: isSeverityLevel(errorProperties.$exception_level)\n ? errorProperties.$exception_level\n : 'error',\n ...(source\n ? {\n $exception_source: source, // TODO get this from URL if not present\n }\n : {}),\n ...(lineno ? { $exception_lineno: lineno } : {}),\n ...(colno ? { $exception_colno: colno } : {}),\n }\n}\n\nexport function unhandledRejectionToProperties([ev]: [ev: PromiseRejectionEvent]): ErrorProperties {\n // dig the object of the rejection out of known event types\n let error: unknown = ev\n try {\n // PromiseRejectionEvents store the object of the rejection under 'reason'\n // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n if ('reason' in ev) {\n error = ev.reason\n }\n // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents\n // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into\n // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec\n // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and\n // https://github.com/getsentry/sentry-javascript/issues/2380\n else if ('detail' in ev && 'reason' in (ev as any).detail) {\n error = (ev as any).detail.reason\n }\n } catch {\n // no-empty\n }\n\n // some properties are not optional but, it's useful to start off without them enforced\n let errorProperties: Omit<ErrorProperties, '$exception_type' | '$exception_message' | '$exception_level'> & {\n $exception_type?: string\n $exception_message?: string\n $exception_level?: string\n } = {}\n if (isPrimitive(error)) {\n errorProperties = {\n $exception_message: `Non-Error promise rejection captured with value: ${String(error)}`,\n }\n } else {\n errorProperties = errorToProperties([error as string | Event])\n }\n errorProperties.$exception_handled = false\n\n return {\n ...errorProperties,\n // now we make sure the mandatory fields that were made optional are present\n $exception_type: (errorProperties.$exception_type = 'UnhandledRejection'),\n $exception_message: (errorProperties.$exception_message =\n errorProperties.$exception_message || (ev as any).reason || String(error)),\n $exception_level: isSeverityLevel(errorProperties.$exception_level)\n ? errorProperties.$exception_level\n : 'error',\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"error-conversion.js","sourceRoot":"","sources":["../../../../src/extensions/exception-autocapture/error-conversion.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n isDOMError,\n isDOMException,\n isError,\n isErrorEvent,\n isErrorWithStack,\n isEvent,\n isPlainObject,\n isPrimitive,\n} from './type-checking'\nimport { defaultStackParser, StackFrame } from './stack-trace'\n\nimport { isEmptyString, isString, isUndefined } from '../../utils/type-utils'\nimport { ErrorEventArgs, ErrorMetadata, SeverityLevel, severityLevels } from '../../types'\n\nexport interface ErrorProperties {\n $exception_list: Exception[]\n $exception_level?: SeverityLevel\n $exception_DOMException_code?: string\n $exception_personURL?: string\n}\n\nexport interface Exception {\n type?: string\n value?: string\n mechanism?: {\n /**\n * In theory, whether or not the exception has been handled by the user. In practice, whether or not we see it before\n * it hits the global error/rejection handlers, whether through explicit handling by the user or auto instrumentation.\n */\n handled?: boolean\n type?: string\n source?: string\n /**\n * True when `captureException` is called with anything other than an instance of `Error` (or, in the case of browser,\n * an instance of `ErrorEvent`, `DOMError`, or `DOMException`). causing us to create a synthetic error in an attempt\n * to recreate the stacktrace.\n */\n synthetic?: boolean\n }\n module?: string\n thread_id?: number\n stacktrace?: {\n frames?: StackFrame[]\n }\n}\n\nexport interface ErrorConversions {\n errorToProperties: (args: ErrorEventArgs, metadata?: ErrorMetadata) => ErrorProperties\n unhandledRejectionToProperties: (args: [ev: PromiseRejectionEvent]) => ErrorProperties\n}\n/**\n * based on the very wonderful MIT licensed Sentry SDK\n */\n\nconst ERROR_TYPES_PATTERN =\n /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i\n\nexport function parseStackFrames(ex: Error & { framesToPop?: number; stacktrace?: string }): StackFrame[] {\n // Access and store the stacktrace property before doing ANYTHING\n // else to it because Opera is not very good at providing it\n // reliably in other circumstances.\n const stacktrace = ex.stacktrace || ex.stack || ''\n\n const skipLines = getSkipFirstStackStringLines(ex)\n\n try {\n return defaultStackParser(stacktrace, skipLines)\n } catch {\n // no-empty\n }\n\n return []\n}\n\nconst reactMinifiedRegexp = /Minified React error #\\d+;/i\n\n/**\n * Certain known React errors contain links that would be falsely\n * parsed as frames. This function check for these errors and\n * returns number of the stack string lines to skip.\n */\nfunction getSkipFirstStackStringLines(ex: Error): number {\n if (ex && reactMinifiedRegexp.test(ex.message)) {\n return 1\n }\n\n return 0\n}\n\nfunction errorPropertiesFromError(error: Error, metadata?: ErrorMetadata): ErrorProperties {\n const frames = parseStackFrames(error)\n\n const handled = metadata?.handled ?? true\n const synthetic = metadata?.synthetic ?? false\n\n const exceptionType = metadata?.overrideExceptionType ? metadata.overrideExceptionType : error.name\n const exceptionMessage = metadata?.overrideExceptionMessage\n ? metadata.overrideExceptionMessage\n : extractMessage(error)\n\n return {\n $exception_list: [\n {\n type: exceptionType,\n value: exceptionMessage,\n stacktrace: {\n frames,\n },\n mechanism: {\n handled,\n synthetic,\n },\n },\n ],\n $exception_level: 'error',\n }\n}\n\n/**\n * There are cases where stacktrace.message is an Event object\n * https://github.com/getsentry/sentry-javascript/issues/1949\n * In this specific case we try to extract stacktrace.message.error.message\n */\nexport function extractMessage(err: Error & { message: { error?: Error } }): string {\n const message = err.message\n\n if (message.error && typeof message.error.message === 'string') {\n return message.error.message\n }\n\n return message\n}\n\nfunction errorPropertiesFromString(candidate: string, metadata?: ErrorMetadata): ErrorProperties {\n // Defaults for metadata are based on what the error candidate is.\n const handled = metadata?.handled ?? true\n const synthetic = metadata?.synthetic ?? true\n\n const exceptionType = metadata?.overrideExceptionType\n ? metadata.overrideExceptionType\n : metadata?.defaultExceptionType ?? 'Error'\n const exceptionMessage = metadata?.overrideExceptionMessage\n ? metadata.overrideExceptionMessage\n : candidate\n ? candidate\n : metadata?.defaultExceptionMessage\n\n return {\n $exception_list: [\n {\n type: exceptionType,\n value: exceptionMessage,\n mechanism: {\n handled,\n synthetic,\n },\n },\n ],\n $exception_level: 'error',\n }\n}\n\n/**\n * Given any captured exception, extract its keys and create a sorted\n * and truncated list that will be used inside the event message.\n * eg. `Non-error exception captured with keys: foo, bar, baz`\n */\nfunction extractExceptionKeysForMessage(exception: Record<string, unknown>, maxLength = 40): string {\n const keys = Object.keys(exception)\n keys.sort()\n\n if (!keys.length) {\n return '[object has no keys]'\n }\n\n for (let i = keys.length; i > 0; i--) {\n const serialized = keys.slice(0, i).join(', ')\n if (serialized.length > maxLength) {\n continue\n }\n if (i === keys.length) {\n return serialized\n }\n return serialized.length <= maxLength ? serialized : `${serialized.slice(0, maxLength)}...`\n }\n\n return ''\n}\n\nfunction isSeverityLevel(x: unknown): x is SeverityLevel {\n return isString(x) && !isEmptyString(x) && severityLevels.indexOf(x as SeverityLevel) >= 0\n}\n\nfunction errorPropertiesFromObject(candidate: Record<string, unknown>, metadata?: ErrorMetadata): ErrorProperties {\n // Defaults for metadata are based on what the error candidate is.\n const handled = metadata?.handled ?? true\n const synthetic = metadata?.synthetic ?? true\n\n const exceptionType = metadata?.overrideExceptionType\n ? metadata.overrideExceptionType\n : isEvent(candidate)\n ? candidate.constructor.name\n : 'Error'\n const exceptionMessage = metadata?.overrideExceptionMessage\n ? metadata.overrideExceptionMessage\n : `Non-Error ${'exception'} captured with keys: ${extractExceptionKeysForMessage(candidate)}`\n\n return {\n $exception_list: [\n {\n type: exceptionType,\n value: exceptionMessage,\n mechanism: {\n handled,\n synthetic,\n },\n },\n ],\n $exception_level: isSeverityLevel(candidate.level) ? candidate.level : 'error',\n }\n}\n\nexport function errorToProperties(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n [event, _, __, ___, error]: ErrorEventArgs,\n metadata?: ErrorMetadata\n): ErrorProperties {\n let errorProperties: ErrorProperties = { $exception_list: [] }\n\n const candidate = error || event\n\n if (isDOMError(candidate) || isDOMException(candidate)) {\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n\n const domException = candidate as unknown as DOMException\n\n if (isErrorWithStack(candidate)) {\n errorProperties = errorPropertiesFromError(candidate as Error, metadata)\n } else {\n const name = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException')\n const message = domException.message ? `${name}: ${domException.message}` : name\n const exceptionType = isDOMError(domException) ? 'DOMError' : 'DOMException'\n errorProperties = errorPropertiesFromString(message, {\n ...metadata,\n overrideExceptionType: exceptionType,\n defaultExceptionMessage: message,\n })\n }\n if ('code' in domException) {\n errorProperties['$exception_DOMException_code'] = `${domException.code}`\n }\n return errorProperties\n } else if (isErrorEvent(candidate as ErrorEvent) && (candidate as ErrorEvent).error) {\n return errorPropertiesFromError((candidate as ErrorEvent).error as Error, metadata)\n } else if (isError(candidate)) {\n return errorPropertiesFromError(candidate, metadata)\n } else if (isPlainObject(candidate) || isEvent(candidate)) {\n // group these by using the keys available on the object\n const objectException = candidate as Record<string, unknown>\n return errorPropertiesFromObject(objectException)\n } else if (isUndefined(error) && isString(event)) {\n let name = 'Error'\n let message = event\n const groups = event.match(ERROR_TYPES_PATTERN)\n if (groups) {\n name = groups[1]\n message = groups[2]\n }\n\n return errorPropertiesFromString(message, {\n ...metadata,\n overrideExceptionType: name,\n defaultExceptionMessage: message,\n })\n } else {\n return errorPropertiesFromString(candidate as string, metadata)\n }\n}\n\nexport function unhandledRejectionToProperties([ev]: [ev: PromiseRejectionEvent]): ErrorProperties {\n const error = getUnhandledRejectionError(ev)\n\n if (isPrimitive(error)) {\n return errorPropertiesFromString(`Non-Error promise rejection captured with value: ${String(error)}`, {\n handled: false,\n synthetic: false,\n overrideExceptionType: 'UnhandledRejection',\n })\n }\n\n return errorToProperties([error as string | Event], {\n handled: false,\n overrideExceptionType: 'UnhandledRejection',\n defaultExceptionMessage: String(error),\n })\n}\n\nfunction getUnhandledRejectionError(error: unknown): unknown {\n if (isPrimitive(error)) {\n return error\n }\n\n // dig the object of the rejection out of known event types\n try {\n type ErrorWithReason = { reason: unknown }\n // PromiseRejectionEvents store the object of the rejection under 'reason'\n // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n if ('reason' in (error as ErrorWithReason)) {\n return (error as ErrorWithReason).reason\n }\n\n type CustomEventWithDetail = { detail: { reason: unknown } }\n // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents\n // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into\n // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec\n // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and\n // https://github.com/getsentry/sentry-javascript/issues/2380\n if ('detail' in (error as CustomEventWithDetail) && 'reason' in (error as CustomEventWithDetail).detail) {\n return (error as CustomEventWithDetail).detail.reason\n }\n } catch {\n // no-empty\n }\n\n return error\n}\n"]}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
export type StackParser = (stack: string, skipFirstLines?: number) => StackFrame[];
|
|
2
|
+
export type StackLineParserFn = (line: string) => StackFrame | undefined;
|
|
3
|
+
export type StackLineParser = [number, StackLineParserFn];
|
|
1
4
|
export interface StackFrame {
|
|
2
5
|
filename?: string;
|
|
3
6
|
function?: string;
|
|
@@ -17,15 +20,12 @@ export interface StackFrame {
|
|
|
17
20
|
};
|
|
18
21
|
debug_id?: string;
|
|
19
22
|
}
|
|
20
|
-
export type StackParser = (stack: string, skipFirst?: number) => StackFrame[];
|
|
21
|
-
export type StackLineParserFn = (line: string) => StackFrame | undefined;
|
|
22
|
-
export type StackLineParser = [number, StackLineParserFn];
|
|
23
23
|
export declare const chromeStackLineParser: StackLineParser;
|
|
24
24
|
export declare const geckoStackLineParser: StackLineParser;
|
|
25
25
|
export declare const winjsStackLineParser: StackLineParser;
|
|
26
26
|
export declare const opera10StackLineParser: StackLineParser;
|
|
27
27
|
export declare const opera11StackLineParser: StackLineParser;
|
|
28
28
|
export declare const defaultStackLineParsers: StackLineParser[];
|
|
29
|
-
export declare function reverse(stack: ReadonlyArray<StackFrame>): StackFrame[];
|
|
30
|
-
export declare function createStackParser(...parsers: StackLineParser[]): StackParser;
|
|
31
29
|
export declare const defaultStackParser: StackParser;
|
|
30
|
+
export declare function reverseAndStripFrames(stack: ReadonlyArray<StackFrame>): StackFrame[];
|
|
31
|
+
export declare function createStackParser(...parsers: StackLineParser[]): StackParser;
|
|
@@ -27,6 +27,15 @@ var __read = (this && this.__read) || function (o, n) {
|
|
|
27
27
|
}
|
|
28
28
|
return ar;
|
|
29
29
|
};
|
|
30
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
31
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
32
|
+
if (ar || !(i in from)) {
|
|
33
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
34
|
+
ar[i] = from[i];
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
38
|
+
};
|
|
30
39
|
var __values = (this && this.__values) || function(o) {
|
|
31
40
|
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
32
41
|
if (m) return m.call(o);
|
|
@@ -38,15 +47,6 @@ var __values = (this && this.__values) || function(o) {
|
|
|
38
47
|
};
|
|
39
48
|
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
40
49
|
};
|
|
41
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
42
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
43
|
-
if (ar || !(i in from)) {
|
|
44
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
45
|
-
ar[i] = from[i];
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
49
|
-
};
|
|
50
50
|
// This was originally forked from https://github.com/csnover/TraceKit, and was largely
|
|
51
51
|
// re-written as part of raven - js.
|
|
52
52
|
//
|
|
@@ -72,6 +72,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
|
72
72
|
// OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
73
73
|
import { isUndefined } from '../../utils/type-utils';
|
|
74
74
|
var WEBPACK_ERROR_REGEXP = /\(error: (.*)\)/;
|
|
75
|
+
var STRIP_FRAME_REGEXP = /captureException/;
|
|
75
76
|
var STACKTRACE_FRAME_LIMIT = 50;
|
|
76
77
|
var UNKNOWN_FUNCTION = '?';
|
|
77
78
|
var OPERA10_PRIORITY = 10;
|
|
@@ -82,7 +83,7 @@ var GECKO_PRIORITY = 50;
|
|
|
82
83
|
function createFrame(filename, func, lineno, colno) {
|
|
83
84
|
var frame = {
|
|
84
85
|
filename: filename,
|
|
85
|
-
function: func,
|
|
86
|
+
function: func === '<anonymous>' ? UNKNOWN_FUNCTION : func,
|
|
86
87
|
in_app: true, // All browser frames are considered in_app
|
|
87
88
|
};
|
|
88
89
|
if (!isUndefined(lineno)) {
|
|
@@ -93,10 +94,23 @@ function createFrame(filename, func, lineno, colno) {
|
|
|
93
94
|
}
|
|
94
95
|
return frame;
|
|
95
96
|
}
|
|
96
|
-
//
|
|
97
|
+
// This regex matches frames that have no function name (ie. are at the top level of a module).
|
|
98
|
+
// For example "at http://localhost:5000//script.js:1:126"
|
|
99
|
+
// Frames _with_ function names usually look as follows: "at commitLayoutEffects (react-dom.development.js:23426:1)"
|
|
100
|
+
var chromeRegexNoFnName = /^\s*at (\S+?)(?::(\d+))(?::(\d+))\s*$/i;
|
|
101
|
+
// This regex matches all the frames that have a function name.
|
|
97
102
|
var chromeRegex = /^\s*at (?:(.+?\)(?: \[.+\])?|.*?) ?\((?:address at )?)?(?:async )?((?:<anonymous>|[-a-z]+:|.*bundle|\/)?.*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i;
|
|
98
103
|
var chromeEvalRegex = /\((\S*)(?::(\d+))(?::(\d+))\)/;
|
|
99
|
-
|
|
104
|
+
// Chromium based browsers: Chrome, Brave, new Opera, new Edge
|
|
105
|
+
// We cannot call this variable `chrome` because it can conflict with global `chrome` variable in certain environments
|
|
106
|
+
// See: https://github.com/getsentry/sentry-javascript/issues/6880
|
|
107
|
+
var chromeStackParserFn = function (line) {
|
|
108
|
+
// If the stack line has no function name, we need to parse it differently
|
|
109
|
+
var noFnParts = chromeRegexNoFnName.exec(line);
|
|
110
|
+
if (noFnParts) {
|
|
111
|
+
var _a = __read(noFnParts, 4), filename = _a[1], line_1 = _a[2], col = _a[3];
|
|
112
|
+
return createFrame(filename, UNKNOWN_FUNCTION, +line_1, +col);
|
|
113
|
+
}
|
|
100
114
|
var parts = chromeRegex.exec(line);
|
|
101
115
|
if (parts) {
|
|
102
116
|
var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line
|
|
@@ -111,12 +125,12 @@ var chrome = function (line) {
|
|
|
111
125
|
}
|
|
112
126
|
// Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now
|
|
113
127
|
// would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)
|
|
114
|
-
var
|
|
128
|
+
var _b = __read(extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2]), 2), func = _b[0], filename = _b[1];
|
|
115
129
|
return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined);
|
|
116
130
|
}
|
|
117
131
|
return;
|
|
118
132
|
};
|
|
119
|
-
export var chromeStackLineParser = [CHROME_PRIORITY,
|
|
133
|
+
export var chromeStackLineParser = [CHROME_PRIORITY, chromeStackParserFn];
|
|
120
134
|
// gecko regex: `(?:bundle|\d+\.js)`: `bundle` is for react native, `\d+\.js` also but specifically for ram bundles because it
|
|
121
135
|
// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js
|
|
122
136
|
// We need this specific case for now because we want no other regex to match.
|
|
@@ -165,14 +179,24 @@ var opera11 = function (line) {
|
|
|
165
179
|
return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined;
|
|
166
180
|
};
|
|
167
181
|
export var opera11StackLineParser = [OPERA11_PRIORITY, opera11];
|
|
168
|
-
export var defaultStackLineParsers = [chromeStackLineParser, geckoStackLineParser
|
|
169
|
-
export
|
|
182
|
+
export var defaultStackLineParsers = [chromeStackLineParser, geckoStackLineParser];
|
|
183
|
+
export var defaultStackParser = createStackParser.apply(void 0, __spreadArray([], __read(defaultStackLineParsers), false));
|
|
184
|
+
export function reverseAndStripFrames(stack) {
|
|
170
185
|
if (!stack.length) {
|
|
171
186
|
return [];
|
|
172
187
|
}
|
|
173
|
-
var localStack =
|
|
188
|
+
var localStack = Array.from(stack);
|
|
174
189
|
localStack.reverse();
|
|
175
|
-
|
|
190
|
+
if (STRIP_FRAME_REGEXP.test(getLastStackFrame(localStack).function || '')) {
|
|
191
|
+
localStack.pop();
|
|
192
|
+
if (STRIP_FRAME_REGEXP.test(getLastStackFrame(localStack).function || '')) {
|
|
193
|
+
localStack.pop();
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return localStack.slice(0, STACKTRACE_FRAME_LIMIT).map(function (frame) { return (__assign(__assign({}, frame), { filename: frame.filename || getLastStackFrame(localStack).filename, function: frame.function || UNKNOWN_FUNCTION })); });
|
|
197
|
+
}
|
|
198
|
+
function getLastStackFrame(arr) {
|
|
199
|
+
return arr[arr.length - 1] || {};
|
|
176
200
|
}
|
|
177
201
|
export function createStackParser() {
|
|
178
202
|
var parsers = [];
|
|
@@ -180,12 +204,12 @@ export function createStackParser() {
|
|
|
180
204
|
parsers[_i] = arguments[_i];
|
|
181
205
|
}
|
|
182
206
|
var sortedParsers = parsers.sort(function (a, b) { return a[0] - b[0]; }).map(function (p) { return p[1]; });
|
|
183
|
-
return function (stack,
|
|
207
|
+
return function (stack, skipFirstLines) {
|
|
184
208
|
var e_1, _a;
|
|
185
|
-
if (
|
|
209
|
+
if (skipFirstLines === void 0) { skipFirstLines = 0; }
|
|
186
210
|
var frames = [];
|
|
187
211
|
var lines = stack.split('\n');
|
|
188
|
-
for (var i =
|
|
212
|
+
for (var i = skipFirstLines; i < lines.length; i++) {
|
|
189
213
|
var line = lines[i];
|
|
190
214
|
// Ignore lines over 1kb as they are unlikely to be stack frames.
|
|
191
215
|
// Many of the regular expressions use backtracking which results in run time that increases exponentially with
|
|
@@ -223,10 +247,9 @@ export function createStackParser() {
|
|
|
223
247
|
break;
|
|
224
248
|
}
|
|
225
249
|
}
|
|
226
|
-
return
|
|
250
|
+
return reverseAndStripFrames(frames);
|
|
227
251
|
};
|
|
228
252
|
}
|
|
229
|
-
export var defaultStackParser = createStackParser.apply(void 0, __spreadArray([], __read(defaultStackLineParsers), false));
|
|
230
253
|
/**
|
|
231
254
|
* Safari web extensions, starting version unknown, can produce "frames-only" stacktraces.
|
|
232
255
|
* What it means, is that instead of format like:
|