/** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ (function(define) { 'use strict'; define(function() { var parse, captureStack, format; if(Error.captureStackTrace) { // Use Error.captureStackTrace if available parse = function(e) { return e && e.stack && e.stack.split('\n'); }; format = formatAsString; captureStack = Error.captureStackTrace; } else { // Otherwise, do minimal feature detection to determine // how to capture and format reasonable stacks. parse = function(e) { var stack = e && e.stack && e.stack.split('\n'); if(stack && e.message) { stack.unshift(e.message); } return stack; }; (function() { var e = new Error(); if(typeof e.stack !== 'string') { format = formatAsString; captureStack = captureSpiderMonkeyStack; } else { format = formatAsErrorWithStack; captureStack = useStackDirectly; } }()); } function captureSpiderMonkeyStack(host) { try { throw new Error(); } catch(err) { host.stack = err.stack; } } function useStackDirectly(host) { host.stack = new Error().stack; } function formatAsString(longTrace) { return join(longTrace); } function formatAsErrorWithStack(longTrace) { var e = new Error(); e.stack = formatAsString(longTrace); return e; } // About 5-10x faster than String.prototype.join o_O function join(a) { var sep = false; var s = ''; for(var i=0; i< a.length; ++i) { if(sep) { s += '\n' + a[i]; } else { s+= a[i]; sep = true; } } return s; } return { parse: parse, format: format, captureStack: captureStack }; }); }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));