[79a0317] | 1 | // Generated by CoffeeScript 1.8.0
|
---|
| 2 | var ParsedError, prop, sysPath, _fn, _i, _len, _ref;
|
---|
| 3 |
|
---|
| 4 | sysPath = require('path');
|
---|
| 5 |
|
---|
| 6 | module.exports = ParsedError = (function() {
|
---|
| 7 | function ParsedError(error) {
|
---|
| 8 | this.error = error;
|
---|
| 9 | this._parse();
|
---|
| 10 | }
|
---|
| 11 |
|
---|
| 12 | ParsedError.prototype._parse = function() {
|
---|
| 13 | var m;
|
---|
| 14 | this._trace = [];
|
---|
| 15 | this._kind = 'Error';
|
---|
| 16 | this._wrapper = '';
|
---|
| 17 | if (this.error.wrapper != null) {
|
---|
| 18 | this._wrapper = String(this.error.wrapper);
|
---|
| 19 | }
|
---|
| 20 | if (typeof this.error !== 'object') {
|
---|
| 21 | this._message = String(this.error);
|
---|
| 22 | } else {
|
---|
| 23 | this._stack = this.error.stack;
|
---|
| 24 | if (this.error.kind != null) {
|
---|
| 25 | this._kind = String(this.error.kind);
|
---|
| 26 | } else if (typeof this._stack === 'string') {
|
---|
| 27 | if (m = this._stack.match(/^([a-zA-Z0-9\_\$]+):\ /)) {
|
---|
| 28 | this._kind = m[1];
|
---|
| 29 | }
|
---|
| 30 | }
|
---|
| 31 | this._message = (this.error.message != null) && String(this.error.message) || '';
|
---|
| 32 | if (typeof this._stack === 'string') {
|
---|
| 33 | this._parseStack();
|
---|
| 34 | }
|
---|
| 35 | }
|
---|
| 36 | };
|
---|
| 37 |
|
---|
| 38 | ParsedError.prototype._parseStack = function() {
|
---|
| 39 | var line, message, messageLines, reachedTrace, _i, _len, _ref;
|
---|
| 40 | messageLines = [];
|
---|
| 41 | reachedTrace = false;
|
---|
| 42 | _ref = this._stack.split('\n');
|
---|
| 43 | for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
---|
| 44 | line = _ref[_i];
|
---|
| 45 | if (line.trim() === '') {
|
---|
| 46 | continue;
|
---|
| 47 | }
|
---|
| 48 | if (reachedTrace) {
|
---|
| 49 | this._trace.push(this._parseTraceItem(line));
|
---|
| 50 | } else {
|
---|
| 51 | if (line.match(/^\s*at\s.+/)) {
|
---|
| 52 | reachedTrace = true;
|
---|
| 53 | this._trace.push(this._parseTraceItem(line));
|
---|
| 54 | } else if (!this._message.split('\n'.indexOf(line))) {
|
---|
| 55 | messageLines.push(line);
|
---|
| 56 | }
|
---|
| 57 | }
|
---|
| 58 | }
|
---|
| 59 | message = messageLines.join('\n');
|
---|
| 60 | if (message.substr(0, this._kind.length) === this._kind) {
|
---|
| 61 | message = message.substr(this._kind.length, message.length).replace(/^\:\s+/, '');
|
---|
| 62 | }
|
---|
| 63 | if (message.length) {
|
---|
| 64 | this._message = this._message.length ? [this._message, message].join('\n') : message;
|
---|
| 65 | }
|
---|
| 66 | };
|
---|
| 67 |
|
---|
| 68 | ParsedError.prototype._parseTraceItem = function(text) {
|
---|
| 69 | var addr, col, d, dir, file, jsCol, jsLine, line, m, original, packageName, packages, path, r, remaining, shortenedAddr, shortenedPath, what;
|
---|
| 70 | text = text.trim();
|
---|
| 71 | if (text === '') {
|
---|
| 72 | return;
|
---|
| 73 | }
|
---|
| 74 | if (!text.match(/^at\ /)) {
|
---|
| 75 | return text;
|
---|
| 76 | }
|
---|
| 77 | text = text.replace(/^at /, '');
|
---|
| 78 | if (text === 'Error (<anonymous>)' || text === 'Error (<anonymous>:null:null)') {
|
---|
| 79 | return;
|
---|
| 80 | }
|
---|
| 81 | original = text;
|
---|
| 82 | what = null;
|
---|
| 83 | addr = null;
|
---|
| 84 | path = null;
|
---|
| 85 | dir = null;
|
---|
| 86 | file = null;
|
---|
| 87 | line = null;
|
---|
| 88 | col = null;
|
---|
| 89 | jsLine = null;
|
---|
| 90 | jsCol = null;
|
---|
| 91 | shortenedPath = null;
|
---|
| 92 | shortenedAddr = null;
|
---|
| 93 | packageName = '[current]';
|
---|
| 94 | if (m = text.match(/\(([^\)]+)\)$/)) {
|
---|
| 95 | addr = m[1].trim();
|
---|
| 96 | }
|
---|
| 97 | if (addr != null) {
|
---|
| 98 | what = text.substr(0, text.length - addr.length - 2);
|
---|
| 99 | what = what.trim();
|
---|
| 100 | }
|
---|
| 101 | if (addr == null) {
|
---|
| 102 | addr = text.trim();
|
---|
| 103 | }
|
---|
| 104 | addr = this._fixPath(addr);
|
---|
| 105 | remaining = addr;
|
---|
| 106 | if (m = remaining.match(/\,\ <js>:(\d+):(\d+)$/)) {
|
---|
| 107 | jsLine = m[1];
|
---|
| 108 | jsCol = m[2];
|
---|
| 109 | remaining = remaining.substr(0, remaining.length - m[0].length);
|
---|
| 110 | }
|
---|
| 111 | if (m = remaining.match(/:(\d+):(\d+)$/)) {
|
---|
| 112 | line = m[1];
|
---|
| 113 | col = m[2];
|
---|
| 114 | remaining = remaining.substr(0, remaining.length - m[0].length);
|
---|
| 115 | path = remaining;
|
---|
| 116 | }
|
---|
| 117 | if (path != null) {
|
---|
| 118 | file = sysPath.basename(path);
|
---|
| 119 | dir = sysPath.dirname(path);
|
---|
| 120 | if (dir === '.') {
|
---|
| 121 | dir = '';
|
---|
| 122 | }
|
---|
| 123 | path = this._fixPath(path);
|
---|
| 124 | file = this._fixPath(file);
|
---|
| 125 | dir = this._fixPath(dir);
|
---|
| 126 | }
|
---|
| 127 | if (dir != null) {
|
---|
| 128 | d = dir.replace(/[\\]{1,2}/g, '/');
|
---|
| 129 | if (m = d.match(/node_modules\/([^\/]+)(?!.*node_modules.*)/)) {
|
---|
| 130 | packageName = m[1];
|
---|
| 131 | }
|
---|
| 132 | }
|
---|
| 133 | if (jsLine == null) {
|
---|
| 134 | jsLine = line;
|
---|
| 135 | jsCol = col;
|
---|
| 136 | }
|
---|
| 137 | if (path != null) {
|
---|
| 138 | r = this._rectifyPath(path);
|
---|
| 139 | shortenedPath = r.path;
|
---|
| 140 | shortenedAddr = shortenedPath + addr.substr(path.length, addr.length);
|
---|
| 141 | packages = r.packages;
|
---|
| 142 | }
|
---|
| 143 | return {
|
---|
| 144 | original: original,
|
---|
| 145 | what: what,
|
---|
| 146 | addr: addr,
|
---|
| 147 | path: path,
|
---|
| 148 | dir: dir,
|
---|
| 149 | file: file,
|
---|
| 150 | line: parseInt(line),
|
---|
| 151 | col: parseInt(col),
|
---|
| 152 | jsLine: parseInt(jsLine),
|
---|
| 153 | jsCol: parseInt(jsCol),
|
---|
| 154 | packageName: packageName,
|
---|
| 155 | shortenedPath: shortenedPath,
|
---|
| 156 | shortenedAddr: shortenedAddr,
|
---|
| 157 | packages: packages || []
|
---|
| 158 | };
|
---|
| 159 | };
|
---|
| 160 |
|
---|
| 161 | ParsedError.prototype._getMessage = function() {
|
---|
| 162 | return this._message;
|
---|
| 163 | };
|
---|
| 164 |
|
---|
| 165 | ParsedError.prototype._getKind = function() {
|
---|
| 166 | return this._kind;
|
---|
| 167 | };
|
---|
| 168 |
|
---|
| 169 | ParsedError.prototype._getWrapper = function() {
|
---|
| 170 | return this._wrapper;
|
---|
| 171 | };
|
---|
| 172 |
|
---|
| 173 | ParsedError.prototype._getStack = function() {
|
---|
| 174 | return this._stack;
|
---|
| 175 | };
|
---|
| 176 |
|
---|
| 177 | ParsedError.prototype._getArguments = function() {
|
---|
| 178 | return this.error["arguments"];
|
---|
| 179 | };
|
---|
| 180 |
|
---|
| 181 | ParsedError.prototype._getType = function() {
|
---|
| 182 | return this.error.type;
|
---|
| 183 | };
|
---|
| 184 |
|
---|
| 185 | ParsedError.prototype._getTrace = function() {
|
---|
| 186 | return this._trace;
|
---|
| 187 | };
|
---|
| 188 |
|
---|
| 189 | ParsedError.prototype._fixPath = function(path) {
|
---|
| 190 | return path.replace(/[\\]{1,2}/g, '/');
|
---|
| 191 | };
|
---|
| 192 |
|
---|
| 193 | ParsedError.prototype._rectifyPath = function(path, nameForCurrentPackage) {
|
---|
| 194 | var m, packages, parts, remaining, rest;
|
---|
| 195 | path = String(path);
|
---|
| 196 | remaining = path;
|
---|
| 197 | if (!(m = path.match(/^(.+?)\/node_modules\/(.+)$/))) {
|
---|
| 198 | return {
|
---|
| 199 | path: path,
|
---|
| 200 | packages: []
|
---|
| 201 | };
|
---|
| 202 | }
|
---|
| 203 | parts = [];
|
---|
| 204 | packages = [];
|
---|
| 205 | if (typeof nameForCurrentPackage === 'string') {
|
---|
| 206 | parts.push("[" + nameForCurrentPackage + "]");
|
---|
| 207 | packages.push("[" + nameForCurrentPackage + "]");
|
---|
| 208 | } else {
|
---|
| 209 | parts.push("[" + (m[1].match(/([^\/]+)$/)[1]) + "]");
|
---|
| 210 | packages.push(m[1].match(/([^\/]+)$/)[1]);
|
---|
| 211 | }
|
---|
| 212 | rest = m[2];
|
---|
| 213 | while (m = rest.match(/([^\/]+)\/node_modules\/(.+)$/)) {
|
---|
| 214 | parts.push("[" + m[1] + "]");
|
---|
| 215 | packages.push(m[1]);
|
---|
| 216 | rest = m[2];
|
---|
| 217 | }
|
---|
| 218 | if (m = rest.match(/([^\/]+)\/(.+)$/)) {
|
---|
| 219 | parts.push("[" + m[1] + "]");
|
---|
| 220 | packages.push(m[1]);
|
---|
| 221 | rest = m[2];
|
---|
| 222 | }
|
---|
| 223 | parts.push(rest);
|
---|
| 224 | return {
|
---|
| 225 | path: parts.join("/"),
|
---|
| 226 | packages: packages
|
---|
| 227 | };
|
---|
| 228 | };
|
---|
| 229 |
|
---|
| 230 | return ParsedError;
|
---|
| 231 |
|
---|
| 232 | })();
|
---|
| 233 |
|
---|
| 234 | _ref = ['message', 'kind', 'arguments', 'type', 'stack', 'trace', 'wrapper'];
|
---|
| 235 | _fn = function() {
|
---|
| 236 | var methodName;
|
---|
| 237 | methodName = '_get' + prop[0].toUpperCase() + prop.substr(1, prop.length);
|
---|
| 238 | return Object.defineProperty(ParsedError.prototype, prop, {
|
---|
| 239 | get: function() {
|
---|
| 240 | return this[methodName]();
|
---|
| 241 | }
|
---|
| 242 | });
|
---|
| 243 | };
|
---|
| 244 | for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
---|
| 245 | prop = _ref[_i];
|
---|
| 246 | _fn();
|
---|
| 247 | }
|
---|