JSFiddle - React, Tailwind, and code Playground

by darthdeus

JavaScript

var data = "" +
"c@http://fiddle.jshell.net/_display/:266\n" +
"b@http://fiddle.jshell.net/_display/:262\n" +
"a@http://fiddle.jshell.net/_display/:258\n" +
"@http://fiddle.jshell.net/_display/:273\n" +
"wrap/<@http://fiddle.jshell.net/_display/:123" +
"    Error: async bug\n" +
"    at c (http://fiddle.jshell.net/darthdeus/RdghB/1/show/:265:9)\n" +
"    at b (http://fiddle.jshell.net/darthdeus/RdghB/1/show/:261:3)\n" +
"    at a (http://fiddle.jshell.net/darthdeus/RdghB/1/show/:257:3)\n" +
"    at http://fiddle.jshell.net/darthdeus/RdghB/1/show/:272:5\n" +
"    at http://fiddle.jshell.net/darthdeus/RdghB/1/show/:122:18";

var CHROME_REGEX = /at (\w+) \((.+?):(\d+):\d+\)/;

  // Safari and Firefox use the same format for stacktraces,
  // hence we can use the same regex for both
  var FIREFOX_AND_SAFARI_REGEX = /(\w+)@(.+):(\d+)/;

  var PARSERS = [FIREFOX_AND_SAFARI_REGEX, CHROME_REGEX];

  function matchStackLine(line) {
    var match;

    for (var i = 0; i < PARSERS.length; i++) {
      if (match = line.match(PARSERS[i])) {
        return match;
      }
    }
    return null;
  }

  function parseStack(stack) {
    var lines = stack.split("\n");
    var results = [];
    for (var i = 0; i < lines.length; i++) {
      var match = matchStackLine(lines[i]);
      if (match) {
        results.push({
          "function": match[1],
          "file": match[2],
          "line": match[3]
        });
      }
    }
    return results;
  }

  function joinParsedStack(lines) {
    var results = [];

    for (var i = 0; i < lines.length; i++) {
      var line = lines[i];
      results.push(line["function"] + " at " + line["file"] + ":" + line["line"]);
    }

    return results.join("\n");
  }

console.log(joinParsedStack(parseStack(data)));