// Inspired by https://github.com/tlrobinson/long-stack-traces var util = require('util'); function extendTrace(object, property, pos) { var old = object[property]; object[property] = function() { var error = new Error(); var name = object.constructor.name + '#' + property + '(' + Array.prototype.slice.call(arguments).map(function(el) { return util.inspect(el, false, 0); }).join(', ') + ')'; if (typeof pos === 'undefined') pos = -1; if (pos < 0) pos += arguments.length; var cb = arguments[pos]; if (typeof arguments[pos] === 'function') { arguments[pos] = function replacement() { try { return cb.apply(this, arguments); } catch (err) { if (err && err.stack && !err.__augmented) { err.stack = filter(err).join('\n'); err.stack += '\n--> in ' + name; err.stack += '\n' + filter(error).slice(1).join('\n'); err.__augmented = true; } throw err; } }; } return old.apply(this, arguments); }; } exports.extendTrace = extendTrace; function filter(error) { return error.stack.split('\n').filter(function(line) { return line.indexOf(__filename) < 0; }); }