stack-trace-parser.cjs.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', { value: true });
  3. var UNKNOWN_FUNCTION = '<unknown>';
  4. /**
  5. * This parses the different stack traces and puts them into one format
  6. * This borrows heavily from TraceKit (https://github.com/csnover/TraceKit)
  7. */
  8. function parse(stackString) {
  9. var lines = stackString.split('\n');
  10. return lines.reduce(function (stack, line) {
  11. var parseResult = parseChrome(line) || parseWinjs(line) || parseGecko(line) || parseNode(line) || parseJSC(line);
  12. if (parseResult) {
  13. stack.push(parseResult);
  14. }
  15. return stack;
  16. }, []);
  17. }
  18. var chromeRe = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|\/|[a-z]:\\|\\\\).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i;
  19. var chromeEvalRe = /\((\S*)(?::(\d+))(?::(\d+))\)/;
  20. function parseChrome(line) {
  21. var parts = chromeRe.exec(line);
  22. if (!parts) {
  23. return null;
  24. }
  25. var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line
  26. var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line
  27. var submatch = chromeEvalRe.exec(parts[2]);
  28. if (isEval && submatch != null) {
  29. // throw out eval line/column and use top-most line/column number
  30. parts[2] = submatch[1]; // url
  31. parts[3] = submatch[2]; // line
  32. parts[4] = submatch[3]; // column
  33. }
  34. return {
  35. file: !isNative ? parts[2] : null,
  36. methodName: parts[1] || UNKNOWN_FUNCTION,
  37. arguments: isNative ? [parts[2]] : [],
  38. lineNumber: parts[3] ? +parts[3] : null,
  39. column: parts[4] ? +parts[4] : null
  40. };
  41. }
  42. var winjsRe = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i;
  43. function parseWinjs(line) {
  44. var parts = winjsRe.exec(line);
  45. if (!parts) {
  46. return null;
  47. }
  48. return {
  49. file: parts[2],
  50. methodName: parts[1] || UNKNOWN_FUNCTION,
  51. arguments: [],
  52. lineNumber: +parts[3],
  53. column: parts[4] ? +parts[4] : null
  54. };
  55. }
  56. var geckoRe = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\[native).*?|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i;
  57. var geckoEvalRe = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i;
  58. function parseGecko(line) {
  59. var parts = geckoRe.exec(line);
  60. if (!parts) {
  61. return null;
  62. }
  63. var isEval = parts[3] && parts[3].indexOf(' > eval') > -1;
  64. var submatch = geckoEvalRe.exec(parts[3]);
  65. if (isEval && submatch != null) {
  66. // throw out eval line/column and use top-most line number
  67. parts[3] = submatch[1];
  68. parts[4] = submatch[2];
  69. parts[5] = null; // no column when eval
  70. }
  71. return {
  72. file: parts[3],
  73. methodName: parts[1] || UNKNOWN_FUNCTION,
  74. arguments: parts[2] ? parts[2].split(',') : [],
  75. lineNumber: parts[4] ? +parts[4] : null,
  76. column: parts[5] ? +parts[5] : null
  77. };
  78. }
  79. var javaScriptCoreRe = /^\s*(?:([^@]*)(?:\((.*?)\))?@)?(\S.*?):(\d+)(?::(\d+))?\s*$/i;
  80. function parseJSC(line) {
  81. var parts = javaScriptCoreRe.exec(line);
  82. if (!parts) {
  83. return null;
  84. }
  85. return {
  86. file: parts[3],
  87. methodName: parts[1] || UNKNOWN_FUNCTION,
  88. arguments: [],
  89. lineNumber: +parts[4],
  90. column: parts[5] ? +parts[5] : null
  91. };
  92. }
  93. var nodeRe = /^\s*at (?:((?:\[object object\])?[^\\/]+(?: \[as \S+\])?) )?\(?(.*?):(\d+)(?::(\d+))?\)?\s*$/i;
  94. function parseNode(line) {
  95. var parts = nodeRe.exec(line);
  96. if (!parts) {
  97. return null;
  98. }
  99. return {
  100. file: parts[2],
  101. methodName: parts[1] || UNKNOWN_FUNCTION,
  102. arguments: [],
  103. lineNumber: +parts[3],
  104. column: parts[4] ? +parts[4] : null
  105. };
  106. }
  107. exports.parse = parse;