stack-trace-parser.esm.js 3.4 KB

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