You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

248 lines
6.5 KiB

// Generated by CoffeeScript 1.8.0
var ParsedError, prop, sysPath, _fn, _i, _len, _ref;
sysPath = require('path');
module.exports = ParsedError = (function() {
function ParsedError(error) {
this.error = error;
this._parse();
}
ParsedError.prototype._parse = function() {
var m;
this._trace = [];
this._kind = 'Error';
this._wrapper = '';
if (this.error.wrapper != null) {
this._wrapper = String(this.error.wrapper);
}
if (typeof this.error !== 'object') {
this._message = String(this.error);
} else {
this._stack = this.error.stack;
if (this.error.kind != null) {
this._kind = String(this.error.kind);
} else if (typeof this._stack === 'string') {
if (m = this._stack.match(/^([a-zA-Z0-9\_\$]+):\ /)) {
this._kind = m[1];
}
}
this._message = (this.error.message != null) && String(this.error.message) || '';
if (typeof this._stack === 'string') {
this._parseStack();
}
}
};
ParsedError.prototype._parseStack = function() {
var line, message, messageLines, reachedTrace, _i, _len, _ref;
messageLines = [];
reachedTrace = false;
_ref = this._stack.split('\n');
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
line = _ref[_i];
if (line.trim() === '') {
continue;
}
if (reachedTrace) {
this._trace.push(this._parseTraceItem(line));
} else {
if (line.match(/^\s*at\s.+/)) {
reachedTrace = true;
this._trace.push(this._parseTraceItem(line));
} else if (!this._message.split('\n'.indexOf(line))) {
messageLines.push(line);
}
}
}
message = messageLines.join('\n');
if (message.substr(0, this._kind.length) === this._kind) {
message = message.substr(this._kind.length, message.length).replace(/^\:\s+/, '');
}
if (message.length) {
this._message = this._message.length ? [this._message, message].join('\n') : message;
}
};
ParsedError.prototype._parseTraceItem = function(text) {
var addr, col, d, dir, file, jsCol, jsLine, line, m, original, packageName, packages, path, r, remaining, shortenedAddr, shortenedPath, what;
text = text.trim();
if (text === '') {
return;
}
if (!text.match(/^at\ /)) {
return text;
}
text = text.replace(/^at /, '');
if (text === 'Error (<anonymous>)' || text === 'Error (<anonymous>:null:null)') {
return;
}
original = text;
what = null;
addr = null;
path = null;
dir = null;
file = null;
line = null;
col = null;
jsLine = null;
jsCol = null;
shortenedPath = null;
shortenedAddr = null;
packageName = '[current]';
if (m = text.match(/\(([^\)]+)\)$/)) {
addr = m[1].trim();
}
if (addr != null) {
what = text.substr(0, text.length - addr.length - 2);
what = what.trim();
}
if (addr == null) {
addr = text.trim();
}
addr = this._fixPath(addr);
remaining = addr;
if (m = remaining.match(/\,\ <js>:(\d+):(\d+)$/)) {
jsLine = m[1];
jsCol = m[2];
remaining = remaining.substr(0, remaining.length - m[0].length);
}
if (m = remaining.match(/:(\d+):(\d+)$/)) {
line = m[1];
col = m[2];
remaining = remaining.substr(0, remaining.length - m[0].length);
path = remaining;
}
if (path != null) {
file = sysPath.basename(path);
dir = sysPath.dirname(path);
if (dir === '.') {
dir = '';
}
path = this._fixPath(path);
file = this._fixPath(file);
dir = this._fixPath(dir);
}
if (dir != null) {
d = dir.replace(/[\\]{1,2}/g, '/');
if (m = d.match(/node_modules\/([^\/]+)(?!.*node_modules.*)/)) {
packageName = m[1];
}
}
if (jsLine == null) {
jsLine = line;
jsCol = col;
}
if (path != null) {
r = this._rectifyPath(path);
shortenedPath = r.path;
shortenedAddr = shortenedPath + addr.substr(path.length, addr.length);
packages = r.packages;
}
return {
original: original,
what: what,
addr: addr,
path: path,
dir: dir,
file: file,
line: parseInt(line),
col: parseInt(col),
jsLine: parseInt(jsLine),
jsCol: parseInt(jsCol),
packageName: packageName,
shortenedPath: shortenedPath,
shortenedAddr: shortenedAddr,
packages: packages || []
};
};
ParsedError.prototype._getMessage = function() {
return this._message;
};
ParsedError.prototype._getKind = function() {
return this._kind;
};
ParsedError.prototype._getWrapper = function() {
return this._wrapper;
};
ParsedError.prototype._getStack = function() {
return this._stack;
};
ParsedError.prototype._getArguments = function() {
return this.error["arguments"];
};
ParsedError.prototype._getType = function() {
return this.error.type;
};
ParsedError.prototype._getTrace = function() {
return this._trace;
};
ParsedError.prototype._fixPath = function(path) {
return path.replace(/[\\]{1,2}/g, '/');
};
ParsedError.prototype._rectifyPath = function(path, nameForCurrentPackage) {
var m, packages, parts, remaining, rest;
path = String(path);
remaining = path;
if (!(m = path.match(/^(.+?)\/node_modules\/(.+)$/))) {
return {
path: path,
packages: []
};
}
parts = [];
packages = [];
if (typeof nameForCurrentPackage === 'string') {
parts.push("[" + nameForCurrentPackage + "]");
packages.push("[" + nameForCurrentPackage + "]");
} else {
parts.push("[" + (m[1].match(/([^\/]+)$/)[1]) + "]");
packages.push(m[1].match(/([^\/]+)$/)[1]);
}
rest = m[2];
while (m = rest.match(/([^\/]+)\/node_modules\/(.+)$/)) {
parts.push("[" + m[1] + "]");
packages.push(m[1]);
rest = m[2];
}
if (m = rest.match(/([^\/]+)\/(.+)$/)) {
parts.push("[" + m[1] + "]");
packages.push(m[1]);
rest = m[2];
}
parts.push(rest);
return {
path: parts.join("/"),
packages: packages
};
};
return ParsedError;
})();
_ref = ['message', 'kind', 'arguments', 'type', 'stack', 'trace', 'wrapper'];
_fn = function() {
var methodName;
methodName = '_get' + prop[0].toUpperCase() + prop.substr(1, prop.length);
return Object.defineProperty(ParsedError.prototype, prop, {
get: function() {
return this[methodName]();
}
});
};
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
prop = _ref[_i];
_fn();
}