@sentry/browser 6.17.8-beta.0 → 6.18.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/build/bundle.es6.js +266 -340
- package/build/bundle.es6.js.map +1 -1
- package/build/bundle.es6.min.js +2 -2
- package/build/bundle.es6.min.js.map +1 -1
- package/build/bundle.js +298 -356
- package/build/bundle.js.map +1 -1
- package/build/bundle.min.js +2 -2
- package/build/bundle.min.js.map +1 -1
- package/dist/eventbuilder.d.ts.map +1 -1
- package/dist/eventbuilder.js +7 -13
- package/dist/eventbuilder.js.map +1 -1
- package/dist/integrations/linkederrors.d.ts.map +1 -1
- package/dist/integrations/linkederrors.js +1 -3
- package/dist/integrations/linkederrors.js.map +1 -1
- package/dist/parsers.d.ts +7 -7
- package/dist/parsers.d.ts.map +1 -1
- package/dist/parsers.js +55 -42
- package/dist/parsers.js.map +1 -1
- package/dist/stack-parsers.d.ts +7 -0
- package/dist/stack-parsers.d.ts.map +1 -0
- package/dist/stack-parsers.js +117 -0
- package/dist/stack-parsers.js.map +1 -0
- package/esm/eventbuilder.d.ts.map +1 -1
- package/esm/eventbuilder.js +8 -14
- package/esm/eventbuilder.js.map +1 -1
- package/esm/integrations/linkederrors.d.ts.map +1 -1
- package/esm/integrations/linkederrors.js +2 -4
- package/esm/integrations/linkederrors.js.map +1 -1
- package/esm/parsers.d.ts +7 -7
- package/esm/parsers.d.ts.map +1 -1
- package/esm/parsers.js +53 -40
- package/esm/parsers.js.map +1 -1
- package/esm/stack-parsers.d.ts +7 -0
- package/esm/stack-parsers.d.ts.map +1 -0
- package/esm/stack-parsers.js +116 -0
- package/esm/stack-parsers.js.map +1 -0
- package/package.json +4 -7
- package/dist/tracekit.d.ts +0 -23
- package/dist/tracekit.d.ts.map +0 -1
- package/dist/tracekit.js +0 -184
- package/dist/tracekit.js.map +0 -1
- package/esm/tracekit.d.ts +0 -23
- package/esm/tracekit.d.ts.map +0 -1
- package/esm/tracekit.js +0 -182
- package/esm/tracekit.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventbuilder.d.ts","sourceRoot":"","sources":["../src/eventbuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"eventbuilder.d.ts","sourceRoot":"","sources":["../src/eventbuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAepE;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,CAW7G;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,QAAwB,EAC/B,IAAI,CAAC,EAAE,SAAS,GACf,WAAW,CAAC,KAAK,CAAC,CAUpB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,OAAO,EAClB,kBAAkB,CAAC,EAAE,KAAK,EAC1B,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACvB,GACL,KAAK,CAiEP;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,kBAAkB,CAAC,EAAE,KAAK,EAC1B,OAAO,GAAE;IACP,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACvB,GACL,KAAK,CAaP"}
|
package/dist/eventbuilder.js
CHANGED
|
@@ -3,7 +3,6 @@ var tslib_1 = require("tslib");
|
|
|
3
3
|
var types_1 = require("@sentry/types");
|
|
4
4
|
var utils_1 = require("@sentry/utils");
|
|
5
5
|
var parsers_1 = require("./parsers");
|
|
6
|
-
var tracekit_1 = require("./tracekit");
|
|
7
6
|
/**
|
|
8
7
|
* Creates an {@link Event} from all inputs to `captureException` and non-primitive inputs to `captureMessage`.
|
|
9
8
|
* @hidden
|
|
@@ -47,10 +46,7 @@ function eventFromUnknownInput(exception, syntheticException, options) {
|
|
|
47
46
|
if (utils_1.isErrorEvent(exception) && exception.error) {
|
|
48
47
|
// If it is an ErrorEvent with `error` property, extract it to get actual Error
|
|
49
48
|
var errorEvent = exception;
|
|
50
|
-
|
|
51
|
-
exception = errorEvent.error;
|
|
52
|
-
event = parsers_1.eventFromStacktrace(tracekit_1.computeStackTrace(exception));
|
|
53
|
-
return event;
|
|
49
|
+
return parsers_1.eventFromError(errorEvent.error);
|
|
54
50
|
}
|
|
55
51
|
// If it is a `DOMError` (which is a legacy API, but still supported in some browsers) then we just extract the name
|
|
56
52
|
// and message, as it doesn't provide anything else. According to the spec, all `DOMExceptions` should also be
|
|
@@ -62,7 +58,7 @@ function eventFromUnknownInput(exception, syntheticException, options) {
|
|
|
62
58
|
if (utils_1.isDOMError(exception) || utils_1.isDOMException(exception)) {
|
|
63
59
|
var domException = exception;
|
|
64
60
|
if ('stack' in exception) {
|
|
65
|
-
event = parsers_1.
|
|
61
|
+
event = parsers_1.eventFromError(exception);
|
|
66
62
|
}
|
|
67
63
|
else {
|
|
68
64
|
var name_1 = domException.name || (utils_1.isDOMError(domException) ? 'DOMError' : 'DOMException');
|
|
@@ -77,8 +73,7 @@ function eventFromUnknownInput(exception, syntheticException, options) {
|
|
|
77
73
|
}
|
|
78
74
|
if (utils_1.isError(exception)) {
|
|
79
75
|
// we have a real Error object, do nothing
|
|
80
|
-
|
|
81
|
-
return event;
|
|
76
|
+
return parsers_1.eventFromError(exception);
|
|
82
77
|
}
|
|
83
78
|
if (utils_1.isPlainObject(exception) || utils_1.isEvent(exception)) {
|
|
84
79
|
// If it's a plain object or an instance of `Event` (the built-in JS kind, not this SDK's `Event` type), serialize
|
|
@@ -117,11 +112,10 @@ function eventFromString(input, syntheticException, options) {
|
|
|
117
112
|
message: input,
|
|
118
113
|
};
|
|
119
114
|
if (options.attachStacktrace && syntheticException) {
|
|
120
|
-
var
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
};
|
|
115
|
+
var frames_1 = parsers_1.parseStackFrames(syntheticException);
|
|
116
|
+
if (frames_1.length) {
|
|
117
|
+
event.stacktrace = { frames: frames_1 };
|
|
118
|
+
}
|
|
125
119
|
}
|
|
126
120
|
return event;
|
|
127
121
|
}
|
package/dist/eventbuilder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventbuilder.js","sourceRoot":"","sources":["../src/eventbuilder.ts"],"names":[],"mappings":";;AAAA,uCAAoE;AACpE,uCAUuB;AAEvB,
|
|
1
|
+
{"version":3,"file":"eventbuilder.js","sourceRoot":"","sources":["../src/eventbuilder.ts"],"names":[],"mappings":"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","sourcesContent":["import { Event, EventHint, Options, Severity } from '@sentry/types';\nimport {\n addExceptionMechanism,\n addExceptionTypeValue,\n isDOMError,\n isDOMException,\n isError,\n isErrorEvent,\n isEvent,\n isPlainObject,\n resolvedSyncPromise,\n} from '@sentry/utils';\n\nimport { eventFromError, eventFromPlainObject, parseStackFrames } from './parsers';\n\n/**\n * Creates an {@link Event} from all inputs to `captureException` and non-primitive inputs to `captureMessage`.\n * @hidden\n */\nexport function eventFromException(options: Options, exception: unknown, hint?: EventHint): PromiseLike<Event> {\n const syntheticException = (hint && hint.syntheticException) || undefined;\n const event = eventFromUnknownInput(exception, syntheticException, {\n attachStacktrace: options.attachStacktrace,\n });\n addExceptionMechanism(event); // defaults to { type: 'generic', handled: true }\n event.level = Severity.Error;\n if (hint && hint.event_id) {\n event.event_id = hint.event_id;\n }\n return resolvedSyncPromise(event);\n}\n\n/**\n * Builds and Event from a Message\n * @hidden\n */\nexport function eventFromMessage(\n options: Options,\n message: string,\n level: Severity = Severity.Info,\n hint?: EventHint,\n): PromiseLike<Event> {\n const syntheticException = (hint && hint.syntheticException) || undefined;\n const event = eventFromString(message, syntheticException, {\n attachStacktrace: options.attachStacktrace,\n });\n event.level = level;\n if (hint && hint.event_id) {\n event.event_id = hint.event_id;\n }\n return resolvedSyncPromise(event);\n}\n\n/**\n * @hidden\n */\nexport function eventFromUnknownInput(\n exception: unknown,\n syntheticException?: Error,\n options: {\n isRejection?: boolean;\n attachStacktrace?: boolean;\n } = {},\n): Event {\n let event: Event;\n\n if (isErrorEvent(exception as ErrorEvent) && (exception as ErrorEvent).error) {\n // If it is an ErrorEvent with `error` property, extract it to get actual Error\n const errorEvent = exception as ErrorEvent;\n return eventFromError(errorEvent.error as Error);\n }\n\n // If it is a `DOMError` (which is a legacy API, but still supported in some browsers) then we just extract the name\n // and message, as it doesn't provide anything else. According to the spec, all `DOMExceptions` should also be\n // `Error`s, but that's not the case in IE11, so in that case we treat it the same as we do a `DOMError`.\n //\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n // https://webidl.spec.whatwg.org/#es-DOMException-specialness\n if (isDOMError(exception as DOMError) || isDOMException(exception as DOMException)) {\n const domException = exception as DOMException;\n\n if ('stack' in (exception as Error)) {\n event = eventFromError(exception as Error);\n } else {\n const name = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException');\n const message = domException.message ? `${name}: ${domException.message}` : name;\n event = eventFromString(message, syntheticException, options);\n addExceptionTypeValue(event, message);\n }\n if ('code' in domException) {\n event.tags = { ...event.tags, 'DOMException.code': `${domException.code}` };\n }\n\n return event;\n }\n if (isError(exception as Error)) {\n // we have a real Error object, do nothing\n return eventFromError(exception as Error);\n }\n if (isPlainObject(exception) || isEvent(exception)) {\n // If it's a plain object or an instance of `Event` (the built-in JS kind, not this SDK's `Event` type), serialize\n // it manually. This will allow us to group events based on top-level keys which is much better than creating a new\n // group on any key/value change.\n const objectException = exception as Record<string, unknown>;\n event = eventFromPlainObject(objectException, syntheticException, options.isRejection);\n addExceptionMechanism(event, {\n synthetic: true,\n });\n return event;\n }\n\n // If none of previous checks were valid, then it means that it's not:\n // - an instance of DOMError\n // - an instance of DOMException\n // - an instance of Event\n // - an instance of Error\n // - a valid ErrorEvent (one with an error property)\n // - a plain Object\n //\n // So bail out and capture it as a simple message:\n event = eventFromString(exception as string, syntheticException, options);\n addExceptionTypeValue(event, `${exception}`, undefined);\n addExceptionMechanism(event, {\n synthetic: true,\n });\n\n return event;\n}\n\n/**\n * @hidden\n */\nexport function eventFromString(\n input: string,\n syntheticException?: Error,\n options: {\n attachStacktrace?: boolean;\n } = {},\n): Event {\n const event: Event = {\n message: input,\n };\n\n if (options.attachStacktrace && syntheticException) {\n const frames = parseStackFrames(syntheticException);\n if (frames.length) {\n event.stacktrace = { frames };\n }\n }\n\n return event;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linkederrors.d.ts","sourceRoot":"","sources":["../../src/integrations/linkederrors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"linkederrors.d.ts","sourceRoot":"","sources":["../../src/integrations/linkederrors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAQxF,UAAU,mBAAmB;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,iCAAiC;AACjC,qBAAa,YAAa,YAAW,WAAW;IAC9C;;OAEG;IACH,OAAc,EAAE,EAAE,MAAM,CAAkB;IAE1C;;OAEG;IACH,SAAgB,IAAI,EAAE,MAAM,CAAmB;IAE/C;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA6B;IAElD;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;IAEtD;;OAEG;gBACgB,OAAO,GAAE,OAAO,CAAC,mBAAmB,CAAM;IAK7D;;OAEG;IACI,SAAS,IAAI,IAAI;CAMzB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,IAAI,CAOjG;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,SAAS,EAAO,GAAG,SAAS,EAAE,CAMrH"}
|
|
@@ -3,7 +3,6 @@ var tslib_1 = require("tslib");
|
|
|
3
3
|
var core_1 = require("@sentry/core");
|
|
4
4
|
var utils_1 = require("@sentry/utils");
|
|
5
5
|
var parsers_1 = require("../parsers");
|
|
6
|
-
var tracekit_1 = require("../tracekit");
|
|
7
6
|
var DEFAULT_KEY = 'cause';
|
|
8
7
|
var DEFAULT_LIMIT = 5;
|
|
9
8
|
/** Adds SDK info to an event. */
|
|
@@ -56,8 +55,7 @@ function _walkErrorTree(limit, error, key, stack) {
|
|
|
56
55
|
if (!utils_1.isInstanceOf(error[key], Error) || stack.length + 1 >= limit) {
|
|
57
56
|
return stack;
|
|
58
57
|
}
|
|
59
|
-
var
|
|
60
|
-
var exception = parsers_1.exceptionFromStacktrace(stacktrace);
|
|
58
|
+
var exception = parsers_1.exceptionFromError(error[key]);
|
|
61
59
|
return _walkErrorTree(limit, error[key], key, tslib_1.__spread([exception], stack));
|
|
62
60
|
}
|
|
63
61
|
exports._walkErrorTree = _walkErrorTree;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linkederrors.js","sourceRoot":"","sources":["../../src/integrations/linkederrors.ts"],"names":[],"mappings":";;AAAA,qCAAsE;AAEtE,uCAA6C;AAE7C,
|
|
1
|
+
{"version":3,"file":"linkederrors.js","sourceRoot":"","sources":["../../src/integrations/linkederrors.ts"],"names":[],"mappings":";;AAAA,qCAAsE;AAEtE,uCAA6C;AAE7C,sCAAgD;AAEhD,IAAM,WAAW,GAAG,OAAO,CAAC;AAC5B,IAAM,aAAa,GAAG,CAAC,CAAC;AAOxB,iCAAiC;AACjC;IAqBE;;OAEG;IACH,sBAAmB,OAA0C;QAA1C,wBAAA,EAAA,YAA0C;QAlB7D;;WAEG;QACa,SAAI,GAAW,YAAY,CAAC,EAAE,CAAC;QAgB7C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,IAAI,WAAW,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,IAAI,aAAa,CAAC;IAC/C,CAAC;IAED;;OAEG;IACI,gCAAS,GAAhB;QACE,8BAAuB,CAAC,UAAC,KAAY,EAAE,IAAgB;YACrD,IAAM,IAAI,GAAG,oBAAa,EAAE,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;YAC1D,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACtE,CAAC,CAAC,CAAC;IACL,CAAC;IApCD;;OAEG;IACW,eAAE,GAAW,cAAc,CAAC;IAkC5C,mBAAC;CAAA,AAtCD,IAsCC;AAtCY,oCAAY;AAwCzB;;GAEG;AACH,SAAgB,QAAQ,CAAC,GAAW,EAAE,KAAa,EAAE,KAAY,EAAE,IAAgB;IACjF,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,oBAAY,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,EAAE;QACxG,OAAO,KAAK,CAAC;KACd;IACD,IAAM,YAAY,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,iBAAkC,EAAE,GAAG,CAAC,CAAC;IACzF,KAAK,CAAC,SAAS,CAAC,MAAM,oBAAO,YAAY,EAAK,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACtE,OAAO,KAAK,CAAC;AACf,CAAC;AAPD,4BAOC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,KAAa,EAAE,KAAoB,EAAE,GAAW,EAAE,KAAuB;IAAvB,sBAAA,EAAA,UAAuB;IACtG,IAAI,CAAC,oBAAY,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,EAAE;QACjE,OAAO,KAAK,CAAC;KACd;IACD,IAAM,SAAS,GAAG,4BAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,OAAO,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,oBAAG,SAAS,GAAK,KAAK,EAAE,CAAC;AACvE,CAAC;AAND,wCAMC","sourcesContent":["import { addGlobalEventProcessor, getCurrentHub } from '@sentry/core';\nimport { Event, EventHint, Exception, ExtendedError, Integration } from '@sentry/types';\nimport { isInstanceOf } from '@sentry/utils';\n\nimport { exceptionFromError } from '../parsers';\n\nconst DEFAULT_KEY = 'cause';\nconst DEFAULT_LIMIT = 5;\n\ninterface LinkedErrorsOptions {\n key: string;\n limit: number;\n}\n\n/** Adds SDK info to an event. */\nexport class LinkedErrors implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = 'LinkedErrors';\n\n /**\n * @inheritDoc\n */\n public readonly name: string = LinkedErrors.id;\n\n /**\n * @inheritDoc\n */\n private readonly _key: LinkedErrorsOptions['key'];\n\n /**\n * @inheritDoc\n */\n private readonly _limit: LinkedErrorsOptions['limit'];\n\n /**\n * @inheritDoc\n */\n public constructor(options: Partial<LinkedErrorsOptions> = {}) {\n this._key = options.key || DEFAULT_KEY;\n this._limit = options.limit || DEFAULT_LIMIT;\n }\n\n /**\n * @inheritDoc\n */\n public setupOnce(): void {\n addGlobalEventProcessor((event: Event, hint?: EventHint) => {\n const self = getCurrentHub().getIntegration(LinkedErrors);\n return self ? _handler(self._key, self._limit, event, hint) : event;\n });\n }\n}\n\n/**\n * @inheritDoc\n */\nexport function _handler(key: string, limit: number, event: Event, hint?: EventHint): Event | null {\n if (!event.exception || !event.exception.values || !hint || !isInstanceOf(hint.originalException, Error)) {\n return event;\n }\n const linkedErrors = _walkErrorTree(limit, hint.originalException as ExtendedError, key);\n event.exception.values = [...linkedErrors, ...event.exception.values];\n return event;\n}\n\n/**\n * JSDOC\n */\nexport function _walkErrorTree(limit: number, error: ExtendedError, key: string, stack: Exception[] = []): Exception[] {\n if (!isInstanceOf(error[key], Error) || stack.length + 1 >= limit) {\n return stack;\n }\n const exception = exceptionFromError(error[key]);\n return _walkErrorTree(limit, error[key], key, [exception, ...stack]);\n}\n"]}
|
package/dist/parsers.d.ts
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { Event, Exception, StackFrame } from '@sentry/types';
|
|
2
|
-
import { StackTrace as TraceKitStackTrace } from './tracekit';
|
|
3
2
|
/**
|
|
4
3
|
* This function creates an exception from an TraceKitStackTrace
|
|
5
4
|
* @param stacktrace TraceKitStackTrace that will be converted to an exception
|
|
6
5
|
* @hidden
|
|
7
6
|
*/
|
|
8
|
-
export declare function
|
|
7
|
+
export declare function exceptionFromError(ex: Error): Exception;
|
|
9
8
|
/**
|
|
10
9
|
* @hidden
|
|
11
10
|
*/
|
|
@@ -13,9 +12,10 @@ export declare function eventFromPlainObject(exception: Record<string, unknown>,
|
|
|
13
12
|
/**
|
|
14
13
|
* @hidden
|
|
15
14
|
*/
|
|
16
|
-
export declare function
|
|
17
|
-
/**
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
export declare function eventFromError(ex: Error): Event;
|
|
16
|
+
/** Parses stack frames from an error */
|
|
17
|
+
export declare function parseStackFrames(ex: Error & {
|
|
18
|
+
framesToPop?: number;
|
|
19
|
+
stacktrace?: string;
|
|
20
|
+
}): StackFrame[];
|
|
21
21
|
//# sourceMappingURL=parsers.d.ts.map
|
package/dist/parsers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../src/parsers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../src/parsers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAK7D;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,KAAK,GAAG,SAAS,CAkBvD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,kBAAkB,CAAC,EAAE,KAAK,EAC1B,SAAS,CAAC,EAAE,OAAO,GAClB,KAAK,CAyBP;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,KAAK,GAAG,KAAK,CAM/C;AAED,wCAAwC;AACxC,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,KAAK,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,EAAE,CAgBxG"}
|
package/dist/parsers.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
2
2
|
var utils_1 = require("@sentry/utils");
|
|
3
|
-
var
|
|
4
|
-
var STACKTRACE_LIMIT = 50;
|
|
3
|
+
var stack_parsers_1 = require("./stack-parsers");
|
|
5
4
|
/**
|
|
6
5
|
* This function creates an exception from an TraceKitStackTrace
|
|
7
6
|
* @param stacktrace TraceKitStackTrace that will be converted to an exception
|
|
8
7
|
* @hidden
|
|
9
8
|
*/
|
|
10
|
-
function
|
|
11
|
-
|
|
9
|
+
function exceptionFromError(ex) {
|
|
10
|
+
// Get the frames first since Opera can lose the stack if we touch anything else first
|
|
11
|
+
var frames = parseStackFrames(ex);
|
|
12
12
|
var exception = {
|
|
13
|
-
type:
|
|
14
|
-
value:
|
|
13
|
+
type: ex && ex.name,
|
|
14
|
+
value: extractMessage(ex),
|
|
15
15
|
};
|
|
16
16
|
if (frames && frames.length) {
|
|
17
17
|
exception.stacktrace = { frames: frames };
|
|
@@ -21,7 +21,7 @@ function exceptionFromStacktrace(stacktrace) {
|
|
|
21
21
|
}
|
|
22
22
|
return exception;
|
|
23
23
|
}
|
|
24
|
-
exports.
|
|
24
|
+
exports.exceptionFromError = exceptionFromError;
|
|
25
25
|
/**
|
|
26
26
|
* @hidden
|
|
27
27
|
*/
|
|
@@ -40,11 +40,10 @@ function eventFromPlainObject(exception, syntheticException, rejection) {
|
|
|
40
40
|
},
|
|
41
41
|
};
|
|
42
42
|
if (syntheticException) {
|
|
43
|
-
var
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
};
|
|
43
|
+
var frames_1 = parseStackFrames(syntheticException);
|
|
44
|
+
if (frames_1.length) {
|
|
45
|
+
event.stacktrace = { frames: frames_1 };
|
|
46
|
+
}
|
|
48
47
|
}
|
|
49
48
|
return event;
|
|
50
49
|
}
|
|
@@ -52,44 +51,58 @@ exports.eventFromPlainObject = eventFromPlainObject;
|
|
|
52
51
|
/**
|
|
53
52
|
* @hidden
|
|
54
53
|
*/
|
|
55
|
-
function
|
|
56
|
-
var exception = exceptionFromStacktrace(stacktrace);
|
|
54
|
+
function eventFromError(ex) {
|
|
57
55
|
return {
|
|
58
56
|
exception: {
|
|
59
|
-
values: [
|
|
57
|
+
values: [exceptionFromError(ex)],
|
|
60
58
|
},
|
|
61
59
|
};
|
|
62
60
|
}
|
|
63
|
-
exports.
|
|
61
|
+
exports.eventFromError = eventFromError;
|
|
62
|
+
/** Parses stack frames from an error */
|
|
63
|
+
function parseStackFrames(ex) {
|
|
64
|
+
// Access and store the stacktrace property before doing ANYTHING
|
|
65
|
+
// else to it because Opera is not very good at providing it
|
|
66
|
+
// reliably in other circumstances.
|
|
67
|
+
var stacktrace = ex.stacktrace || ex.stack || '';
|
|
68
|
+
var popSize = getPopSize(ex);
|
|
69
|
+
try {
|
|
70
|
+
// The order of the parsers in important
|
|
71
|
+
return utils_1.createStackParser(stack_parsers_1.opera10, stack_parsers_1.opera11, stack_parsers_1.chrome, stack_parsers_1.winjs, stack_parsers_1.gecko)(stacktrace, popSize);
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
// no-empty
|
|
75
|
+
}
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
exports.parseStackFrames = parseStackFrames;
|
|
79
|
+
// Based on our own mapping pattern - https://github.com/getsentry/sentry/blob/9f08305e09866c8bd6d0c24f5b0aabdd7dd6c59c/src/sentry/lang/javascript/errormapping.py#L83-L108
|
|
80
|
+
var reactMinifiedRegexp = /Minified React error #\d+;/i;
|
|
81
|
+
function getPopSize(ex) {
|
|
82
|
+
if (ex) {
|
|
83
|
+
if (typeof ex.framesToPop === 'number') {
|
|
84
|
+
return ex.framesToPop;
|
|
85
|
+
}
|
|
86
|
+
if (reactMinifiedRegexp.test(ex.message)) {
|
|
87
|
+
return 1;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return 0;
|
|
91
|
+
}
|
|
64
92
|
/**
|
|
65
|
-
*
|
|
93
|
+
* There are cases where stacktrace.message is an Event object
|
|
94
|
+
* https://github.com/getsentry/sentry-javascript/issues/1949
|
|
95
|
+
* In this specific case we try to extract stacktrace.message.error.message
|
|
66
96
|
*/
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
var firstFrameFunction = localStack[0].function || '';
|
|
73
|
-
var lastFrameFunction = localStack[localStack.length - 1].function || '';
|
|
74
|
-
// If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call)
|
|
75
|
-
if (firstFrameFunction.indexOf('captureMessage') !== -1 || firstFrameFunction.indexOf('captureException') !== -1) {
|
|
76
|
-
localStack = localStack.slice(1);
|
|
97
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
98
|
+
function extractMessage(ex) {
|
|
99
|
+
var message = ex && ex.message;
|
|
100
|
+
if (!message) {
|
|
101
|
+
return 'No error message';
|
|
77
102
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
localStack = localStack.slice(0, -1);
|
|
103
|
+
if (message.error && typeof message.error.message === 'string') {
|
|
104
|
+
return message.error.message;
|
|
81
105
|
}
|
|
82
|
-
|
|
83
|
-
return localStack
|
|
84
|
-
.slice(0, STACKTRACE_LIMIT)
|
|
85
|
-
.map(function (frame) { return ({
|
|
86
|
-
filename: frame.filename || localStack[0].filename,
|
|
87
|
-
function: frame.function || '?',
|
|
88
|
-
lineno: frame.lineno,
|
|
89
|
-
colno: frame.colno,
|
|
90
|
-
in_app: true,
|
|
91
|
-
}); })
|
|
92
|
-
.reverse();
|
|
106
|
+
return message;
|
|
93
107
|
}
|
|
94
|
-
exports.prepareFramesForEvent = prepareFramesForEvent;
|
|
95
108
|
//# sourceMappingURL=parsers.js.map
|
package/dist/parsers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parsers.js","sourceRoot":"","sources":["../src/parsers.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"parsers.js","sourceRoot":"","sources":["../src/parsers.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\nimport { Event, Exception, StackFrame } from '@sentry/types';\nimport { createStackParser, extractExceptionKeysForMessage, isEvent, normalizeToSize } from '@sentry/utils';\n\nimport { chrome, gecko, opera10, opera11, winjs } from './stack-parsers';\n\n/**\n * This function creates an exception from an TraceKitStackTrace\n * @param stacktrace TraceKitStackTrace that will be converted to an exception\n * @hidden\n */\nexport function exceptionFromError(ex: Error): Exception {\n // Get the frames first since Opera can lose the stack if we touch anything else first\n const frames = parseStackFrames(ex);\n\n const exception: Exception = {\n type: ex && ex.name,\n value: extractMessage(ex),\n };\n\n if (frames && frames.length) {\n exception.stacktrace = { frames };\n }\n\n if (exception.type === undefined && exception.value === '') {\n exception.value = 'Unrecoverable error caught';\n }\n\n return exception;\n}\n\n/**\n * @hidden\n */\nexport function eventFromPlainObject(\n exception: Record<string, unknown>,\n syntheticException?: Error,\n rejection?: boolean,\n): Event {\n const event: Event = {\n exception: {\n values: [\n {\n type: isEvent(exception) ? exception.constructor.name : rejection ? 'UnhandledRejection' : 'Error',\n value: `Non-Error ${\n rejection ? 'promise rejection' : 'exception'\n } captured with keys: ${extractExceptionKeysForMessage(exception)}`,\n },\n ],\n },\n extra: {\n __serialized__: normalizeToSize(exception),\n },\n };\n\n if (syntheticException) {\n const frames = parseStackFrames(syntheticException);\n if (frames.length) {\n event.stacktrace = { frames };\n }\n }\n\n return event;\n}\n\n/**\n * @hidden\n */\nexport function eventFromError(ex: Error): Event {\n return {\n exception: {\n values: [exceptionFromError(ex)],\n },\n };\n}\n\n/** Parses stack frames from an error */\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 // The order of the parsers in important\n return createStackParser(opera10, opera11, chrome, winjs, gecko)(stacktrace, popSize);\n } catch (e) {\n // no-empty\n }\n\n return [];\n}\n\n// Based on our own mapping pattern - https://github.com/getsentry/sentry/blob/9f08305e09866c8bd6d0c24f5b0aabdd7dd6c59c/src/sentry/lang/javascript/errormapping.py#L83-L108\nconst reactMinifiedRegexp = /Minified React error #\\d+;/i;\n\nfunction getPopSize(ex: Error & { framesToPop?: number }): number {\n if (ex) {\n if (typeof ex.framesToPop === 'number') {\n return ex.framesToPop;\n }\n\n if (reactMinifiedRegexp.test(ex.message)) {\n return 1;\n }\n }\n\n return 0;\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 */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction extractMessage(ex: any): string {\n const message = ex && ex.message;\n if (!message) {\n return 'No error message';\n }\n if (message.error && typeof message.error.message === 'string') {\n return message.error.message;\n }\n return message;\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { StackLineParser } from '@sentry/utils';
|
|
2
|
+
export declare const chrome: StackLineParser;
|
|
3
|
+
export declare const gecko: StackLineParser;
|
|
4
|
+
export declare const winjs: StackLineParser;
|
|
5
|
+
export declare const opera10: StackLineParser;
|
|
6
|
+
export declare const opera11: StackLineParser;
|
|
7
|
+
//# sourceMappingURL=stack-parsers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack-parsers.d.ts","sourceRoot":"","sources":["../src/stack-parsers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AA6BhD,eAAO,MAAM,MAAM,EAAE,eAyBpB,CAAC;AASF,eAAO,MAAM,KAAK,EAAE,eAyBnB,CAAC;AAKF,eAAO,MAAM,KAAK,EAAE,eAMnB,CAAC;AAIF,eAAO,MAAM,OAAO,EAAE,eAGrB,CAAC;AAKF,eAAO,MAAM,OAAO,EAAE,eAGrB,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
2
|
+
var tslib_1 = require("tslib");
|
|
3
|
+
// global reference to slice
|
|
4
|
+
var UNKNOWN_FUNCTION = '?';
|
|
5
|
+
function createFrame(filename, func, lineno, colno) {
|
|
6
|
+
var frame = {
|
|
7
|
+
filename: filename,
|
|
8
|
+
function: func,
|
|
9
|
+
// All browser frames are considered in_app
|
|
10
|
+
in_app: true,
|
|
11
|
+
};
|
|
12
|
+
if (lineno !== undefined) {
|
|
13
|
+
frame.lineno = lineno;
|
|
14
|
+
}
|
|
15
|
+
if (colno !== undefined) {
|
|
16
|
+
frame.colno = colno;
|
|
17
|
+
}
|
|
18
|
+
return frame;
|
|
19
|
+
}
|
|
20
|
+
// Chromium based browsers: Chrome, Brave, new Opera, new Edge
|
|
21
|
+
var chromeRegex = /^\s*at (?:(.*?) ?\((?:address at )?)?((?:file|https?|blob|chrome-extension|address|native|eval|webpack|<anonymous>|[-a-z]+:|.*bundle|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i;
|
|
22
|
+
var chromeEvalRegex = /\((\S*)(?::(\d+))(?::(\d+))\)/;
|
|
23
|
+
exports.chrome = function (line) {
|
|
24
|
+
var parts = chromeRegex.exec(line);
|
|
25
|
+
if (parts) {
|
|
26
|
+
var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line
|
|
27
|
+
if (isEval) {
|
|
28
|
+
var subMatch = chromeEvalRegex.exec(parts[2]);
|
|
29
|
+
if (subMatch) {
|
|
30
|
+
// throw out eval line/column and use top-most line/column number
|
|
31
|
+
parts[2] = subMatch[1]; // url
|
|
32
|
+
parts[3] = subMatch[2]; // line
|
|
33
|
+
parts[4] = subMatch[3]; // column
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now
|
|
37
|
+
// would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)
|
|
38
|
+
var _a = tslib_1.__read(extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2]), 2), func = _a[0], filename = _a[1];
|
|
39
|
+
return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined);
|
|
40
|
+
}
|
|
41
|
+
return;
|
|
42
|
+
};
|
|
43
|
+
// gecko regex: `(?:bundle|\d+\.js)`: `bundle` is for react native, `\d+\.js` also but specifically for ram bundles because it
|
|
44
|
+
// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js
|
|
45
|
+
// We need this specific case for now because we want no other regex to match.
|
|
46
|
+
var geckoREgex = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension|capacitor).*?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js)|\/[\w\-. /=]+)(?::(\d+))?(?::(\d+))?\s*$/i;
|
|
47
|
+
var geckoEvalRegex = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i;
|
|
48
|
+
exports.gecko = function (line) {
|
|
49
|
+
var _a;
|
|
50
|
+
var parts = geckoREgex.exec(line);
|
|
51
|
+
if (parts) {
|
|
52
|
+
var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;
|
|
53
|
+
if (isEval) {
|
|
54
|
+
var subMatch = geckoEvalRegex.exec(parts[3]);
|
|
55
|
+
if (subMatch) {
|
|
56
|
+
// throw out eval line/column and use top-most line number
|
|
57
|
+
parts[1] = parts[1] || "eval";
|
|
58
|
+
parts[3] = subMatch[1];
|
|
59
|
+
parts[4] = subMatch[2];
|
|
60
|
+
parts[5] = ''; // no column when eval
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
var filename = parts[3];
|
|
64
|
+
var func = parts[1] || UNKNOWN_FUNCTION;
|
|
65
|
+
_a = tslib_1.__read(extractSafariExtensionDetails(func, filename), 2), func = _a[0], filename = _a[1];
|
|
66
|
+
return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined);
|
|
67
|
+
}
|
|
68
|
+
return;
|
|
69
|
+
};
|
|
70
|
+
var winjsRegex = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i;
|
|
71
|
+
exports.winjs = function (line) {
|
|
72
|
+
var parts = winjsRegex.exec(line);
|
|
73
|
+
return parts
|
|
74
|
+
? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined)
|
|
75
|
+
: undefined;
|
|
76
|
+
};
|
|
77
|
+
var opera10Regex = / line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i;
|
|
78
|
+
exports.opera10 = function (line) {
|
|
79
|
+
var parts = opera10Regex.exec(line);
|
|
80
|
+
return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined;
|
|
81
|
+
};
|
|
82
|
+
var opera11Regex = / line (\d+), column (\d+)\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\(.*\))? in (.*):\s*$/i;
|
|
83
|
+
exports.opera11 = function (line) {
|
|
84
|
+
var parts = opera11Regex.exec(line);
|
|
85
|
+
return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined;
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Safari web extensions, starting version unknown, can produce "frames-only" stacktraces.
|
|
89
|
+
* What it means, is that instead of format like:
|
|
90
|
+
*
|
|
91
|
+
* Error: wat
|
|
92
|
+
* at function@url:row:col
|
|
93
|
+
* at function@url:row:col
|
|
94
|
+
* at function@url:row:col
|
|
95
|
+
*
|
|
96
|
+
* it produces something like:
|
|
97
|
+
*
|
|
98
|
+
* function@url:row:col
|
|
99
|
+
* function@url:row:col
|
|
100
|
+
* function@url:row:col
|
|
101
|
+
*
|
|
102
|
+
* Because of that, it won't be captured by `chrome` RegExp and will fall into `Gecko` branch.
|
|
103
|
+
* This function is extracted so that we can use it in both places without duplicating the logic.
|
|
104
|
+
* Unfortunately "just" changing RegExp is too complicated now and making it pass all tests
|
|
105
|
+
* and fix this case seems like an impossible, or at least way too time-consuming task.
|
|
106
|
+
*/
|
|
107
|
+
var extractSafariExtensionDetails = function (func, filename) {
|
|
108
|
+
var isSafariExtension = func.indexOf('safari-extension') !== -1;
|
|
109
|
+
var isSafariWebExtension = func.indexOf('safari-web-extension') !== -1;
|
|
110
|
+
return isSafariExtension || isSafariWebExtension
|
|
111
|
+
? [
|
|
112
|
+
func.indexOf('@') !== -1 ? func.split('@')[0] : UNKNOWN_FUNCTION,
|
|
113
|
+
isSafariExtension ? "safari-extension:" + filename : "safari-web-extension:" + filename,
|
|
114
|
+
]
|
|
115
|
+
: [func, filename];
|
|
116
|
+
};
|
|
117
|
+
//# sourceMappingURL=stack-parsers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack-parsers.js","sourceRoot":"","sources":["../src/stack-parsers.ts"],"names":[],"mappings":"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","sourcesContent":["import { StackFrame } from '@sentry/types';\nimport { StackLineParser } from '@sentry/utils';\n\n// global reference to slice\nconst UNKNOWN_FUNCTION = '?';\n\nfunction createFrame(filename: string, func: string, lineno?: number, colno?: number): StackFrame {\n const frame: StackFrame = {\n filename,\n function: func,\n // All browser frames are considered in_app\n in_app: true,\n };\n\n if (lineno !== undefined) {\n frame.lineno = lineno;\n }\n\n if (colno !== undefined) {\n frame.colno = colno;\n }\n\n return frame;\n}\n\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\nconst chromeRegex =\n /^\\s*at (?:(.*?) ?\\((?:address at )?)?((?:file|https?|blob|chrome-extension|address|native|eval|webpack|<anonymous>|[-a-z]+:|.*bundle|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\nconst chromeEvalRegex = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n\nexport const chrome: StackLineParser = line => {\n const parts = chromeRegex.exec(line);\n\n if (parts) {\n const isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n\n if (isEval) {\n const subMatch = chromeEvalRegex.exec(parts[2]);\n\n if (subMatch) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = subMatch[1]; // url\n parts[3] = subMatch[2]; // line\n parts[4] = subMatch[3]; // column\n }\n }\n\n // Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now\n // would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)\n const [func, filename] = extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2]);\n\n return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined);\n }\n\n return;\n};\n\n// gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\nconst geckoREgex =\n /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension|capacitor).*?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nconst geckoEvalRegex = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n\nexport const gecko: StackLineParser = line => {\n const parts = geckoREgex.exec(line);\n\n if (parts) {\n const isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval) {\n const subMatch = geckoEvalRegex.exec(parts[3]);\n\n if (subMatch) {\n // throw out eval line/column and use top-most line number\n parts[1] = parts[1] || `eval`;\n parts[3] = subMatch[1];\n parts[4] = subMatch[2];\n parts[5] = ''; // no column when eval\n }\n }\n\n let filename = parts[3];\n let func = parts[1] || UNKNOWN_FUNCTION;\n [func, filename] = extractSafariExtensionDetails(func, filename);\n\n return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined);\n }\n\n return;\n};\n\nconst winjsRegex =\n /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n\nexport const winjs: StackLineParser = line => {\n const parts = winjsRegex.exec(line);\n\n return parts\n ? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined)\n : undefined;\n};\n\nconst opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i;\n\nexport const opera10: StackLineParser = line => {\n const parts = opera10Regex.exec(line);\n return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined;\n};\n\nconst opera11Regex =\n / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\\(.*\\))? in (.*):\\s*$/i;\n\nexport const opera11: StackLineParser = line => {\n const parts = opera11Regex.exec(line);\n return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined;\n};\n\n/**\n * Safari web extensions, starting version unknown, can produce \"frames-only\" stacktraces.\n * What it means, is that instead of format like:\n *\n * Error: wat\n * at function@url:row:col\n * at function@url:row:col\n * at function@url:row:col\n *\n * it produces something like:\n *\n * function@url:row:col\n * function@url:row:col\n * function@url:row:col\n *\n * Because of that, it won't be captured by `chrome` RegExp and will fall into `Gecko` branch.\n * This function is extracted so that we can use it in both places without duplicating the logic.\n * Unfortunately \"just\" changing RegExp is too complicated now and making it pass all tests\n * and fix this case seems like an impossible, or at least way too time-consuming task.\n */\nconst extractSafariExtensionDetails = (func: string, filename: string): [string, string] => {\n const isSafariExtension = func.indexOf('safari-extension') !== -1;\n const isSafariWebExtension = func.indexOf('safari-web-extension') !== -1;\n\n return isSafariExtension || isSafariWebExtension\n ? [\n func.indexOf('@') !== -1 ? func.split('@')[0] : UNKNOWN_FUNCTION,\n isSafariExtension ? `safari-extension:${filename}` : `safari-web-extension:${filename}`,\n ]\n : [func, filename];\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventbuilder.d.ts","sourceRoot":"","sources":["../src/eventbuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"eventbuilder.d.ts","sourceRoot":"","sources":["../src/eventbuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAepE;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,CAW7G;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,QAAwB,EAC/B,IAAI,CAAC,EAAE,SAAS,GACf,WAAW,CAAC,KAAK,CAAC,CAUpB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,OAAO,EAClB,kBAAkB,CAAC,EAAE,KAAK,EAC1B,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACvB,GACL,KAAK,CAiEP;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,kBAAkB,CAAC,EAAE,KAAK,EAC1B,OAAO,GAAE;IACP,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACvB,GACL,KAAK,CAaP"}
|
package/esm/eventbuilder.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { __assign } from "tslib";
|
|
2
2
|
import { Severity } from '@sentry/types';
|
|
3
3
|
import { addExceptionMechanism, addExceptionTypeValue, isDOMError, isDOMException, isError, isErrorEvent, isEvent, isPlainObject, resolvedSyncPromise, } from '@sentry/utils';
|
|
4
|
-
import {
|
|
5
|
-
import { computeStackTrace } from './tracekit';
|
|
4
|
+
import { eventFromError, eventFromPlainObject, parseStackFrames } from './parsers';
|
|
6
5
|
/**
|
|
7
6
|
* Creates an {@link Event} from all inputs to `captureException` and non-primitive inputs to `captureMessage`.
|
|
8
7
|
* @hidden
|
|
@@ -44,10 +43,7 @@ export function eventFromUnknownInput(exception, syntheticException, options) {
|
|
|
44
43
|
if (isErrorEvent(exception) && exception.error) {
|
|
45
44
|
// If it is an ErrorEvent with `error` property, extract it to get actual Error
|
|
46
45
|
var errorEvent = exception;
|
|
47
|
-
|
|
48
|
-
exception = errorEvent.error;
|
|
49
|
-
event = eventFromStacktrace(computeStackTrace(exception));
|
|
50
|
-
return event;
|
|
46
|
+
return eventFromError(errorEvent.error);
|
|
51
47
|
}
|
|
52
48
|
// If it is a `DOMError` (which is a legacy API, but still supported in some browsers) then we just extract the name
|
|
53
49
|
// and message, as it doesn't provide anything else. According to the spec, all `DOMExceptions` should also be
|
|
@@ -59,7 +55,7 @@ export function eventFromUnknownInput(exception, syntheticException, options) {
|
|
|
59
55
|
if (isDOMError(exception) || isDOMException(exception)) {
|
|
60
56
|
var domException = exception;
|
|
61
57
|
if ('stack' in exception) {
|
|
62
|
-
event =
|
|
58
|
+
event = eventFromError(exception);
|
|
63
59
|
}
|
|
64
60
|
else {
|
|
65
61
|
var name_1 = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException');
|
|
@@ -74,8 +70,7 @@ export function eventFromUnknownInput(exception, syntheticException, options) {
|
|
|
74
70
|
}
|
|
75
71
|
if (isError(exception)) {
|
|
76
72
|
// we have a real Error object, do nothing
|
|
77
|
-
|
|
78
|
-
return event;
|
|
73
|
+
return eventFromError(exception);
|
|
79
74
|
}
|
|
80
75
|
if (isPlainObject(exception) || isEvent(exception)) {
|
|
81
76
|
// If it's a plain object or an instance of `Event` (the built-in JS kind, not this SDK's `Event` type), serialize
|
|
@@ -113,11 +108,10 @@ export function eventFromString(input, syntheticException, options) {
|
|
|
113
108
|
message: input,
|
|
114
109
|
};
|
|
115
110
|
if (options.attachStacktrace && syntheticException) {
|
|
116
|
-
var
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
};
|
|
111
|
+
var frames_1 = parseStackFrames(syntheticException);
|
|
112
|
+
if (frames_1.length) {
|
|
113
|
+
event.stacktrace = { frames: frames_1 };
|
|
114
|
+
}
|
|
121
115
|
}
|
|
122
116
|
return event;
|
|
123
117
|
}
|