UNPKG

12.6 kBSource Map (JSON)View Raw
1{"version":3,"file":"stack-parsers.js","sources":["../../../src/stack-parsers.ts"],"sourcesContent":["// This was originally forked from https://github.com/csnover/TraceKit, and was largely\n// re - written as part of raven - js.\n//\n// This code was later copied to the JavaScript mono - repo and further modified and\n// refactored over the years.\n\n// Copyright (c) 2013 Onur Can Cakmak onur.cakmak@gmail.com and all TraceKit contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this\n// software and associated documentation files(the 'Software'), to deal in the Software\n// without restriction, including without limitation the rights to use, copy, modify,\n// merge, publish, distribute, sublicense, and / or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following\n// conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies\n// or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n// PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n// CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE\n// OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nimport 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 in_app: true, // All browser frames are considered in_app\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 )?)?(?:async )?((?:<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*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:[-a-z]+)?:\\/.*?|\\[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 = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:[-a-z]+):.*?):(\\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":["createStackParser"],"mappings":"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"}
\No newline at end of file