Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
128 lines
3.9 KiB
Plaintext
128 lines
3.9 KiB
Plaintext
import { normalizeStackTracePath, UNKNOWN_FUNCTION } from './stacktrace.js';
|
|
|
|
/**
|
|
* Does this filename look like it's part of the app code?
|
|
*/
|
|
function filenameIsInApp(filename, isNative = false) {
|
|
const isInternal =
|
|
isNative ||
|
|
(filename &&
|
|
// It's not internal if it's an absolute linux path
|
|
!filename.startsWith('/') &&
|
|
// It's not internal if it's an absolute windows path
|
|
!filename.match(/^[A-Z]:/) &&
|
|
// It's not internal if the path is starting with a dot
|
|
!filename.startsWith('.') &&
|
|
// It's not internal if the frame has a protocol. In node, this is usually the case if the file got pre-processed with a bundler like webpack
|
|
!filename.match(/^[a-zA-Z]([a-zA-Z0-9.\-+])*:\/\//)); // Schema from: https://stackoverflow.com/a/3641782
|
|
|
|
// in_app is all that's not an internal Node function or a module within node_modules
|
|
// note that isNative appears to return true even for node core libraries
|
|
// see https://github.com/getsentry/raven-node/issues/176
|
|
|
|
return !isInternal && filename !== undefined && !filename.includes('node_modules/');
|
|
}
|
|
|
|
/** Node Stack line parser */
|
|
function node(getModule) {
|
|
const FILENAME_MATCH = /^\s*[-]{4,}$/;
|
|
const FULL_MATCH = /at (?:async )?(?:(.+?)\s+\()?(?:(.+):(\d+):(\d+)?|([^)]+))\)?/;
|
|
const DATA_URI_MATCH = /at (?:async )?(.+?) \(data:(.*?),/;
|
|
|
|
return (line) => {
|
|
const dataUriMatch = line.match(DATA_URI_MATCH);
|
|
if (dataUriMatch) {
|
|
return {
|
|
filename: `<data:${dataUriMatch[2]}>`,
|
|
function: dataUriMatch[1],
|
|
};
|
|
}
|
|
|
|
const lineMatch = line.match(FULL_MATCH);
|
|
|
|
if (lineMatch) {
|
|
let object;
|
|
let method;
|
|
let functionName;
|
|
let typeName;
|
|
let methodName;
|
|
|
|
if (lineMatch[1]) {
|
|
functionName = lineMatch[1];
|
|
|
|
let methodStart = functionName.lastIndexOf('.');
|
|
if (functionName[methodStart - 1] === '.') {
|
|
methodStart--;
|
|
}
|
|
|
|
if (methodStart > 0) {
|
|
object = functionName.slice(0, methodStart);
|
|
method = functionName.slice(methodStart + 1);
|
|
const objectEnd = object.indexOf('.Module');
|
|
if (objectEnd > 0) {
|
|
functionName = functionName.slice(objectEnd + 1);
|
|
object = object.slice(0, objectEnd);
|
|
}
|
|
}
|
|
typeName = undefined;
|
|
}
|
|
|
|
if (method) {
|
|
typeName = object;
|
|
methodName = method;
|
|
}
|
|
|
|
if (method === '<anonymous>') {
|
|
methodName = undefined;
|
|
functionName = undefined;
|
|
}
|
|
|
|
if (functionName === undefined) {
|
|
methodName = methodName || UNKNOWN_FUNCTION;
|
|
functionName = typeName ? `${typeName}.${methodName}` : methodName;
|
|
}
|
|
|
|
let filename = normalizeStackTracePath(lineMatch[2]);
|
|
const isNative = lineMatch[5] === 'native';
|
|
|
|
if (!filename && lineMatch[5] && !isNative) {
|
|
filename = lineMatch[5];
|
|
}
|
|
|
|
return {
|
|
filename: filename ? decodeURI(filename) : undefined,
|
|
module: getModule ? getModule(filename) : undefined,
|
|
function: functionName,
|
|
lineno: _parseIntOrUndefined(lineMatch[3]),
|
|
colno: _parseIntOrUndefined(lineMatch[4]),
|
|
in_app: filenameIsInApp(filename || '', isNative),
|
|
};
|
|
}
|
|
|
|
if (line.match(FILENAME_MATCH)) {
|
|
return {
|
|
filename: line,
|
|
};
|
|
}
|
|
|
|
return undefined;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Node.js stack line parser
|
|
*
|
|
* This is in @sentry/core so it can be used from the Electron SDK in the browser for when `nodeIntegration == true`.
|
|
* This allows it to be used without referencing or importing any node specific code which causes bundlers to complain
|
|
*/
|
|
function nodeStackLineParser(getModule) {
|
|
return [90, node(getModule)];
|
|
}
|
|
|
|
function _parseIntOrUndefined(input) {
|
|
return parseInt(input || '', 10) || undefined;
|
|
}
|
|
|
|
export { filenameIsInApp, node, nodeStackLineParser };
|
|
//# sourceMappingURL=node-stack-trace.js.map
|