UNPKG

@sentry/core

Version:
125 lines (104 loc) 3.94 kB
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); const debugBuild = require('../debug-build.js'); const integration = require('../integration.js'); const is = require('../utils-hoist/is.js'); const logger = require('../utils-hoist/logger.js'); const normalize = require('../utils-hoist/normalize.js'); const object = require('../utils-hoist/object.js'); const string = require('../utils-hoist/string.js'); const INTEGRATION_NAME = 'ExtraErrorData'; /** * Extract additional data for from original exceptions. */ const _extraErrorDataIntegration = ((options = {}) => { const { depth = 3, captureErrorCause = true } = options; return { name: INTEGRATION_NAME, processEvent(event, hint, client) { const { maxValueLength = 250 } = client.getOptions(); return _enhanceEventWithErrorData(event, hint, depth, captureErrorCause, maxValueLength); }, }; }) ; const extraErrorDataIntegration = integration.defineIntegration(_extraErrorDataIntegration); function _enhanceEventWithErrorData( event, hint = {}, depth, captureErrorCause, maxValueLength, ) { if (!hint.originalException || !is.isError(hint.originalException)) { return event; } const exceptionName = (hint.originalException ).name || hint.originalException.constructor.name; const errorData = _extractErrorData(hint.originalException , captureErrorCause, maxValueLength); if (errorData) { const contexts = { ...event.contexts, }; const normalizedErrorData = normalize.normalize(errorData, depth); if (is.isPlainObject(normalizedErrorData)) { // We mark the error data as "already normalized" here, because we don't want other normalization procedures to // potentially truncate the data we just already normalized, with a certain depth setting. object.addNonEnumerableProperty(normalizedErrorData, '__sentry_skip_normalization__', true); contexts[exceptionName] = normalizedErrorData; } return { ...event, contexts, }; } return event; } /** * Extract extra information from the Error object */ function _extractErrorData( error, captureErrorCause, maxValueLength, ) { // We are trying to enhance already existing event, so no harm done if it won't succeed try { const nativeKeys = [ 'name', 'message', 'stack', 'line', 'column', 'fileName', 'lineNumber', 'columnNumber', 'toJSON', ]; const extraErrorInfo = {}; // We want only enumerable properties, thus `getOwnPropertyNames` is redundant here, as we filter keys anyway. for (const key of Object.keys(error)) { if (nativeKeys.indexOf(key) !== -1) { continue; } const value = error[key]; extraErrorInfo[key] = is.isError(value) || typeof value === 'string' ? string.truncate(`${value}`, maxValueLength) : value; } // Error.cause is a standard property that is non enumerable, we therefore need to access it separately. // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause if (captureErrorCause && error.cause !== undefined) { extraErrorInfo.cause = is.isError(error.cause) ? error.cause.toString() : error.cause; } // Check if someone attached `toJSON` method to grab even more properties (eg. axios is doing that) if (typeof error.toJSON === 'function') { const serializedError = error.toJSON() ; for (const key of Object.keys(serializedError)) { const value = serializedError[key]; extraErrorInfo[key] = is.isError(value) ? value.toString() : value; } } return extraErrorInfo; } catch (oO) { debugBuild.DEBUG_BUILD && logger.logger.error('Unable to extract extra data from the Error object:', oO); } return null; } exports.extraErrorDataIntegration = extraErrorDataIntegration; //# sourceMappingURL=extraerrordata.js.map