forked from honeybadger-io/honeybadger-js
-
Notifications
You must be signed in to change notification settings - Fork 0
/
honeybadger.min.js
1 lines (1 loc) · 19.2 KB
/
honeybadger.min.js
1
!function(window){!function(window,undefined){var TraceKit={};var _oldTraceKit=window.TraceKit;var _slice=[].slice;var UNKNOWN_FUNCTION="?";function _has(object,key){return Object.prototype.hasOwnProperty.call(object,key)}function _isUndefined(what){return typeof what==="undefined"}TraceKit.noConflict=function noConflict(){window.TraceKit=_oldTraceKit;return TraceKit};TraceKit.wrap=function traceKitWrapper(func){function wrapped(){try{return func.apply(this,arguments)}catch(e){TraceKit.report(e);throw e}}return wrapped};TraceKit.report=function reportModuleWrapper(){var handlers=[],lastException=null,lastExceptionStack=null;function subscribe(handler){installGlobalHandler();handlers.push(handler)}function unsubscribe(handler){for(var i=handlers.length-1;i>=0;--i){if(handlers[i]===handler){handlers.splice(i,1)}}}function notifyHandlers(stack,windowError){var exception=null;if(windowError&&!TraceKit.collectWindowErrors){return}for(var i in handlers){if(_has(handlers,i)){try{handlers[i].apply(null,[stack].concat(_slice.call(arguments,2)))}catch(inner){exception=inner}}}if(exception){throw exception}}var _oldOnerrorHandler,_onErrorHandlerInstalled;function traceKitWindowOnError(message,url,lineNo){var stack=null;if(lastExceptionStack){TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(lastExceptionStack,url,lineNo,message);stack=lastExceptionStack;lastExceptionStack=null;lastException=null}else{var location={url:url,line:lineNo};location.func=TraceKit.computeStackTrace.guessFunctionName(location.url,location.line);location.context=TraceKit.computeStackTrace.gatherContext(location.url,location.line);stack={mode:"onerror",message:message,url:document.location.href,stack:[location],useragent:navigator.userAgent}}notifyHandlers(stack,"from window.onerror");if(_oldOnerrorHandler){return _oldOnerrorHandler.apply(this,arguments)}return false}function installGlobalHandler(){if(_onErrorHandlerInstalled===true){return}_oldOnerrorHandler=window.onerror;window.onerror=traceKitWindowOnError;_onErrorHandlerInstalled=true}function report(ex){var args=_slice.call(arguments,1);if(lastExceptionStack){if(lastException===ex){return}else{var s=lastExceptionStack;lastExceptionStack=null;lastException=null;notifyHandlers.apply(null,[s,null].concat(args))}}var stack=TraceKit.computeStackTrace(ex);lastExceptionStack=stack;lastException=ex;window.setTimeout(function(){if(lastException===ex){lastExceptionStack=null;lastException=null;notifyHandlers.apply(null,[stack,null].concat(args))}},stack.incomplete?2e3:0);throw ex}report.subscribe=subscribe;report.unsubscribe=unsubscribe;return report}();TraceKit.computeStackTrace=function computeStackTraceWrapper(){var debug=false,sourceCache={};function loadSource(url){if(!TraceKit.remoteFetching){return""}try{function getXHR(){try{return new window.XMLHttpRequest}catch(e){return new window.ActiveXObject("Microsoft.XMLHTTP")}}var request=getXHR();request.open("GET",url,false);request.send("");return request.responseText}catch(e){return""}}function getSource(url){if(!_has(sourceCache,url)){var source="";if(url.indexOf(document.domain)!==-1){source=loadSource(url)}sourceCache[url]=source?source.split("\n"):[]}return sourceCache[url]}function guessFunctionName(url,lineNo){var reFunctionArgNames=/function ([^(]*)\(([^)]*)\)/,reGuessFunction=/['"]?([0-9A-Za-z$_]+)['"]?\s*[:=]\s*(function|eval|new Function)/,line="",maxLines=10,source=getSource(url),m;if(!source.length){return UNKNOWN_FUNCTION}for(var i=0;i<maxLines;++i){line=source[lineNo-i]+line;if(!_isUndefined(line)){if(m=reGuessFunction.exec(line)){return m[1]}else if(m=reFunctionArgNames.exec(line)){return m[1]}}}return UNKNOWN_FUNCTION}function gatherContext(url,line){var source=getSource(url);if(!source.length){return null}var context=[],linesBefore=Math.floor(TraceKit.linesOfContext/2),linesAfter=linesBefore+TraceKit.linesOfContext%2,start=Math.max(0,line-linesBefore-1),end=Math.min(source.length,line+linesAfter-1);line-=1;for(var i=start;i<end;++i){if(!_isUndefined(source[i])){context.push(source[i])}}return context.length>0?context:null}function escapeRegExp(text){return text.replace(/[\-\[\]{}()*+?.,\\\^$|#]/g,"\\$&")}function escapeCodeAsRegExpForMatchingInsideHTML(body){return escapeRegExp(body).replace("<","(?:<|<)").replace(">","(?:>|>)").replace("&","(?:&|&)").replace('"','(?:"|")').replace(/\s+/g,"\\s+")}function findSourceInUrls(re,urls){var source,m;for(var i=0,j=urls.length;i<j;++i){if((source=getSource(urls[i])).length){source=source.join("\n");if(m=re.exec(source)){return{url:urls[i],line:source.substring(0,m.index).split("\n").length,column:m.index-source.lastIndexOf("\n",m.index)-1}}}}return null}function findSourceInLine(fragment,url,line){var source=getSource(url),re=new RegExp("\\b"+escapeRegExp(fragment)+"\\b"),m;line-=1;if(source&&source.length>line&&(m=re.exec(source[line]))){return m.index}return null}function findSourceByFunctionBody(func){var urls=[window.location.href],scripts=document.getElementsByTagName("script"),body,code=""+func,codeRE=/^function(?:\s+([\w$]+))?\s*\(([\w\s,]*)\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/,eventRE=/^function on([\w$]+)\s*\(event\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/,re,parts,result;for(var i=0;i<scripts.length;++i){var script=scripts[i];if(script.src){urls.push(script.src)}}if(!(parts=codeRE.exec(code))){re=new RegExp(escapeRegExp(code).replace(/\s+/g,"\\s+"))}else{var name=parts[1]?"\\s+"+parts[1]:"",args=parts[2].split(",").join("\\s*,\\s*");body=escapeRegExp(parts[3]).replace(/;$/,";?");re=new RegExp("function"+name+"\\s*\\(\\s*"+args+"\\s*\\)\\s*{\\s*"+body+"\\s*}")}if(result=findSourceInUrls(re,urls)){return result}if(parts=eventRE.exec(code)){var event=parts[1];body=escapeCodeAsRegExpForMatchingInsideHTML(parts[2]);re=new RegExp("on"+event+"=[\\'\"]\\s*"+body+"\\s*[\\'\"]","i");if(result=findSourceInUrls(re,urls[0])){return result}re=new RegExp(body);if(result=findSourceInUrls(re,urls)){return result}}return null}function computeStackTraceFromStackProp(ex){if(!ex.stack){return null}var chrome=/^\s*at (?:((?:\[object object\])?\S+(?: \[as \S+\])?) )?\(?((?:file|http|https):.*?):(\d+)(?::(\d+))?\)?\s*$/i,gecko=/^\s*(\S*)(?:\((.*?)\))?@((?:file|http|https).*?):(\d+)(?::(\d+))?\s*$/i,lines=ex.stack.split("\n"),stack=[],parts,element,reference=/^(.*) is undefined$/.exec(ex.message);for(var i=0,j=lines.length;i<j;++i){if(parts=gecko.exec(lines[i])){element={url:parts[3],func:parts[1]||UNKNOWN_FUNCTION,args:parts[2]?parts[2].split(","):"",line:+parts[4],column:parts[5]?+parts[5]:null}}else if(parts=chrome.exec(lines[i])){element={url:parts[2],func:parts[1]||UNKNOWN_FUNCTION,line:+parts[3],column:parts[4]?+parts[4]:null}}else{continue}if(!element.func&&element.line){element.func=guessFunctionName(element.url,element.line)}if(element.line){element.context=gatherContext(element.url,element.line)}stack.push(element)}if(stack[0]&&stack[0].line&&!stack[0].column&&reference){stack[0].column=findSourceInLine(reference[1],stack[0].url,stack[0].line)}if(!stack.length){return null}return{mode:"stack",name:ex.name,message:ex.message,url:document.location.href,stack:stack,useragent:navigator.userAgent}}function computeStackTraceFromStacktraceProp(ex){var stacktrace=ex.stacktrace;var testRE=/ line (\d+), column (\d+) in (?:<anonymous function: ([^>]+)>|([^\)]+))\((.*)\) in (.*):\s*$/i,lines=stacktrace.split("\n"),stack=[],parts;for(var i=0,j=lines.length;i<j;i+=2){if(parts=testRE.exec(lines[i])){var element={line:+parts[1],column:+parts[2],func:parts[3]||parts[4],args:parts[5]?parts[5].split(","):[],url:parts[6]};if(!element.func&&element.line){element.func=guessFunctionName(element.url,element.line)}if(element.line){try{element.context=gatherContext(element.url,element.line)}catch(exc){}}if(!element.context){element.context=[lines[i+1]]}stack.push(element)}}if(!stack.length){return null}return{mode:"stacktrace",name:ex.name,message:ex.message,url:document.location.href,stack:stack,useragent:navigator.userAgent}}function computeStackTraceFromOperaMultiLineMessage(ex){var lines=ex.message.split("\n");if(lines.length<4){return null}var lineRE1=/^\s*Line (\d+) of linked script ((?:file|http|https)\S+)(?:: in function (\S+))?\s*$/i,lineRE2=/^\s*Line (\d+) of inline#(\d+) script in ((?:file|http|https)\S+)(?:: in function (\S+))?\s*$/i,lineRE3=/^\s*Line (\d+) of function script\s*$/i,stack=[],scripts=document.getElementsByTagName("script"),inlineScriptBlocks=[],parts,i,len,source;for(i in scripts){if(_has(scripts,i)&&!scripts[i].src){inlineScriptBlocks.push(scripts[i])}}for(i=2,len=lines.length;i<len;i+=2){var item=null;if(parts=lineRE1.exec(lines[i])){item={url:parts[2],func:parts[3],line:+parts[1]}}else if(parts=lineRE2.exec(lines[i])){item={url:parts[3],func:parts[4]};var relativeLine=+parts[1];var script=inlineScriptBlocks[parts[2]-1];if(script){source=getSource(item.url);if(source){source=source.join("\n");var pos=source.indexOf(script.innerText);if(pos>=0){item.line=relativeLine+source.substring(0,pos).split("\n").length}}}}else if(parts=lineRE3.exec(lines[i])){var url=window.location.href.replace(/#.*$/,""),line=parts[1];var re=new RegExp(escapeCodeAsRegExpForMatchingInsideHTML(lines[i+1]));source=findSourceInUrls(re,[url]);item={url:url,line:source?source.line:line,func:""}}if(item){if(!item.func){item.func=guessFunctionName(item.url,item.line)}var context=gatherContext(item.url,item.line);var midline=context?context[Math.floor(context.length/2)]:null;if(context&&midline.replace(/^\s*/,"")===lines[i+1].replace(/^\s*/,"")){item.context=context}else{item.context=[lines[i+1]]}stack.push(item)}}if(!stack.length){return null}return{mode:"multiline",name:ex.name,message:lines[0],url:document.location.href,stack:stack,useragent:navigator.userAgent}}function augmentStackTraceWithInitialElement(stackInfo,url,lineNo,message){var initial={url:url,line:lineNo};if(initial.url&&initial.line){stackInfo.incomplete=false;if(!initial.func){initial.func=guessFunctionName(initial.url,initial.line)}if(!initial.context){initial.context=gatherContext(initial.url,initial.line)}var reference=/ '([^']+)' /.exec(message);if(reference){initial.column=findSourceInLine(reference[1],initial.url,initial.line)}if(stackInfo.stack.length>0){if(stackInfo.stack[0].url===initial.url){if(stackInfo.stack[0].line===initial.line){return false}else if(!stackInfo.stack[0].line&&stackInfo.stack[0].func===initial.func){stackInfo.stack[0].line=initial.line;stackInfo.stack[0].context=initial.context;return false}}}stackInfo.stack.unshift(initial);stackInfo.partial=true;return true}else{stackInfo.incomplete=true}return false}function computeStackTraceByWalkingCallerChain(ex,depth){var functionName=/function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i,stack=[],funcs={},recursion=false,parts,item,source;for(var curr=computeStackTraceByWalkingCallerChain.caller;curr&&!recursion;curr=curr.caller){if(curr===computeStackTrace||curr===TraceKit.report){continue}item={url:null,func:UNKNOWN_FUNCTION,line:null,column:null};if(curr.name){item.func=curr.name}else if(parts=functionName.exec(curr.toString())){item.func=parts[1]}if(source=findSourceByFunctionBody(curr)){item.url=source.url;item.line=source.line;if(item.func===UNKNOWN_FUNCTION){item.func=guessFunctionName(item.url,item.line)}var reference=/ '([^']+)' /.exec(ex.message||ex.description);if(reference){item.column=findSourceInLine(reference[1],source.url,source.line)}}if(funcs[""+curr]){recursion=true}else{funcs[""+curr]=true}stack.push(item)}if(depth){stack.splice(0,depth)}var result={mode:"callers",name:ex.name,message:ex.message,url:document.location.href,stack:stack,useragent:navigator.userAgent};augmentStackTraceWithInitialElement(result,ex.sourceURL||ex.fileName,ex.line||ex.lineNumber,ex.message||ex.description);return result}function computeStackTrace(ex,depth){var stack=null;depth=depth==null?0:+depth;try{stack=computeStackTraceFromStacktraceProp(ex);if(stack){return stack}}catch(e){if(debug){throw e}}try{stack=computeStackTraceFromStackProp(ex);if(stack){return stack}}catch(e){if(debug){throw e}}try{stack=computeStackTraceFromOperaMultiLineMessage(ex);if(stack){return stack}}catch(e){if(debug){throw e}}try{stack=computeStackTraceByWalkingCallerChain(ex,depth+1);if(stack){return stack}}catch(e){if(debug){throw e}}return{mode:"failed"}}function computeStackTraceOfCaller(depth){depth=(depth==null?0:+depth)+1;try{throw new Error}catch(ex){return computeStackTrace(ex,depth+1)}return null}computeStackTrace.augmentStackTraceWithInitialElement=augmentStackTraceWithInitialElement;computeStackTrace.guessFunctionName=guessFunctionName;computeStackTrace.gatherContext=gatherContext;computeStackTrace.ofCaller=computeStackTraceOfCaller;return computeStackTrace}();!function extendToAsynchronousCallbacks(){var _helper=function _helper(fnName){var originalFn=window[fnName];window[fnName]=function traceKitAsyncExtension(){var args=_slice.call(arguments);var originalCallback=args[0];if(typeof originalCallback==="function"){args[0]=TraceKit.wrap(originalCallback)}if(originalFn.apply){return originalFn.apply(this,args)}else{return originalFn(args[0],args[1])}}};_helper("setTimeout");_helper("setInterval")}();if(!TraceKit.remoteFetching){TraceKit.remoteFetching=true}if(!TraceKit.collectWindowErrors){TraceKit.collectWindowErrors=true}if(!TraceKit.linesOfContext||TraceKit.linesOfContext<1){TraceKit.linesOfContext=11}window.TraceKit=TraceKit}(window);var Configuration;Configuration=function(){Configuration.defaults={api_key:null,host:"api.honeybadger.io",ssl:true,project_root:window.location.protocol+"//"+window.location.host,environment:"production",component:null,action:null,disabled:true,onerror:false};function Configuration(options){var k,v,_ref;if(options==null){options={}}_ref=this.constructor.defaults;for(k in _ref){v=_ref[k];this[k]=v}for(k in options){v=options[k];this[k]=v}}Configuration.prototype.reset=function(){var k,v,_ref;_ref=this.constructor.defaults;for(k in _ref){v=_ref[k];this[k]=v}return this};return Configuration}();var Notice;Notice=function(){function Notice(options){var k,v,_ref,_ref1,_ref2,_ref3,_ref4;this.options=options!=null?options:{};this.error=this.options.error;this.stackInfo=this.options.stackInfo||this.error&&Honeybadger.TraceKit.computeStackTrace(this.error);this.trace=this._parseBacktrace((_ref=this.stackInfo)!=null?_ref.stack:void 0);this["class"]=(_ref1=this.stackInfo)!=null?_ref1.name:void 0;this.message=(_ref2=this.stackInfo)!=null?_ref2.message:void 0;this.source=this.stackInfo&&this._extractSource(this.stackInfo.stack);this.url=document.URL;this.project_root=Honeybadger.configuration.project_root;this.environment=Honeybadger.configuration.environment;this.component=Honeybadger.configuration.component;this.action=Honeybadger.configuration.action;this.context={};_ref3=Honeybadger.context;for(k in _ref3){v=_ref3[k];this.context[k]=v}if(this.options.context&&typeof this.options.context==="object"){_ref4=this.options.context;for(k in _ref4){v=_ref4[k];this.context[k]=v}}}Notice.prototype.toJSON=function(){return JSON.stringify({notifier:{name:"honeybadger.js",url:"https://github.com/honeybadger-io/honeybadger-js",version:Honeybadger.version,language:"javascript"},error:{"class":this["class"],message:this.message,backtrace:this.trace,source:this.source},request:{url:this.url,component:this.component,action:this.action,context:this.context,cgi_data:this._cgiData()},server:{project_root:this.project_root,environment_name:this.environment}})};Notice.prototype._parseBacktrace=function(stack){var backtrace,trace,_i,_len,_ref,_ref1;if(stack==null){stack=[]}backtrace=[];for(_i=0,_len=stack.length;_i<_len;_i++){trace=stack[_i];if((_ref=trace.url)!=null?_ref.match(/honeybadger(?:\.min)?\.js/):void 0){continue}backtrace.push({file:((_ref1=trace.url)!=null?_ref1.replace(Honeybadger.configuration.project_root,"[PROJECT_ROOT]"):void 0)||"unknown",number:trace.line,method:trace.func})}return backtrace};Notice.prototype._extractSource=function(stack){var i,line,source,_i,_len,_ref,_ref1,_ref2;if(stack==null){stack=[]}source={};_ref2=(_ref=(_ref1=stack[0])!=null?_ref1.context:void 0)!=null?_ref:[];for(i=_i=0,_len=_ref2.length;_i<_len;i=++_i){line=_ref2[i];source[i]=line}return source};Notice.prototype._cgiData=function(){var data,k,v;data={};for(k in navigator){v=navigator[k];if(!(v instanceof Object)){data[k.split(/(?=[A-Z][a-z]*)/).join("_").toUpperCase()]=v}}data["HTTP_USER_AGENT"]=data["USER_AGENT"];delete data["USER_AGENT"];if(document.referrer.match(/\S/)){data["HTTP_REFERER"]=document.referrer}return data};return Notice}();var Honeybadger,__hasProp={}.hasOwnProperty;Honeybadger={version:"0.0.4",TraceKit:TraceKit.noConflict(),configured:false,configure:function(options){var k,v;if(options==null){options={}}if(this.configured===false){if(typeof options.disabled==="undefined"){options["disabled"]=false}this.configured=true}for(k in options){v=options[k];this.configuration[k]=v}this.TraceKit.collectWindowErrors=this.configuration.onerror;return this},configuration:new Configuration,context:{},resetContext:function(options){if(options==null){options={}}this.context=options instanceof Object?options:{};return this},setContext:function(options){var k,v;if(options==null){options={}}if(options instanceof Object){for(k in options){v=options[k];this.context[k]=v}}return this},beforeNotifyHandlers:[],beforeNotify:function(handler){return this.beforeNotifyHandlers.push(handler)},notify:function(error,options){var handler,k,notice,v,_i,_len,_ref;if(options==null){options={}}if(!this.configured||this.configuration.disabled===true){return false}if(error instanceof Error){options["error"]=error}else if(typeof error==="string"){options["error"]=new Error(error)}else if(error instanceof Object){for(k in error){v=error[k];options[k]=v}}if(function(){var _results;_results=[];for(k in options){if(!__hasProp.call(options,k))continue;_results.push(k)}return _results}().length===0){return false}notice=new Notice(options);_ref=this.beforeNotifyHandlers;for(_i=0,_len=_ref.length;_i<_len;_i++){handler=_ref[_i];if(handler(notice)===false){return false}}return this._sendRequest(notice.toJSON())},wrap:function(func){return function(){var e;try{return func.apply(this,arguments)}catch(_error){e=_error;Honeybadger.notify(e);throw e}}},reset:function(){this.resetContext();this.configuration.reset();this.TraceKit.collectWindowErrors=this.configuration.onerror;this.configured=false;return this},install:function(){this.TraceKit.collectWindowErrors=this.configuration.onerror;this.TraceKit.report.subscribe(this._handleTraceKitSubscription);return this},_sendRequest:function(data){var url;url="http"+(this.configuration.ssl&&"s"||"")+"://"+this.configuration.host+"/v1/notices.html";return this._crossDomainPost(url,data)},_crossDomainPost:function(url,payload){var form,iframe,input,uniqueNameOfFrame;iframe=document.createElement("iframe");uniqueNameOfFrame="_hb_"+(new Date).getTime();document.body.appendChild(iframe);iframe.style.display="none";iframe.contentWindow.name=uniqueNameOfFrame;form=document.createElement("form");form.target=uniqueNameOfFrame;form.action=url;form.method="POST";input=document.createElement("input");input.type="hidden";input.name="payload";input.value=payload;form.appendChild(input);input=document.createElement("input");input.type="hidden";input.name="api_key";input.value=this.configuration.api_key;form.appendChild(input);document.body.appendChild(form);return form.submit()},_handleTraceKitSubscription:function(stackInfo){return Honeybadger.notify({stackInfo:stackInfo})}};window.Honeybadger=Honeybadger;Honeybadger.install()}(window);