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
						
					
					
				
			
		
		
	
	
							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();
 | |
| }
 |