UNPKG

11.3 kBSource Map (JSON)View Raw
1{"version":3,"file":"stack-parsers.js","sources":["../../../src/stack-parsers.ts"],"sourcesContent":["import type { StackFrame, StackLineParser, StackLineParserFn } from '@sentry/types';\nimport { createStackParser } from '@sentry/utils';\n\n// global reference to slice\nconst UNKNOWN_FUNCTION = '?';\n\nconst OPERA10_PRIORITY = 10;\nconst OPERA11_PRIORITY = 20;\nconst CHROME_PRIORITY = 30;\nconst WINJS_PRIORITY = 40;\nconst GECKO_PRIORITY = 50;\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\nconst chrome: StackLineParserFn = 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\nexport const chromeStackLineParser: StackLineParser = [CHROME_PRIORITY, chrome];\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|safari-extension|safari-web-extension|capacitor)?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nconst geckoEvalRegex = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n\nconst gecko: StackLineParserFn = 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\nexport const geckoStackLineParser: StackLineParser = [GECKO_PRIORITY, gecko];\n\nconst winjsRegex =\n /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n\nconst winjs: StackLineParserFn = 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\nexport const winjsStackLineParser: StackLineParser = [WINJS_PRIORITY, winjs];\n\nconst opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i;\n\nconst opera10: StackLineParserFn = line => {\n const parts = opera10Regex.exec(line);\n return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined;\n};\n\nexport const opera10StackLineParser: StackLineParser = [OPERA10_PRIORITY, opera10];\n\nconst opera11Regex =\n / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\\(.*\\))? in (.*):\\s*$/i;\n\nconst opera11: StackLineParserFn = 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\nexport const opera11StackLineParser: StackLineParser = [OPERA11_PRIORITY, opera11];\n\nexport const defaultStackLineParsers = [chromeStackLineParser, geckoStackLineParser, winjsStackLineParser];\n\nexport const defaultStackParser = createStackParser(...defaultStackLineParsers);\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"],"names":[],"mappings":"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"}
\No newline at end of file