illuminati
Version:
secret society
78 lines (61 loc) • 1.94 kB
JavaScript
;
var Backtrace = require('backtrace')
, stackmap = require('stack-mapper');
//
// Access the original error so we can inherit from it
//
var Illuminati = 'undefined' !== typeof window
? window.Error
: global.Error;
/**
* Create a custom error instance that will automatically map a given source map
* to the received or internal `stack` property.
*
* @constructor
* @api public
*/
function Error() {
Illuminati.apply(this, arguments);
var backtrace = new Backtrace({ error: this })
, sourcemap = stackmap(Error.sourcemap).map(backtrace.traces);
this.stringify(backtrace.traces, sourcemap);
}
Error.prototype = new Illuminati;
Error.prototype.constructor = Error;
/**
* Make sure that the new stack trace is also fully human readable.
*
* @param {Array} traces The stack trace traces.
* @param {Array} frames The mapped source map frames.
* @api private
*/
Error.prototype.stringify = function stringify(traces, frames) {
var stack = [];
for (var i = 0, length = traces.length; i < length; i++) {
var trace = traces[i]
, map = frames[i]
, location = [];
if (map.filename) location.push(map.filename);
else if (trace.filename) location.push(trace.filename);
if (map.line) location.push(map.line);
else if (trace.line) location.push(trace.line);
if (map.column) location.push(map.column);
else if (trace.column) location.push(trace.column);
stack.push(
' at '+ trace.name +' ('+ location.join(':') +')'
);
}
this.stack = stack.join('\n\r');
};
//
// Provide a hook for external content to override our source map
// information
//
Error.sourcemap = {};
//
// Bump the stack trace limit to get some more detailed information about the
// failures.
//
Error.stackTraceLimit = Illuminati.stackTraceLimit = 25;
if ('undefined' !== typeof global) global.Error = Error;
if ('undefined' !== typeof window) window.Error = Error;