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.
Files changed (57) hide show
  1. package/dist/all-external-dependencies.js +2 -2
  2. package/dist/all-external-dependencies.js.map +1 -1
  3. package/dist/array.full.js +2 -2
  4. package/dist/array.full.js.map +1 -1
  5. package/dist/array.full.no-external.js +2 -2
  6. package/dist/array.full.no-external.js.map +1 -1
  7. package/dist/array.js +1 -1
  8. package/dist/array.js.map +1 -1
  9. package/dist/array.no-external.js +1 -1
  10. package/dist/array.no-external.js.map +1 -1
  11. package/dist/exception-autocapture.js +1 -1
  12. package/dist/exception-autocapture.js.map +1 -1
  13. package/dist/external-scripts-loader.js.map +1 -1
  14. package/dist/lib/src/extensions/exception-autocapture/error-conversion.d.ts +46 -2
  15. package/dist/lib/src/extensions/exception-autocapture/stack-trace.d.ts +5 -5
  16. package/dist/lib/src/extensions/replay/sessionrecording.d.ts +11 -1
  17. package/dist/lib/src/types.d.ts +8 -17
  18. package/dist/lib/src/utils/globals.d.ts +3 -2
  19. package/dist/main.js +1 -1
  20. package/dist/main.js.map +1 -1
  21. package/dist/module.d.ts +20 -19
  22. package/dist/module.full.d.ts +20 -19
  23. package/dist/module.full.js +2 -2
  24. package/dist/module.full.js.map +1 -1
  25. package/dist/module.full.no-external.d.ts +20 -19
  26. package/dist/module.full.no-external.js +2 -2
  27. package/dist/module.full.no-external.js.map +1 -1
  28. package/dist/module.js +1 -1
  29. package/dist/module.js.map +1 -1
  30. package/dist/module.no-external.d.ts +20 -19
  31. package/dist/module.no-external.js +1 -1
  32. package/dist/module.no-external.js.map +1 -1
  33. package/dist/recorder-v2.js.map +1 -1
  34. package/dist/recorder.js.map +1 -1
  35. package/dist/surveys-preview.js.map +1 -1
  36. package/dist/surveys.js.map +1 -1
  37. package/dist/tracing-headers.js.map +1 -1
  38. package/dist/web-vitals.js.map +1 -1
  39. package/lib/package.json +1 -1
  40. package/lib/src/extensions/exception-autocapture/error-conversion.d.ts +46 -2
  41. package/lib/src/extensions/exception-autocapture/error-conversion.js +146 -89
  42. package/lib/src/extensions/exception-autocapture/error-conversion.js.map +1 -1
  43. package/lib/src/extensions/exception-autocapture/stack-trace.d.ts +5 -5
  44. package/lib/src/extensions/exception-autocapture/stack-trace.js +46 -23
  45. package/lib/src/extensions/exception-autocapture/stack-trace.js.map +1 -1
  46. package/lib/src/extensions/replay/sessionrecording.d.ts +11 -1
  47. package/lib/src/extensions/replay/sessionrecording.js +46 -14
  48. package/lib/src/extensions/replay/sessionrecording.js.map +1 -1
  49. package/lib/src/extensions/sentry-integration.js +1 -0
  50. package/lib/src/extensions/sentry-integration.js.map +1 -1
  51. package/lib/src/posthog-core.js +23 -16
  52. package/lib/src/posthog-core.js.map +1 -1
  53. package/lib/src/types.d.ts +8 -17
  54. package/lib/src/types.js.map +1 -1
  55. package/lib/src/utils/globals.d.ts +3 -2
  56. package/lib/src/utils/globals.js.map +1 -1
  57. 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, isNumber, isString, isUndefined } from '../../utils/type-utils';
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 popSize = getPopSize(ex);
41
+ var skipLines = getSkipFirstStackStringLines(ex);
54
42
  try {
55
- return defaultStackParser(stacktrace, popSize);
43
+ return defaultStackParser(stacktrace, skipLines);
56
44
  }
