Comparing version 2.0.5 to 2.1.0
{ | ||
"name": "raven-js", | ||
"version": "2.0.5", | ||
"version": "2.1.0", | ||
"dependencies": {}, | ||
@@ -5,0 +5,0 @@ "main": "dist/raven.js", |
# Changelog | ||
## 2.1.0 | ||
* BUGFIX: Fixed Raven.js rejecting frames w/ blob URLs. See: https://github.com/getsentry/raven-js/issues/463 | ||
* BUGFIX: Fixed plugin files not consumable without module loader. See: https://github.com/getsentry/raven-js/issues/446 | ||
* BUGFIX: Fixed bug in console.js plugin where `level` wasn't passed. See: https://github.com/getsentry/raven-js/pull/474 | ||
* BUGFIX: Fixed broken debug logging in IE9 and below. See: https://github.com/getsentry/raven-js/pull/473 | ||
* BUGFIX: Fixed `XMLHttpRequest` wrapper not capturing all event handlers. See: https://github.com/getsentry/raven-js/issues/453 | ||
* CHANGE: `Raven.uninstall` now restores original builtin functions (e.g. setTimeout). See: https://github.com/getsentry/raven-js/issues/228 | ||
* CHANGE: `maxMessageLength` now defaults to 0 (no limit). See: https://github.com/getsentry/raven-js/pull/441 | ||
* NEW: New `stackTraceLimit` config option (default 50 in supported browsers). See: https://github.com/getsentry/raven-js/pull/419/files | ||
* NEW: `Raven.showReportDialog` (experimental). See: https://github.com/getsentry/raven-js/pull/456 | ||
## 2.0.5 | ||
* BUGFIX: Fixed exception thrown by React Native plugin. See: https://github.com/getsentry/raven-js/issues/468 | ||
* BUGFIX: Fixed "pre-built JavaScript" warning when loading Raven.js via Webpack: https://github.com/getsentry/raven-js/issues/465 | ||
* BUGFIX: Fixed "pre-built JavaScript" warning when loading Raven.js via Webpack. See: https://github.com/getsentry/raven-js/issues/465 | ||
@@ -7,0 +18,0 @@ ## 2.0.4 |
@@ -1,2 +0,3 @@ | ||
!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.Raven=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){"use strict";function d(a){this.name="RavenConfigError",this.message=a}d.prototype=new Error,d.prototype.constructor=d,b.exports=d},{}],2:[function(a,b,c){"use strict";function d(){return+new Date}function e(){this._hasJSON=!("object"!=typeof JSON||!JSON.stringify),this._hasDocument="undefined"!=typeof document,this._lastCapturedException=null,this._lastEventId=null,this._globalServer=null,this._globalKey=null,this._globalProject=null,this._globalContext={},this._globalOptions={logger:"javascript",ignoreErrors:[],ignoreUrls:[],whitelistUrls:[],includePaths:[],crossOrigin:"anonymous",collectWindowErrors:!0,maxMessageLength:100},this._ignoreOnError=0,this._isRavenInstalled=!1,this._originalConsole=window.console||{},this._originalConsoleMethods={},this._plugins=[],this._startTime=d();for(var a in this._originalConsole)this._originalConsoleMethods[a]=this._originalConsole[a]}var f=a("../vendor/TraceKit/tracekit"),g=a("./configError"),h=a("./utils"),i=h.isFunction,j=h.isUndefined,k=h.isError,l=h.isEmptyObject,m=h.hasKey,n=h.joinRegExp,o=h.each,p=h.objectMerge,q=h.truncate,r=h.urlencode,s=h.uuid4,t="source protocol user pass host port path".split(" "),u=/^(?:(\w+):)?\/\/(?:(\w+)(:\w+)?@)?([\w\.-]+)(?::(\d+))?(\/.*)/;e.prototype={VERSION:"2.0.5",debug:!1,TraceKit:f,config:function(a,b){var c=this;if(this._globalServer)return this._logDebug("error","Error: Raven has already been configured"),this;if(!a)return this;var d=this._parseDSN(a),e=d.path.lastIndexOf("/"),g=d.path.substr(1,e);return b&&o(b,function(a,b){"tags"==a||"extra"==a?c._globalContext[a]=b:c._globalOptions[a]=b}),this._globalOptions.ignoreErrors.push(/^Script error\.?$/),this._globalOptions.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/),this._globalOptions.ignoreErrors=n(this._globalOptions.ignoreErrors),this._globalOptions.ignoreUrls=this._globalOptions.ignoreUrls.length?n(this._globalOptions.ignoreUrls):!1,this._globalOptions.whitelistUrls=this._globalOptions.whitelistUrls.length?n(this._globalOptions.whitelistUrls):!1,this._globalOptions.includePaths=n(this._globalOptions.includePaths),this._globalKey=d.user,this._globalProject=d.path.substr(e+1),this._globalServer="//"+d.host+(d.port?":"+d.port:"")+"/"+g+"api/"+this._globalProject+"/store/",d.protocol&&(this._globalServer=d.protocol+":"+this._globalServer),this._globalOptions.fetchContext&&(f.remoteFetching=!0),this._globalOptions.linesOfContext&&(f.linesOfContext=this._globalOptions.linesOfContext),f.collectWindowErrors=!!this._globalOptions.collectWindowErrors,this},install:function(){var a=this;return this.isSetup()&&!this._isRavenInstalled&&(f.report.subscribe(function(){a._ignoreOnError||a._handleStackInfo.apply(a,arguments)}),this._wrapBuiltIns(),this._drainPlugins(),this._isRavenInstalled=!0),this},context:function(a,b,c){return i(a)&&(c=b||[],b=a,a=void 0),this.wrap(a,b).apply(this,c)},wrap:function(a,b){function c(){for(var c=[],e=arguments.length,f=!a||a&&a.deep!==!1;e--;)c[e]=f?d.wrap(a,arguments[e]):arguments[e];try{return b.apply(this,c)}catch(g){throw d._ignoreNextOnError(),d.captureException(g,a),g}}var d=this;if(j(b)&&!i(a))return a;if(i(a)&&(b=a,a=void 0),!i(b))return b;if(b.__raven__)return b;if(b.__raven_wrapper__)return b.__raven_wrapper__;for(var e in b)m(b,e)&&(c[e]=b[e]);return b.__raven_wrapper__=c,c.prototype=b.prototype,c.__raven__=!0,c.__inner__=b,c},uninstall:function(){return f.report.uninstall(),this._isRavenInstalled=!1,this},captureException:function(a,b){if(!k(a))return this.captureMessage(a,b);this._lastCapturedException=a;try{var c=f.computeStackTrace(a);this._handleStackInfo(c,b)}catch(d){if(a!==d)throw d}return this},captureMessage:function(a,b){return this._globalOptions.ignoreErrors.test&&this._globalOptions.ignoreErrors.test(a)?void 0:(this._send(p({message:a+""},b)),this)},addPlugin:function(a){var b=Array.prototype.slice.call(arguments,1);return this._plugins.push([a,b]),this._isRavenInstalled&&this._drainPlugins(),this},setUserContext:function(a){return this._globalContext.user=a,this},setExtraContext:function(a){return this._mergeContext("extra",a),this},setTagsContext:function(a){return this._mergeContext("tags",a),this},clearContext:function(){return this._globalContext={},this},getContext:function(){return JSON.parse(JSON.stringify(this._globalContext))},setRelease:function(a){return this._globalOptions.release=a,this},setDataCallback:function(a){return this._globalOptions.dataCallback=a,this},setShouldSendCallback:function(a){return this._globalOptions.shouldSendCallback=a,this},setTransport:function(a){return this._globalOptions.transport=a,this},lastException:function(){return this._lastCapturedException},lastEventId:function(){return this._lastEventId},isSetup:function(){return this._hasJSON?this._globalServer?!0:(this.ravenNotConfiguredError||this._logDebug("error","Error: Raven has not been configured."),this.ravenNotConfiguredError=!0,!1):!1},afterLoad:function(){var a=window.RavenConfig;a&&this.config(a.dsn,a.config).install()},_ignoreNextOnError:function(){var a=this;this._ignoreOnError+=1,setTimeout(function(){a._ignoreOnError-=1})},_triggerEvent:function(a,b){var c,d;if(this._hasDocument){b=b||{},a="raven"+a.substr(0,1).toUpperCase()+a.substr(1),document.createEvent?(c=document.createEvent("HTMLEvents"),c.initEvent(a,!0,!0)):(c=document.createEventObject(),c.eventType=a);for(d in b)m(b,d)&&(c[d]=b[d]);if(document.createEvent)document.dispatchEvent(c);else try{document.fireEvent("on"+c.eventType.toLowerCase(),c)}catch(e){}}},_wrapBuiltIns:function(){function a(a,b,c){var d=a[b];a[b]=c(d)}function b(a){return function(b,d){var e=[].slice.call(arguments),f=e[0];return"function"==typeof f&&(e[0]=c.wrap(f)),a.apply?a.apply(this,e):a(e[0],e[1])}}var c=this;a(window,"setTimeout",b),a(window,"setInterval",b),window.requestAnimationFrame&&a(window,"requestAnimationFrame",function(a){return function(b){return a(c.wrap(b))}}),"EventTarget Window Node ApplicationCache AudioTrackList ChannelMergerNode CryptoOperation EventSource FileReader HTMLUnknownElement IDBDatabase IDBRequest IDBTransaction KeyOperation MediaController MessagePort ModalWindow Notification SVGElementInstance Screen TextTrack TextTrackCue TextTrackList WebSocket WebSocketWorker Worker XMLHttpRequest XMLHttpRequestEventTarget XMLHttpRequestUpload".replace(/\w+/g,function(b){var d=window[b]&&window[b].prototype;d&&d.hasOwnProperty&&d.hasOwnProperty("addEventListener")&&(a(d,"addEventListener",function(a){return function(b,d,e,f){try{d&&d.handleEvent&&(d.handleEvent=c.wrap(d.handleEvent))}catch(g){}return a.call(this,b,c.wrap(d),e,f)}}),a(d,"removeEventListener",function(a){return function(b,c,d,e){return c=c&&(c.__raven_wrapper__?c.__raven_wrapper__:c),a.call(this,b,c,d,e)}}))});var d;"XMLHttpRequest"in window&&(d=XMLHttpRequest.prototype.open,XMLHttpRequest.prototype.open=function(b){var e=this;"onreadystatechange onload onerror onprogress".replace(/\w+/g,function(b){b in e&&"[object Function]"===Object.prototype.toString.call(e[b])&&a(e,b,function(a){return c.wrap(a)})}),d.apply(this,arguments)});var e,f=window.jQuery||window.$;f&&f.fn&&f.fn.ready&&(e=f.fn.ready,f.fn.ready=function(a){return e.call(this,c.wrap(a))})},_drainPlugins:function(){var a=this;o(this._plugins,function(b,c){var d=c[0],e=c[1];d.apply(a,[a].concat(e))})},_parseDSN:function(a){var b=u.exec(a),c={},d=7;try{for(;d--;)c[t[d]]=b[d]||""}catch(e){throw new g("Invalid DSN: "+a)}if(c.pass)throw new g("Do not specify your private key in the DSN!");return c},_handleStackInfo:function(a,b){var c=this,d=[];a.stack&&a.stack.length&&o(a.stack,function(a,b){var e=c._normalizeFrame(b);e&&d.push(e)}),this._triggerEvent("handle",{stackInfo:a,options:b}),this._processException(a.name,a.message,a.url,a.lineno,d,b)},_normalizeFrame:function(a){if(a.url){var b,c={filename:a.url,lineno:a.line,colno:a.column,"function":a.func||"?"},d=this._extractContextFromFrame(a);if(d){var e=["pre_context","context_line","post_context"];for(b=3;b--;)c[e[b]]=d[b]}return c.in_app=!(this._globalOptions.includePaths.test&&!this._globalOptions.includePaths.test(c.filename)||/(Raven|TraceKit)\./.test(c["function"])||/raven\.(min\.)?js$/.test(c.filename)),c}},_extractContextFromFrame:function(a){if(a.context&&this._globalOptions.fetchContext){for(var b=a.context,c=~~(b.length/2),d=b.length,e=!1;d--;)if(b[d].length>300){e=!0;break}if(e){if(j(a.column))return;return[[],b[c].substr(a.column,50),[]]}return[b.slice(0,c),b[c],b.slice(c+1)]}},_processException:function(a,b,c,d,e,f){var g,h;if((!this._globalOptions.ignoreErrors.test||!this._globalOptions.ignoreErrors.test(b))&&(b+="",b=q(b,this._globalOptions.maxMessageLength),h=a+": "+b,h=q(h,this._globalOptions.maxMessageLength),e&&e.length?(c=e[0].filename||c,e.reverse(),g={frames:e}):c&&(g={frames:[{filename:c,lineno:d,in_app:!0}]}),(!this._globalOptions.ignoreUrls.test||!this._globalOptions.ignoreUrls.test(c))&&(!this._globalOptions.whitelistUrls.test||this._globalOptions.whitelistUrls.test(c)))){var i=p({exception:{values:[{type:a,value:b,stacktrace:g}]},culprit:c,message:h},f);this._send(i)}},_trimPacket:function(a){var b=this._globalOptions.maxMessageLength;if(a.message=q(a.message,b),a.exception){var c=a.exception.values[0];c.value=q(c.value,b)}return a},_getHttpData:function(){if(this._hasDocument&&document.location&&document.location.href){var a={headers:{"User-Agent":navigator.userAgent}};return a.url=document.location.href,document.referrer&&(a.headers.Referer=document.referrer),a}},_send:function(a){var b=this,c=this._globalOptions,e={project:this._globalProject,logger:c.logger,platform:"javascript"},f=this._getHttpData();f&&(e.request=f),a=p(e,a),a.tags=p(p({},this._globalContext.tags),a.tags),a.extra=p(p({},this._globalContext.extra),a.extra),a.extra["session:duration"]=d()-this._startTime,l(a.tags)&&delete a.tags,this._globalContext.user&&(a.user=this._globalContext.user),c.release&&(a.release=c.release),c.serverName&&(a.server_name=c.serverName),c.release&&(a.release=c.release),i(c.dataCallback)&&(a=c.dataCallback(a)||a),a&&!l(a)&&(!i(c.shouldSendCallback)||c.shouldSendCallback(a))&&(this._lastEventId=a.event_id||(a.event_id=s()),a=this._trimPacket(a),this._logDebug("debug","Raven about to send:",a),this.isSetup()&&(c.transport||this._makeRequest).call(this,{url:this._globalServer,auth:{sentry_version:"7",sentry_client:"raven-js/"+this.VERSION,sentry_key:this._globalKey},data:a,options:c,onSuccess:function(){b._triggerEvent("success",{data:a,src:b._globalServer})},onError:function(){b._triggerEvent("failure",{data:a,src:b._globalServer})}}))},_makeImageRequest:function(a){a.auth.sentry_data=JSON.stringify(a.data);var b=this._newImage(),c=a.url+"?"+r(a.auth),d=a.options.crossOrigin;(d||""===d)&&(b.crossOrigin=d),b.onload=a.onSuccess,b.onerror=b.onabort=a.onError,b.src=c},_makeXhrRequest:function(a){function b(){200===c.status?a.onSuccess&&a.onSuccess():a.onError&&a.onError()}var c,d=a.url;c=new XMLHttpRequest,"withCredentials"in c?c.onreadystatechange=function(){4===c.readyState&&b()}:(c=new XDomainRequest,d=d.replace(/^https?:/,""),c.onload=b),c.open("POST",d+"?"+r(a.auth)),c.send(JSON.stringify(a.data))},_makeRequest:function(a){var b="withCredentials"in new XMLHttpRequest||"undefined"!=typeof XDomainRequest;return(b?this._makeXhrRequest:this._makeImageRequest)(a)},_newImage:function(){return document.createElement("img")},_logDebug:function(a){this._originalConsoleMethods[a]&&this.debug&&this._originalConsoleMethods[a].apply(this._originalConsole,[].slice.call(arguments,1))},_mergeContext:function(a,b){j(b)?delete this._globalContext[a]:this._globalContext[a]=p(this._globalContext[a]||{},b)}},e.prototype.setUser=e.prototype.setUserContext,e.prototype.setReleaseContext=e.prototype.setRelease,b.exports=e},{"../vendor/TraceKit/tracekit":5,"./configError":1,"./utils":4}],3:[function(a,b,c){"use strict";var d=a("./raven"),e=window.Raven,f=new d;f.noConflict=function(){return window.Raven=e,f},f.afterLoad(),b.exports=f},{"./raven":2}],4:[function(a,b,c){"use strict";function d(a){return void 0===a}function e(a){return"function"==typeof a}function f(a){return"[object String]"===q.toString.call(a)}function g(a){return"object"==typeof a&&null!==a}function h(a){for(var b in a)return!1;return!0}function i(a){return g(a)&&"[object Error]"===q.toString.call(a)||a instanceof Error}function j(a,b){var c,e;if(d(a.length))for(c in a)m(a,c)&&b.call(null,c,a[c]);else if(e=a.length)for(c=0;e>c;c++)b.call(null,c,a[c])}function k(a,b){return b?(j(b,function(b,c){a[b]=c}),a):a}function l(a,b){return a.length<=b?a:a.substr(0,b)+"…"}function m(a,b){return q.hasOwnProperty.call(a,b)}function n(a){for(var b,c=[],d=0,e=a.length;e>d;d++)b=a[d],f(b)?c.push(b.replace(/([.*+?^=!:${}()|\[\]\/\\])/g,"\\$1")):b&&b.source&&c.push(b.source);return new RegExp(c.join("|"),"i")}function o(a){var b=[];return j(a,function(a,c){b.push(encodeURIComponent(a)+"="+encodeURIComponent(c))}),b.join("&")}function p(){var a=window.crypto||window.msCrypto;if(!d(a)&&a.getRandomValues){var b=new Uint16Array(8);a.getRandomValues(b),b[3]=4095&b[3]|16384,b[4]=16383&b[4]|32768;var c=function(a){for(var b=a.toString(16);b.length<4;)b="0"+b;return b};return c(b[0])+c(b[1])+c(b[2])+c(b[3])+c(b[4])+c(b[5])+c(b[6])+c(b[7])}return"xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(/[xy]/g,function(a){var b=16*Math.random()|0,c="x"==a?b:3&b|8;return c.toString(16)})}var q=Object.prototype;b.exports={isUndefined:d,isFunction:e,isString:f,isObject:g,isEmptyObject:h,isError:i,each:j,objectMerge:k,truncate:l,hasKey:m,joinRegExp:n,urlencode:o,uuid4:p}},{}],5:[function(a,b,c){"use strict";function d(){return"undefined"==typeof document?"":document.location.href}var e=a("../../src/utils"),f=e.hasKey,g=e.isString,h=e.isUndefined,i={remoteFetching:!1,collectWindowErrors:!0,linesOfContext:7,debug:!1},j=[].slice,k="?";i.report=function(){function a(a){h(),p.push(a)}function b(a){for(var b=p.length-1;b>=0;--b)p[b]===a&&p.splice(b,1)}function c(){k(),p=[]}function e(a,b){var c=null;if(!b||i.collectWindowErrors){for(var d in p)if(f(p,d))try{p[d].apply(null,[a].concat(j.call(arguments,2)))}catch(e){c=e}if(c)throw c}}function g(a,b,c,f,g){var h=null;if(s)i.computeStackTrace.augmentStackTraceWithInitialElement(s,b,c,a),l();else if(g)h=i.computeStackTrace(g),e(h,!0);else{var j={url:b,line:c,column:f};j.func=i.computeStackTrace.guessFunctionName(j.url,j.line),j.context=i.computeStackTrace.gatherContext(j.url,j.line),h={message:a,url:d(),stack:[j]},e(h,!0)}return n?n.apply(this,arguments):!1}function h(){o||(n=window.onerror,window.onerror=g,o=!0)}function k(){o&&(window.onerror=n,o=!1,n=void 0)}function l(){var a=s,b=q;q=null,s=null,r=null,e.apply(null,[a,!1].concat(b))}function m(a,b){var c=j.call(arguments,1);if(s){if(r===a)return;l()}var d=i.computeStackTrace(a);if(s=d,r=a,q=c,window.setTimeout(function(){r===a&&l()},d.incomplete?2e3:0),b!==!1)throw a}var n,o,p=[],q=null,r=null,s=null;return m.subscribe=a,m.unsubscribe=b,m.uninstall=c,m}(),i.computeStackTrace=function(){function a(a){if(!i.remoteFetching)return"";try{var b=function(){try{return new window.XMLHttpRequest}catch(a){return new window.ActiveXObject("Microsoft.XMLHTTP")}},c=b();return c.open("GET",a,!1),c.send(""),c.responseText}catch(d){return""}}function b(b){if(!g(b))return[];if(!f(v,b)){var c="",d="";try{d=document.domain}catch(e){}-1!==b.indexOf(d)&&(c=a(b)),v[b]=c?c.split("\n"):[]}return v[b]}function c(a,c){var d,e=/function ([^(]*)\(([^)]*)\)/,f=/['"]?([0-9A-Za-z$_]+)['"]?\s*[:=]\s*(function|eval|new Function)/,g="",i=10,j=b(a);if(!j.length)return k;for(var l=0;i>l;++l)if(g=j[c-l]+g,!h(g)){if(d=f.exec(g))return d[1];if(d=e.exec(g))return d[1]}return k}function e(a,c){var d=b(a);if(!d.length)return null;var e=[],f=Math.floor(i.linesOfContext/2),g=f+i.linesOfContext%2,j=Math.max(0,c-f-1),k=Math.min(d.length,c+g-1);c-=1;for(var l=j;k>l;++l)h(d[l])||e.push(d[l]);return e.length>0?e:null}function j(a){return a.replace(/[\-\[\]{}()*+?.,\\\^$|#]/g,"\\$&")}function l(a){return j(a).replace("<","(?:<|<)").replace(">","(?:>|>)").replace("&","(?:&|&)").replace('"','(?:"|")').replace(/\s+/g,"\\s+")}function m(a,c){for(var d,e,f=0,g=c.length;g>f;++f)if((d=b(c[f])).length&&(d=d.join("\n"),e=a.exec(d)))return{url:c[f],line:d.substring(0,e.index).split("\n").length,column:e.index-d.lastIndexOf("\n",e.index)-1};return null}function n(a,c,d){var e,f=b(c),g=new RegExp("\\b"+j(a)+"\\b");return d-=1,f&&f.length>d&&(e=g.exec(f[d]))?e.index:null}function o(a){if("undefined"!=typeof document){for(var b,c,d,e,f=[window.location.href],g=document.getElementsByTagName("script"),h=""+a,i=/^function(?:\s+([\w$]+))?\s*\(([\w\s,]*)\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/,k=/^function on([\w$]+)\s*\(event\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/,n=0;n<g.length;++n){var o=g[n];o.src&&f.push(o.src)}if(d=i.exec(h)){var p=d[1]?"\\s+"+d[1]:"",q=d[2].split(",").join("\\s*,\\s*");b=j(d[3]).replace(/;$/,";?"),c=new RegExp("function"+p+"\\s*\\(\\s*"+q+"\\s*\\)\\s*{\\s*"+b+"\\s*}")}else c=new RegExp(j(h).replace(/\s+/g,"\\s+"));if(e=m(c,f))return e;if(d=k.exec(h)){var r=d[1];if(b=l(d[2]),c=new RegExp("on"+r+"=[\\'\"]\\s*"+b+"\\s*[\\'\"]","i"),e=m(c,f[0]))return e;if(c=new RegExp(b),e=m(c,f))return e}return null}}function p(a){if(!h(a.stack)&&a.stack){for(var b,f,g=/^\s*at (.*?) ?\(?((?:(?:file|https?|chrome-extension):.*?)|<anonymous>):(\d+)(?::(\d+))?\)?\s*$/i,i=/^\s*(.*?)(?:\((.*?)\))?@((?:file|https?|chrome).*?):(\d+)(?::(\d+))?\s*$/i,j=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:ms-appx|http|https):.*?):(\d+)(?::(\d+))?\)?\s*$/i,l=a.stack.split("\n"),m=[],o=/^(.*) is undefined$/.exec(a.message),p=0,q=l.length;q>p;++p){if(b=i.exec(l[p]))f={url:b[3],func:b[1]||k,args:b[2]?b[2].split(","):"",line:+b[4],column:b[5]?+b[5]:null};else if(b=g.exec(l[p]))f={url:b[2],func:b[1]||k,line:+b[3],column:b[4]?+b[4]:null};else{if(!(b=j.exec(l[p])))continue;f={url:b[2],func:b[1]||k,line:+b[3],column:b[4]?+b[4]:null}}!f.func&&f.line&&(f.func=c(f.url,f.line)),f.line&&(f.context=e(f.url,f.line)),m.push(f)}return m.length?(m[0].line&&!m[0].column&&o?m[0].column=n(o[1],m[0].url,m[0].line):m[0].column||h(a.columnNumber)||(m[0].column=a.columnNumber+1),{name:a.name,message:a.message,url:d(),stack:m}):null}}function q(a){var b=a.stacktrace;if(!h(a.stacktrace)&&a.stacktrace){for(var f,g=/ line (\d+), column (\d+) in (?:<anonymous function: ([^>]+)>|([^\)]+))\((.*)\) in (.*):\s*$/i,i=b.split("\n"),j=[],k=0,l=i.length;l>k;k+=2)if(f=g.exec(i[k])){var m={line:+f[1],column:+f[2],func:f[3]||f[4],args:f[5]?f[5].split(","):[],url:f[6]};if(!m.func&&m.line&&(m.func=c(m.url,m.line)),m.line)try{m.context=e(m.url,m.line)}catch(n){}m.context||(m.context=[i[k+1]]),j.push(m)}return j.length?{name:a.name,message:a.message,url:d(),stack:j}:null}}function r(a){var g=a.message.split("\n");if(g.length<4)return null;var h,i,j,k,n=/^\s*Line (\d+) of linked script ((?:file|https?)\S+)(?:: in function (\S+))?\s*$/i,o=/^\s*Line (\d+) of inline#(\d+) script in ((?:file|https?)\S+)(?:: in function (\S+))?\s*$/i,p=/^\s*Line (\d+) of function script\s*$/i,q=[],r=document.getElementsByTagName("script"),s=[];for(i in r)f(r,i)&&!r[i].src&&s.push(r[i]);for(i=2,j=g.length;j>i;i+=2){var t=null;if(h=n.exec(g[i]))t={url:h[2],func:h[3],line:+h[1]};else if(h=o.exec(g[i])){t={url:h[3],func:h[4]};var u=+h[1],v=s[h[2]-1];if(v&&(k=b(t.url))){k=k.join("\n");var w=k.indexOf(v.innerText);w>=0&&(t.line=u+k.substring(0,w).split("\n").length)}}else if(h=p.exec(g[i])){var x=window.location.href.replace(/#.*$/,""),y=h[1],z=new RegExp(l(g[i+1]));k=m(z,[x]),t={url:x,line:k?k.line:y,func:""}}if(t){t.func||(t.func=c(t.url,t.line));var A=e(t.url,t.line),B=A?A[Math.floor(A.length/2)]:null;A&&B.replace(/^\s*/,"")===g[i+1].replace(/^\s*/,"")?t.context=A:t.context=[g[i+1]],q.push(t)}}return q.length?{name:a.name,message:g[0],url:d(),stack:q}:null}function s(a,b,d,f){var g={url:b,line:d};if(g.url&&g.line){a.incomplete=!1,g.func||(g.func=c(g.url,g.line)),g.context||(g.context=e(g.url,g.line));var h=/ '([^']+)' /.exec(f);if(h&&(g.column=n(h[1],g.url,g.line)),a.stack.length>0&&a.stack[0].url===g.url){if(a.stack[0].line===g.line)return!1;if(!a.stack[0].line&&a.stack[0].func===g.func)return a.stack[0].line=g.line,a.stack[0].context=g.context,!1}return a.stack.unshift(g),a.partial=!0,!0}return a.incomplete=!0,!1}function t(a,b){for(var e,f,g,h=/function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i,j=[],l={},m=!1,p=t.caller;p&&!m;p=p.caller)if(p!==u&&p!==i.report){if(f={url:null,func:k,line:null,column:null},p.name?f.func=p.name:(e=h.exec(p.toString()))&&(f.func=e[1]),"undefined"==typeof f.func)try{f.func=e.input.substring(0,e.input.indexOf("{"))}catch(q){}if(g=o(p)){f.url=g.url,f.line=g.line,f.func===k&&(f.func=c(f.url,f.line));var r=/ '([^']+)' /.exec(a.message||a.description);r&&(f.column=n(r[1],g.url,g.line))}l[""+p]?m=!0:l[""+p]=!0,j.push(f)}b&&j.splice(0,b);var v={name:a.name,message:a.message,url:d(),stack:j};return s(v,a.sourceURL||a.fileName,a.line||a.lineNumber,a.message||a.description),v}function u(a,b){var c=null;b=null==b?0:+b;try{if(c=q(a))return c}catch(e){if(i.debug)throw e}try{if(c=p(a))return c}catch(e){if(i.debug)throw e}try{if(c=r(a))return c}catch(e){if(i.debug)throw e}try{if(c=t(a,b+1))return c}catch(e){if(i.debug)throw e}return{name:a.name,message:a.message,url:d()}}var v={};return u.augmentStackTraceWithInitialElement=s,u.computeStackTraceFromStackProp=p,u.guessFunctionName=c,u.gatherContext=e,u}(),b.exports=i},{"../../src/utils":4}]},{},[3])(3)}); | ||
//# sourceMappingURL=raven.min.map | ||
/*! Raven.js 2.1.0 (9ca11cd) | github.com/getsentry/raven-js */ | ||
!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.Raven=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){"use strict";function d(a){this.name="RavenConfigError",this.message=a}d.prototype=new Error,d.prototype.constructor=d,b.exports=d},{}],2:[function(a,b,c){"use strict";function d(){return+new Date}function e(){this._hasJSON=!("object"!=typeof JSON||!JSON.stringify),this._hasDocument="undefined"!=typeof document,this._lastCapturedException=null,this._lastEventId=null,this._globalServer=null,this._globalKey=null,this._globalProject=null,this._globalContext={},this._globalOptions={logger:"javascript",ignoreErrors:[],ignoreUrls:[],whitelistUrls:[],includePaths:[],crossOrigin:"anonymous",collectWindowErrors:!0,maxMessageLength:0,stackTraceLimit:50},this._ignoreOnError=0,this._isRavenInstalled=!1,this._originalErrorStackTraceLimit=Error.stackTraceLimit,this._originalConsole=window.console||{},this._originalConsoleMethods={},this._plugins=[],this._startTime=d(),this._wrappedBuiltIns=[];for(var a in this._originalConsole)this._originalConsoleMethods[a]=this._originalConsole[a]}var f=a("../vendor/TraceKit/tracekit"),g=a("./configError"),h=a("./utils"),i=h.isFunction,j=h.isUndefined,k=h.isError,l=h.isEmptyObject,m=h.hasKey,n=h.joinRegExp,o=h.each,p=h.objectMerge,q=h.truncate,r=h.urlencode,s=h.uuid4,t="source protocol user pass host port path".split(" "),u=/^(?:(\w+):)?\/\/(?:(\w+)(:\w+)?@)?([\w\.-]+)(?::(\d+))?(\/.*)/;e.prototype={VERSION:"2.1.0",debug:!1,TraceKit:f,config:function(a,b){var c=this;if(this._globalServer)return this._logDebug("error","Error: Raven has already been configured"),this;if(!a)return this;var d=this._parseDSN(a),e=d.path.lastIndexOf("/"),g=d.path.substr(1,e);return b&&o(b,function(a,b){"tags"===a||"extra"===a?c._globalContext[a]=b:c._globalOptions[a]=b}),this._dsn=a,this._globalOptions.ignoreErrors.push(/^Script error\.?$/),this._globalOptions.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/),this._globalOptions.ignoreErrors=n(this._globalOptions.ignoreErrors),this._globalOptions.ignoreUrls=this._globalOptions.ignoreUrls.length?n(this._globalOptions.ignoreUrls):!1,this._globalOptions.whitelistUrls=this._globalOptions.whitelistUrls.length?n(this._globalOptions.whitelistUrls):!1,this._globalOptions.includePaths=n(this._globalOptions.includePaths),this._globalKey=d.user,this._globalProject=d.path.substr(e+1),this._globalServer=this._getGlobalServer(d),this._globalEndpoint=this._globalServer+"/"+g+"api/"+this._globalProject+"/store/",this._globalOptions.fetchContext&&(f.remoteFetching=!0),this._globalOptions.linesOfContext&&(f.linesOfContext=this._globalOptions.linesOfContext),f.collectWindowErrors=!!this._globalOptions.collectWindowErrors,this},install:function(){var a=this;return this.isSetup()&&!this._isRavenInstalled&&(f.report.subscribe(function(){a._handleOnErrorStackInfo.apply(a,arguments)}),this._wrapBuiltIns(),this._drainPlugins(),this._isRavenInstalled=!0),Error.stackTraceLimit=this._globalOptions.stackTraceLimit,this},context:function(a,b,c){return i(a)&&(c=b||[],b=a,a=void 0),this.wrap(a,b).apply(this,c)},wrap:function(a,b){function c(){for(var c=[],e=arguments.length,f=!a||a&&a.deep!==!1;e--;)c[e]=f?d.wrap(a,arguments[e]):arguments[e];try{return b.apply(this,c)}catch(g){throw d._ignoreNextOnError(),d.captureException(g,a),g}}var d=this;if(j(b)&&!i(a))return a;if(i(a)&&(b=a,a=void 0),!i(b))return b;if(b.__raven__)return b;if(b.__raven_wrapper__)return b.__raven_wrapper__;for(var e in b)m(b,e)&&(c[e]=b[e]);return b.__raven_wrapper__=c,c.prototype=b.prototype,c.__raven__=!0,c.__inner__=b,c},uninstall:function(){return f.report.uninstall(),this._restoreBuiltIns(),Error.stackTraceLimit=this._originalErrorStackTraceLimit,this._isRavenInstalled=!1,this},captureException:function(a,b){if(!k(a))return this.captureMessage(a,b);this._lastCapturedException=a;try{var c=f.computeStackTrace(a);this._handleStackInfo(c,b)}catch(d){if(a!==d)throw d}return this},captureMessage:function(a,b){return this._globalOptions.ignoreErrors.test&&this._globalOptions.ignoreErrors.test(a)?void 0:(this._send(p({message:a+""},b)),this)},addPlugin:function(a){var b=Array.prototype.slice.call(arguments,1);return this._plugins.push([a,b]),this._isRavenInstalled&&this._drainPlugins(),this},setUserContext:function(a){return this._globalContext.user=a,this},setExtraContext:function(a){return this._mergeContext("extra",a),this},setTagsContext:function(a){return this._mergeContext("tags",a),this},clearContext:function(){return this._globalContext={},this},getContext:function(){return JSON.parse(JSON.stringify(this._globalContext))},setRelease:function(a){return this._globalOptions.release=a,this},setDataCallback:function(a){return this._globalOptions.dataCallback=a,this},setShouldSendCallback:function(a){return this._globalOptions.shouldSendCallback=a,this},setTransport:function(a){return this._globalOptions.transport=a,this},lastException:function(){return this._lastCapturedException},lastEventId:function(){return this._lastEventId},isSetup:function(){return this._hasJSON?this._globalServer?!0:(this.ravenNotConfiguredError||(this.ravenNotConfiguredError=!0,this._logDebug("error","Error: Raven has not been configured.")),!1):!1},afterLoad:function(){var a=window.RavenConfig;a&&this.config(a.dsn,a.config).install()},showReportDialog:function(a){if(window.document){a=a||{};var b=a.eventId||this.lastEventId();if(!b)throw new g("Missing eventId");var c=a.dsn||this._dsn;if(!c)throw new g("Missing DSN");var d=encodeURIComponent,e="";e+="?eventId="+d(b),e+="&dsn="+d(c);var f=a.user||this._globalContext.user;f&&(f.name&&(e+="&name="+d(f.name)),f.email&&(e+="&email="+d(f.email)));var h=this._getGlobalServer(this._parseDSN(c)),i=document.createElement("script");i.async=!0,i.src=h+"/api/embed/error-page/"+e,(document.head||document.body).appendChild(i)}},_ignoreNextOnError:function(){var a=this;this._ignoreOnError+=1,setTimeout(function(){a._ignoreOnError-=1})},_triggerEvent:function(a,b){var c,d;if(this._hasDocument){b=b||{},a="raven"+a.substr(0,1).toUpperCase()+a.substr(1),document.createEvent?(c=document.createEvent("HTMLEvents"),c.initEvent(a,!0,!0)):(c=document.createEventObject(),c.eventType=a);for(d in b)m(b,d)&&(c[d]=b[d]);if(document.createEvent)document.dispatchEvent(c);else try{document.fireEvent("on"+c.eventType.toLowerCase(),c)}catch(e){}}},_wrapBuiltIns:function(){function a(a,b,d,e){var f=a[b];a[b]=d(f),e||c._wrappedBuiltIns.push([a,b,f])}function b(a){return function(b,d){var e=[].slice.call(arguments),f=e[0];return i(f)&&(e[0]=c.wrap(f)),a.apply?a.apply(this,e):a(e[0],e[1])}}var c=this;a(window,"setTimeout",b),a(window,"setInterval",b),window.requestAnimationFrame&&a(window,"requestAnimationFrame",function(a){return function(b){return a(c.wrap(b))}}),"EventTarget Window Node ApplicationCache AudioTrackList ChannelMergerNode CryptoOperation EventSource FileReader HTMLUnknownElement IDBDatabase IDBRequest IDBTransaction KeyOperation MediaController MessagePort ModalWindow Notification SVGElementInstance Screen TextTrack TextTrackCue TextTrackList WebSocket WebSocketWorker Worker XMLHttpRequest XMLHttpRequestEventTarget XMLHttpRequestUpload".replace(/\w+/g,function(b){var d=window[b]&&window[b].prototype;d&&d.hasOwnProperty&&d.hasOwnProperty("addEventListener")&&(a(d,"addEventListener",function(a){return function(b,d,e,f){try{d&&d.handleEvent&&(d.handleEvent=c.wrap(d.handleEvent))}catch(g){}return a.call(this,b,c.wrap(d),e,f)}}),a(d,"removeEventListener",function(a){return function(b,c,d,e){return c=c&&(c.__raven_wrapper__?c.__raven_wrapper__:c),a.call(this,b,c,d,e)}}))}),"XMLHttpRequest"in window&&a(XMLHttpRequest.prototype,"send",function(b){return function(d){var e=this;return"onreadystatechange onload onerror onprogress".replace(/\w+/g,function(b){b in e&&"[object Function]"===Object.prototype.toString.call(e[b])&&a(e,b,function(a){return c.wrap(a)},!0)}),b.apply(this,arguments)}});var d=window.jQuery||window.$;d&&d.fn&&d.fn.ready&&a(d.fn,"ready",function(a){return function(b){return a.call(this,c.wrap(b))}})},_restoreBuiltIns:function(){for(var a;this._wrappedBuiltIns.length;){a=this._wrappedBuiltIns.shift();var b=a[0],c=a[1],d=a[2];b[c]=d}},_drainPlugins:function(){var a=this;o(this._plugins,function(b,c){var d=c[0],e=c[1];d.apply(a,[a].concat(e))})},_parseDSN:function(a){var b=u.exec(a),c={},d=7;try{for(;d--;)c[t[d]]=b[d]||""}catch(e){throw new g("Invalid DSN: "+a)}if(c.pass)throw new g("Do not specify your private key in the DSN!");return c},_getGlobalServer:function(a){var b="//"+a.host+(a.port?":"+a.port:"");return a.protocol&&(b=a.protocol+":"+b),b},_handleOnErrorStackInfo:function(){this._ignoreOnError||this._handleStackInfo.apply(this,arguments)},_handleStackInfo:function(a,b){var c=this,d=[];a.stack&&a.stack.length&&o(a.stack,function(a,b){var e=c._normalizeFrame(b);e&&d.push(e)}),this._triggerEvent("handle",{stackInfo:a,options:b}),this._processException(a.name,a.message,a.url,a.lineno,d.slice(0,this._globalOptions.stackTraceLimit),b)},_normalizeFrame:function(a){if(a.url){var b,c={filename:a.url,lineno:a.line,colno:a.column,"function":a.func||"?"},d=this._extractContextFromFrame(a);if(d){var e=["pre_context","context_line","post_context"];for(b=3;b--;)c[e[b]]=d[b]}return c.in_app=!(this._globalOptions.includePaths.test&&!this._globalOptions.includePaths.test(c.filename)||/(Raven|TraceKit)\./.test(c["function"])||/raven\.(min\.)?js$/.test(c.filename)),c}},_extractContextFromFrame:function(a){if(a.context&&this._globalOptions.fetchContext){for(var b=a.context,c=~~(b.length/2),d=b.length,e=!1;d--;)if(b[d].length>300){e=!0;break}if(e){if(j(a.column))return;return[[],b[c].substr(a.column,50),[]]}return[b.slice(0,c),b[c],b.slice(c+1)]}},_processException:function(a,b,c,d,e,f){var g,h;if((!this._globalOptions.ignoreErrors.test||!this._globalOptions.ignoreErrors.test(b))&&(b+="",b=q(b,this._globalOptions.maxMessageLength),h=a+": "+b,h=q(h,this._globalOptions.maxMessageLength),e&&e.length?(c=e[0].filename||c,e.reverse(),g={frames:e}):c&&(g={frames:[{filename:c,lineno:d,in_app:!0}]}),(!this._globalOptions.ignoreUrls.test||!this._globalOptions.ignoreUrls.test(c))&&(!this._globalOptions.whitelistUrls.test||this._globalOptions.whitelistUrls.test(c)))){var i=p({exception:{values:[{type:a,value:b,stacktrace:g}]},culprit:c,message:h},f);this._send(i)}},_trimPacket:function(a){var b=this._globalOptions.maxMessageLength;if(a.message=q(a.message,b),a.exception){var c=a.exception.values[0];c.value=q(c.value,b)}return a},_getHttpData:function(){if(this._hasDocument&&document.location&&document.location.href){var a={headers:{"User-Agent":navigator.userAgent}};return a.url=document.location.href,document.referrer&&(a.headers.Referer=document.referrer),a}},_send:function(a){var b=this,c=this._globalOptions,e={project:this._globalProject,logger:c.logger,platform:"javascript"},f=this._getHttpData();if(f&&(e.request=f),a=p(e,a),a.tags=p(p({},this._globalContext.tags),a.tags),a.extra=p(p({},this._globalContext.extra),a.extra),a.extra["session:duration"]=d()-this._startTime,l(a.tags)&&delete a.tags,this._globalContext.user&&(a.user=this._globalContext.user),c.release&&(a.release=c.release),c.serverName&&(a.server_name=c.serverName),c.release&&(a.release=c.release),i(c.dataCallback)&&(a=c.dataCallback(a)||a),a&&!l(a)&&(!i(c.shouldSendCallback)||c.shouldSendCallback(a))&&(this._lastEventId=a.event_id||(a.event_id=s()),a=this._trimPacket(a),this._logDebug("debug","Raven about to send:",a),this.isSetup())){var g=this._globalEndpoint;(c.transport||this._makeRequest).call(this,{url:g,auth:{sentry_version:"7",sentry_client:"raven-js/"+this.VERSION,sentry_key:this._globalKey},data:a,options:c,onSuccess:function(){b._triggerEvent("success",{data:a,src:g})},onError:function(){b._triggerEvent("failure",{data:a,src:g})}})}},_makeImageRequest:function(a){a.auth.sentry_data=JSON.stringify(a.data);var b=this._newImage(),c=a.url+"?"+r(a.auth),d=a.options.crossOrigin;(d||""===d)&&(b.crossOrigin=d),b.onload=a.onSuccess,b.onerror=b.onabort=a.onError,b.src=c},_makeXhrRequest:function(a){function b(){200===c.status?a.onSuccess&&a.onSuccess():a.onError&&a.onError()}var c,d=a.url;c=new XMLHttpRequest,"withCredentials"in c?c.onreadystatechange=function(){4===c.readyState&&b()}:(c=new XDomainRequest,d=d.replace(/^https?:/,""),c.onload=b),c.open("POST",d+"?"+r(a.auth)),c.send(JSON.stringify(a.data))},_makeRequest:function(a){var b="withCredentials"in new XMLHttpRequest||"undefined"!=typeof XDomainRequest;return(b?this._makeXhrRequest:this._makeImageRequest)(a)},_newImage:function(){return document.createElement("img")},_logDebug:function(a){this._originalConsoleMethods[a]&&this.debug&&Function.prototype.apply.call(this._originalConsoleMethods[a],this._originalConsole,[].slice.call(arguments,1))},_mergeContext:function(a,b){j(b)?delete this._globalContext[a]:this._globalContext[a]=p(this._globalContext[a]||{},b)}},e.prototype.setUser=e.prototype.setUserContext,e.prototype.setReleaseContext=e.prototype.setRelease,b.exports=e},{"../vendor/TraceKit/tracekit":5,"./configError":1,"./utils":4}],3:[function(a,b,c){"use strict";var d=a("./raven"),e=window.Raven,f=new d;f.noConflict=function(){return window.Raven=e,f},f.afterLoad(),b.exports=f},{"./raven":2}],4:[function(a,b,c){"use strict";function d(a){return void 0===a}function e(a){return"function"==typeof a}function f(a){return"[object String]"===q.toString.call(a)}function g(a){return"object"==typeof a&&null!==a}function h(a){for(var b in a)return!1;return!0}function i(a){return g(a)&&"[object Error]"===q.toString.call(a)||a instanceof Error}function j(a,b){var c,e;if(d(a.length))for(c in a)m(a,c)&&b.call(null,c,a[c]);else if(e=a.length)for(c=0;e>c;c++)b.call(null,c,a[c])}function k(a,b){return b?(j(b,function(b,c){a[b]=c}),a):a}function l(a,b){return!b||a.length<=b?a:a.substr(0,b)+"…"}function m(a,b){return q.hasOwnProperty.call(a,b)}function n(a){for(var b,c=[],d=0,e=a.length;e>d;d++)b=a[d],f(b)?c.push(b.replace(/([.*+?^=!:${}()|\[\]\/\\])/g,"\\$1")):b&&b.source&&c.push(b.source);return new RegExp(c.join("|"),"i")}function o(a){var b=[];return j(a,function(a,c){b.push(encodeURIComponent(a)+"="+encodeURIComponent(c))}),b.join("&")}function p(){var a=window.crypto||window.msCrypto;if(!d(a)&&a.getRandomValues){var b=new Uint16Array(8);a.getRandomValues(b),b[3]=4095&b[3]|16384,b[4]=16383&b[4]|32768;var c=function(a){for(var b=a.toString(16);b.length<4;)b="0"+b;return b};return c(b[0])+c(b[1])+c(b[2])+c(b[3])+c(b[4])+c(b[5])+c(b[6])+c(b[7])}return"xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(/[xy]/g,function(a){var b=16*Math.random()|0,c="x"===a?b:3&b|8;return c.toString(16)})}var q=Object.prototype;b.exports={isUndefined:d,isFunction:e,isString:f,isObject:g,isEmptyObject:h,isError:i,each:j,objectMerge:k,truncate:l,hasKey:m,joinRegExp:n,urlencode:o,uuid4:p}},{}],5:[function(a,b,c){"use strict";function d(){return"undefined"==typeof document?"":document.location.href}var e=a("../../src/utils"),f=e.hasKey,g=e.isString,h=e.isUndefined,i={remoteFetching:!1,collectWindowErrors:!0,linesOfContext:7,debug:!1},j=[].slice,k="?";i.report=function(){function a(a){h(),p.push(a)}function b(a){for(var b=p.length-1;b>=0;--b)p[b]===a&&p.splice(b,1)}function c(){k(),p=[]}function e(a,b){var c=null;if(!b||i.collectWindowErrors){for(var d in p)if(f(p,d))try{p[d].apply(null,[a].concat(j.call(arguments,2)))}catch(e){c=e}if(c)throw c}}function g(a,b,c,f,g){var h=null;if(s)i.computeStackTrace.augmentStackTraceWithInitialElement(s,b,c,a),l();else if(g)h=i.computeStackTrace(g),e(h,!0);else{var j={url:b,line:c,column:f};j.func=i.computeStackTrace.guessFunctionName(j.url,j.line),j.context=i.computeStackTrace.gatherContext(j.url,j.line),h={message:a,url:d(),stack:[j]},e(h,!0)}return n?n.apply(this,arguments):!1}function h(){o||(n=window.onerror,window.onerror=g,o=!0)}function k(){o&&(window.onerror=n,o=!1,n=void 0)}function l(){var a=s,b=q;q=null,s=null,r=null,e.apply(null,[a,!1].concat(b))}function m(a,b){var c=j.call(arguments,1);if(s){if(r===a)return;l()}var d=i.computeStackTrace(a);if(s=d,r=a,q=c,window.setTimeout(function(){r===a&&l()},d.incomplete?2e3:0),b!==!1)throw a}var n,o,p=[],q=null,r=null,s=null;return m.subscribe=a,m.unsubscribe=b,m.uninstall=c,m}(),i.computeStackTrace=function(){function a(a){if(!i.remoteFetching)return"";try{var b=function(){try{return new window.XMLHttpRequest}catch(a){return new window.ActiveXObject("Microsoft.XMLHTTP")}},c=b();return c.open("GET",a,!1),c.send(""),c.responseText}catch(d){return""}}function b(b){if(!g(b))return[];if(!f(v,b)){var c="",d="";try{d=document.domain}catch(e){}-1!==b.indexOf(d)&&(c=a(b)),v[b]=c?c.split("\n"):[]}return v[b]}function c(a,c){var d,e=/function ([^(]*)\(([^)]*)\)/,f=/['"]?([0-9A-Za-z$_]+)['"]?\s*[:=]\s*(function|eval|new Function)/,g="",i=10,j=b(a);if(!j.length)return k;for(var l=0;i>l;++l)if(g=j[c-l]+g,!h(g)){if(d=f.exec(g))return d[1];if(d=e.exec(g))return d[1]}return k}function e(a,c){var d=b(a);if(!d.length)return null;var e=[],f=Math.floor(i.linesOfContext/2),g=f+i.linesOfContext%2,j=Math.max(0,c-f-1),k=Math.min(d.length,c+g-1);c-=1;for(var l=j;k>l;++l)h(d[l])||e.push(d[l]);return e.length>0?e:null}function j(a){return a.replace(/[\-\[\]{}()*+?.,\\\^$|#]/g,"\\$&")}function l(a){return j(a).replace("<","(?:<|<)").replace(">","(?:>|>)").replace("&","(?:&|&)").replace('"','(?:"|")').replace(/\s+/g,"\\s+")}function m(a,c){for(var d,e,f=0,g=c.length;g>f;++f)if((d=b(c[f])).length&&(d=d.join("\n"),e=a.exec(d)))return{url:c[f],line:d.substring(0,e.index).split("\n").length,column:e.index-d.lastIndexOf("\n",e.index)-1};return null}function n(a,c,d){var e,f=b(c),g=new RegExp("\\b"+j(a)+"\\b");return d-=1,f&&f.length>d&&(e=g.exec(f[d]))?e.index:null}function o(a){if("undefined"!=typeof document){for(var b,c,d,e,f=[window.location.href],g=document.getElementsByTagName("script"),h=""+a,i=/^function(?:\s+([\w$]+))?\s*\(([\w\s,]*)\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/,k=/^function on([\w$]+)\s*\(event\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/,n=0;n<g.length;++n){var o=g[n];o.src&&f.push(o.src)}if(d=i.exec(h)){var p=d[1]?"\\s+"+d[1]:"",q=d[2].split(",").join("\\s*,\\s*");b=j(d[3]).replace(/;$/,";?"),c=new RegExp("function"+p+"\\s*\\(\\s*"+q+"\\s*\\)\\s*{\\s*"+b+"\\s*}")}else c=new RegExp(j(h).replace(/\s+/g,"\\s+"));if(e=m(c,f))return e;if(d=k.exec(h)){var r=d[1];if(b=l(d[2]),c=new RegExp("on"+r+"=[\\'\"]\\s*"+b+"\\s*[\\'\"]","i"),e=m(c,f[0]))return e;if(c=new RegExp(b),e=m(c,f))return e}return null}}function p(a){if(!h(a.stack)&&a.stack){for(var b,f,g=/^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|<anonymous>).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,i=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|\[).*?)(?::(\d+))?(?::(\d+))?\s*$/i,j=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:ms-appx|https?|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i,l=a.stack.split("\n"),m=[],o=/^(.*) is undefined$/.exec(a.message),p=0,q=l.length;q>p;++p){if(b=g.exec(l[p])){var r=b[2]&&-1!==b[2].indexOf("native");f={url:r?null:b[2],func:b[1]||k,args:r?[b[2]]:[],line:b[3]?+b[3]:null,column:b[4]?+b[4]:null}}else if(b=j.exec(l[p]))f={url:b[2],func:b[1]||k,args:[],line:+b[3],column:b[4]?+b[4]:null};else{if(!(b=i.exec(l[p])))continue;f={url:b[3],func:b[1]||k,args:b[2]?b[2].split(","):[],line:b[4]?+b[4]:null,column:b[5]?+b[5]:null}}!f.func&&f.line&&(f.func=c(f.url,f.line)),f.line&&(f.context=e(f.url,f.line)),m.push(f)}return m.length?(m[0].line&&!m[0].column&&o?m[0].column=n(o[1],m[0].url,m[0].line):m[0].column||h(a.columnNumber)||(m[0].column=a.columnNumber+1),{name:a.name,message:a.message,url:d(),stack:m}):null}}function q(a){var b=a.stacktrace;if(!h(a.stacktrace)&&a.stacktrace){for(var f,g=/ line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i,i=/ line (\d+), column (\d+)\s*(?:in (?:<anonymous function: ([^>]+)>|([^\)]+))\((.*)\))? in (.*):\s*$/i,j=b.split("\n"),k=[],l=0;l<j.length;l+=2){var m=null;if((f=g.exec(j[l]))?m={url:f[2],line:+f[1],column:null,func:f[3],args:[]}:(f=i.exec(j[l]))&&(m={url:f[6],line:+f[1],column:+f[2],func:f[3]||f[4],args:f[5]?f[5].split(","):[]}),m){if(!m.func&&m.line&&(m.func=c(m.url,m.line)),m.line)try{m.context=e(m.url,m.line)}catch(n){}m.context||(m.context=[j[l+1]]),k.push(m)}}return k.length?{name:a.name,message:a.message,url:d(),stack:k}:null}}function r(a){var g=a.message.split("\n");if(g.length<4)return null;var h,i=/^\s*Line (\d+) of linked script ((?:file|https?|blob)\S+)(?:: in function (\S+))?\s*$/i,j=/^\s*Line (\d+) of inline#(\d+) script in ((?:file|https?|blob)\S+)(?:: in function (\S+))?\s*$/i,k=/^\s*Line (\d+) of function script\s*$/i,n=[],o=document.getElementsByTagName("script"),p=[];for(var q in o)f(o,q)&&!o[q].src&&p.push(o[q]);for(var r=2;r<g.length;r+=2){var s=null;if(h=i.exec(g[r]))s={url:h[2],func:h[3],args:[],line:+h[1],column:null};else if(h=j.exec(g[r])){s={url:h[3],func:h[4],args:[],line:+h[1],column:null};var t=+h[1],u=p[h[2]-1];if(u){var v=b(s.url);if(v){v=v.join("\n");var w=v.indexOf(u.innerText);w>=0&&(s.line=t+v.substring(0,w).split("\n").length)}}}else if(h=k.exec(g[r])){var x=window.location.href.replace(/#.*$/,""),y=new RegExp(l(g[r+1])),z=m(y,[x]);s={url:x,func:"",args:[],line:z?z.line:h[1],column:null}}if(s){s.func||(s.func=c(s.url,s.line));var A=e(s.url,s.line),B=A?A[Math.floor(A.length/2)]:null;A&&B.replace(/^\s*/,"")===g[r+1].replace(/^\s*/,"")?s.context=A:s.context=[g[r+1]],n.push(s)}}return n.length?{name:a.name,message:g[0],url:d(),stack:n}:null}function s(a,b,d,f){var g={url:b,line:d};if(g.url&&g.line){a.incomplete=!1,g.func||(g.func=c(g.url,g.line)),g.context||(g.context=e(g.url,g.line));var h=/ '([^']+)' /.exec(f);if(h&&(g.column=n(h[1],g.url,g.line)),a.stack.length>0&&a.stack[0].url===g.url){if(a.stack[0].line===g.line)return!1;if(!a.stack[0].line&&a.stack[0].func===g.func)return a.stack[0].line=g.line,a.stack[0].context=g.context,!1}return a.stack.unshift(g),a.partial=!0,!0}return a.incomplete=!0,!1}function t(a,b){for(var e,f,g,h=/function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i,j=[],l={},m=!1,p=t.caller;p&&!m;p=p.caller)if(p!==u&&p!==i.report){if(f={url:null,func:k,line:null,column:null},p.name?f.func=p.name:(e=h.exec(p.toString()))&&(f.func=e[1]),"undefined"==typeof f.func)try{f.func=e.input.substring(0,e.input.indexOf("{"))}catch(q){}if(g=o(p)){f.url=g.url,f.line=g.line,f.func===k&&(f.func=c(f.url,f.line));var r=/ '([^']+)' /.exec(a.message||a.description);r&&(f.column=n(r[1],g.url,g.line))}l[""+p]?m=!0:l[""+p]=!0,j.push(f)}b&&j.splice(0,b);var v={name:a.name,message:a.message,url:d(),stack:j};return s(v,a.sourceURL||a.fileName,a.line||a.lineNumber,a.message||a.description),v}function u(a,b){var c=null;b=null==b?0:+b;try{if(c=q(a))return c}catch(e){if(i.debug)throw e}try{if(c=p(a))return c}catch(e){if(i.debug)throw e}try{if(c=r(a))return c}catch(e){if(i.debug)throw e}try{if(c=t(a,b+1))return c}catch(e){if(i.debug)throw e}return{name:a.name,message:a.message,url:d()}}var v={};return u.augmentStackTraceWithInitialElement=s,u.computeStackTraceFromStackProp=p,u.guessFunctionName=c,u.gatherContext=e,u}(),b.exports=i},{"../../src/utils":4}]},{},[3])(3)}); | ||
//# sourceMappingURL=raven.min.js.map |
{ | ||
"@dist/raven.js": { | ||
"hashes": { | ||
"sha256": "VoWG5FjRcWv0Zpefd2xHF3HfVviDN+c9iGJsNDDUPDs=", | ||
"sha512": "kVByPWaa0uYOKn/v797k7YGPrEAKmqH0nsMCMv5ssiE1e+AmrjCzDcMWEUER/53sYoGqynGj+ReRzGd+kWlCHQ==" | ||
"sha256": "CCTMmoqRyMome21evusgcQTqtn4S6dh2IYXy/9iXC5w=", | ||
"sha512": "MV0+GMYq1nnf7Ur8v6wRJM7JTbk1lS+1U/e7RaZZA4+8BY+Ft2JvNUnLzi7UZli+lBFhsBEwdevuL5Qms7J9jw==" | ||
}, | ||
"type": null, | ||
"integrity": "sha256-VoWG5FjRcWv0Zpefd2xHF3HfVviDN+c9iGJsNDDUPDs= sha512-kVByPWaa0uYOKn/v797k7YGPrEAKmqH0nsMCMv5ssiE1e+AmrjCzDcMWEUER/53sYoGqynGj+ReRzGd+kWlCHQ==", | ||
"integrity": "sha256-CCTMmoqRyMome21evusgcQTqtn4S6dh2IYXy/9iXC5w= sha512-MV0+GMYq1nnf7Ur8v6wRJM7JTbk1lS+1U/e7RaZZA4+8BY+Ft2JvNUnLzi7UZli+lBFhsBEwdevuL5Qms7J9jw==", | ||
"path": "dist/raven.js" | ||
@@ -13,9 +13,9 @@ }, | ||
"hashes": { | ||
"sha256": "DBVw7D0VtUxKOHCgay6isJm54nkEVL5v36xp7RVg06c=", | ||
"sha512": "EDIenuweiUZDMoQRxmw8huGReOChxTiTTBwZd0T6Mb/uh9fc4o8BdeF77BOZidawGJGtRPc28sP4zgk8SHhFbw==" | ||
"sha256": "65Ulhun150ZZFP+ifmeWjzFGRy4X+TWYNaYJ44f3TTk=", | ||
"sha512": "wSTFPL8615g/+7ge4NVK1tHB1butUtCMhpLxknSXFrVukUf5YyO+NWRRSZAMDdBw2UXVoHODwoTK9cf4pDYRPQ==" | ||
}, | ||
"type": null, | ||
"integrity": "sha256-DBVw7D0VtUxKOHCgay6isJm54nkEVL5v36xp7RVg06c= sha512-EDIenuweiUZDMoQRxmw8huGReOChxTiTTBwZd0T6Mb/uh9fc4o8BdeF77BOZidawGJGtRPc28sP4zgk8SHhFbw==", | ||
"integrity": "sha256-65Ulhun150ZZFP+ifmeWjzFGRy4X+TWYNaYJ44f3TTk= sha512-wSTFPL8615g/+7ge4NVK1tHB1butUtCMhpLxknSXFrVukUf5YyO+NWRRSZAMDdBw2UXVoHODwoTK9cf4pDYRPQ==", | ||
"path": "dist/raven.min.js" | ||
} | ||
} |
@@ -43,1 +43,38 @@ function foo() { | ||
} | ||
function showDialog() { | ||
broken(); | ||
Raven.showReportDialog(); | ||
} | ||
function blobExample() { | ||
var xhr = new XMLHttpRequest(); | ||
xhr.open('GET', 'stack.js'); | ||
xhr.onreadystatechange = function () { | ||
if (xhr.readyState === 4) { | ||
var blob = new Blob([xhr.responseText], {type: 'application/javascript'}); | ||
var url = URL.createObjectURL(blob); | ||
var script = document.createElement('script'); | ||
script.src = url; | ||
document.head.appendChild(script); | ||
} | ||
}; | ||
xhr.send(); | ||
} | ||
function a() { b(); } | ||
function b() { c(); } | ||
function c() { d(); } | ||
function d() { e(); } | ||
function e() { f(); } | ||
function f() { g(); } | ||
function g() { h(); } | ||
function h() { i(); } | ||
function i() { j(); } | ||
function j() { k(); } | ||
function k() { l(); } | ||
function l() { m(); } | ||
function m() { n(); } | ||
function n() { o(); } | ||
function o() { throw new Error('dang'); } |
199
Gruntfile.js
@@ -1,10 +0,9 @@ | ||
var proxyquire = require('proxyquireify'); | ||
var versionify = require('browserify-versionify'); | ||
'use strict'; | ||
module.exports = function(grunt) { | ||
"use strict"; | ||
var _ = require('lodash'); | ||
var path = require('path'); | ||
var through = require('through2'); | ||
var proxyquire = require('proxyquireify'); | ||
var versionify = require('browserify-versionify'); | ||
var derequire = require('derequire/plugin'); | ||
@@ -19,8 +18,8 @@ | ||
plugins = _.map(plugins ? plugins.split(',') : [], function (plugin) { | ||
var path = 'plugins/' + plugin + '.js'; | ||
var p = 'plugins/' + plugin + '.js'; | ||
if(!grunt.file.exists(path)) | ||
if(!grunt.file.exists(p)) | ||
throw new Error("Plugin '" + plugin + "' not found in plugins directory."); | ||
return path; | ||
return p; | ||
}); | ||
@@ -74,3 +73,21 @@ | ||
var pluginCombinations = combine(grunt.file.expand('plugins/*.js')); | ||
var plugins = grunt.file.expand('plugins/*.js'); | ||
var cleanedPlugins = plugins.filter(function (plugin) { | ||
var pluginName = path.basename(plugin, '.js'); | ||
return excludedPlugins.indexOf(pluginName) === -1; | ||
}); | ||
var pluginSingleFiles = cleanedPlugins.map(function (plugin) { | ||
var filename = path.basename(plugin); | ||
var file = {}; | ||
file.src = plugin; | ||
file.dest = path.join('build', 'plugins', filename); | ||
return file; | ||
}); | ||
var pluginCombinations = combine(plugins); | ||
var pluginConcatFiles = _.reduce(pluginCombinations, function (dict, comb) { | ||
@@ -88,58 +105,78 @@ var key = _.map(comb, function (plugin) { | ||
var gruntConfig = { | ||
pkg: grunt.file.readJSON('package.json'), | ||
aws: grunt.file.exists('aws.json') ? grunt.file.readJSON('aws.json'): {}, | ||
clean: ['build'], | ||
browserify: { | ||
options: { | ||
var browserifyConfig = { | ||
options: { | ||
banner: grunt.file.read('template/_copyright.js'), | ||
browserifyOptions: { | ||
banner: grunt.file.read('template/_copyright.js'), | ||
standalone: 'Raven' // umd | ||
}, | ||
transform: [versionify], | ||
standalone: 'Raven' // umd | ||
}, | ||
transform: [ versionify ], | ||
plugin: [ derequire ] | ||
}, | ||
core: { | ||
src: 'src/singleton.js', | ||
dest: 'build/raven.js' | ||
}, | ||
plugins: { | ||
files: pluginConcatFiles, | ||
}, | ||
core: { | ||
src: 'src/singleton.js', | ||
dest: 'build/raven.js' | ||
}, | ||
'plugins-combined': { | ||
files: pluginConcatFiles, | ||
options: { | ||
transform: [ | ||
[ versionify ], | ||
[ new AddPluginBrowserifyTransformer() ] | ||
] | ||
} | ||
}, | ||
test: { | ||
src: 'test/**/*.test.js', | ||
transform: [ | ||
[ versionify ], | ||
[ new AddPluginBrowserifyTransformer() ] | ||
] | ||
} | ||
}, | ||
test: { | ||
src: 'test/**/*.test.js', | ||
dest: 'build/raven.test.js', | ||
options: { | ||
browserifyOptions: { | ||
debug: true // source maps | ||
}, | ||
plugin: [proxyquire.plugin] | ||
browserifyOptions: { | ||
debug: true // source maps | ||
}, | ||
plugin: [proxyquire.plugin] | ||
} | ||
} | ||
}; | ||
// Create a dedicated entry in browserify config for | ||
// each individual plugin (each needs a unique `standalone` | ||
// config) | ||
var browserifyPluginTaskNames = []; | ||
pluginSingleFiles.forEach(function (item) { | ||
var name = item.src | ||
.replace(/.*\//, '') // everything before slash | ||
.replace('.js', ''); // extension | ||
var capsName = name.charAt(0).toUpperCase() + name.slice(1); | ||
var config = { | ||
src: item.src, | ||
dest: item.dest, | ||
options: { | ||
browserifyOptions: { | ||
// e.g. Raven.Plugins.Angular | ||
standalone: 'Raven.Plugins.' + capsName | ||
} | ||
} | ||
}, | ||
}; | ||
browserifyConfig[name] = config; | ||
browserifyPluginTaskNames.push('browserify:' + name); | ||
}); | ||
var gruntConfig = { | ||
pkg: grunt.file.readJSON('package.json'), | ||
aws: grunt.file.exists('aws.json') ? grunt.file.readJSON('aws.json'): {}, | ||
clean: ['build'], | ||
browserify: browserifyConfig, | ||
uglify: { | ||
options: { | ||
sourceMap: function (dest) { | ||
return path.join(path.dirname(dest), | ||
path.basename(dest, '.js')) + | ||
'.map'; | ||
}, | ||
sourceMappingURL: function (dest) { | ||
return path.basename(dest, '.js') + '.map'; | ||
}, | ||
preserveComments: 'some', | ||
sourceMap: true, | ||
// Only preserve comments that start with (!) | ||
preserveComments: /^!/, | ||
compress: { | ||
dead_code: true, | ||
global_defs: { | ||
"TEST": false | ||
'TEST': false | ||
} | ||
@@ -155,13 +192,6 @@ } | ||
fixSourceMaps: { | ||
all: ['build/**/*.map'] | ||
eslint: { | ||
target: ['Gruntfile.js', 'src/**/*.js', 'plugins/**/*.js'] | ||
}, | ||
jshint: { | ||
options: { | ||
jshintrc: '.jshintrc' | ||
}, | ||
all: ['Gruntfile.js', 'src/**/*.js', 'plugins/**/*.js'] | ||
}, | ||
mocha: { | ||
@@ -171,7 +201,7 @@ options: { | ||
ignoreLeaks: true, | ||
grep: grunt.option('grep') | ||
grep: grunt.option('grep') | ||
}, | ||
log: true, | ||
log: true, | ||
reporter: 'Dot', | ||
run: true | ||
run: true | ||
}, | ||
@@ -190,3 +220,3 @@ unit: { | ||
options: { | ||
npm: false, | ||
npm: false, | ||
commitMessage: 'Release <%= version %>' | ||
@@ -240,3 +270,3 @@ } | ||
expand: true, | ||
flatten: true, | ||
flatten: false, | ||
cwd: 'build/', | ||
@@ -287,29 +317,5 @@ src: '**', | ||
grunt.registerMultiTask('fixSourceMaps', function () { | ||
this.files.forEach(function (f) { | ||
var result; | ||
var sources = f.src.filter(function (filepath) { | ||
if (!grunt.file.exists(filepath)) { | ||
grunt.log.warn('Source file "' + filepath + '" not found.'); | ||
return false; | ||
} else { | ||
return true; | ||
} | ||
}).forEach(function (filepath) { | ||
var base = path.dirname(filepath); | ||
var sMap = grunt.file.readJSON(filepath); | ||
sMap.file = path.relative(base, sMap.file); | ||
sMap.sources = _.map(sMap.sources, path.relative.bind(path, base)); | ||
grunt.file.write(filepath, JSON.stringify(sMap)); | ||
// Print a success message. | ||
grunt.log.writeln('File "' + filepath + '" fixed.'); | ||
}); | ||
}); | ||
}); | ||
// Grunt contrib tasks | ||
grunt.loadNpmTasks('grunt-contrib-uglify'); | ||
grunt.loadNpmTasks('grunt-contrib-clean'); | ||
grunt.loadNpmTasks('grunt-contrib-jshint'); | ||
grunt.loadNpmTasks('grunt-contrib-connect'); | ||
@@ -325,15 +331,16 @@ grunt.loadNpmTasks('grunt-contrib-copy'); | ||
grunt.loadNpmTasks('grunt-sri'); | ||
grunt.loadNpmTasks('grunt-eslint'); | ||
// Build tasks | ||
grunt.registerTask('_prep', ['clean', 'gitinfo', 'version']); | ||
grunt.registerTask('browserify.core', ['_prep', 'browserify:core']); | ||
grunt.registerTask('browserify.plugins', ['_prep', 'browserify:plugins']); | ||
grunt.registerTask('browserify.core', ['_prep', 'browserify:core'].concat(browserifyPluginTaskNames)); | ||
grunt.registerTask('browserify.plugins-combined', ['_prep', 'browserify:plugins-combined']); | ||
grunt.registerTask('build.test', ['_prep', 'browserify:test']); | ||
grunt.registerTask('build.core', ['browserify.core', 'uglify', 'fixSourceMaps', 'sri:dist']); | ||
grunt.registerTask('build.all', ['browserify.plugins', 'uglify', 'fixSourceMaps', 'sri:dist', 'sri:build']); | ||
grunt.registerTask('build', ['build.all']); | ||
grunt.registerTask('build.core', ['browserify.core', 'uglify', 'sri:dist']); | ||
grunt.registerTask('build.plugins-combined', ['browserify.plugins-combined', 'uglify', 'sri:dist', 'sri:build']); | ||
grunt.registerTask('build', ['build.plugins-combined']); | ||
grunt.registerTask('dist', ['build.core', 'copy:dist']); | ||
// Test task | ||
grunt.registerTask('test', ['jshint', 'browserify.core', 'browserify:test', 'mocha']); | ||
grunt.registerTask('test', ['eslint', 'browserify.core', 'browserify:test', 'mocha']); | ||
@@ -344,4 +351,4 @@ // Webserver tasks | ||
grunt.registerTask('publish', ['test', 'build.all', 's3']); | ||
grunt.registerTask('publish', ['test', 'build', 's3']); | ||
grunt.registerTask('default', ['test']); | ||
}; |
{ | ||
"name": "raven-js", | ||
"version": "2.0.5", | ||
"version": "2.1.0", | ||
"license": "BSD-2-Clause", | ||
@@ -21,17 +21,20 @@ "homepage": "https://getsentry.com", | ||
"grunt-browserify": "^4.0.1", | ||
"grunt-cli": "~0.1.9", | ||
"grunt-contrib-clean": "~0.4.0", | ||
"grunt-contrib-concat": "~0.3.0", | ||
"grunt-contrib-connect": "~0.5.0", | ||
"grunt-contrib-copy": "~0.4.1", | ||
"grunt-contrib-jshint": "~0.6.3", | ||
"grunt-contrib-uglify": "~0.2.2", | ||
"grunt-gitinfo": "~0.1.1", | ||
"grunt-mocha": "~0.4.1", | ||
"grunt-release": "~0.6.0", | ||
"grunt-s3": "~0.2.0-alpha.3", | ||
"grunt-cli": "^0.1.13", | ||
"grunt-contrib-clean": "^0.7.0", | ||
"grunt-contrib-concat": "^0.5.1", | ||
"grunt-contrib-connect": "^0.11.2", | ||
"grunt-contrib-copy": "^0.8.2", | ||
"grunt-contrib-jshint": "^0.11.3", | ||
"grunt-contrib-uglify": "^0.11.0", | ||
"grunt-eslint": "^17.3.1", | ||
"grunt-gitinfo": "^0.1.7", | ||
"grunt-mocha": "^0.4.15", | ||
"grunt-release": "^0.13.0", | ||
"grunt-s3": "0.2.0-alpha.3", | ||
"grunt-sri": "mattrobenolt/grunt-sri#pretty", | ||
"lodash": "~2.4.0", | ||
"proxyquireify": "^3.0.0", | ||
"sinon": "~1.7.3", | ||
"jquery": "^2.1.4", | ||
"lodash": "^3.10.1", | ||
"mocha": "^1.21.5", | ||
"proxyquireify": "^3.0.1", | ||
"sinon": "1.7.3", | ||
"through2": "^2.0.0" | ||
@@ -38,0 +41,0 @@ }, |
@@ -12,3 +12,2 @@ /** | ||
function angularPlugin(Raven, angular) { | ||
/*jshint validthis:true*/ | ||
angular = angular || window.angular; | ||
@@ -29,5 +28,5 @@ | ||
function exceptionHandler(Raven, $delegate) { | ||
function exceptionHandler(R, $delegate) { | ||
return function (ex, cause) { | ||
Raven.captureException(ex, { | ||
R.captureException(ex, { | ||
extra: { cause: cause } | ||
@@ -34,0 +33,0 @@ }); |
@@ -16,11 +16,11 @@ /** | ||
var logForGivenLevel = function(level) { | ||
var originalConsoleLevel = console[level]; | ||
var logForGivenLevel = function(l) { | ||
var originalConsoleLevel = console[l]; | ||
// warning level is the only level that doesn't map up | ||
// correctly with what Sentry expects. | ||
if (level === 'warn') level = 'warning'; | ||
if (l === 'warn') l = 'warning'; | ||
return function () { | ||
var args = [].slice.call(arguments); | ||
Raven.captureMessage('' + args[0], {level: level, logger: 'console', extra: { 'arguments': args }}); | ||
Raven.captureMessage('' + args.join(' '), {level: l, logger: 'console', extra: { 'arguments': args }}); | ||
@@ -31,5 +31,7 @@ // this fails for some browsers. :( | ||
// See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193 | ||
Function.prototype.bind | ||
.call(originalConsoleLevel, originalConsole) | ||
.apply(originalConsole, args); | ||
Function.prototype.apply.call( | ||
originalConsoleLevel, | ||
originalConsole, | ||
args | ||
); | ||
} | ||
@@ -36,0 +38,0 @@ }; |
@@ -9,3 +9,2 @@ /** | ||
function emberPlugin(Raven, Ember) { | ||
/*jshint validthis:true*/ | ||
Ember = Ember || window.Ember; | ||
@@ -12,0 +11,0 @@ |
# Raven.js [![Build Status](https://travis-ci.org/getsentry/raven-js.svg?branch=master)](https://travis-ci.org/getsentry/raven-js) | ||
Raven.js is a tiny standalone JavaScript client for [Sentry](https://getsentry.com/). | ||
Raven.js is the official browser JavaScript client for [Sentry](https://getsentry.com/). | ||
@@ -5,0 +5,0 @@ **Raven.js v2.0 requires Sentry v8.0.0 or later.** |
179
src/raven.js
@@ -48,6 +48,8 @@ /*global XDomainRequest:false*/ | ||
collectWindowErrors: true, | ||
maxMessageLength: 100 | ||
maxMessageLength: 0, | ||
stackTraceLimit: 50 | ||
}; | ||
this._ignoreOnError = 0; | ||
this._isRavenInstalled = false; | ||
this._originalErrorStackTraceLimit = Error.stackTraceLimit; | ||
// capture references to window.console *and* all its methods first | ||
@@ -59,4 +61,5 @@ // before the console plugin has a chance to monkey patch | ||
this._startTime = now(); | ||
this._wrappedBuiltIns = []; | ||
for (var method in this._originalConsole) { | ||
for (var method in this._originalConsole) { // eslint-disable-line guard-for-in | ||
this._originalConsoleMethods[method] = this._originalConsole[method]; | ||
@@ -77,3 +80,3 @@ } | ||
// See: https://github.com/getsentry/raven-js/issues/465 | ||
VERSION: '2.0.5', | ||
VERSION: '2.1.0', | ||
@@ -108,3 +111,3 @@ debug: false, | ||
// tags and extra are special and need to be put into context | ||
if (key == 'tags' || key == 'extra') { | ||
if (key === 'tags' || key === 'extra') { | ||
self._globalContext[key] = value; | ||
@@ -117,2 +120,4 @@ } else { | ||
this._dsn = dsn; | ||
// "Script error." is hard coded into browsers for errors that it can't read. | ||
@@ -132,10 +137,6 @@ // this is the result of a script being pulled in from an external domain and CORS. | ||
// assemble the endpoint from the uri pieces | ||
this._globalServer = '//' + uri.host + | ||
(uri.port ? ':' + uri.port : '') + | ||
'/' + path + 'api/' + this._globalProject + '/store/'; | ||
this._globalServer = this._getGlobalServer(uri); | ||
if (uri.protocol) { | ||
this._globalServer = uri.protocol + ':' + this._globalServer; | ||
} | ||
this._globalEndpoint = this._globalServer + | ||
'/' + path + 'api/' + this._globalProject + '/store/'; | ||
@@ -168,6 +169,3 @@ if (this._globalOptions.fetchContext) { | ||
TraceKit.report.subscribe(function () { | ||
// maintain 'self' | ||
if (!self._ignoreOnError) { | ||
self._handleStackInfo.apply(self, arguments); | ||
} | ||
self._handleOnErrorStackInfo.apply(self, arguments); | ||
}); | ||
@@ -182,2 +180,3 @@ this._wrapBuiltIns(); | ||
Error.stackTraceLimit = this._globalOptions.stackTraceLimit; | ||
return this; | ||
@@ -251,3 +250,2 @@ }, | ||
try { | ||
/*jshint -W040*/ | ||
return func.apply(this, args); | ||
@@ -286,2 +284,6 @@ } catch(e) { | ||
TraceKit.report.uninstall(); | ||
this._restoreBuiltIns(); | ||
Error.stackTraceLimit = this._originalErrorStackTraceLimit; | ||
this._isRavenInstalled = false; | ||
@@ -496,5 +498,6 @@ | ||
if (!this._globalServer) { | ||
if (!this.ravenNotConfiguredError) | ||
if (!this.ravenNotConfiguredError) { | ||
this.ravenNotConfiguredError = true; | ||
this._logDebug('error', 'Error: Raven has not been configured.'); | ||
this.ravenNotConfiguredError = true; | ||
} | ||
return false; | ||
@@ -515,2 +518,37 @@ } | ||
showReportDialog: function (options) { | ||
if (!window.document) // doesn't work without a document (React native) | ||
return; | ||
options = options || {}; | ||
var lastEventId = options.eventId || this.lastEventId(); | ||
if (!lastEventId) { | ||
throw new RavenConfigError('Missing eventId'); | ||
} | ||
var dsn = options.dsn || this._dsn; | ||
if (!dsn) { | ||
throw new RavenConfigError('Missing DSN'); | ||
} | ||
var encode = encodeURIComponent; | ||
var qs = ''; | ||
qs += '?eventId=' + encode(lastEventId); | ||
qs += '&dsn=' + encode(dsn); | ||
var user = options.user || this._globalContext.user; | ||
if (user) { | ||
if (user.name) qs += '&name=' + encode(user.name); | ||
if (user.email) qs += '&email=' + encode(user.email); | ||
} | ||
var globalServer = this._getGlobalServer(this._parseDSN(dsn)); | ||
var script = document.createElement('script'); | ||
script.async = true; | ||
script.src = globalServer + '/api/embed/error-page/' + qs; | ||
(document.head || document.body).appendChild(script); | ||
}, | ||
/**** Private functions ****/ | ||
@@ -557,3 +595,5 @@ _ignoreNextOnError: function () { | ||
document.fireEvent('on' + evt.eventType.toLowerCase(), evt); | ||
} catch(e) {} | ||
} catch(e) { | ||
// Do nothing | ||
} | ||
} | ||
@@ -568,5 +608,8 @@ }, | ||
function fill(obj, name, replacement) { | ||
function fill(obj, name, replacement, noUndo) { | ||
var orig = obj[name]; | ||
obj[name] = replacement(orig); | ||
if (!noUndo) { | ||
self._wrappedBuiltIns.push([obj, name, orig]); | ||
} | ||
} | ||
@@ -579,3 +622,3 @@ | ||
var originalCallback = args[0]; | ||
if (typeof (originalCallback) === 'function') { | ||
if (isFunction(originalCallback)) { | ||
args[0] = self.wrap(originalCallback); | ||
@@ -616,3 +659,5 @@ } | ||
} | ||
} catch (err) {} // can sometimes get 'Permission denied to access property "handle Event' | ||
} catch (err) { | ||
// can sometimes get 'Permission denied to access property "handle Event' | ||
} | ||
return orig.call(this, evt, self.wrap(fn), capture, secure); | ||
@@ -630,28 +675,42 @@ }; | ||
var origOpen; | ||
if ('XMLHttpRequest' in window) { | ||
origOpen = XMLHttpRequest.prototype.open; | ||
XMLHttpRequest.prototype.open = function (data) { // preserve arity | ||
var xhr = this; | ||
'onreadystatechange onload onerror onprogress'.replace(/\w+/g, function (prop) { | ||
if (prop in xhr && Object.prototype.toString.call(xhr[prop]) === '[object Function]') { | ||
fill(xhr, prop, function (orig) { | ||
return self.wrap(orig); | ||
}); | ||
} | ||
}); | ||
origOpen.apply(this, arguments); | ||
}; | ||
fill(XMLHttpRequest.prototype, 'send', function(origSend) { | ||
return function (data) { // preserve arity | ||
var xhr = this; | ||
'onreadystatechange onload onerror onprogress'.replace(/\w+/g, function (prop) { | ||
if (prop in xhr && Object.prototype.toString.call(xhr[prop]) === '[object Function]') { | ||
fill(xhr, prop, function (orig) { | ||
return self.wrap(orig); | ||
}, true /* noUndo */); // don't track filled methods on XHR instances | ||
} | ||
}); | ||
return origSend.apply(this, arguments); | ||
}; | ||
}); | ||
} | ||
var $ = window.jQuery || window.$; | ||
var origReady; | ||
if ($ && $.fn && $.fn.ready) { | ||
origReady = $.fn.ready; | ||
$.fn.ready = function ravenjQueryReadyWrapper(fn) { | ||
return origReady.call(this, self.wrap(fn)); | ||
}; | ||
fill($.fn, 'ready', function (orig) { | ||
return function (fn) { | ||
return orig.call(this, self.wrap(fn)); | ||
}; | ||
}); | ||
} | ||
}, | ||
_restoreBuiltIns: function () { | ||
// restore any wrapped builtins | ||
var builtin; | ||
while (this._wrappedBuiltIns.length) { | ||
builtin = this._wrappedBuiltIns.shift(); | ||
var obj = builtin[0], | ||
name = builtin[1], | ||
orig = builtin[2]; | ||
obj[name] = orig; | ||
} | ||
}, | ||
_drainPlugins: function() { | ||
@@ -685,2 +744,20 @@ var self = this; | ||
_getGlobalServer: function(uri) { | ||
// assemble the endpoint from the uri pieces | ||
var globalServer = '//' + uri.host + | ||
(uri.port ? ':' + uri.port : ''); | ||
if (uri.protocol) { | ||
globalServer = uri.protocol + ':' + globalServer; | ||
} | ||
return globalServer; | ||
}, | ||
_handleOnErrorStackInfo: function() { | ||
// if we are intentionally ignoring errors via onerror, bail out | ||
if (!this._ignoreOnError) { | ||
this._handleStackInfo.apply(this, arguments); | ||
} | ||
}, | ||
_handleStackInfo: function(stackInfo, options) { | ||
@@ -709,3 +786,3 @@ var self = this; | ||
stackInfo.lineno, | ||
frames, | ||
frames.slice(0, this._globalOptions.stackTraceLimit), | ||
options | ||
@@ -734,5 +811,5 @@ ); | ||
// first we check the global includePaths list. | ||
(!!this._globalOptions.includePaths.test && !this._globalOptions.includePaths.test(normalized.filename)) || | ||
!!this._globalOptions.includePaths.test && !this._globalOptions.includePaths.test(normalized.filename) || | ||
// Now we check for fun, if the function name is Raven or TraceKit | ||
/(Raven|TraceKit)\./.test(normalized['function']) || | ||
/(Raven|TraceKit)\./.test(normalized.function) || | ||
// finally, we do a last ditch effort and check for raven.min.js | ||
@@ -785,3 +862,3 @@ /raven\.(min\.)?js$/.test(normalized.filename) | ||
_processException: function(type, message, fileurl, lineno, frames, options) { | ||
var stacktrace, i, fullMessage; | ||
var stacktrace, fullMessage; | ||
@@ -932,4 +1009,5 @@ if (!!this._globalOptions.ignoreErrors.test && this._globalOptions.ignoreErrors.test(message)) return; | ||
var url = this._globalEndpoint; | ||
(globalOptions.transport || this._makeRequest).call(this, { | ||
url: this._globalServer, | ||
url: url, | ||
auth: { | ||
@@ -945,3 +1023,3 @@ sentry_version: '7', | ||
data: data, | ||
src: self._globalServer | ||
src: url | ||
}); | ||
@@ -952,3 +1030,3 @@ }, | ||
data: data, | ||
src: self._globalServer | ||
src: url | ||
}); | ||
@@ -1030,3 +1108,8 @@ } | ||
if (this._originalConsoleMethods[level] && this.debug) { | ||
this._originalConsoleMethods[level].apply(this._originalConsole, [].slice.call(arguments, 1)); | ||
// In IE<10 console methods do not have their own 'apply' method | ||
Function.prototype.apply.call( | ||
this._originalConsoleMethods[level], | ||
this._originalConsole, | ||
[].slice.call(arguments, 1) | ||
); | ||
} | ||
@@ -1033,0 +1116,0 @@ }, |
@@ -22,3 +22,3 @@ 'use strict'; | ||
function isEmptyObject(what) { | ||
for (var k in what) return false; | ||
for (var _ in what) return false; // eslint-disable-line guard-for-in, no-unused-vars | ||
return true; | ||
@@ -65,3 +65,3 @@ } | ||
function truncate(str, max) { | ||
return str.length <= max ? str : str.substr(0, max) + '\u2026'; | ||
return !max || str.length <= max ? str : str.substr(0, max) + '\u2026'; | ||
} | ||
@@ -92,3 +92,3 @@ | ||
// Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions | ||
sources.push(pattern.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1")); | ||
sources.push(pattern.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, '\\$1')); | ||
} else if (pattern && pattern.source) { | ||
@@ -132,4 +132,4 @@ // If it's a regexp already, we want to extract the source | ||
return (pad(arr[0]) + pad(arr[1]) + pad(arr[2]) + pad(arr[3]) + pad(arr[4]) + | ||
pad(arr[5]) + pad(arr[6]) + pad(arr[7])); | ||
return pad(arr[0]) + pad(arr[1]) + pad(arr[2]) + pad(arr[3]) + pad(arr[4]) + | ||
pad(arr[5]) + pad(arr[6]) + pad(arr[7]); | ||
} else { | ||
@@ -139,3 +139,3 @@ // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523 | ||
var r = Math.random()*16|0, | ||
v = c == 'x' ? r : (r&0x3|0x8); | ||
v = c === 'x' ? r : r&0x3|0x8; | ||
return v.toString(16); | ||
@@ -142,0 +142,0 @@ }); |
@@ -10,5 +10,5 @@ /*global assert*/ | ||
} | ||
} | ||
}; | ||
// use setTimeout so stack trace doesn't go all the way back to mocha test runner | ||
iframe.contentWindow.eval('origSetTimeout(' + execute.toString() + ');'); | ||
iframe.contentWindow.eval('window.originalBuiltIns.setTimeout.call(window, ' + execute.toString() + ');'); | ||
} | ||
@@ -47,3 +47,3 @@ | ||
function () { | ||
var ravenData = iframe.contentWindow.ravenData; | ||
var ravenData = iframe.contentWindow.ravenData[0]; | ||
assert.equal(ravenData.message, 'Hello'); | ||
@@ -67,3 +67,3 @@ } | ||
function () { | ||
var ravenData = iframe.contentWindow.ravenData; | ||
var ravenData = iframe.contentWindow.ravenData[0]; | ||
assert.isAbove(ravenData.exception.values[0].stacktrace.frames.length, 1); | ||
@@ -74,3 +74,61 @@ } | ||
}); | ||
describe('native', function () { | ||
describe('window.onerror', function () { | ||
it('should catch syntax errors', function (done) { | ||
var iframe = this.iframe; | ||
iframeExecute(iframe, done, | ||
function () { | ||
setTimeout(done); | ||
eval('foo{};'); | ||
}, | ||
function () { | ||
var ravenData = iframe.contentWindow.ravenData[0]; | ||
assert.isTrue(/SyntaxError/.test(ravenData.message)); // full message differs per-browser | ||
assert.equal(ravenData.exception.values[0].stacktrace.frames.length, 1); // just one frame | ||
} | ||
); | ||
}); | ||
it('should NOT catch an exception already caught via Raven.wrap', function (done) { | ||
var iframe = this.iframe; | ||
iframeExecute(iframe, done, | ||
function () { | ||
setTimeout(done); | ||
Raven.wrap(function () { | ||
foo(); | ||
})(); | ||
}, | ||
function () { | ||
var ravenData = iframe.contentWindow.ravenData; | ||
assert.equal(ravenData.length, 1); // one caught error | ||
} | ||
); | ||
}); | ||
it('should catch an exception already caught [but rethrown] via Raven.captureException', function (done) { | ||
// unlike Raven.wrap which ALWAYS re-throws, we don't know if the user will | ||
// re-throw an exception passed to Raven.captureException, and so we cannot | ||
// automatically suppress the next error caught through window.onerror | ||
var iframe = this.iframe; | ||
iframeExecute(iframe, done, | ||
function () { | ||
setTimeout(done); | ||
try { | ||
foo(); | ||
} catch (e) { | ||
Raven.captureException(e); | ||
throw e; // intentionally re-throw | ||
} | ||
}, | ||
function () { | ||
var ravenData = iframe.contentWindow.ravenData; | ||
assert.equal(ravenData.length, 2); | ||
} | ||
); | ||
}); | ||
}); | ||
describe('wrapped built-ins', function () { | ||
it('should capture exceptions from event listeners', function (done) { | ||
@@ -99,3 +157,3 @@ var iframe = this.iframe; | ||
function () { | ||
var ravenData = iframe.contentWindow.ravenData; | ||
var ravenData = iframe.contentWindow.ravenData[0]; | ||
assert.isAbove(ravenData.exception.values[0].stacktrace.frames.length, 2); | ||
@@ -129,3 +187,3 @@ } | ||
function () { | ||
var ravenData = iframe.contentWindow.ravenData; | ||
var ravenData = iframe.contentWindow.ravenData[0]; | ||
assert.equal(ravenData, null); // should never trigger error | ||
@@ -147,3 +205,3 @@ } | ||
function () { | ||
var ravenData = iframe.contentWindow.ravenData; | ||
var ravenData = iframe.contentWindow.ravenData[0]; | ||
assert.isAbove(ravenData.exception.values[0].stacktrace.frames.length, 2); | ||
@@ -166,3 +224,3 @@ } | ||
function () { | ||
var ravenData = iframe.contentWindow.ravenData; | ||
var ravenData = iframe.contentWindow.ravenData[0]; | ||
assert.isAbove(ravenData.exception.values[0].stacktrace.frames.length, 2); | ||
@@ -186,3 +244,3 @@ } | ||
function () { | ||
var ravenData = iframe.contentWindow.ravenData; | ||
var ravenData = iframe.contentWindow.ravenData[0]; | ||
assert.isAbove(ravenData.exception.values[0].stacktrace.frames.length, 2); | ||
@@ -198,12 +256,20 @@ } | ||
function () { | ||
setTimeout(done); | ||
var xhr = new XMLHttpRequest(); | ||
// intentionally assign event handlers *after* XMLHttpRequest.prototype.open, | ||
// since this is what jQuery does | ||
// https://github.com/jquery/jquery/blob/master/src/ajax/xhr.js#L37 | ||
xhr.open('GET', 'example.json') | ||
xhr.onreadystatechange = function () { | ||
setTimeout(done); | ||
// replace onreadystatechange with no-op so exception doesn't | ||
// fire more than once as XHR changes loading state | ||
xhr.onreadystatechange = function () {}; | ||
foo(); | ||
} | ||
xhr.open('GET', 'example.json'); | ||
}; | ||
xhr.send(); | ||
}, | ||
function () { | ||
var ravenData = iframe.contentWindow.ravenData; | ||
var ravenData = iframe.contentWindow.ravenData[0]; | ||
// # of frames alter significantly between chrome/firefox & safari | ||
@@ -214,3 +280,75 @@ assert.isAbove(ravenData.exception.values[0].stacktrace.frames.length, 2); | ||
}); | ||
it('should capture exceptions from $.fn.ready (jQuery)', function (done) { | ||
var iframe = this.iframe; | ||
iframeExecute(iframe, done, | ||
function () { | ||
setTimeout(done); | ||
$(function () { | ||
foo(); | ||
}); | ||
}, | ||
function () { | ||
var ravenData = iframe.contentWindow.ravenData[0]; | ||
// # of frames alter significantly between chrome/firefox & safari | ||
assert.isAbove(ravenData.exception.values[0].stacktrace.frames.length, 2); | ||
} | ||
); | ||
}); | ||
}); | ||
describe('uninstall', function () { | ||
it('should restore original built-ins', function (done) { | ||
var iframe = this.iframe; | ||
iframeExecute(iframe, done, | ||
function () { | ||
setTimeout(done); | ||
Raven.uninstall(); | ||
window.isRestored = { | ||
setTimeout: originalBuiltIns.setTimeout === setTimeout, | ||
setInterval: originalBuiltIns.setInterval === setInterval, | ||
requestAnimationFrame: originalBuiltIns.requestAnimationFrame === requestAnimationFrame, | ||
xhrProtoOpen: originalBuiltIns.xhrProtoOpen === XMLHttpRequest.prototype.open, | ||
headAddEventListener: originalBuiltIns.headAddEventListener === document.body.addEventListener, | ||
headRemoveEventListener: originalBuiltIns.headRemoveEventListener === document.body.removeEventListener | ||
}; | ||
}, | ||
function () { | ||
var isRestored = iframe.contentWindow.isRestored; | ||
assert.isTrue(isRestored.setTimeout); | ||
assert.isTrue(isRestored.setInterval); | ||
assert.isTrue(isRestored.requestAnimationFrame); | ||
assert.isTrue(isRestored.xhrProtoOpen); | ||
assert.isTrue(isRestored.headAddEventListener); | ||
assert.isTrue(isRestored.headRemoveEventListener); | ||
} | ||
); | ||
}); | ||
it('should not restore XMLHttpRequest instance methods', function (done) { | ||
var iframe = this.iframe; | ||
iframeExecute(iframe, done, | ||
function () { | ||
setTimeout(done); | ||
var xhr = new XMLHttpRequest(); | ||
var origOnReadyStateChange = xhr.onreadystatechange = function () {}; | ||
xhr.open('GET', '/foo/'); | ||
xhr.abort(); | ||
Raven.uninstall(); | ||
window.isOnReadyStateChangeRestored = xhr.onready === origOnReadyStateChange; | ||
}, | ||
function () { | ||
assert.isFalse(iframe.contentWindow.isOnReadyStateChangeRestored); | ||
} | ||
); | ||
}); | ||
}); | ||
}); |
@@ -89,2 +89,3 @@ /*jshint mocha:true*/ | ||
assert.equal(truncate('lol', 3), 'lol'); | ||
assert.equal(truncate(new Array(1000).join('f'), 0), new Array(1000).join('f')); | ||
}); | ||
@@ -91,0 +92,0 @@ }); |
@@ -1,2 +0,1 @@ | ||
/*jshint mocha:true*/ | ||
/*global Mocha, assert*/ | ||
@@ -14,8 +13,8 @@ 'use strict'; | ||
" Error: \n" + | ||
" at new <anonymous> (http://example.com/js/test.js:63)\n" + // stack[0] | ||
" at namedFunc0 (http://example.com/js/script.js:10)\n" + // stack[1] | ||
" at http://example.com/js/test.js:65\n" + // stack[2] | ||
" at namedFunc2 (http://example.com/js/script.js:20)\n" + // stack[3] | ||
" at http://example.com/js/test.js:67\n" + // stack[4] | ||
" at namedFunc4 (http://example.com/js/script.js:100001)"; // stack[5] | ||
" at new <anonymous> (http://example.com/js/test.js:63:1)\n" + // stack[0] | ||
" at namedFunc0 (http://example.com/js/script.js:10:2)\n" + // stack[1] | ||
" at http://example.com/js/test.js:65:10\n" + // stack[2] | ||
" at namedFunc2 (http://example.com/js/script.js:20:5)\n" + // stack[3] | ||
" at http://example.com/js/test.js:67:5\n" + // stack[4] | ||
" at namedFunc4 (http://example.com/js/script.js:100001:10002)"; // stack[5] | ||
var mock_err = { stack: stack_str }; | ||
@@ -27,8 +26,57 @@ var trace = TraceKit.computeStackTrace.computeStackTraceFromStackProp(mock_err); | ||
assert.equal(trace.stack[0].func, 'new <anonymous>'); | ||
assert.equal(trace.stack[0].url, 'http://example.com/js/test.js'); | ||
assert.equal(trace.stack[0].line, 63); | ||
assert.equal(trace.stack[0].column, 1); | ||
assert.equal(trace.stack[1].func, 'namedFunc0'); | ||
assert.equal(trace.stack[1].url, 'http://example.com/js/script.js'); | ||
assert.equal(trace.stack[1].line, 10); | ||
assert.equal(trace.stack[1].column, 2); | ||
assert.equal(trace.stack[2].func, '?'); | ||
assert.equal(trace.stack[2].url, 'http://example.com/js/test.js'); | ||
assert.equal(trace.stack[2].line, 65); | ||
assert.equal(trace.stack[2].column, 10); | ||
assert.equal(trace.stack[3].func, 'namedFunc2'); | ||
assert.equal(trace.stack[3].url, 'http://example.com/js/script.js'); | ||
assert.equal(trace.stack[3].line, 20); | ||
assert.equal(trace.stack[3].column, 5); | ||
assert.equal(trace.stack[4].func, '?'); | ||
assert.equal(trace.stack[4].url, 'http://example.com/js/test.js'); | ||
assert.equal(trace.stack[4].line, 67); | ||
assert.equal(trace.stack[4].column, 5); | ||
assert.equal(trace.stack[5].func, 'namedFunc4'); | ||
assert.equal(trace.stack[5].url, 'http://example.com/js/script.js'); | ||
assert.equal(trace.stack[5].line, 100001); | ||
assert.equal(trace.stack[5].column, 10002); | ||
}); | ||
it('should handle eval/anonymous strings in Chrome 46', function () { | ||
var stack_str = "" + | ||
"ReferenceError: baz is not defined\n" + | ||
" at bar (http://example.com/js/test.js:19:7)\n" + | ||
" at foo (http://example.com/js/test.js:23:7)\n" + | ||
" at eval (eval at <anonymous> (http://example.com/js/test.js:26:5), <anonymous>:1:26)\n"; | ||
var mock_err = { stack: stack_str }; | ||
var trace = TraceKit.computeStackTrace.computeStackTraceFromStackProp(mock_err); | ||
assert.equal(trace.stack[0].func, 'bar'); | ||
assert.equal(trace.stack[0].url, 'http://example.com/js/test.js'); | ||
assert.equal(trace.stack[0].line, 19); | ||
assert.equal(trace.stack[0].column, 7); | ||
assert.equal(trace.stack[1].func, 'foo'); | ||
assert.equal(trace.stack[1].url, 'http://example.com/js/test.js'); | ||
assert.equal(trace.stack[1].line, 23); | ||
assert.equal(trace.stack[1].column, 7); | ||
assert.equal(trace.stack[2].func, 'eval'); | ||
// TODO: fix nested evals | ||
assert.equal(trace.stack[2].url, 'eval at <anonymous> (http://example.com/js/test.js:26:5), <anonymous>'); | ||
assert.equal(trace.stack[2].line, 1); // second set of line/column numbers used | ||
assert.equal(trace.stack[2].column, 26); | ||
}); | ||
}); | ||
@@ -35,0 +83,0 @@ |
@@ -618,5 +618,5 @@ 'use strict'; | ||
var chrome = /^\s*at (.*?) ?\(?((?:(?:file|https?|chrome-extension):.*?)|<anonymous>):(\d+)(?::(\d+))?\)?\s*$/i, | ||
gecko = /^\s*(.*?)(?:\((.*?)\))?@((?:file|https?|chrome).*?):(\d+)(?::(\d+))?\s*$/i, | ||
winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:ms-appx|http|https):.*?):(\d+)(?::(\d+))?\)?\s*$/i, | ||
var chrome = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|<anonymous>).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i, | ||
gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|\[).*?)(?::(\d+))?(?::(\d+))?\s*$/i, | ||
winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:ms-appx|https?|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i, | ||
lines = ex.stack.split('\n'), | ||
@@ -629,23 +629,26 @@ stack = [], | ||
for (var i = 0, j = lines.length; i < j; ++i) { | ||
if ((parts = gecko.exec(lines[i]))) { | ||
if ((parts = chrome.exec(lines[i]))) { | ||
var isNative = parts[2] && parts[2].indexOf('native') !== -1; | ||
element = { | ||
'url': parts[3], | ||
'url': !isNative ? parts[2] : null, | ||
'func': parts[1] || UNKNOWN_FUNCTION, | ||
'args': parts[2] ? parts[2].split(',') : '', | ||
'line': +parts[4], | ||
'column': parts[5] ? +parts[5] : null | ||
'args': isNative ? [parts[2]] : [], | ||
'line': parts[3] ? +parts[3] : null, | ||
'column': parts[4] ? +parts[4] : null | ||
}; | ||
} else if ((parts = chrome.exec(lines[i]))) { | ||
} else if ( parts = winjs.exec(lines[i]) ) { | ||
element = { | ||
'url': parts[2], | ||
'func': parts[1] || UNKNOWN_FUNCTION, | ||
'args': [], | ||
'line': +parts[3], | ||
'column': parts[4] ? +parts[4] : null | ||
}; | ||
} else if ((parts = winjs.exec(lines[i]))) { | ||
} else if ((parts = gecko.exec(lines[i]))) { | ||
element = { | ||
'url': parts[2], | ||
'url': parts[3], | ||
'func': parts[1] || UNKNOWN_FUNCTION, | ||
'line': +parts[3], | ||
'column': parts[4] ? +parts[4] : null | ||
'args': parts[2] ? parts[2].split(',') : [], | ||
'line': parts[4] ? +parts[4] : null, | ||
'column': parts[5] ? +parts[5] : null | ||
}; | ||
@@ -701,17 +704,29 @@ } else { | ||
var testRE = / line (\d+), column (\d+) in (?:<anonymous function: ([^>]+)>|([^\)]+))\((.*)\) in (.*):\s*$/i, | ||
lines = stacktrace.split('\n'), | ||
stack = [], | ||
parts; | ||
var opera10Regex = / line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i, | ||
opera11Regex = / line (\d+), column (\d+)\s*(?: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 = { | ||
for (var line = 0; line < lines.length; line += 2) { | ||
var element = null; | ||
if ((parts = opera10Regex.exec(lines[line]))) { | ||
element = { | ||
'url': parts[2], | ||
'line': +parts[1], | ||
'column': null, | ||
'func': parts[3], | ||
'args':[] | ||
}; | ||
} else if ((parts = opera11Regex.exec(lines[line]))) { | ||
element = { | ||
'url': parts[6], | ||
'line': +parts[1], | ||
'column': +parts[2], | ||
'func': parts[3] || parts[4], | ||
'args': parts[5] ? parts[5].split(',') : [], | ||
'url': parts[6] | ||
'args': parts[5] ? parts[5].split(',') : [] | ||
}; | ||
} | ||
if (element) { | ||
if (!element.func && element.line) { | ||
@@ -727,3 +742,3 @@ element.func = guessFunctionName(element.url, element.line); | ||
if (!element.context) { | ||
element.context = [lines[i + 1]]; | ||
element.context = [lines[line + 1]]; | ||
} | ||
@@ -776,4 +791,4 @@ | ||
var lineRE1 = /^\s*Line (\d+) of linked script ((?:file|https?)\S+)(?:: in function (\S+))?\s*$/i, | ||
lineRE2 = /^\s*Line (\d+) of inline#(\d+) script in ((?:file|https?)\S+)(?:: in function (\S+))?\s*$/i, | ||
var lineRE1 = /^\s*Line (\d+) of linked script ((?:file|https?|blob)\S+)(?:: in function (\S+))?\s*$/i, | ||
lineRE2 = /^\s*Line (\d+) of inline#(\d+) script in ((?:file|https?|blob)\S+)(?:: in function (\S+))?\s*$/i, | ||
lineRE3 = /^\s*Line (\d+) of function script\s*$/i, | ||
@@ -783,25 +798,27 @@ stack = [], | ||
inlineScriptBlocks = [], | ||
parts, | ||
i, | ||
len, | ||
source; | ||
parts; | ||
for (i in scripts) { | ||
if (hasKey(scripts, i) && !scripts[i].src) { | ||
inlineScriptBlocks.push(scripts[i]); | ||
for (var s in scripts) { | ||
if (hasKey(scripts, s) && !scripts[s].src) { | ||
inlineScriptBlocks.push(scripts[s]); | ||
} | ||
} | ||
for (i = 2, len = lines.length; i < len; i += 2) { | ||
for (var line = 2; line < lines.length; line += 2) { | ||
var item = null; | ||
if ((parts = lineRE1.exec(lines[i]))) { | ||
if ((parts = lineRE1.exec(lines[line]))) { | ||
item = { | ||
'url': parts[2], | ||
'func': parts[3], | ||
'line': +parts[1] | ||
'args': [], | ||
'line': +parts[1], | ||
'column': null | ||
}; | ||
} else if ((parts = lineRE2.exec(lines[i]))) { | ||
} else if ((parts = lineRE2.exec(lines[line]))) { | ||
item = { | ||
'url': parts[3], | ||
'func': parts[4] | ||
'func': parts[4], | ||
'args': [], | ||
'line': +parts[1], | ||
'column': null // TODO: Check to see if inline#1 (+parts[2]) points to the script number or column number. | ||
}; | ||
@@ -811,3 +828,3 @@ var relativeLine = (+parts[1]); // relative to the start of the <SCRIPT> block | ||
if (script) { | ||
source = getSource(item.url); | ||
var source = getSource(item.url); | ||
if (source) { | ||
@@ -821,11 +838,12 @@ source = source.join('\n'); | ||
} | ||
} 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]); | ||
} else if ((parts = lineRE3.exec(lines[line]))) { | ||
var url = window.location.href.replace(/#.*$/, ''); | ||
var re = new RegExp(escapeCodeAsRegExpForMatchingInsideHTML(lines[line + 1])); | ||
var src = findSourceInUrls(re, [url]); | ||
item = { | ||
'url': url, | ||
'line': source ? source.line : line, | ||
'func': '' | ||
'func': '', | ||
'args': [], | ||
'line': src ? src.line : parts[1], | ||
'column': null | ||
}; | ||
@@ -840,7 +858,7 @@ } | ||
var midline = (context ? context[Math.floor(context.length / 2)] : null); | ||
if (context && midline.replace(/^\s*/, '') === lines[i + 1].replace(/^\s*/, '')) { | ||
if (context && midline.replace(/^\s*/, '') === lines[line + 1].replace(/^\s*/, '')) { | ||
item.context = context; | ||
} else { | ||
// if (context) alert("Context mismatch. Correct midline:\n" + lines[i+1] + "\n\nMidline:\n" + midline + "\n\nContext:\n" + context.join("\n") + "\n\nURL:\n" + item.url); | ||
item.context = [lines[i + 1]]; | ||
item.context = [lines[line + 1]]; | ||
} | ||
@@ -850,2 +868,3 @@ stack.push(item); | ||
} | ||
if (!stack.length) { | ||
@@ -852,0 +871,0 @@ return null; // could not parse multiline exception message as Opera stack trace |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
518583
80
7572
24
5
20