@ -1,4 +1,4 @@
/*! Raven.js 3.1 3.1 (f55d28 1) | github.com/getsentry/raven-js */
/*! Raven.js 3.1 4.2 (5cf57e 1) | github.com/getsentry/raven-js */
/ *
* Includes TraceKit
@ -115,6 +115,9 @@ function Raven() {
crossOrigin : 'anonymous' ,
collectWindowErrors : true ,
maxMessageLength : 0 ,
// By default, truncates URL values to 250 chars
maxUrlLength : 250 ,
stackTraceLimit : 50 ,
autoBreadcrumbs : true ,
sampleRate : 1
@ -152,7 +155,7 @@ Raven.prototype = {
// webpack (using a build step causes webpack #1617). Grunt verifies that
// this value matches package.json during build.
// See: https://github.com/getsentry/raven-js/issues/465
VERSION : '3.1 3.1 ',
VERSION : '3.1 4.2 ',
debug : false ,
@ -457,9 +460,10 @@ Raven.prototype = {
if ( this . _globalOptions . stacktrace || ( options && options . stacktrace ) ) {
var ex ;
// create a stack trace from this point; just trim
// off extra frames so they don't include this function call (or
// earlier Raven.js library fn calls)
// Generate a "synthetic" stack trace from this point.
// NOTE: If you are a Sentry user, and you are seeing this stack frame, it is NOT indicative
// of a bug with Raven.js. Sentry generates synthetic traces either by configuration,
// or if it catches a thrown object without a "stack" property.
try {
throw new Error ( msg ) ;
} catch ( ex1 ) {
@ -473,6 +477,9 @@ Raven.prototype = {
// fingerprint on msg, not stack trace (legacy behavior, could be
// revisited)
fingerprint : msg ,
// since we know this is a synthetic trace, the top N-most frames
// MUST be from Raven.js, so mark them as in_app later by setting
// trimHeadFrames
trimHeadFrames : ( options . trimHeadFrames || 0 ) + 1
} , options ) ;
@ -1385,9 +1392,48 @@ Raven.prototype = {
exception . value = truncate ( exception . value , max ) ;
}
var request = data . request ;
if ( request ) {
if ( request . url ) {
request . url = truncate ( request . url , this . _globalOptions . maxUrlLength ) ;
}
if ( request . Referer ) {
request . Referer = truncate ( request . Referer , this . _globalOptions . maxUrlLength ) ;
}
}
if ( data . breadcrumbs && data . breadcrumbs . values )
this . _trimBreadcrumbs ( data . breadcrumbs ) ;
return data ;
} ,
/ * *
* Truncate breadcrumb values ( right now just URLs )
* /
_trimBreadcrumbs : function ( breadcrumbs ) {
// known breadcrumb properties with urls
// TODO: also consider arbitrary prop values that start with (https?)?://
var urlProps = [ 'to' , 'from' , 'url' ] ,
urlProp ,
crumb ,
data ;
for ( var i = 0 ; i < breadcrumbs . values . length ; ++ i ) {
crumb = breadcrumbs . values [ i ] ;
if ( ! crumb . hasOwnProperty ( 'data' ) || ! isObject ( crumb . data ) )
continue ;
data = crumb . data ;
for ( var j = 0 ; j < urlProps . length ; ++ j ) {
urlProp = urlProps [ j ] ;
if ( data . hasOwnProperty ( urlProp ) ) {
data [ urlProp ] = truncate ( data [ urlProp ] , this . _globalOptions . maxUrlLength ) ;
}
}
}
} ,
_getHttpData : function ( ) {
if ( ! this . _hasNavigator && ! this . _hasDocument ) return ;
var httpData = { } ;
@ -2083,20 +2129,22 @@ function isObject(what) {
return typeof what === 'object' && what !== null ;
}
// Sorta yanked from https://github.com/joyent/node/blob/aa3b4b4/lib/util.js#L56 0
// Yanked from https://git.io/vS8DV re-used under CC 0
// with some tiny modifications
function isError ( what ) {
var toString = { } . toString . call ( what ) ;
return isObject ( what ) &&
toString === '[object Error]' ||
toString === '[object Exception]' || // Firefox NS_ERROR_FAILURE Exceptions
what instanceof Error ;
function isError ( value ) {
switch ( { } . toString . call ( value ) ) {
case '[object Error]' : return true ;
case '[object Exception]' : return true ;
case '[object DOMException]' : return true ;
default : return value instanceof Error ;
}
}
module . exports = {
isObject : isObject ,
isError : isError
} ;
} , { } ] , 6 : [ function ( _dereq _ , module , exports ) {
( function ( global ) {
'use strict' ;
@ -2424,27 +2472,6 @@ TraceKit.report = (function reportModuleWrapper() {
*
* /
TraceKit . computeStackTrace = ( function computeStackTraceWrapper ( ) {
/ * *
* Escapes special characters , except for whitespace , in a string to be
* used inside a regular expression as a string literal .
* @ param { string } text The string .
* @ return { string } The escaped string literal .
* /
function escapeRegExp ( text ) {
return text . replace ( /[\-\[\]{}()*+?.,\\\^$|#]/g , '\\$&' ) ;
}
/ * *
* Escapes special characters in a string to be used inside a regular
* expression as a string literal . Also ensures that HTML entities will
* be matched the same as their literal friends .
* @ param { string } body The string .
* @ return { string } The escaped string .
* /
function escapeCodeAsRegExpForMatchingInsideHTML ( body ) {
return escapeRegExp ( body ) . replace ( '<' , '(?:<|<)' ) . replace ( '>' , '(?:>|>)' ) . replace ( '&' , '(?:&|&)' ) . replace ( '"' , '(?:"|")' ) . replace ( /\s+/g , '\\s+' ) ;
}
// Contents of Exception in various browsers.
//
// SAFARI:
@ -2491,18 +2518,31 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() {
function computeStackTraceFromStackProp ( ex ) {
if ( typeof ex . stack === 'undefined' || ! ex . stack ) return ;
var chrome = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|<anonymous>).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i ,
gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|resource|\[native).*?)(?::(\d+))?(?::(\d+))?\s*$/i ,
winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i ,
var chrome = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i ,
gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\[native).*?)(?::(\d+))?(?::(\d+))?\s*$/i ,
winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i ,
// Used to additionally parse URL/line/column from eval frames
geckoEval = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i ,
chromeEval = /\((\S*)(?::(\d+))(?::(\d+))\)/ ,
lines = ex . stack . split ( '\n' ) ,
stack = [ ] ,
submatch ,
parts ,
element ,
reference = /^(.*) is undefined$/ . exec ( ex . message ) ;
for ( var i = 0 , j = lines . length ; i < j ; ++ i ) {
if ( ( parts = chrome . exec ( lines [ i ] ) ) ) {
var isNative = parts [ 2 ] && parts [ 2 ] . indexOf ( 'native' ) !== - 1 ;
var isNative = parts [ 2 ] && parts [ 2 ] . indexOf ( 'native' ) === 0 ; // start of line
var isEval = parts [ 2 ] && parts [ 2 ] . indexOf ( 'eval' ) === 0 ; // start of line
if ( isEval && ( submatch = chromeEval . exec ( parts [ 2 ] ) ) ) {
// throw out eval line/column and use top-most line/column number
parts [ 2 ] = submatch [ 1 ] ; // url
parts [ 3 ] = submatch [ 2 ] ; // line
parts [ 4 ] = submatch [ 3 ] ; // column
}
element = {
'url' : ! isNative ? parts [ 2 ] : null ,
'func' : parts [ 1 ] || UNKNOWN _FUNCTION ,
@ -2519,6 +2559,19 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() {
'column' : parts [ 4 ] ? + parts [ 4 ] : null
} ;
} else if ( ( parts = gecko . exec ( lines [ i ] ) ) ) {
var isEval = parts [ 3 ] && parts [ 3 ] . indexOf ( ' > eval' ) > - 1 ;
if ( isEval && ( submatch = geckoEval . exec ( parts [ 3 ] ) ) ) {
// throw out eval line/column and use top-most line number
parts [ 3 ] = submatch [ 1 ] ;
parts [ 4 ] = submatch [ 2 ] ;
parts [ 5 ] = null ; // no column when eval
} else if ( i === 0 && ! parts [ 5 ] && typeof ex . columnNumber !== 'undefined' ) {
// FireFox uses this awesome columnNumber property for its top frame
// Also note, Firefox's column number is 0-based and everything else expects 1-based,
// so adding 1
// NOTE: this hack doesn't work if top-most frame is eval
stack [ 0 ] . column = ex . columnNumber + 1 ;
}
element = {
'url' : parts [ 3 ] ,
'func' : parts [ 1 ] || UNKNOWN _FUNCTION ,
@ -2541,13 +2594,6 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() {
return null ;
}
if ( ! stack [ 0 ] . column && typeof ex . columnNumber !== 'undefined' ) {
// FireFox uses this awesome columnNumber property for its top frame
// Also note, Firefox's column number is 0-based and everything else expects 1-based,
// so adding 1
stack [ 0 ] . column = ex . columnNumber + 1 ;
}
return {
'name' : ex . name ,
'message' : ex . message ,