57
45
  catch (_a) {
58
46
  // no-empty
59
47
  }
60
48
  return [];
61
49
  }
62
- function errorPropertiesFromError(error) {
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
- $exception_type: error.name,
66
- $exception_message: error.message,
67
- $exception_stack_trace_raw: JSON.stringify(frames),
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
- function errorPropertiesFromString(candidate) {
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
- $exception_type: 'Error',
74
- $exception_message: candidate,
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
- $exception_type: isEvent(candidate) ? candidate.constructor.name : 'Error',
108
- $exception_message: "Non-Error ".concat('exception', " captured with keys: ").concat(extractExceptionKeysForMessage(candidate)),
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(_a) {
113
- var _b = __read(_a, 5), event = _b[0], source = _b[1], lineno = _b[2], colno = _b[3], error = _b[4];
114
- // some properties are not optional but, it's useful to start off without them enforced
115
- var errorProperties = {};
116
- if (isUndefined(error) && isString(event)) {
117
- var name_1 = 'Error';
118
- var message = event;
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 name_2 = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException');
139
- var message = domException.message ? "".concat(name_2, ": ").concat(domException.message) : name_2;
140
- errorProperties = errorPropertiesFromString(message);
141
- errorProperties.$exception_type = isDOMError(domException) ? 'DOMError' : 'DOMException';
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
- errorProperties = errorPropertiesFromError(candidate.error);
208
+ return errorPropertiesFromError(candidate.error, metadata);
150
209
  }
151
210
  else if (isError(candidate)) {
152
- errorProperties = errorPropertiesFromError(candidate);
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
- errorProperties = errorPropertiesFromObject(objectException);
158
- errorProperties.$exception_is_synthetic = true;
216
+ return errorPropertiesFromObject(objectException);
159
217
  }
160
- else {
161
- // If none of previous checks were valid, then it must be a string
162
- errorProperties.$exception_type = errorProperties.$exception_type || 'Error';
163
- errorProperties.$exception_message = errorProperties.$exception_message || candidate;
164
- errorProperties.$exception_is_synthetic = true;
165
- }
166
- return __assign(__assign(__assign(__assign(__assign({}, errorProperties), {
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
- : {})), (lineno ? { $exception_lineno: lineno } : {})), (colno ? { $exception_colno: colno } : {}));
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 ev) {
184
- error = ev.reason;
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
- else if ('detail' in ev && 'reason' in ev.detail) {
192
- error = ev.detail.reason;
264
+ if ('detail' in error && 'reason' in error.detail) {
265
+ return error.detail.reason;
193
266
  }
194
267
  }
195
- catch (_c) {
268
+ catch (_a) {
196
269
  // no-empty
197
270
  }
198
- // some properties are not optional but, it's useful to start off without them enforced
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
- // Chromium based browsers: Chrome, Brave, new Opera, new Edge
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
- var chrome = function (line) {
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 _a = __read(extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2]), 2), func = _a[0], filename = _a[1];
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, chrome];
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, winjsStackLineParser];
169
- export function reverse(stack) {
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 = stack.slice(0, STACKTRACE_FRAME_LIMIT);
188
+ var localStack = Array.from(stack);
174
189
  localStack.reverse();
175
- return localStack.map(function (frame) { return (__assign(__assign({}, frame), { filename: frame.filename || localStack[localStack.length - 1].filename, function: frame.function || '?' })); });
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, skipFirst) {
207
+ return function (stack, skipFirstLines) {
184
208
  var e_1, _a;
185
- if (skipFirst === void 0) { skipFirst = 0; }
209
+ if (skipFirstLines === void 0) { skipFirstLines = 0; }
186
210
  var frames = [];
187
211
  var lines = stack.split('\n');
188
- for (var i = skipFirst; i < lines.length; 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 reverse(frames);
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: