@sentry/browser
Version:
Official Sentry SDK for browsers
51 lines (48 loc) • 1.74 kB
JavaScript
import { defineIntegration, GLOBAL_OBJ, stripUrlQueryAndFragment, addContextToFrame } from '@sentry/core/browser';
const WINDOW = GLOBAL_OBJ;
const DEFAULT_LINES_OF_CONTEXT = 7;
const INTEGRATION_NAME = "ContextLines";
const _contextLinesIntegration = ((options = {}) => {
const contextLines = options.frameContextLines != null ? options.frameContextLines : DEFAULT_LINES_OF_CONTEXT;
return {
name: INTEGRATION_NAME,
processEvent(event) {
return addSourceContext(event, contextLines);
}
};
});
const contextLinesIntegration = defineIntegration(_contextLinesIntegration);
function addSourceContext(event, contextLines) {
const doc = WINDOW.document;
const htmlFilename = WINDOW.location && stripUrlQueryAndFragment(WINDOW.location.href);
if (!doc || !htmlFilename) {
return event;
}
const exceptions = event.exception?.values;
if (!exceptions?.length) {
return event;
}
const html = doc.documentElement.innerHTML;
if (!html) {
return event;
}
const htmlLines = ["<!DOCTYPE html>", "<html>", ...html.split("\n"), "</html>"];
exceptions.forEach((exception) => {
const stacktrace = exception.stacktrace;
if (stacktrace?.frames) {
stacktrace.frames = stacktrace.frames.map(
(frame) => applySourceContextToFrame(frame, htmlLines, htmlFilename, contextLines)
);
}
});
return event;
}
function applySourceContextToFrame(frame, htmlLines, htmlFilename, linesOfContext) {
if (frame.filename !== htmlFilename || !frame.lineno || !htmlLines.length) {
return frame;
}
addContextToFrame(htmlLines, frame, linesOfContext);
return frame;
}
export { applySourceContextToFrame, contextLinesIntegration };
//# sourceMappingURL=contextlines.js.map