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.
247 lines
6.5 KiB
247 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(); |
|
}
|
|
|