From 8f5b59c18cc7837bde9af55d24d12e1fd939043d Mon Sep 17 00:00:00 2001 From: Sam Potts Date: Mon, 30 Mar 2020 23:39:01 +1100 Subject: [PATCH] Sentry upgrade for demo --- demo/dist/demo.js | 11888 ++++++++++++++++++----------- demo/dist/demo.min.js | 19 +- demo/dist/demo.min.js.map | 2 +- demo/package.json | 2 +- demo/src/js/demo.js | 266 +- demo/yarn.lock | 78 +- dist/plyr.min.js.map | 2 +- dist/plyr.min.mjs.map | 2 +- dist/plyr.polyfilled.min.js.map | 2 +- dist/plyr.polyfilled.min.mjs.map | 2 +- yarn.lock | 68 +- 11 files changed, 7655 insertions(+), 4676 deletions(-) diff --git a/demo/dist/demo.js b/demo/dist/demo.js index 8c8b4152..560488fd 100644 --- a/demo/dist/demo.js +++ b/demo/dist/demo.js @@ -986,6 +986,59 @@ typeof navigator === "object" && (function () { // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables addToUnscopables('includes'); + var engineUserAgent = getBuiltIn('navigator', 'userAgent') || ''; + + var process$1 = global_1.process; + var versions = process$1 && process$1.versions; + var v8 = versions && versions.v8; + var match, version; + + if (v8) { + match = v8.split('.'); + version = match[0] + match[1]; + } else if (engineUserAgent) { + match = engineUserAgent.match(/Edge\/(\d+)/); + if (!match || match[1] >= 74) { + match = engineUserAgent.match(/Chrome\/(\d+)/); + if (match) version = match[1]; + } + } + + var engineV8Version = version && +version; + + var SPECIES$1 = wellKnownSymbol('species'); + + var arrayMethodHasSpeciesSupport = function (METHOD_NAME) { + // We can't use this feature detection in V8 since it causes + // deoptimization and serious performance degradation + // https://github.com/zloirock/core-js/issues/677 + return engineV8Version >= 51 || !fails(function () { + var array = []; + var constructor = array.constructor = {}; + constructor[SPECIES$1] = function () { + return { foo: 1 }; + }; + return array[METHOD_NAME](Boolean).foo !== 1; + }); + }; + + var $map = arrayIteration.map; + + + + var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map'); + // FF49- issue + var USES_TO_LENGTH$2 = arrayMethodUsesToLength('map'); + + // `Array.prototype.map` method + // https://tc39.github.io/ecma262/#sec-array.prototype.map + // with adding support of @@species + _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH$2 }, { + map: function map(callbackfn /* , thisArg */) { + return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } + }); + var FAILS_ON_PRIMITIVES = fails(function () { objectKeys(1); }); // `Object.keys` method @@ -996,6 +1049,49 @@ typeof navigator === "object" && (function () { } }); + var aPossiblePrototype = function (it) { + if (!isObject(it) && it !== null) { + throw TypeError("Can't set " + String(it) + ' as a prototype'); + } return it; + }; + + // `Object.setPrototypeOf` method + // https://tc39.github.io/ecma262/#sec-object.setprototypeof + // Works with __proto__ only. Old v8 can't work with null proto objects. + /* eslint-disable no-proto */ + var objectSetPrototypeOf = Object.setPrototypeOf || ('__proto__' in {} ? function () { + var CORRECT_SETTER = false; + var test = {}; + var setter; + try { + setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set; + setter.call(test, []); + CORRECT_SETTER = test instanceof Array; + } catch (error) { /* empty */ } + return function setPrototypeOf(O, proto) { + anObject(O); + aPossiblePrototype(proto); + if (CORRECT_SETTER) setter.call(O, proto); + else O.__proto__ = proto; + return O; + }; + }() : undefined); + + // makes subclassing work correct for wrapped built-ins + var inheritIfRequired = function ($this, dummy, Wrapper) { + var NewTarget, NewTargetPrototype; + if ( + // it can work only with native `setPrototypeOf` + objectSetPrototypeOf && + // we haven't completely correct pre-ES6 way for getting `new.target`, so use this + typeof (NewTarget = dummy.constructor) == 'function' && + NewTarget !== Wrapper && + isObject(NewTargetPrototype = NewTarget.prototype) && + NewTargetPrototype !== Wrapper.prototype + ) objectSetPrototypeOf($this, NewTargetPrototype); + return $this; + }; + var MATCH = wellKnownSymbol('match'); // `IsRegExp` abstract operation @@ -1005,13 +1101,255 @@ typeof navigator === "object" && (function () { return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classofRaw(it) == 'RegExp'); }; + // `RegExp.prototype.flags` getter implementation + // https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags + var regexpFlags = function () { + var that = anObject(this); + var result = ''; + if (that.global) result += 'g'; + if (that.ignoreCase) result += 'i'; + if (that.multiline) result += 'm'; + if (that.dotAll) result += 's'; + if (that.unicode) result += 'u'; + if (that.sticky) result += 'y'; + return result; + }; + + // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError, + // so we use an intermediate function. + function RE(s, f) { + return RegExp(s, f); + } + + var UNSUPPORTED_Y = fails(function () { + // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError + var re = RE('a', 'y'); + re.lastIndex = 2; + return re.exec('abcd') != null; + }); + + var BROKEN_CARET = fails(function () { + // https://bugzilla.mozilla.org/show_bug.cgi?id=773687 + var re = RE('^r', 'gy'); + re.lastIndex = 2; + return re.exec('str') != null; + }); + + var regexpStickyHelpers = { + UNSUPPORTED_Y: UNSUPPORTED_Y, + BROKEN_CARET: BROKEN_CARET + }; + + var SPECIES$2 = wellKnownSymbol('species'); + + var setSpecies = function (CONSTRUCTOR_NAME) { + var Constructor = getBuiltIn(CONSTRUCTOR_NAME); + var defineProperty = objectDefineProperty.f; + + if (descriptors && Constructor && !Constructor[SPECIES$2]) { + defineProperty(Constructor, SPECIES$2, { + configurable: true, + get: function () { return this; } + }); + } + }; + + var defineProperty$1 = objectDefineProperty.f; + var getOwnPropertyNames = objectGetOwnPropertyNames.f; + + + + + + var setInternalState = internalState.set; + + + + var MATCH$1 = wellKnownSymbol('match'); + var NativeRegExp = global_1.RegExp; + var RegExpPrototype = NativeRegExp.prototype; + var re1 = /a/g; + var re2 = /a/g; + + // "new" should create a new object, old webkit bug + var CORRECT_NEW = new NativeRegExp(re1) !== re1; + + var UNSUPPORTED_Y$1 = regexpStickyHelpers.UNSUPPORTED_Y; + + var FORCED = descriptors && isForced_1('RegExp', (!CORRECT_NEW || UNSUPPORTED_Y$1 || fails(function () { + re2[MATCH$1] = false; + // RegExp constructor can alter flags and IsRegExp works correct with @@match + return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i'; + }))); + + // `RegExp` constructor + // https://tc39.github.io/ecma262/#sec-regexp-constructor + if (FORCED) { + var RegExpWrapper = function RegExp(pattern, flags) { + var thisIsRegExp = this instanceof RegExpWrapper; + var patternIsRegExp = isRegexp(pattern); + var flagsAreUndefined = flags === undefined; + var sticky; + + if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper && flagsAreUndefined) { + return pattern; + } + + if (CORRECT_NEW) { + if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source; + } else if (pattern instanceof RegExpWrapper) { + if (flagsAreUndefined) flags = regexpFlags.call(pattern); + pattern = pattern.source; + } + + if (UNSUPPORTED_Y$1) { + sticky = !!flags && flags.indexOf('y') > -1; + if (sticky) flags = flags.replace(/y/g, ''); + } + + var result = inheritIfRequired( + CORRECT_NEW ? new NativeRegExp(pattern, flags) : NativeRegExp(pattern, flags), + thisIsRegExp ? this : RegExpPrototype, + RegExpWrapper + ); + + if (UNSUPPORTED_Y$1 && sticky) setInternalState(result, { sticky: sticky }); + + return result; + }; + var proxy = function (key) { + key in RegExpWrapper || defineProperty$1(RegExpWrapper, key, { + configurable: true, + get: function () { return NativeRegExp[key]; }, + set: function (it) { NativeRegExp[key] = it; } + }); + }; + var keys$1 = getOwnPropertyNames(NativeRegExp); + var index = 0; + while (keys$1.length > index) proxy(keys$1[index++]); + RegExpPrototype.constructor = RegExpWrapper; + RegExpWrapper.prototype = RegExpPrototype; + redefine(global_1, 'RegExp', RegExpWrapper); + } + + // https://tc39.github.io/ecma262/#sec-get-regexp-@@species + setSpecies('RegExp'); + + var nativeExec = RegExp.prototype.exec; + // This always refers to the native implementation, because the + // String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js, + // which loads this file before patching the method. + var nativeReplace = String.prototype.replace; + + var patchedExec = nativeExec; + + var UPDATES_LAST_INDEX_WRONG = (function () { + var re1 = /a/; + var re2 = /b*/g; + nativeExec.call(re1, 'a'); + nativeExec.call(re2, 'a'); + return re1.lastIndex !== 0 || re2.lastIndex !== 0; + })(); + + var UNSUPPORTED_Y$2 = regexpStickyHelpers.UNSUPPORTED_Y || regexpStickyHelpers.BROKEN_CARET; + + // nonparticipating capturing group, copied from es5-shim's String#split patch. + var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined; + + var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y$2; + + if (PATCH) { + patchedExec = function exec(str) { + var re = this; + var lastIndex, reCopy, match, i; + var sticky = UNSUPPORTED_Y$2 && re.sticky; + var flags = regexpFlags.call(re); + var source = re.source; + var charsAdded = 0; + var strCopy = str; + + if (sticky) { + flags = flags.replace('y', ''); + if (flags.indexOf('g') === -1) { + flags += 'g'; + } + + strCopy = String(str).slice(re.lastIndex); + // Support anchored sticky behavior. + if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\n')) { + source = '(?: ' + source + ')'; + strCopy = ' ' + strCopy; + charsAdded++; + } + // ^(? + rx + ) is needed, in combination with some str slicing, to + // simulate the 'y' flag. + reCopy = new RegExp('^(?:' + source + ')', flags); + } + + if (NPCG_INCLUDED) { + reCopy = new RegExp('^' + source + '$(?!\\s)', flags); + } + if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex; + + match = nativeExec.call(sticky ? reCopy : re, strCopy); + + if (sticky) { + if (match) { + match.input = match.input.slice(charsAdded); + match[0] = match[0].slice(charsAdded); + match.index = re.lastIndex; + re.lastIndex += match[0].length; + } else re.lastIndex = 0; + } else if (UPDATES_LAST_INDEX_WRONG && match) { + re.lastIndex = re.global ? match.index + match[0].length : lastIndex; + } + if (NPCG_INCLUDED && match && match.length > 1) { + // Fix browsers whose `exec` methods don't consistently return `undefined` + // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/ + nativeReplace.call(match[0], reCopy, function () { + for (i = 1; i < arguments.length - 2; i++) { + if (arguments[i] === undefined) match[i] = undefined; + } + }); + } + + return match; + }; + } + + var regexpExec = patchedExec; + + _export({ target: 'RegExp', proto: true, forced: /./.exec !== regexpExec }, { + exec: regexpExec + }); + + var TO_STRING = 'toString'; + var RegExpPrototype$1 = RegExp.prototype; + var nativeToString = RegExpPrototype$1[TO_STRING]; + + var NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; }); + // FF44- RegExp#toString has a wrong name + var INCORRECT_NAME = nativeToString.name != TO_STRING; + + // `RegExp.prototype.toString` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring + if (NOT_GENERIC || INCORRECT_NAME) { + redefine(RegExp.prototype, TO_STRING, function toString() { + var R = anObject(this); + var p = String(R.source); + var rf = R.flags; + var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype$1) ? regexpFlags.call(R) : rf); + return '/' + p + '/' + f; + }, { unsafe: true }); + } + var notARegexp = function (it) { if (isRegexp(it)) { throw TypeError("The method doesn't accept regular expressions"); } return it; }; - var MATCH$1 = wellKnownSymbol('match'); + var MATCH$2 = wellKnownSymbol('match'); var correctIsRegexpLogic = function (METHOD_NAME) { var regexp = /./; @@ -1019,7 +1357,7 @@ typeof navigator === "object" && (function () { '/./'[METHOD_NAME](regexp); } catch (e) { try { - regexp[MATCH$1] = false; + regexp[MATCH$2] = false; return '/./'[METHOD_NAME](regexp); } catch (f) { /* empty */ } } return false; @@ -1109,7 +1447,7 @@ typeof navigator === "object" && (function () { BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS }; - var defineProperty$1 = objectDefineProperty.f; + var defineProperty$2 = objectDefineProperty.f; @@ -1117,7 +1455,7 @@ typeof navigator === "object" && (function () { var setToStringTag = function (it, TAG, STATIC) { if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG$2)) { - defineProperty$1(it, TO_STRING_TAG$2, { configurable: true, value: TAG }); + defineProperty$2(it, TO_STRING_TAG$2, { configurable: true, value: TAG }); } }; @@ -1137,34 +1475,6 @@ typeof navigator === "object" && (function () { return IteratorConstructor; }; - var aPossiblePrototype = function (it) { - if (!isObject(it) && it !== null) { - throw TypeError("Can't set " + String(it) + ' as a prototype'); - } return it; - }; - - // `Object.setPrototypeOf` method - // https://tc39.github.io/ecma262/#sec-object.setprototypeof - // Works with __proto__ only. Old v8 can't work with null proto objects. - /* eslint-disable no-proto */ - var objectSetPrototypeOf = Object.setPrototypeOf || ('__proto__' in {} ? function () { - var CORRECT_SETTER = false; - var test = {}; - var setter; - try { - setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set; - setter.call(test, []); - CORRECT_SETTER = test instanceof Array; - } catch (error) { /* empty */ } - return function setPrototypeOf(O, proto) { - anObject(O); - aPossiblePrototype(proto); - if (CORRECT_SETTER) setter.call(O, proto); - else O.__proto__ = proto; - return O; - }; - }() : undefined); - var IteratorPrototype$2 = iteratorsCore.IteratorPrototype; var BUGGY_SAFARI_ITERATORS$1 = iteratorsCore.BUGGY_SAFARI_ITERATORS; var ITERATOR$4 = wellKnownSymbol('iterator'); @@ -1247,13 +1557,13 @@ typeof navigator === "object" && (function () { var STRING_ITERATOR = 'String Iterator'; - var setInternalState = internalState.set; + var setInternalState$1 = internalState.set; var getInternalState = internalState.getterFor(STRING_ITERATOR); // `String.prototype[@@iterator]` method // https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator defineIterator(String, 'String', function (iterated) { - setInternalState(this, { + setInternalState$1(this, { type: STRING_ITERATOR, string: String(iterated), index: 0 @@ -1432,11 +1742,11 @@ typeof navigator === "object" && (function () { f: f$6 }; - var defineProperty$2 = objectDefineProperty.f; + var defineProperty$3 = objectDefineProperty.f; var defineWellKnownSymbol = function (NAME) { var Symbol = path.Symbol || (path.Symbol = {}); - if (!has(Symbol, NAME)) defineProperty$2(Symbol, NAME, { + if (!has(Symbol, NAME)) defineProperty$3(Symbol, NAME, { value: wellKnownSymbolWrapped.f(NAME) }); }; @@ -1447,7 +1757,7 @@ typeof navigator === "object" && (function () { var SYMBOL = 'Symbol'; var PROTOTYPE$1 = 'prototype'; var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); - var setInternalState$1 = internalState.set; + var setInternalState$2 = internalState.set; var getInternalState$1 = internalState.getterFor(SYMBOL); var ObjectPrototype$1 = Object[PROTOTYPE$1]; var $Symbol = global_1.Symbol; @@ -1481,7 +1791,7 @@ typeof navigator === "object" && (function () { var wrap = function (tag, description) { var symbol = AllSymbols[tag] = objectCreate($Symbol[PROTOTYPE$1]); - setInternalState$1(symbol, { + setInternalState$2(symbol, { type: SYMBOL, tag: tag, description: description @@ -1717,7 +2027,7 @@ typeof navigator === "object" && (function () { hiddenKeys[HIDDEN] = true; - var defineProperty$3 = objectDefineProperty.f; + var defineProperty$4 = objectDefineProperty.f; var NativeSymbol = global_1.Symbol; @@ -1744,7 +2054,7 @@ typeof navigator === "object" && (function () { var symbolToString = symbolPrototype.toString; var native = String(NativeSymbol('test')) == 'Symbol(test)'; var regexp = /^Symbol\((.*)\)[^)]+$/; - defineProperty$3(symbolPrototype, 'description', { + defineProperty$4(symbolPrototype, 'description', { configurable: true, get: function description() { var symbol = isObject(this) ? this.valueOf() : this; @@ -1772,11 +2082,11 @@ typeof navigator === "object" && (function () { var NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0; var STRICT_METHOD$1 = arrayMethodIsStrict('indexOf'); - var USES_TO_LENGTH$2 = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 }); + var USES_TO_LENGTH$3 = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 }); // `Array.prototype.indexOf` method // https://tc39.github.io/ecma262/#sec-array.prototype.indexof - _export({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD$1 || !USES_TO_LENGTH$2 }, { + _export({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD$1 || !USES_TO_LENGTH$3 }, { indexOf: function indexOf(searchElement /* , fromIndex = 0 */) { return NEGATIVE_ZERO // convert -0 to +0 @@ -1786,7 +2096,7 @@ typeof navigator === "object" && (function () { }); var ARRAY_ITERATOR = 'Array Iterator'; - var setInternalState$2 = internalState.set; + var setInternalState$3 = internalState.set; var getInternalState$2 = internalState.getterFor(ARRAY_ITERATOR); // `Array.prototype.entries` method @@ -1800,7 +2110,7 @@ typeof navigator === "object" && (function () { // `CreateArrayIterator` internal method // https://tc39.github.io/ecma262/#sec-createarrayiterator var es_array_iterator = defineIterator(Array, 'Array', function (iterated, kind) { - setInternalState$2(this, { + setInternalState$3(this, { type: ARRAY_ITERATOR, target: toIndexedObject(iterated), // target index: 0, // next index @@ -1845,53 +2155,17 @@ typeof navigator === "object" && (function () { } }); - var engineUserAgent = getBuiltIn('navigator', 'userAgent') || ''; + var HAS_SPECIES_SUPPORT$1 = arrayMethodHasSpeciesSupport('slice'); + var USES_TO_LENGTH$4 = arrayMethodUsesToLength('slice', { ACCESSORS: true, 0: 0, 1: 2 }); - var process = global_1.process; - var versions = process && process.versions; - var v8 = versions && versions.v8; - var match, version; - - if (v8) { - match = v8.split('.'); - version = match[0] + match[1]; - } else if (engineUserAgent) { - match = engineUserAgent.match(/Edge\/(\d+)/); - if (!match || match[1] >= 74) { - match = engineUserAgent.match(/Chrome\/(\d+)/); - if (match) version = match[1]; - } - } - - var engineV8Version = version && +version; - - var SPECIES$1 = wellKnownSymbol('species'); - - var arrayMethodHasSpeciesSupport = function (METHOD_NAME) { - // We can't use this feature detection in V8 since it causes - // deoptimization and serious performance degradation - // https://github.com/zloirock/core-js/issues/677 - return engineV8Version >= 51 || !fails(function () { - var array = []; - var constructor = array.constructor = {}; - constructor[SPECIES$1] = function () { - return { foo: 1 }; - }; - return array[METHOD_NAME](Boolean).foo !== 1; - }); - }; - - var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice'); - var USES_TO_LENGTH$3 = arrayMethodUsesToLength('slice', { ACCESSORS: true, 0: 0, 1: 2 }); - - var SPECIES$2 = wellKnownSymbol('species'); + var SPECIES$3 = wellKnownSymbol('species'); var nativeSlice = [].slice; var max$1 = Math.max; // `Array.prototype.slice` method // https://tc39.github.io/ecma262/#sec-array.prototype.slice // fallback for not array-like ES3 strings and DOM objects - _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH$3 }, { + _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$1 || !USES_TO_LENGTH$4 }, { slice: function slice(start, end) { var O = toIndexedObject(this); var length = toLength(O.length); @@ -1905,7 +2179,7 @@ typeof navigator === "object" && (function () { if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) { Constructor = undefined; } else if (isObject(Constructor)) { - Constructor = Constructor[SPECIES$2]; + Constructor = Constructor[SPECIES$3]; if (Constructor === null) Constructor = undefined; } if (Constructor === Array || Constructor === undefined) { @@ -1931,153 +2205,6 @@ typeof navigator === "object" && (function () { redefine(Object.prototype, 'toString', objectToString, { unsafe: true }); } - // `RegExp.prototype.flags` getter implementation - // https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags - var regexpFlags = function () { - var that = anObject(this); - var result = ''; - if (that.global) result += 'g'; - if (that.ignoreCase) result += 'i'; - if (that.multiline) result += 'm'; - if (that.dotAll) result += 's'; - if (that.unicode) result += 'u'; - if (that.sticky) result += 'y'; - return result; - }; - - // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError, - // so we use an intermediate function. - function RE(s, f) { - return RegExp(s, f); - } - - var UNSUPPORTED_Y = fails(function () { - // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError - var re = RE('a', 'y'); - re.lastIndex = 2; - return re.exec('abcd') != null; - }); - - var BROKEN_CARET = fails(function () { - // https://bugzilla.mozilla.org/show_bug.cgi?id=773687 - var re = RE('^r', 'gy'); - re.lastIndex = 2; - return re.exec('str') != null; - }); - - var regexpStickyHelpers = { - UNSUPPORTED_Y: UNSUPPORTED_Y, - BROKEN_CARET: BROKEN_CARET - }; - - var nativeExec = RegExp.prototype.exec; - // This always refers to the native implementation, because the - // String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js, - // which loads this file before patching the method. - var nativeReplace = String.prototype.replace; - - var patchedExec = nativeExec; - - var UPDATES_LAST_INDEX_WRONG = (function () { - var re1 = /a/; - var re2 = /b*/g; - nativeExec.call(re1, 'a'); - nativeExec.call(re2, 'a'); - return re1.lastIndex !== 0 || re2.lastIndex !== 0; - })(); - - var UNSUPPORTED_Y$1 = regexpStickyHelpers.UNSUPPORTED_Y || regexpStickyHelpers.BROKEN_CARET; - - // nonparticipating capturing group, copied from es5-shim's String#split patch. - var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined; - - var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y$1; - - if (PATCH) { - patchedExec = function exec(str) { - var re = this; - var lastIndex, reCopy, match, i; - var sticky = UNSUPPORTED_Y$1 && re.sticky; - var flags = regexpFlags.call(re); - var source = re.source; - var charsAdded = 0; - var strCopy = str; - - if (sticky) { - flags = flags.replace('y', ''); - if (flags.indexOf('g') === -1) { - flags += 'g'; - } - - strCopy = String(str).slice(re.lastIndex); - // Support anchored sticky behavior. - if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\n')) { - source = '(?: ' + source + ')'; - strCopy = ' ' + strCopy; - charsAdded++; - } - // ^(? + rx + ) is needed, in combination with some str slicing, to - // simulate the 'y' flag. - reCopy = new RegExp('^(?:' + source + ')', flags); - } - - if (NPCG_INCLUDED) { - reCopy = new RegExp('^' + source + '$(?!\\s)', flags); - } - if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex; - - match = nativeExec.call(sticky ? reCopy : re, strCopy); - - if (sticky) { - if (match) { - match.input = match.input.slice(charsAdded); - match[0] = match[0].slice(charsAdded); - match.index = re.lastIndex; - re.lastIndex += match[0].length; - } else re.lastIndex = 0; - } else if (UPDATES_LAST_INDEX_WRONG && match) { - re.lastIndex = re.global ? match.index + match[0].length : lastIndex; - } - if (NPCG_INCLUDED && match && match.length > 1) { - // Fix browsers whose `exec` methods don't consistently return `undefined` - // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/ - nativeReplace.call(match[0], reCopy, function () { - for (i = 1; i < arguments.length - 2; i++) { - if (arguments[i] === undefined) match[i] = undefined; - } - }); - } - - return match; - }; - } - - var regexpExec = patchedExec; - - _export({ target: 'RegExp', proto: true, forced: /./.exec !== regexpExec }, { - exec: regexpExec - }); - - var TO_STRING = 'toString'; - var RegExpPrototype = RegExp.prototype; - var nativeToString = RegExpPrototype[TO_STRING]; - - var NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; }); - // FF44- RegExp#toString has a wrong name - var INCORRECT_NAME = nativeToString.name != TO_STRING; - - // `RegExp.prototype.toString` method - // https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring - if (NOT_GENERIC || INCORRECT_NAME) { - redefine(RegExp.prototype, TO_STRING, function toString() { - var R = anObject(this); - var p = String(R.source); - var rf = R.flags; - var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? regexpFlags.call(R) : rf); - return '/' + p + '/' + f; - }, { unsafe: true }); - } - // TODO: Remove from `core-js@4` since it's moved to entry points @@ -2086,7 +2213,7 @@ typeof navigator === "object" && (function () { - var SPECIES$3 = wellKnownSymbol('species'); + var SPECIES$4 = wellKnownSymbol('species'); var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () { // #replace needs built-in support for named groups. @@ -2149,7 +2276,7 @@ typeof navigator === "object" && (function () { // RegExp[@@split] doesn't call the regex's exec method, but first creates // a new one. We need to return the patched regex when creating the new one. re.constructor = {}; - re.constructor[SPECIES$3] = function () { return re; }; + re.constructor[SPECIES$4] = function () { return re; }; re.flags = ''; re[SYMBOL] = /./[SYMBOL]; } @@ -2391,14 +2518,14 @@ typeof navigator === "object" && (function () { ]; }); - var SPECIES$4 = wellKnownSymbol('species'); + var SPECIES$5 = wellKnownSymbol('species'); // `SpeciesConstructor` abstract operation // https://tc39.github.io/ecma262/#sec-speciesconstructor var speciesConstructor = function (O, defaultConstructor) { var C = anObject(O).constructor; var S; - return C === undefined || (S = anObject(C)[SPECIES$4]) == undefined ? defaultConstructor : aFunction$1(S); + return C === undefined || (S = anObject(C)[SPECIES$5]) == undefined ? defaultConstructor : aFunction$1(S); }; var arrayPush = [].push; @@ -2589,16 +2716,16 @@ typeof navigator === "object" && (function () { }; var nativeAssign = Object.assign; - var defineProperty$4 = Object.defineProperty; + var defineProperty$5 = Object.defineProperty; // `Object.assign` method // https://tc39.github.io/ecma262/#sec-object.assign var objectAssign = !nativeAssign || fails(function () { // should have correct order of operations (Edge bug) - if (descriptors && nativeAssign({ b: 1 }, nativeAssign(defineProperty$4({}, 'a', { + if (descriptors && nativeAssign({ b: 1 }, nativeAssign(defineProperty$5({}, 'a', { enumerable: true, get: function () { - defineProperty$4(this, 'b', { + defineProperty$5(this, 'b', { value: 3, enumerable: false }); @@ -2839,7 +2966,7 @@ typeof navigator === "object" && (function () { var ITERATOR$7 = wellKnownSymbol('iterator'); var URL_SEARCH_PARAMS = 'URLSearchParams'; var URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator'; - var setInternalState$3 = internalState.set; + var setInternalState$4 = internalState.set; var getInternalParamsState = internalState.getterFor(URL_SEARCH_PARAMS); var getInternalIteratorState = internalState.getterFor(URL_SEARCH_PARAMS_ITERATOR); @@ -2918,7 +3045,7 @@ typeof navigator === "object" && (function () { }; var URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) { - setInternalState$3(this, { + setInternalState$4(this, { type: URL_SEARCH_PARAMS_ITERATOR, iterator: getIterator(getInternalParamsState(params).entries), kind: kind @@ -2942,7 +3069,7 @@ typeof navigator === "object" && (function () { var entries = []; var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key; - setInternalState$3(that, { + setInternalState$4(that, { type: URL_SEARCH_PARAMS, entries: entries, updateURL: function () { /* empty */ }, @@ -3180,7 +3307,7 @@ typeof navigator === "object" && (function () { var NativeURL = global_1.URL; var URLSearchParams$1 = web_urlSearchParams.URLSearchParams; var getInternalSearchParamsState = web_urlSearchParams.getState; - var setInternalState$4 = internalState.set; + var setInternalState$5 = internalState.set; var getInternalURLState = internalState.getterFor('URL'); var floor$3 = Math.floor; var pow = Math.pow; @@ -3897,7 +4024,7 @@ typeof navigator === "object" && (function () { var that = anInstance(this, URLConstructor, 'URL'); var base = arguments.length > 1 ? arguments[1] : undefined; var urlString = String(url); - var state = setInternalState$4(that, { type: 'URL' }); + var state = setInternalState$5(that, { type: 'URL' }); var baseState, failure; if (base !== undefined) { if (base instanceof URLConstructor) baseState = getInternalURLState(base); @@ -4803,6 +4930,10 @@ typeof navigator === "object" && (function () { } })(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal); + // `Symbol.asyncIterator` well-known symbol + // https://tc39.github.io/ecma262/#sec-symbol.asynciterator + defineWellKnownSymbol('asyncIterator'); + var IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable'); var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; var MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded'; @@ -4824,12 +4955,12 @@ typeof navigator === "object" && (function () { return spreadable !== undefined ? !!spreadable : isArray(O); }; - var FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT; + var FORCED$1 = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT; // `Array.prototype.concat` method // https://tc39.github.io/ecma262/#sec-array.prototype.concat // with adding support of @@isConcatSpreadable and @@species - _export({ target: 'Array', proto: true, forced: FORCED }, { + _export({ target: 'Array', proto: true, forced: FORCED$1 }, { concat: function concat(arg) { // eslint-disable-line no-unused-vars var O = toObject(this); var A = arraySpeciesCreate(O, 0); @@ -4851,94 +4982,28 @@ typeof navigator === "object" && (function () { } }); - // `Array.prototype.fill` method implementation - // https://tc39.github.io/ecma262/#sec-array.prototype.fill - var arrayFill = function fill(value /* , start = 0, end = @length */) { - var O = toObject(this); - var length = toLength(O.length); - var argumentsLength = arguments.length; - var index = toAbsoluteIndex(argumentsLength > 1 ? arguments[1] : undefined, length); - var end = argumentsLength > 2 ? arguments[2] : undefined; - var endPos = end === undefined ? length : toAbsoluteIndex(end, length); - while (endPos > index) O[index++] = value; - return O; - }; - - // `Array.prototype.fill` method - // https://tc39.github.io/ecma262/#sec-array.prototype.fill - _export({ target: 'Array', proto: true }, { - fill: arrayFill + // `Object.assign` method + // https://tc39.github.io/ecma262/#sec-object.assign + _export({ target: 'Object', stat: true, forced: Object.assign !== objectAssign }, { + assign: objectAssign }); - // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables - addToUnscopables('fill'); + var nativeGetOwnPropertyDescriptor$2 = objectGetOwnPropertyDescriptor.f; - var min$4 = Math.min; - var nativeLastIndexOf = [].lastIndexOf; - var NEGATIVE_ZERO$1 = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0; - var STRICT_METHOD$3 = arrayMethodIsStrict('lastIndexOf'); - // For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method - var USES_TO_LENGTH$4 = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 }); - var FORCED$1 = NEGATIVE_ZERO$1 || !STRICT_METHOD$3 || !USES_TO_LENGTH$4; - // `Array.prototype.lastIndexOf` method implementation - // https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof - var arrayLastIndexOf = FORCED$1 ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) { - // convert -0 to +0 - if (NEGATIVE_ZERO$1) return nativeLastIndexOf.apply(this, arguments) || 0; - var O = toIndexedObject(this); - var length = toLength(O.length); - var index = length - 1; - if (arguments.length > 1) index = min$4(index, toInteger(arguments[1])); - if (index < 0) index = length + index; - for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0; - return -1; - } : nativeLastIndexOf; + var FAILS_ON_PRIMITIVES$1 = fails(function () { nativeGetOwnPropertyDescriptor$2(1); }); + var FORCED$2 = !descriptors || FAILS_ON_PRIMITIVES$1; - // `Array.prototype.lastIndexOf` method - // https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof - _export({ target: 'Array', proto: true, forced: arrayLastIndexOf !== [].lastIndexOf }, { - lastIndexOf: arrayLastIndexOf + // `Object.getOwnPropertyDescriptor` method + // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor + _export({ target: 'Object', stat: true, forced: FORCED$2, sham: !descriptors }, { + getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) { + return nativeGetOwnPropertyDescriptor$2(toIndexedObject(it), key); + } }); - var defineProperty$5 = objectDefineProperty.f; - - var FunctionPrototype = Function.prototype; - var FunctionPrototypeToString = FunctionPrototype.toString; - var nameRE = /^\s*function ([^ (]*)/; - var NAME = 'name'; - - // Function instances `.name` property - // https://tc39.github.io/ecma262/#sec-function-instances-name - if (descriptors && !(NAME in FunctionPrototype)) { - defineProperty$5(FunctionPrototype, NAME, { - configurable: true, - get: function () { - try { - return FunctionPrototypeToString.call(this).match(nameRE)[1]; - } catch (error) { - return ''; - } - } - }); - } - var nativePromiseConstructor = global_1.Promise; - var SPECIES$5 = wellKnownSymbol('species'); - - var setSpecies = function (CONSTRUCTOR_NAME) { - var Constructor = getBuiltIn(CONSTRUCTOR_NAME); - var defineProperty = objectDefineProperty.f; - - if (descriptors && Constructor && !Constructor[SPECIES$5]) { - defineProperty(Constructor, SPECIES$5, { - configurable: true, - get: function () { return this; } - }); - } - }; - var iterate_1 = createCommonjsModule(function (module) { var Result = function (stopped, result) { this.stopped = stopped; @@ -4983,7 +5048,7 @@ typeof navigator === "object" && (function () { var location = global_1.location; var set$1 = global_1.setImmediate; var clear = global_1.clearImmediate; - var process$1 = global_1.process; + var process$2 = global_1.process; var MessageChannel = global_1.MessageChannel; var Dispatch = global_1.Dispatch; var counter = 0; @@ -5032,9 +5097,9 @@ typeof navigator === "object" && (function () { delete queue[id]; }; // Node.js 0.8- - if (classofRaw(process$1) == 'process') { + if (classofRaw(process$2) == 'process') { defer = function (id) { - process$1.nextTick(runner(id)); + process$2.nextTick(runner(id)); }; // Sphere (JS game engine) Dispatch API } else if (Dispatch && Dispatch.now) { @@ -5080,9 +5145,9 @@ typeof navigator === "object" && (function () { var MutationObserver$1 = global_1.MutationObserver || global_1.WebKitMutationObserver; - var process$2 = global_1.process; + var process$3 = global_1.process; var Promise$1 = global_1.Promise; - var IS_NODE = classofRaw(process$2) == 'process'; + var IS_NODE = classofRaw(process$3) == 'process'; // Node.js 11 shows ExperimentalWarning on getting `queueMicrotask` var queueMicrotaskDescriptor = getOwnPropertyDescriptor$2(global_1, 'queueMicrotask'); var queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value; @@ -5093,7 +5158,7 @@ typeof navigator === "object" && (function () { if (!queueMicrotask) { flush = function () { var parent, fn; - if (IS_NODE && (parent = process$2.domain)) parent.exit(); + if (IS_NODE && (parent = process$3.domain)) parent.exit(); while (head) { fn = head.fn; head = head.next; @@ -5111,7 +5176,7 @@ typeof navigator === "object" && (function () { // Node.js if (IS_NODE) { notify = function () { - process$2.nextTick(flush); + process$3.nextTick(flush); }; // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339 } else if (MutationObserver$1 && !engineIsIos) { @@ -5210,16 +5275,16 @@ typeof navigator === "object" && (function () { var SPECIES$6 = wellKnownSymbol('species'); var PROMISE = 'Promise'; var getInternalState$3 = internalState.get; - var setInternalState$5 = internalState.set; + var setInternalState$6 = internalState.set; var getInternalPromiseState = internalState.getterFor(PROMISE); var PromiseConstructor = nativePromiseConstructor; var TypeError$1 = global_1.TypeError; var document$2 = global_1.document; - var process$3 = global_1.process; + var process$4 = global_1.process; var $fetch$1 = getBuiltIn('fetch'); var newPromiseCapability$1 = newPromiseCapability.f; var newGenericPromiseCapability = newPromiseCapability$1; - var IS_NODE$1 = classofRaw(process$3) == 'process'; + var IS_NODE$1 = classofRaw(process$4) == 'process'; var DISPATCH_EVENT = !!(document$2 && document$2.createEvent && global_1.dispatchEvent); var UNHANDLED_REJECTION = 'unhandledrejection'; var REJECTION_HANDLED = 'rejectionhandled'; @@ -5230,7 +5295,7 @@ typeof navigator === "object" && (function () { var UNHANDLED = 2; var Internal, OwnPromiseCapability, PromiseWrapper, nativeThen; - var FORCED$2 = isForced_1(PROMISE, function () { + var FORCED$3 = isForced_1(PROMISE, function () { var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor); if (!GLOBAL_CORE_JS_PROMISE) { // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables @@ -5254,7 +5319,7 @@ typeof navigator === "object" && (function () { return !(promise.then(function () { /* empty */ }) instanceof FakePromise); }); - var INCORRECT_ITERATION$1 = FORCED$2 || !checkCorrectnessOfIteration(function (iterable) { + var INCORRECT_ITERATION$1 = FORCED$3 || !checkCorrectnessOfIteration(function (iterable) { PromiseConstructor.all(iterable)['catch'](function () { /* empty */ }); }); @@ -5333,7 +5398,7 @@ typeof navigator === "object" && (function () { if (IS_UNHANDLED) { result = perform(function () { if (IS_NODE$1) { - process$3.emit('unhandledRejection', value, promise); + process$4.emit('unhandledRejection', value, promise); } else dispatchEvent(UNHANDLED_REJECTION, promise, value); }); // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should @@ -5350,7 +5415,7 @@ typeof navigator === "object" && (function () { var onHandleUnhandled = function (promise, state) { task$1.call(global_1, function () { if (IS_NODE$1) { - process$3.emit('rejectionHandled', promise); + process$4.emit('rejectionHandled', promise); } else dispatchEvent(REJECTION_HANDLED, promise, state.value); }); }; @@ -5400,7 +5465,7 @@ typeof navigator === "object" && (function () { }; // constructor polyfill - if (FORCED$2) { + if (FORCED$3) { // 25.4.3.1 Promise(executor) PromiseConstructor = function Promise(executor) { anInstance(this, PromiseConstructor, PROMISE); @@ -5415,7 +5480,7 @@ typeof navigator === "object" && (function () { }; // eslint-disable-next-line no-unused-vars Internal = function Promise(executor) { - setInternalState$5(this, { + setInternalState$6(this, { type: PROMISE, done: false, notified: false, @@ -5434,7 +5499,7 @@ typeof navigator === "object" && (function () { var reaction = newPromiseCapability$1(speciesConstructor(this, PromiseConstructor)); reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; reaction.fail = typeof onRejected == 'function' && onRejected; - reaction.domain = IS_NODE$1 ? process$3.domain : undefined; + reaction.domain = IS_NODE$1 ? process$4.domain : undefined; state.parent = true; state.reactions.push(reaction); if (state.state != PENDING) notify$1(this, state, false); @@ -5481,7 +5546,7 @@ typeof navigator === "object" && (function () { } } - _export({ global: true, wrap: true, forced: FORCED$2 }, { + _export({ global: true, wrap: true, forced: FORCED$3 }, { Promise: PromiseConstructor }); @@ -5491,7 +5556,7 @@ typeof navigator === "object" && (function () { PromiseWrapper = getBuiltIn(PROMISE); // statics - _export({ target: PROMISE, stat: true, forced: FORCED$2 }, { + _export({ target: PROMISE, stat: true, forced: FORCED$3 }, { // `Promise.reject` method // https://tc39.github.io/ecma262/#sec-promise.reject reject: function reject(r) { @@ -5501,7 +5566,7 @@ typeof navigator === "object" && (function () { } }); - _export({ target: PROMISE, stat: true, forced: FORCED$2 }, { + _export({ target: PROMISE, stat: true, forced: FORCED$3 }, { // `Promise.resolve` method // https://tc39.github.io/ecma262/#sec-promise.resolve resolve: function resolve(x) { @@ -5556,65 +5621,465 @@ typeof navigator === "object" && (function () { } }); - var HAS_SPECIES_SUPPORT$1 = arrayMethodHasSpeciesSupport('splice'); - var USES_TO_LENGTH$5 = arrayMethodUsesToLength('splice', { ACCESSORS: true, 0: 0, 1: 2 }); + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ - var max$3 = Math.max; - var min$5 = Math.min; - var MAX_SAFE_INTEGER$1 = 0x1FFFFFFFFFFFFF; - var MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded'; + /* global Reflect, Promise */ + var _extendStatics = function extendStatics(d, b) { + _extendStatics = Object.setPrototypeOf || { + __proto__: [] + } instanceof Array && function (d, b) { + d.__proto__ = b; + } || function (d, b) { + for (var p in b) { + if (b.hasOwnProperty(p)) d[p] = b[p]; + } + }; - // `Array.prototype.splice` method - // https://tc39.github.io/ecma262/#sec-array.prototype.splice - // with adding support of @@species - _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$1 || !USES_TO_LENGTH$5 }, { - splice: function splice(start, deleteCount /* , ...items */) { - var O = toObject(this); - var len = toLength(O.length); - var actualStart = toAbsoluteIndex(start, len); - var argumentsLength = arguments.length; - var insertCount, actualDeleteCount, A, k, from, to; - if (argumentsLength === 0) { - insertCount = actualDeleteCount = 0; - } else if (argumentsLength === 1) { - insertCount = 0; - actualDeleteCount = len - actualStart; - } else { - insertCount = argumentsLength - 2; - actualDeleteCount = min$5(max$3(toInteger(deleteCount), 0), len - actualStart); - } - if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER$1) { - throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED); - } - A = arraySpeciesCreate(O, actualDeleteCount); - for (k = 0; k < actualDeleteCount; k++) { - from = actualStart + k; - if (from in O) createProperty(A, k, O[from]); - } - A.length = actualDeleteCount; - if (insertCount < actualDeleteCount) { - for (k = actualStart; k < len - actualDeleteCount; k++) { - from = k + actualDeleteCount; - to = k + insertCount; - if (from in O) O[to] = O[from]; - else delete O[to]; - } - for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1]; - } else if (insertCount > actualDeleteCount) { - for (k = len - actualDeleteCount; k > actualStart; k--) { - from = k + actualDeleteCount - 1; - to = k + insertCount - 1; - if (from in O) O[to] = O[from]; - else delete O[to]; - } - } - for (k = 0; k < insertCount; k++) { - O[k + actualStart] = arguments[k + 2]; - } - O.length = len - actualDeleteCount + insertCount; - return A; + return _extendStatics(d, b); + }; + + function __extends(d, b) { + _extendStatics(d, b); + + function __() { + this.constructor = d; } - }); + + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + + var _assign = function __assign() { + _assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + + for (var p in s) { + if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + } + + return t; + }; + + return _assign.apply(this, arguments); + }; + function __values(o) { + var s = typeof Symbol === "function" && Symbol.iterator, + m = s && o[s], + i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function next() { + if (o && i >= o.length) o = void 0; + return { + value: o && o[i++], + done: !o + }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); + } + function __read(o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), + r, + ar = [], + e; + + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) { + ar.push(r.value); + } + } catch (error) { + e = { + error: error + }; + } finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } finally { + if (e) throw e.error; + } + } + + return ar; + } + function __spread() { + for (var ar = [], i = 0; i < arguments.length; i++) { + ar = ar.concat(__read(arguments[i])); + } + + return ar; + } + + /** JSDoc */ + var Severity; + + (function (Severity) { + /** JSDoc */ + Severity["Fatal"] = "fatal"; + /** JSDoc */ + + Severity["Error"] = "error"; + /** JSDoc */ + + Severity["Warning"] = "warning"; + /** JSDoc */ + + Severity["Log"] = "log"; + /** JSDoc */ + + Severity["Info"] = "info"; + /** JSDoc */ + + Severity["Debug"] = "debug"; + /** JSDoc */ + + Severity["Critical"] = "critical"; + })(Severity || (Severity = {})); // tslint:disable:completed-docs + // tslint:disable:no-unnecessary-qualifier no-namespace + + + (function (Severity) { + /** + * Converts a string-based level into a {@link Severity}. + * + * @param level string representation of Severity + * @returns Severity + */ + function fromString(level) { + switch (level) { + case 'debug': + return Severity.Debug; + + case 'info': + return Severity.Info; + + case 'warn': + case 'warning': + return Severity.Warning; + + case 'error': + return Severity.Error; + + case 'fatal': + return Severity.Fatal; + + case 'critical': + return Severity.Critical; + + case 'log': + default: + return Severity.Log; + } + } + + Severity.fromString = fromString; + })(Severity || (Severity = {})); + + /** The status of an event. */ + var Status; + + (function (Status) { + /** The status could not be determined. */ + Status["Unknown"] = "unknown"; + /** The event was skipped due to configuration or callbacks. */ + + Status["Skipped"] = "skipped"; + /** The event was sent to Sentry successfully. */ + + Status["Success"] = "success"; + /** The client is currently rate limited and will try again later. */ + + Status["RateLimit"] = "rate_limit"; + /** The event could not be processed. */ + + Status["Invalid"] = "invalid"; + /** A server-side error ocurred during submission. */ + + Status["Failed"] = "failed"; + })(Status || (Status = {})); // tslint:disable:completed-docs + // tslint:disable:no-unnecessary-qualifier no-namespace + + + (function (Status) { + /** + * Converts a HTTP status code into a {@link Status}. + * + * @param code The HTTP response status code. + * @returns The send status or {@link Status.Unknown}. + */ + function fromHttpCode(code) { + if (code >= 200 && code < 300) { + return Status.Success; + } + + if (code === 429) { + return Status.RateLimit; + } + + if (code >= 400 && code < 500) { + return Status.Invalid; + } + + if (code >= 500) { + return Status.Failed; + } + + return Status.Unknown; + } + + Status.fromHttpCode = fromHttpCode; + })(Status || (Status = {})); + + var defineProperty$6 = objectDefineProperty.f; + + var FunctionPrototype = Function.prototype; + var FunctionPrototypeToString = FunctionPrototype.toString; + var nameRE = /^\s*function ([^ (]*)/; + var NAME = 'name'; + + // Function instances `.name` property + // https://tc39.github.io/ecma262/#sec-function-instances-name + if (descriptors && !(NAME in FunctionPrototype)) { + defineProperty$6(FunctionPrototype, NAME, { + configurable: true, + get: function () { + try { + return FunctionPrototypeToString.call(this).match(nameRE)[1]; + } catch (error) { + return ''; + } + } + }); + } + + var setPrototypeOf = Object.setPrototypeOf || ({ + __proto__: [] + } instanceof Array ? setProtoOf : mixinProperties); // tslint:disable-line:no-unbound-method + + /** + * setPrototypeOf polyfill using __proto__ + */ + + function setProtoOf(obj, proto) { + // @ts-ignore + obj.__proto__ = proto; + return obj; + } + /** + * setPrototypeOf polyfill using mixin + */ + + + function mixinProperties(obj, proto) { + for (var prop in proto) { + if (!obj.hasOwnProperty(prop)) { + // @ts-ignore + obj[prop] = proto[prop]; + } + } + + return obj; + } + + /** An error emitted by Sentry SDKs and related utilities. */ + + var SentryError = + /** @class */ + function (_super) { + __extends(SentryError, _super); + + function SentryError(message) { + var _newTarget = this.constructor; + + var _this = _super.call(this, message) || this; + + _this.message = message; // tslint:disable:no-unsafe-any + + _this.name = _newTarget.prototype.constructor.name; + setPrototypeOf(_this, _newTarget.prototype); + return _this; + } + + return SentryError; + }(Error); + + /** + * Checks whether given value's type is one of a few Error or Error-like + * {@link isError}. + * + * @param wat A value to be checked. + * @returns A boolean representing the result. + */ + function isError(wat) { + switch (Object.prototype.toString.call(wat)) { + case '[object Error]': + return true; + + case '[object Exception]': + return true; + + case '[object DOMException]': + return true; + + default: + return isInstanceOf(wat, Error); + } + } + /** + * Checks whether given value's type is ErrorEvent + * {@link isErrorEvent}. + * + * @param wat A value to be checked. + * @returns A boolean representing the result. + */ + + function isErrorEvent(wat) { + return Object.prototype.toString.call(wat) === '[object ErrorEvent]'; + } + /** + * Checks whether given value's type is DOMError + * {@link isDOMError}. + * + * @param wat A value to be checked. + * @returns A boolean representing the result. + */ + + function isDOMError(wat) { + return Object.prototype.toString.call(wat) === '[object DOMError]'; + } + /** + * Checks whether given value's type is DOMException + * {@link isDOMException}. + * + * @param wat A value to be checked. + * @returns A boolean representing the result. + */ + + function isDOMException(wat) { + return Object.prototype.toString.call(wat) === '[object DOMException]'; + } + /** + * Checks whether given value's type is a string + * {@link isString}. + * + * @param wat A value to be checked. + * @returns A boolean representing the result. + */ + + function isString(wat) { + return Object.prototype.toString.call(wat) === '[object String]'; + } + /** + * Checks whether given value's is a primitive (undefined, null, number, boolean, string) + * {@link isPrimitive}. + * + * @param wat A value to be checked. + * @returns A boolean representing the result. + */ + + function isPrimitive(wat) { + return wat === null || _typeof(wat) !== 'object' && typeof wat !== 'function'; + } + /** + * Checks whether given value's type is an object literal + * {@link isPlainObject}. + * + * @param wat A value to be checked. + * @returns A boolean representing the result. + */ + + function isPlainObject(wat) { + return Object.prototype.toString.call(wat) === '[object Object]'; + } + /** + * Checks whether given value's type is an Event instance + * {@link isEvent}. + * + * @param wat A value to be checked. + * @returns A boolean representing the result. + */ + + function isEvent(wat) { + // tslint:disable-next-line:strict-type-predicates + return typeof Event !== 'undefined' && isInstanceOf(wat, Event); + } + /** + * Checks whether given value's type is an Element instance + * {@link isElement}. + * + * @param wat A value to be checked. + * @returns A boolean representing the result. + */ + + function isElement(wat) { + // tslint:disable-next-line:strict-type-predicates + return typeof Element !== 'undefined' && isInstanceOf(wat, Element); + } + /** + * Checks whether given value's type is an regexp + * {@link isRegExp}. + * + * @param wat A value to be checked. + * @returns A boolean representing the result. + */ + + function isRegExp(wat) { + return Object.prototype.toString.call(wat) === '[object RegExp]'; + } + /** + * Checks whether given value has a then function. + * @param wat A value to be checked. + */ + + function isThenable$1(wat) { + // tslint:disable:no-unsafe-any + return Boolean(wat && wat.then && typeof wat.then === 'function'); // tslint:enable:no-unsafe-any + } + /** + * Checks whether given value's type is a SyntheticEvent + * {@link isSyntheticEvent}. + * + * @param wat A value to be checked. + * @returns A boolean representing the result. + */ + + function isSyntheticEvent(wat) { + // tslint:disable-next-line:no-unsafe-any + return isPlainObject(wat) && 'nativeEvent' in wat && 'preventDefault' in wat && 'stopPropagation' in wat; + } + /** + * Checks whether given value's type is an instance of provided constructor. + * {@link isInstanceOf}. + * + * @param wat A value to be checked. + * @param base A constructor to be used in a check. + * @returns A boolean representing the result. + */ + + function isInstanceOf(wat, base) { + try { + // tslint:disable-next-line:no-unsafe-any + return wat instanceof base; + } catch (_e) { + return false; + } + } // @@match logic fixRegexpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) { @@ -5653,198 +6118,6 @@ typeof navigator === "object" && (function () { ]; }); - var $filter = arrayIteration.filter; - - - - var HAS_SPECIES_SUPPORT$2 = arrayMethodHasSpeciesSupport('filter'); - // Edge 14- issue - var USES_TO_LENGTH$6 = arrayMethodUsesToLength('filter'); - - // `Array.prototype.filter` method - // https://tc39.github.io/ecma262/#sec-array.prototype.filter - // with adding support of @@species - _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$2 || !USES_TO_LENGTH$6 }, { - filter: function filter(callbackfn /* , thisArg */) { - return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); - } - }); - - var $map = arrayIteration.map; - - - - var HAS_SPECIES_SUPPORT$3 = arrayMethodHasSpeciesSupport('map'); - // FF49- issue - var USES_TO_LENGTH$7 = arrayMethodUsesToLength('map'); - - // `Array.prototype.map` method - // https://tc39.github.io/ecma262/#sec-array.prototype.map - // with adding support of @@species - _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$3 || !USES_TO_LENGTH$7 }, { - map: function map(callbackfn /* , thisArg */) { - return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); - } - }); - - // `Array.prototype.{ reduce, reduceRight }` methods implementation - var createMethod$3 = function (IS_RIGHT) { - return function (that, callbackfn, argumentsLength, memo) { - aFunction$1(callbackfn); - var O = toObject(that); - var self = indexedObject(O); - var length = toLength(O.length); - var index = IS_RIGHT ? length - 1 : 0; - var i = IS_RIGHT ? -1 : 1; - if (argumentsLength < 2) while (true) { - if (index in self) { - memo = self[index]; - index += i; - break; - } - index += i; - if (IS_RIGHT ? index < 0 : length <= index) { - throw TypeError('Reduce of empty array with no initial value'); - } - } - for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) { - memo = callbackfn(memo, self[index], index, O); - } - return memo; - }; - }; - - var arrayReduce = { - // `Array.prototype.reduce` method - // https://tc39.github.io/ecma262/#sec-array.prototype.reduce - left: createMethod$3(false), - // `Array.prototype.reduceRight` method - // https://tc39.github.io/ecma262/#sec-array.prototype.reduceright - right: createMethod$3(true) - }; - - var $reduce = arrayReduce.left; - - - - var STRICT_METHOD$4 = arrayMethodIsStrict('reduce'); - var USES_TO_LENGTH$8 = arrayMethodUsesToLength('reduce', { 1: 0 }); - - // `Array.prototype.reduce` method - // https://tc39.github.io/ecma262/#sec-array.prototype.reduce - _export({ target: 'Array', proto: true, forced: !STRICT_METHOD$4 || !USES_TO_LENGTH$8 }, { - reduce: function reduce(callbackfn /* , initialValue */) { - return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined); - } - }); - - var nativeIsFrozen = Object.isFrozen; - var FAILS_ON_PRIMITIVES$1 = fails(function () { nativeIsFrozen(1); }); - - // `Object.isFrozen` method - // https://tc39.github.io/ecma262/#sec-object.isfrozen - _export({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES$1 }, { - isFrozen: function isFrozen(it) { - return isObject(it) ? nativeIsFrozen ? nativeIsFrozen(it) : false : true; - } - }); - - // makes subclassing work correct for wrapped built-ins - var inheritIfRequired = function ($this, dummy, Wrapper) { - var NewTarget, NewTargetPrototype; - if ( - // it can work only with native `setPrototypeOf` - objectSetPrototypeOf && - // we haven't completely correct pre-ES6 way for getting `new.target`, so use this - typeof (NewTarget = dummy.constructor) == 'function' && - NewTarget !== Wrapper && - isObject(NewTargetPrototype = NewTarget.prototype) && - NewTargetPrototype !== Wrapper.prototype - ) objectSetPrototypeOf($this, NewTargetPrototype); - return $this; - }; - - var defineProperty$6 = objectDefineProperty.f; - var getOwnPropertyNames = objectGetOwnPropertyNames.f; - - - - - - var setInternalState$6 = internalState.set; - - - - var MATCH$2 = wellKnownSymbol('match'); - var NativeRegExp = global_1.RegExp; - var RegExpPrototype$1 = NativeRegExp.prototype; - var re1 = /a/g; - var re2 = /a/g; - - // "new" should create a new object, old webkit bug - var CORRECT_NEW = new NativeRegExp(re1) !== re1; - - var UNSUPPORTED_Y$2 = regexpStickyHelpers.UNSUPPORTED_Y; - - var FORCED$3 = descriptors && isForced_1('RegExp', (!CORRECT_NEW || UNSUPPORTED_Y$2 || fails(function () { - re2[MATCH$2] = false; - // RegExp constructor can alter flags and IsRegExp works correct with @@match - return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i'; - }))); - - // `RegExp` constructor - // https://tc39.github.io/ecma262/#sec-regexp-constructor - if (FORCED$3) { - var RegExpWrapper = function RegExp(pattern, flags) { - var thisIsRegExp = this instanceof RegExpWrapper; - var patternIsRegExp = isRegexp(pattern); - var flagsAreUndefined = flags === undefined; - var sticky; - - if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper && flagsAreUndefined) { - return pattern; - } - - if (CORRECT_NEW) { - if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source; - } else if (pattern instanceof RegExpWrapper) { - if (flagsAreUndefined) flags = regexpFlags.call(pattern); - pattern = pattern.source; - } - - if (UNSUPPORTED_Y$2) { - sticky = !!flags && flags.indexOf('y') > -1; - if (sticky) flags = flags.replace(/y/g, ''); - } - - var result = inheritIfRequired( - CORRECT_NEW ? new NativeRegExp(pattern, flags) : NativeRegExp(pattern, flags), - thisIsRegExp ? this : RegExpPrototype$1, - RegExpWrapper - ); - - if (UNSUPPORTED_Y$2 && sticky) setInternalState$6(result, { sticky: sticky }); - - return result; - }; - var proxy = function (key) { - key in RegExpWrapper || defineProperty$6(RegExpWrapper, key, { - configurable: true, - get: function () { return NativeRegExp[key]; }, - set: function (it) { NativeRegExp[key] = it; } - }); - }; - var keys$1 = getOwnPropertyNames(NativeRegExp); - var index = 0; - while (keys$1.length > index) proxy(keys$1[index++]); - RegExpPrototype$1.constructor = RegExpWrapper; - RegExpWrapper.prototype = RegExpPrototype$1; - redefine(global_1, 'RegExp', RegExpWrapper); - } - - // https://tc39.github.io/ecma262/#sec-get-regexp-@@species - setSpecies('RegExp'); - var arrayBufferNative = typeof ArrayBuffer !== 'undefined' && typeof DataView !== 'undefined'; var defineProperty$7 = objectDefineProperty.f; @@ -6117,6 +6390,19 @@ typeof navigator === "object" && (function () { unpack: unpack }; + // `Array.prototype.fill` method implementation + // https://tc39.github.io/ecma262/#sec-array.prototype.fill + var arrayFill = function fill(value /* , start = 0, end = @length */) { + var O = toObject(this); + var length = toLength(O.length); + var argumentsLength = arguments.length; + var index = toAbsoluteIndex(argumentsLength > 1 ? arguments[1] : undefined, length); + var end = argumentsLength > 2 ? arguments[2] : undefined; + var endPos = end === undefined ? length : toAbsoluteIndex(end, length); + while (endPos > index) O[index++] = value; + return O; + }; + var getOwnPropertyNames$1 = objectGetOwnPropertyNames.f; var defineProperty$8 = objectDefineProperty.f; @@ -6610,7 +6896,7 @@ typeof navigator === "object" && (function () { }; }); - var min$6 = Math.min; + var min$4 = Math.min; // `Array.prototype.copyWithin` method implementation // https://tc39.github.io/ecma262/#sec-array.prototype.copywithin @@ -6620,7 +6906,7 @@ typeof navigator === "object" && (function () { var to = toAbsoluteIndex(target, len); var from = toAbsoluteIndex(start, len); var end = arguments.length > 2 ? arguments[2] : undefined; - var count = min$6((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to); + var count = min$4((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to); var inc = 1; if (from < to && to < from + count) { inc = -1; @@ -6665,7 +6951,7 @@ typeof navigator === "object" && (function () { return arrayFill.apply(aTypedArray$3(this), arguments); }); - var $filter$1 = arrayIteration.filter; + var $filter = arrayIteration.filter; var aTypedArray$4 = arrayBufferViewCore.aTypedArray; @@ -6675,7 +6961,7 @@ typeof navigator === "object" && (function () { // `%TypedArray%.prototype.filter` method // https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.filter exportTypedArrayMethod$4('filter', function filter(callbackfn /* , thisArg */) { - var list = $filter$1(aTypedArray$4(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); + var list = $filter(aTypedArray$4(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined); var C = speciesConstructor(this, this.constructor); var index = 0; var length = list.length; @@ -6783,6 +7069,28 @@ typeof navigator === "object" && (function () { return $join.apply(aTypedArray$b(this), arguments); }); + var min$5 = Math.min; + var nativeLastIndexOf = [].lastIndexOf; + var NEGATIVE_ZERO$1 = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0; + var STRICT_METHOD$3 = arrayMethodIsStrict('lastIndexOf'); + // For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method + var USES_TO_LENGTH$5 = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 }); + var FORCED$4 = NEGATIVE_ZERO$1 || !STRICT_METHOD$3 || !USES_TO_LENGTH$5; + + // `Array.prototype.lastIndexOf` method implementation + // https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof + var arrayLastIndexOf = FORCED$4 ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) { + // convert -0 to +0 + if (NEGATIVE_ZERO$1) return nativeLastIndexOf.apply(this, arguments) || 0; + var O = toIndexedObject(this); + var length = toLength(O.length); + var index = length - 1; + if (arguments.length > 1) index = min$5(index, toInteger(arguments[1])); + if (index < 0) index = length + index; + for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0; + return -1; + } : nativeLastIndexOf; + var aTypedArray$c = arrayBufferViewCore.aTypedArray; var exportTypedArrayMethod$c = arrayBufferViewCore.exportTypedArrayMethod; @@ -6808,7 +7116,43 @@ typeof navigator === "object" && (function () { }); }); - var $reduce$1 = arrayReduce.left; + // `Array.prototype.{ reduce, reduceRight }` methods implementation + var createMethod$3 = function (IS_RIGHT) { + return function (that, callbackfn, argumentsLength, memo) { + aFunction$1(callbackfn); + var O = toObject(that); + var self = indexedObject(O); + var length = toLength(O.length); + var index = IS_RIGHT ? length - 1 : 0; + var i = IS_RIGHT ? -1 : 1; + if (argumentsLength < 2) while (true) { + if (index in self) { + memo = self[index]; + index += i; + break; + } + index += i; + if (IS_RIGHT ? index < 0 : length <= index) { + throw TypeError('Reduce of empty array with no initial value'); + } + } + for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) { + memo = callbackfn(memo, self[index], index, O); + } + return memo; + }; + }; + + var arrayReduce = { + // `Array.prototype.reduce` method + // https://tc39.github.io/ecma262/#sec-array.prototype.reduce + left: createMethod$3(false), + // `Array.prototype.reduceRight` method + // https://tc39.github.io/ecma262/#sec-array.prototype.reduceright + right: createMethod$3(true) + }; + + var $reduce = arrayReduce.left; var aTypedArray$e = arrayBufferViewCore.aTypedArray; var exportTypedArrayMethod$e = arrayBufferViewCore.exportTypedArrayMethod; @@ -6816,7 +7160,7 @@ typeof navigator === "object" && (function () { // `%TypedArray%.prototype.reduce` method // https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reduce exportTypedArrayMethod$e('reduce', function reduce(callbackfn /* , initialValue */) { - return $reduce$1(aTypedArray$e(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined); + return $reduce(aTypedArray$e(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined); }); var $reduceRight = arrayReduce.right; @@ -6852,7 +7196,7 @@ typeof navigator === "object" && (function () { var aTypedArray$h = arrayBufferViewCore.aTypedArray; var exportTypedArrayMethod$h = arrayBufferViewCore.exportTypedArrayMethod; - var FORCED$4 = fails(function () { + var FORCED$5 = fails(function () { // eslint-disable-next-line no-undef new Int8Array(1).set({}); }); @@ -6868,14 +7212,14 @@ typeof navigator === "object" && (function () { var index = 0; if (len + offset > length) throw RangeError('Wrong length'); while (index < len) this[offset + index] = src[index++]; - }, FORCED$4); + }, FORCED$5); var aTypedArray$i = arrayBufferViewCore.aTypedArray; var aTypedArrayConstructor$4 = arrayBufferViewCore.aTypedArrayConstructor; var exportTypedArrayMethod$i = arrayBufferViewCore.exportTypedArrayMethod; var $slice = [].slice; - var FORCED$5 = fails(function () { + var FORCED$6 = fails(function () { // eslint-disable-next-line no-undef new Int8Array(1).slice(); }); @@ -6890,7 +7234,7 @@ typeof navigator === "object" && (function () { var result = new (aTypedArrayConstructor$4(C))(length); while (length > index) result[index] = list[index++]; return result; - }, FORCED$5); + }, FORCED$6); var $some = arrayIteration.some; @@ -6940,7 +7284,7 @@ typeof navigator === "object" && (function () { $toLocaleString.call(new Int8Array$3(1)); }); - var FORCED$6 = fails(function () { + var FORCED$7 = fails(function () { return [1, 2].toLocaleString() != new Int8Array$3([1, 2]).toLocaleString(); }) || !fails(function () { Int8Array$3.prototype.toLocaleString.call([1, 2]); @@ -6950,7 +7294,7 @@ typeof navigator === "object" && (function () { // https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.tolocalestring exportTypedArrayMethod$m('toLocaleString', function toLocaleString() { return $toLocaleString.apply(TO_LOCALE_STRING_BUG ? $slice$1.call(aTypedArray$m(this)) : aTypedArray$m(this), arguments); - }, FORCED$6); + }, FORCED$7); var exportTypedArrayMethod$n = arrayBufferViewCore.exportTypedArrayMethod; @@ -6973,366 +7317,118 @@ typeof navigator === "object" && (function () { // https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.tostring exportTypedArrayMethod$n('toString', arrayToString, IS_NOT_ARRAY_METHOD); - var stringify_1 = createCommonjsModule(function (module, exports) { - /* - json-stringify-safe - Like JSON.stringify, but doesn't throw on circular references. - - Originally forked from https://github.com/isaacs/json-stringify-safe - version 5.0.1 on 3/8/2017 and modified to handle Errors serialization - and IE8 compatibility. Tests for this are in test/vendor. - - ISC license: https://github.com/isaacs/json-stringify-safe/blob/master/LICENSE - */ - exports = module.exports = stringify; - exports.getSerialize = serializer; - - function indexOf(haystack, needle) { - for (var i = 0; i < haystack.length; ++i) { - if (haystack[i] === needle) return i; - } - - return -1; - } - - function stringify(obj, replacer, spaces, cycleReplacer) { - return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces); - } // https://github.com/ftlabs/js-abbreviate/blob/fa709e5f139e7770a71827b1893f22418097fbda/index.js#L95-L106 - - - function stringifyError(value) { - var err = { - // These properties are implemented as magical getters and don't show up in for in - stack: value.stack, - message: value.message, - name: value.name - }; - - for (var i in value) { - if (Object.prototype.hasOwnProperty.call(value, i)) { - err[i] = value[i]; - } - } - - return err; - } - - function serializer(replacer, cycleReplacer) { - var stack = []; - var keys = []; - - if (cycleReplacer == null) { - cycleReplacer = function cycleReplacer(key, value) { - if (stack[0] === value) { - return '[Circular ~]'; - } - - return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']'; - }; - } - - return function (key, value) { - if (stack.length > 0) { - var thisPos = indexOf(stack, this); - ~thisPos ? stack.splice(thisPos + 1) : stack.push(this); - ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key); - - if (~indexOf(stack, value)) { - value = cycleReplacer.call(this, key, value); - } - } else { - stack.push(value); - } - - return replacer == null ? value instanceof Error ? stringifyError(value) : value : replacer.call(this, key, value); - }; - } - }); - var stringify_2 = stringify_1.getSerialize; - - var _window = typeof window !== 'undefined' ? window : typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof self !== 'undefined' ? self : {}; - - function isObject$1(what) { - return _typeof(what) === 'object' && what !== null; - } // Yanked from https://git.io/vS8DV re-used under CC0 - // with some tiny modifications - - - function isError(value) { - switch (Object.prototype.toString.call(value)) { - case '[object Error]': - return true; - - case '[object Exception]': - return true; - - case '[object DOMException]': - return true; - - default: - return value instanceof Error; - } - } - - function isErrorEvent(value) { - return Object.prototype.toString.call(value) === '[object ErrorEvent]'; - } - - function isDOMError(value) { - return Object.prototype.toString.call(value) === '[object DOMError]'; - } - - function isDOMException(value) { - return Object.prototype.toString.call(value) === '[object DOMException]'; - } - - function isUndefined(what) { - return what === void 0; - } - - function isFunction(what) { - return typeof what === 'function'; - } - - function isPlainObject(what) { - return Object.prototype.toString.call(what) === '[object Object]'; - } - - function isString(what) { - return Object.prototype.toString.call(what) === '[object String]'; - } - - function isArray$1(what) { - return Object.prototype.toString.call(what) === '[object Array]'; - } - - function isEmptyObject(what) { - if (!isPlainObject(what)) return false; - - for (var _ in what) { - if (what.hasOwnProperty(_)) { - return false; - } - } - - return true; - } - - function supportsErrorEvent() { - try { - new ErrorEvent(''); // eslint-disable-line no-new - - return true; - } catch (e) { - return false; - } - } - - function supportsDOMError() { - try { - new DOMError(''); // eslint-disable-line no-new - - return true; - } catch (e) { - return false; - } - } - - function supportsDOMException() { - try { - new DOMException(''); // eslint-disable-line no-new - - return true; - } catch (e) { - return false; - } - } - - function supportsFetch() { - if (!('fetch' in _window)) return false; - - try { - new Headers(); // eslint-disable-line no-new - - new Request(''); // eslint-disable-line no-new - - new Response(); // eslint-disable-line no-new - - return true; - } catch (e) { - return false; - } - } // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default - // https://caniuse.com/#feat=referrer-policy - // It doesn't. And it throw exception instead of ignoring this parameter... - // REF: https://github.com/getsentry/raven-js/issues/1233 - - - function supportsReferrerPolicy() { - if (!supportsFetch()) return false; - - try { - // eslint-disable-next-line no-new - new Request('pickleRick', { - referrerPolicy: 'origin' - }); - return true; - } catch (e) { - return false; - } - } - - function supportsPromiseRejectionEvent() { - return typeof PromiseRejectionEvent === 'function'; - } - - function wrappedCallback(callback) { - function dataCallback(data, original) { - var normalizedData = callback(data) || data; - - if (original) { - return original(normalizedData) || normalizedData; - } - - return normalizedData; - } - - return dataCallback; - } - - function each(obj, callback) { - var i, j; - - if (isUndefined(obj.length)) { - for (i in obj) { - if (hasKey(obj, i)) { - callback.call(null, i, obj[i]); - } - } - } else { - j = obj.length; - - if (j) { - for (i = 0; i < j; i++) { - callback.call(null, i, obj[i]); - } - } - } - } - - function objectMerge(obj1, obj2) { - if (!obj2) { - return obj1; - } - - each(obj2, function (key, value) { - obj1[key] = value; - }); - return obj1; - } /** - * This function is only used for react-native. - * react-native freezes object that have already been sent over the - * js bridge. We need this function in order to check if the object is frozen. - * So it's ok that objectFrozen returns false if Object.isFrozen is not - * supported because it's not relevant for other "platforms". See related issue: - * https://github.com/getsentry/react-native-sentry/issues/57 + * Truncates given string to the maximum characters count + * + * @param str An object that contains serializable values + * @param max Maximum number of characters in truncated string + * @returns string Encoded */ - - function objectFrozen(obj) { - if (!Object.isFrozen) { - return false; - } - - return Object.isFrozen(obj); - } - function truncate(str, max) { - if (typeof max !== 'number') { - throw new Error('2nd argument to `truncate` function should be a number'); - } + if (max === void 0) { + max = 0; + } // tslint:disable-next-line:strict-type-predicates + if (typeof str !== 'string' || max === 0) { return str; } - return str.length <= max ? str : str.substr(0, max) + "\u2026"; + return str.length <= max ? str : str.substr(0, max) + "..."; } /** - * hasKey, a better form of hasOwnProperty - * Example: hasKey(MainHostObject, property) === true/false - * - * @param {Object} host object to check property - * @param {string} key to check + * Join values in array + * @param input array of values to be joined together + * @param delimiter string to be placed in-between values + * @returns Joined values */ - - function hasKey(object, key) { - return Object.prototype.hasOwnProperty.call(object, key); - } - - function joinRegExp(patterns) { - // Combine an array of regular expressions and strings into one large regexp - // Be mad. - var sources = [], - i = 0, - len = patterns.length, - pattern; - - for (; i < len; i++) { - pattern = patterns[i]; - - if (isString(pattern)) { - // If it's a string, we need to escape it - // Taken from: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions - sources.push(pattern.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, '\\$1')); - } else if (pattern && pattern.source) { - // If it's a regexp already, we want to extract the source - sources.push(pattern.source); - } // Intentionally skip other cases - + function safeJoin(input, delimiter) { + if (!Array.isArray(input)) { + return ''; } - return new RegExp(sources.join('|'), 'i'); + var output = []; // tslint:disable-next-line:prefer-for-of + + for (var i = 0; i < input.length; i++) { + var value = input[i]; + + try { + output.push(String(value)); + } catch (e) { + output.push('[value cannot be serialized]'); + } + } + + return output.join(delimiter); + } + /** + * Checks if the value matches a regex or includes the string + * @param value The string value to be checked against + * @param pattern Either a regex or a string that must be contained in value + */ + + function isMatchingPattern(value, pattern) { + if (isRegExp(pattern)) { + return pattern.test(value); + } + + if (typeof pattern === 'string') { + return value.indexOf(pattern) !== -1; + } + + return false; } - function urlencode(o) { - var pairs = []; - each(o, function (key, value) { - pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value)); - }); - return pairs.join('&'); - } // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B - // intentionally using regex and not href parsing trick because React Native and other - // environments where DOM might not be available + /** + * Requires a module which is protected against bundler minification. + * + * @param request The module path to resolve + */ - - function parseUrl(url) { - if (typeof url !== 'string') return {}; - var match = url.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/); // coerce to undefined values to empty string so we don't get 'undefined' - - var query = match[6] || ''; - var fragment = match[8] || ''; - return { - protocol: match[2], - host: match[4], - path: match[5], - relative: match[5] + query + fragment // everything minus origin - - }; + function dynamicRequire(mod, request) { + // tslint:disable-next-line: no-unsafe-any + return mod.require(request); } + /** + * Checks whether we're in the Node.js or Browser environment + * + * @returns Answer to given question + */ + + function isNodeEnv() { + // tslint:disable:strict-type-predicates + return Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]'; + } + var fallbackGlobalObject = {}; + /** + * Safely get global scope object + * + * @returns Global scope object + */ + + function getGlobalObject() { + return isNodeEnv() ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : fallbackGlobalObject; + } + /** + * UUID4 generator + * + * @returns string Generated UUID4. + */ function uuid4() { - var crypto = _window.crypto || _window.msCrypto; + var global = getGlobalObject(); + var crypto = global.crypto || global.msCrypto; - if (!isUndefined(crypto) && crypto.getRandomValues) { + if (!(crypto === void 0) && crypto.getRandomValues) { // Use window.crypto API if available - // eslint-disable-next-line no-undef var arr = new Uint16Array(8); crypto.getRandomValues(arr); // set 4 in byte 7 + // tslint:disable-next-line:no-bitwise arr[3] = arr[3] & 0xfff | 0x4000; // set 2 most significant bits of byte 9 to '10' + // tslint:disable-next-line:no-bitwise arr[4] = arr[4] & 0x3fff | 0x8000; @@ -7340,74 +7436,209 @@ typeof navigator === "object" && (function () { var v = num.toString(16); while (v.length < 4) { - v = '0' + v; + v = "0" + v; } return v; }; 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 { - // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523 - return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) { - var r = Math.random() * 16 | 0, - v = c === 'x' ? r : r & 0x3 | 0x8; - return v.toString(16); + } // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523 + + + return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + // tslint:disable-next-line:no-bitwise + var r = Math.random() * 16 | 0; // tslint:disable-next-line:no-bitwise + + var v = c === 'x' ? r : r & 0x3 | 0x8; + return v.toString(16); + }); + } + /** + * Parses string form of URL into an object + * // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B + * // intentionally using regex and not href parsing trick because React Native and other + * // environments where DOM might not be available + * @returns parsed URL object + */ + + function parseUrl(url) { + if (!url) { + return {}; + } + + var match = url.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/); + + if (!match) { + return {}; + } // coerce to undefined values to empty string so we don't get 'undefined' + + + var query = match[6] || ''; + var fragment = match[8] || ''; + return { + host: match[4], + path: match[5], + protocol: match[2], + relative: match[5] + query + fragment + }; + } + /** + * Extracts either message or type+value from an event that can be used for user-facing logs + * @returns event's description + */ + + function getEventDescription(event) { + if (event.message) { + return event.message; + } + + if (event.exception && event.exception.values && event.exception.values[0]) { + var exception = event.exception.values[0]; + + if (exception.type && exception.value) { + return exception.type + ": " + exception.value; + } + + return exception.type || exception.value || event.event_id || ''; + } + + return event.event_id || ''; + } + /** JSDoc */ + + function consoleSandbox(callback) { + var global = getGlobalObject(); + var levels = ['debug', 'info', 'warn', 'error', 'log', 'assert']; + + if (!('console' in global)) { + return callback(); + } + + var originalConsole = global.console; + var wrappedLevels = {}; // Restore all wrapped console methods + + levels.forEach(function (level) { + if (level in global.console && originalConsole[level].__sentry_original__) { + wrappedLevels[level] = originalConsole[level]; + originalConsole[level] = originalConsole[level].__sentry_original__; + } + }); // Perform callback manipulations + + var result = callback(); // Revert restoration to wrapped state + + Object.keys(wrappedLevels).forEach(function (level) { + originalConsole[level] = wrappedLevels[level]; + }); + return result; + } + /** + * Adds exception values, type and value to an synthetic Exception. + * @param event The event to modify. + * @param value Value of the exception. + * @param type Type of the exception. + * @hidden + */ + + function addExceptionTypeValue(event, value, type) { + event.exception = event.exception || {}; + event.exception.values = event.exception.values || []; + event.exception.values[0] = event.exception.values[0] || {}; + event.exception.values[0].value = event.exception.values[0].value || value || ''; + event.exception.values[0].type = event.exception.values[0].type || type || 'Error'; + } + /** + * Adds exception mechanism to a given event. + * @param event The event to modify. + * @param mechanism Mechanism of the mechanism. + * @hidden + */ + + function addExceptionMechanism(event, mechanism) { + if (mechanism === void 0) { + mechanism = {}; + } // TODO: Use real type with `keyof Mechanism` thingy and maybe make it better? + + + try { + // @ts-ignore + // tslint:disable:no-non-null-assertion + event.exception.values[0].mechanism = event.exception.values[0].mechanism || {}; + Object.keys(mechanism).forEach(function (key) { + // @ts-ignore + event.exception.values[0].mechanism[key] = mechanism[key]; }); + } catch (_oO) {// no-empty + } + } + /** + * A safe form of location.href + */ + + function getLocationHref() { + try { + return document.location.href; + } catch (oO) { + return ''; } } /** * Given a child DOM element, returns a query-selector statement describing that * and its ancestors * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz] - * @param elem - * @returns {string} + * @returns generated DOM path */ - function htmlTreeAsString(elem) { - /* eslint no-extra-parens:0*/ - var MAX_TRAVERSE_HEIGHT = 5, - MAX_OUTPUT_LEN = 80, - out = [], - height = 0, - len = 0, - separator = ' > ', - sepLength = separator.length, - nextStr; + // try/catch both: + // - accessing event.target (see getsentry/raven-js#838, #768) + // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly + // - can throw an exception in some circumstances. + try { + var currentElem = elem; + var MAX_TRAVERSE_HEIGHT = 5; + var MAX_OUTPUT_LEN = 80; + var out = []; + var height = 0; + var len = 0; + var separator = ' > '; + var sepLength = separator.length; + var nextStr = void 0; - while (elem && height++ < MAX_TRAVERSE_HEIGHT) { - nextStr = htmlElementAsString(elem); // bail out if - // - nextStr is the 'html' element - // - the length of the string that would be created exceeds MAX_OUTPUT_LEN - // (ignore this limit if we are on the first iteration) + while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) { + nextStr = _htmlElementAsString(currentElem); // bail out if + // - nextStr is the 'html' element + // - the length of the string that would be created exceeds MAX_OUTPUT_LEN + // (ignore this limit if we are on the first iteration) - if (nextStr === 'html' || height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN) { - break; + if (nextStr === 'html' || height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN) { + break; + } + + out.push(nextStr); + len += nextStr.length; + currentElem = currentElem.parentNode; } - out.push(nextStr); - len += nextStr.length; - elem = elem.parentNode; + return out.reverse().join(separator); + } catch (_oO) { + return ''; } - - return out.reverse().join(separator); } /** * Returns a simple, query-selector representation of a DOM element * e.g. [HTMLElement] => input#foo.btn[name=baz] - * @param HTMLElement - * @returns {string} + * @returns generated DOM path */ - - function htmlElementAsString(elem) { - var out = [], - className, - classes, - key, - attr, - i; + function _htmlElementAsString(el) { + var elem = el; + var out = []; + var className; + var classes; + var key; + var attr; + var i; if (!elem || !elem.tagName) { return ''; @@ -7416,7 +7647,7 @@ typeof navigator === "object" && (function () { out.push(elem.tagName.toLowerCase()); if (elem.id) { - out.push('#' + elem.id); + out.push("#" + elem.id); } className = elem.className; @@ -7425,7 +7656,7 @@ typeof navigator === "object" && (function () { classes = className.split(/\s+/); for (i = 0; i < classes.length; i++) { - out.push('.' + classes[i]); + out.push("." + classes[i]); } } @@ -7436,3377 +7667,6055 @@ typeof navigator === "object" && (function () { attr = elem.getAttribute(key); if (attr) { - out.push('[' + key + '="' + attr + '"]'); + out.push("[" + key + "=\"" + attr + "\"]"); } } return out.join(''); } - /** - * Returns true if either a OR b is truthy, but not both - */ + var INITIAL_TIME = Date.now(); + var prevNow = 0; + var performanceFallback = { + now: function now() { + var now = Date.now() - INITIAL_TIME; - function isOnlyOneTruthy(a, b) { - return !!(!!a ^ !!b); - } - /** - * Returns true if both parameters are undefined - */ + if (now < prevNow) { + now = prevNow; + } - - function isBothUndefined(a, b) { - return isUndefined(a) && isUndefined(b); - } - /** - * Returns true if the two input exception interfaces have the same content - */ - - - function isSameException(ex1, ex2) { - if (isOnlyOneTruthy(ex1, ex2)) return false; - ex1 = ex1.values[0]; - ex2 = ex2.values[0]; - if (ex1.type !== ex2.type || ex1.value !== ex2.value) return false; // in case both stacktraces are undefined, we can't decide so default to false - - if (isBothUndefined(ex1.stacktrace, ex2.stacktrace)) return false; - return isSameStacktrace(ex1.stacktrace, ex2.stacktrace); - } - /** - * Returns true if the two input stack trace interfaces have the same content - */ - - - function isSameStacktrace(stack1, stack2) { - if (isOnlyOneTruthy(stack1, stack2)) return false; - var frames1 = stack1.frames; - var frames2 = stack2.frames; // Exit early if stacktrace is malformed - - if (frames1 === undefined || frames2 === undefined) return false; // Exit early if frame count differs - - if (frames1.length !== frames2.length) return false; // Iterate through every frame; bail out if anything differs - - var a, b; - - for (var i = 0; i < frames1.length; i++) { - a = frames1[i]; - b = frames2[i]; - if (a.filename !== b.filename || a.lineno !== b.lineno || a.colno !== b.colno || a['function'] !== b['function']) return false; - } - - return true; - } - /** - * Polyfill a method - * @param obj object e.g. `document` - * @param name method name present on object e.g. `addEventListener` - * @param replacement replacement function - * @param track {optional} record instrumentation to an array - */ - - - function fill(obj, name, replacement, track) { - if (obj == null) return; - var orig = obj[name]; - obj[name] = replacement(orig); - obj[name].__raven__ = true; - obj[name].__orig__ = orig; - - if (track) { - track.push([obj, name, orig]); - } - } - /** - * Join values in array - * @param input array of values to be joined together - * @param delimiter string to be placed in-between values - * @returns {string} - */ - - - function safeJoin(input, delimiter) { - if (!isArray$1(input)) return ''; - var output = []; - - for (var i = 0; i < input.length; i++) { + prevNow = now; + return now; + }, + timeOrigin: INITIAL_TIME + }; + var crossPlatformPerformance = function () { + if (isNodeEnv()) { try { - output.push(String(input[i])); - } catch (e) { - output.push('[value cannot be serialized]'); + var perfHooks = dynamicRequire(module, 'perf_hooks'); + return perfHooks.performance; + } catch (_) { + return performanceFallback; } } - return output.join(delimiter); - } // Default Node.js REPL depth + if (getGlobalObject().performance) { + // Polyfill for performance.timeOrigin. + // + // While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin + // is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing. + // tslint:disable-next-line:strict-type-predicates + if (performance.timeOrigin === undefined) { + // As of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always a + // valid fallback. In the absence of a initial time provided by the browser, fallback to INITIAL_TIME. + // @ts-ignore + // tslint:disable-next-line:deprecation + performance.timeOrigin = performance.timing && performance.timing.navigationStart || INITIAL_TIME; + } + } + + return getGlobalObject().performance || performanceFallback; + }(); + /** + * Returns a timestamp in seconds with milliseconds precision since the UNIX epoch calculated with the monotonic clock. + */ + + function timestampWithMs() { + return (crossPlatformPerformance.timeOrigin + crossPlatformPerformance.now()) / 1000; + } // https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string + var defaultRetryAfter = 60 * 1000; // 60 seconds + + /** + * Extracts Retry-After value from the request header or returns default value + * @param now current unix timestamp + * @param header string representation of 'Retry-After' header + */ + + function parseRetryAfterHeader(now, header) { + if (!header) { + return defaultRetryAfter; + } + + var headerDelay = parseInt("" + header, 10); + + if (!isNaN(headerDelay)) { + return headerDelay * 1000; + } + + var headerDate = Date.parse("" + header); + + if (!isNaN(headerDate)) { + return headerDate - now; + } + + return defaultRetryAfter; + } + var defaultFunctionName = ''; + /** + * Safely extract function name from itself + */ + + function getFunctionName(fn) { + try { + if (!fn || typeof fn !== 'function') { + return defaultFunctionName; + } + + return fn.name || defaultFunctionName; + } catch (e) { + // Just accessing custom props in some Selenium environments + // can cause a "Permission denied" exception (see raven-js#495). + return defaultFunctionName; + } + } + + var global$1 = getGlobalObject(); + /** Prefix for logging strings */ + + var PREFIX = 'Sentry Logger '; + /** JSDoc */ + + var Logger = + /** @class */ + function () { + /** JSDoc */ + function Logger() { + this._enabled = false; + } + /** JSDoc */ - var MAX_SERIALIZE_EXCEPTION_DEPTH = 3; // 50kB, as 100kB is max payload size, so half sounds reasonable + Logger.prototype.disable = function () { + this._enabled = false; + }; + /** JSDoc */ + + + Logger.prototype.enable = function () { + this._enabled = true; + }; + /** JSDoc */ + + + Logger.prototype.log = function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + if (!this._enabled) { + return; + } + + consoleSandbox(function () { + global$1.console.log(PREFIX + "[Log]: " + args.join(' ')); // tslint:disable-line:no-console + }); + }; + /** JSDoc */ + + + Logger.prototype.warn = function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + if (!this._enabled) { + return; + } + + consoleSandbox(function () { + global$1.console.warn(PREFIX + "[Warn]: " + args.join(' ')); // tslint:disable-line:no-console + }); + }; + /** JSDoc */ + + + Logger.prototype.error = function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + if (!this._enabled) { + return; + } + + consoleSandbox(function () { + global$1.console.error(PREFIX + "[Error]: " + args.join(' ')); // tslint:disable-line:no-console + }); + }; + + return Logger; + }(); // Ensure we only have a single logger instance, even if multiple versions of @sentry/utils are being used + + + global$1.__SENTRY__ = global$1.__SENTRY__ || {}; + var logger = global$1.__SENTRY__.logger || (global$1.__SENTRY__.logger = new Logger()); + + var HAS_SPECIES_SUPPORT$2 = arrayMethodHasSpeciesSupport('splice'); + var USES_TO_LENGTH$6 = arrayMethodUsesToLength('splice', { ACCESSORS: true, 0: 0, 1: 2 }); + + var max$3 = Math.max; + var min$6 = Math.min; + var MAX_SAFE_INTEGER$1 = 0x1FFFFFFFFFFFFF; + var MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded'; + + // `Array.prototype.splice` method + // https://tc39.github.io/ecma262/#sec-array.prototype.splice + // with adding support of @@species + _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$2 || !USES_TO_LENGTH$6 }, { + splice: function splice(start, deleteCount /* , ...items */) { + var O = toObject(this); + var len = toLength(O.length); + var actualStart = toAbsoluteIndex(start, len); + var argumentsLength = arguments.length; + var insertCount, actualDeleteCount, A, k, from, to; + if (argumentsLength === 0) { + insertCount = actualDeleteCount = 0; + } else if (argumentsLength === 1) { + insertCount = 0; + actualDeleteCount = len - actualStart; + } else { + insertCount = argumentsLength - 2; + actualDeleteCount = min$6(max$3(toInteger(deleteCount), 0), len - actualStart); + } + if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER$1) { + throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED); + } + A = arraySpeciesCreate(O, actualDeleteCount); + for (k = 0; k < actualDeleteCount; k++) { + from = actualStart + k; + if (from in O) createProperty(A, k, O[from]); + } + A.length = actualDeleteCount; + if (insertCount < actualDeleteCount) { + for (k = actualStart; k < len - actualDeleteCount; k++) { + from = k + actualDeleteCount; + to = k + insertCount; + if (from in O) O[to] = O[from]; + else delete O[to]; + } + for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1]; + } else if (insertCount > actualDeleteCount) { + for (k = len - actualDeleteCount; k > actualStart; k--) { + from = k + actualDeleteCount - 1; + to = k + insertCount - 1; + if (from in O) O[to] = O[from]; + else delete O[to]; + } + } + for (k = 0; k < insertCount; k++) { + O[k + actualStart] = arguments[k + 2]; + } + O.length = len - actualDeleteCount + insertCount; + return A; + } + }); + + var freezing = !fails(function () { + return Object.isExtensible(Object.preventExtensions({})); + }); + + var internalMetadata = createCommonjsModule(function (module) { + var defineProperty = objectDefineProperty.f; + + + + var METADATA = uid('meta'); + var id = 0; + + var isExtensible = Object.isExtensible || function () { + return true; + }; + + var setMetadata = function (it) { + defineProperty(it, METADATA, { value: { + objectID: 'O' + ++id, // object ID + weakData: {} // weak collections IDs + } }); + }; + + var fastKey = function (it, create) { + // return a primitive with prefix + if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; + if (!has(it, METADATA)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return 'F'; + // not necessary to add metadata + if (!create) return 'E'; + // add missing metadata + setMetadata(it); + // return object ID + } return it[METADATA].objectID; + }; + + var getWeakData = function (it, create) { + if (!has(it, METADATA)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return true; + // not necessary to add metadata + if (!create) return false; + // add missing metadata + setMetadata(it); + // return the store of weak collections IDs + } return it[METADATA].weakData; + }; + + // add metadata on freeze-family methods calling + var onFreeze = function (it) { + if (freezing && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it); + return it; + }; + + var meta = module.exports = { + REQUIRED: false, + fastKey: fastKey, + getWeakData: getWeakData, + onFreeze: onFreeze + }; + + hiddenKeys[METADATA] = true; + }); + var internalMetadata_1 = internalMetadata.REQUIRED; + var internalMetadata_2 = internalMetadata.fastKey; + var internalMetadata_3 = internalMetadata.getWeakData; + var internalMetadata_4 = internalMetadata.onFreeze; + + var collection = function (CONSTRUCTOR_NAME, wrapper, common) { + var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1; + var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1; + var ADDER = IS_MAP ? 'set' : 'add'; + var NativeConstructor = global_1[CONSTRUCTOR_NAME]; + var NativePrototype = NativeConstructor && NativeConstructor.prototype; + var Constructor = NativeConstructor; + var exported = {}; + + var fixMethod = function (KEY) { + var nativeMethod = NativePrototype[KEY]; + redefine(NativePrototype, KEY, + KEY == 'add' ? function add(value) { + nativeMethod.call(this, value === 0 ? 0 : value); + return this; + } : KEY == 'delete' ? function (key) { + return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key); + } : KEY == 'get' ? function get(key) { + return IS_WEAK && !isObject(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key); + } : KEY == 'has' ? function has(key) { + return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key); + } : function set(key, value) { + nativeMethod.call(this, key === 0 ? 0 : key, value); + return this; + } + ); + }; + + // eslint-disable-next-line max-len + if (isForced_1(CONSTRUCTOR_NAME, typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails(function () { + new NativeConstructor().entries().next(); + })))) { + // create collection constructor + Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER); + internalMetadata.REQUIRED = true; + } else if (isForced_1(CONSTRUCTOR_NAME, true)) { + var instance = new Constructor(); + // early implementations not supports chaining + var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; + // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false + var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); }); + // most early implementations doesn't supports iterables, most modern - not close it correctly + // eslint-disable-next-line no-new + var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); }); + // for early implementations -0 and +0 not the same + var BUGGY_ZERO = !IS_WEAK && fails(function () { + // V8 ~ Chromium 42- fails only with 5+ elements + var $instance = new NativeConstructor(); + var index = 5; + while (index--) $instance[ADDER](index, index); + return !$instance.has(-0); + }); + + if (!ACCEPT_ITERABLES) { + Constructor = wrapper(function (dummy, iterable) { + anInstance(dummy, Constructor, CONSTRUCTOR_NAME); + var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor); + if (iterable != undefined) iterate_1(iterable, that[ADDER], that, IS_MAP); + return that; + }); + Constructor.prototype = NativePrototype; + NativePrototype.constructor = Constructor; + } + + if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) { + fixMethod('delete'); + fixMethod('has'); + IS_MAP && fixMethod('get'); + } + + if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER); + + // weak collections should not contains .clear method + if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear; + } + + exported[CONSTRUCTOR_NAME] = Constructor; + _export({ global: true, forced: Constructor != NativeConstructor }, exported); + + setToStringTag(Constructor, CONSTRUCTOR_NAME); + + if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP); + + return Constructor; + }; + + var getWeakData = internalMetadata.getWeakData; + + + + + + + + + var setInternalState$8 = internalState.set; + var internalStateGetterFor = internalState.getterFor; + var find$1 = arrayIteration.find; + var findIndex = arrayIteration.findIndex; + var id$1 = 0; + + // fallback for uncaught frozen keys + var uncaughtFrozenStore = function (store) { + return store.frozen || (store.frozen = new UncaughtFrozenStore()); + }; + + var UncaughtFrozenStore = function () { + this.entries = []; + }; + + var findUncaughtFrozen = function (store, key) { + return find$1(store.entries, function (it) { + return it[0] === key; + }); + }; + + UncaughtFrozenStore.prototype = { + get: function (key) { + var entry = findUncaughtFrozen(this, key); + if (entry) return entry[1]; + }, + has: function (key) { + return !!findUncaughtFrozen(this, key); + }, + set: function (key, value) { + var entry = findUncaughtFrozen(this, key); + if (entry) entry[1] = value; + else this.entries.push([key, value]); + }, + 'delete': function (key) { + var index = findIndex(this.entries, function (it) { + return it[0] === key; + }); + if (~index) this.entries.splice(index, 1); + return !!~index; + } + }; + + var collectionWeak = { + getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) { + var C = wrapper(function (that, iterable) { + anInstance(that, C, CONSTRUCTOR_NAME); + setInternalState$8(that, { + type: CONSTRUCTOR_NAME, + id: id$1++, + frozen: undefined + }); + if (iterable != undefined) iterate_1(iterable, that[ADDER], that, IS_MAP); + }); + + var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME); + + var define = function (that, key, value) { + var state = getInternalState(that); + var data = getWeakData(anObject(key), true); + if (data === true) uncaughtFrozenStore(state).set(key, value); + else data[state.id] = value; + return that; + }; + + redefineAll(C.prototype, { + // 23.3.3.2 WeakMap.prototype.delete(key) + // 23.4.3.3 WeakSet.prototype.delete(value) + 'delete': function (key) { + var state = getInternalState(this); + if (!isObject(key)) return false; + var data = getWeakData(key); + if (data === true) return uncaughtFrozenStore(state)['delete'](key); + return data && has(data, state.id) && delete data[state.id]; + }, + // 23.3.3.4 WeakMap.prototype.has(key) + // 23.4.3.4 WeakSet.prototype.has(value) + has: function has$1(key) { + var state = getInternalState(this); + if (!isObject(key)) return false; + var data = getWeakData(key); + if (data === true) return uncaughtFrozenStore(state).has(key); + return data && has(data, state.id); + } + }); + + redefineAll(C.prototype, IS_MAP ? { + // 23.3.3.3 WeakMap.prototype.get(key) + get: function get(key) { + var state = getInternalState(this); + if (isObject(key)) { + var data = getWeakData(key); + if (data === true) return uncaughtFrozenStore(state).get(key); + return data ? data[state.id] : undefined; + } + }, + // 23.3.3.5 WeakMap.prototype.set(key, value) + set: function set(key, value) { + return define(this, key, value); + } + } : { + // 23.4.3.1 WeakSet.prototype.add(value) + add: function add(value) { + return define(this, value, true); + } + }); + + return C; + } + }; + + // `WeakSet` constructor + // https://tc39.github.io/ecma262/#sec-weakset-constructor + collection('WeakSet', function (init) { + return function WeakSet() { return init(this, arguments.length ? arguments[0] : undefined); }; + }, collectionWeak); + + // tslint:disable:no-unsafe-any + + /** + * Memo class used for decycle json objects. Uses WeakSet if available otherwise array. + */ + var Memo = + /** @class */ + function () { + function Memo() { + // tslint:disable-next-line + this._hasWeakSet = typeof WeakSet === 'function'; + this._inner = this._hasWeakSet ? new WeakSet() : []; + } + /** + * Sets obj to remember. + * @param obj Object to remember + */ + + + Memo.prototype.memoize = function (obj) { + if (this._hasWeakSet) { + if (this._inner.has(obj)) { + return true; + } + + this._inner.add(obj); + + return false; + } // tslint:disable-next-line:prefer-for-of + + + for (var i = 0; i < this._inner.length; i++) { + var value = this._inner[i]; + + if (value === obj) { + return true; + } + } + + this._inner.push(obj); + + return false; + }; + /** + * Removes object from internal storage. + * @param obj Object to forget + */ + + + Memo.prototype.unmemoize = function (obj) { + if (this._hasWeakSet) { + this._inner.delete(obj); + } else { + for (var i = 0; i < this._inner.length; i++) { + if (this._inner[i] === obj) { + this._inner.splice(i, 1); + + break; + } + } + } + }; + + return Memo; + }(); + + // `URL.prototype.toJSON` method + // https://url.spec.whatwg.org/#dom-url-tojson + _export({ target: 'URL', proto: true, enumerable: true }, { + toJSON: function toJSON() { + return URL.prototype.toString.call(this); + } + }); + + /** + * Wrap a given object method with a higher-order function + * + * @param source An object that contains a method to be wrapped. + * @param name A name of method to be wrapped. + * @param replacement A function that should be used to wrap a given method. + * @returns void + */ + + function fill(source, name, replacement) { + if (!(name in source)) { + return; + } + + var original = source[name]; + var wrapped = replacement(original); // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work + // otherwise it'll throw "TypeError: Object.defineProperties called on non-object" + // tslint:disable-next-line:strict-type-predicates + + if (typeof wrapped === 'function') { + try { + wrapped.prototype = wrapped.prototype || {}; + Object.defineProperties(wrapped, { + __sentry_original__: { + enumerable: false, + value: original + } + }); + } catch (_Oo) {// This can throw if multiple fill happens on a global object like XMLHttpRequest + // Fixes https://github.com/getsentry/sentry-javascript/issues/2043 + } + } + + source[name] = wrapped; + } + /** + * Encodes given object into url-friendly format + * + * @param object An object that contains serializable values + * @returns string Encoded + */ + + function urlEncode(object) { + return Object.keys(object).map( // tslint:disable-next-line:no-unsafe-any + function (key) { + return encodeURIComponent(key) + "=" + encodeURIComponent(object[key]); + }).join('&'); + } + /** + * Transforms any object into an object literal with all it's attributes + * attached to it. + * + * @param value Initial source that we have to transform in order to be usable by the serializer + */ + + function getWalkSource(value) { + if (isError(value)) { + var error = value; + var err = { + message: error.message, + name: error.name, + stack: error.stack + }; + + for (var i in error) { + if (Object.prototype.hasOwnProperty.call(error, i)) { + err[i] = error[i]; + } + } + + return err; + } + + if (isEvent(value)) { + var event_1 = value; + var source = {}; + source.type = event_1.type; // Accessing event.target can throw (see getsentry/raven-js#838, #768) + + try { + source.target = isElement(event_1.target) ? htmlTreeAsString(event_1.target) : Object.prototype.toString.call(event_1.target); + } catch (_oO) { + source.target = ''; + } + + try { + source.currentTarget = isElement(event_1.currentTarget) ? htmlTreeAsString(event_1.currentTarget) : Object.prototype.toString.call(event_1.currentTarget); + } catch (_oO) { + source.currentTarget = ''; + } // tslint:disable-next-line:strict-type-predicates + + + if (typeof CustomEvent !== 'undefined' && isInstanceOf(value, CustomEvent)) { + source.detail = event_1.detail; + } + + for (var i in event_1) { + if (Object.prototype.hasOwnProperty.call(event_1, i)) { + source[i] = event_1; + } + } + + return source; + } + + return value; + } + /** Calculates bytes size of input string */ - var MAX_SERIALIZE_EXCEPTION_SIZE = 50 * 1024; - var MAX_SERIALIZE_KEYS_LENGTH = 40; function utf8Length(value) { + // tslint:disable-next-line:no-bitwise return ~-encodeURI(value).split(/%..|./).length; } + /** Calculates bytes size of input object */ + function jsonSize(value) { return utf8Length(JSON.stringify(value)); } + /** JSDoc */ - function serializeValue(value) { - if (typeof value === 'string') { - var maxLength = 40; - return truncate(value, maxLength); - } else if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'undefined') { - return value; + + function normalizeToSize(object, // Default Node.js REPL depth + depth, // 100kB, as 200kB is max payload size, so half sounds reasonable + maxSize) { + if (depth === void 0) { + depth = 3; } - var type = Object.prototype.toString.call(value); // Node.js REPL notation - - if (type === '[object Object]') return '[Object]'; - if (type === '[object Array]') return '[Array]'; - if (type === '[object Function]') return value.name ? '[Function: ' + value.name + ']' : '[Function]'; - return value; - } - - function serializeObject(value, depth) { - if (depth === 0) return serializeValue(value); - - if (isPlainObject(value)) { - return Object.keys(value).reduce(function (acc, key) { - acc[key] = serializeObject(value[key], depth - 1); - return acc; - }, {}); - } else if (Array.isArray(value)) { - return value.map(function (val) { - return serializeObject(val, depth - 1); - }); + if (maxSize === void 0) { + maxSize = 100 * 1024; } - return serializeValue(value); - } + var serialized = normalize$1(object, depth); - function serializeException(ex, depth, maxSize) { - if (!isPlainObject(ex)) return ex; - depth = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_DEPTH : depth; - maxSize = typeof depth !== 'number' ? MAX_SERIALIZE_EXCEPTION_SIZE : maxSize; - var serialized = serializeObject(ex, depth); - - if (jsonSize(stringify_1(serialized)) > maxSize) { - return serializeException(ex, depth - 1); + if (jsonSize(serialized) > maxSize) { + return normalizeToSize(object, depth - 1, maxSize); } return serialized; } + /** Transforms any input value into a string form, either primitive value or a type of the input */ - function serializeKeysForMessage(keys, maxLength) { - if (typeof keys === 'number' || typeof keys === 'string') return keys.toString(); - if (!Array.isArray(keys)) return ''; - keys = keys.filter(function (key) { - return typeof key === 'string'; - }); - if (keys.length === 0) return '[object has no keys]'; - maxLength = typeof maxLength !== 'number' ? MAX_SERIALIZE_KEYS_LENGTH : maxLength; - if (keys[0].length >= maxLength) return keys[0]; + function serializeValue(value) { + var type = Object.prototype.toString.call(value); // Node.js REPL notation - for (var usedKeys = keys.length; usedKeys > 0; usedKeys--) { - var serialized = keys.slice(0, usedKeys).join(', '); - if (serialized.length > maxLength) continue; - if (usedKeys === keys.length) return serialized; - return serialized + "\u2026"; + if (typeof value === 'string') { + return value; + } + + if (type === '[object Object]') { + return '[Object]'; + } + + if (type === '[object Array]') { + return '[Array]'; + } + + var normalized = normalizeValue(value); + return isPrimitive(normalized) ? normalized : type; + } + /** + * normalizeValue() + * + * Takes unserializable input and make it serializable friendly + * + * - translates undefined/NaN values to "[undefined]"/"[NaN]" respectively, + * - serializes Error objects + * - filter global objects + */ + // tslint:disable-next-line:cyclomatic-complexity + + + function normalizeValue(value, key) { + if (key === 'domain' && value && _typeof(value) === 'object' && value._events) { + return '[Domain]'; + } + + if (key === 'domainEmitter') { + return '[DomainEmitter]'; + } + + if (typeof global !== 'undefined' && value === global) { + return '[Global]'; + } + + if (typeof window !== 'undefined' && value === window) { + return '[Window]'; + } + + if (typeof document !== 'undefined' && value === document) { + return '[Document]'; + } // React's SyntheticEvent thingy + + + if (isSyntheticEvent(value)) { + return '[SyntheticEvent]'; + } // tslint:disable-next-line:no-tautology-expression + + + if (typeof value === 'number' && value !== value) { + return '[NaN]'; + } + + if (value === void 0) { + return '[undefined]'; + } + + if (typeof value === 'function') { + return "[Function: " + getFunctionName(value) + "]"; + } + + return value; + } + /** + * Walks an object to perform a normalization on it + * + * @param key of object that's walked in current iteration + * @param value object to be walked + * @param depth Optional number indicating how deep should walking be performed + * @param memo Optional Memo class handling decycling + */ + + + function walk(key, value, depth, memo) { + if (depth === void 0) { + depth = +Infinity; + } + + if (memo === void 0) { + memo = new Memo(); + } // If we reach the maximum depth, serialize whatever has left + + + if (depth === 0) { + return serializeValue(value); + } // If value implements `toJSON` method, call it and return early + // tslint:disable:no-unsafe-any + + + if (value !== null && value !== undefined && typeof value.toJSON === 'function') { + return value.toJSON(); + } // tslint:enable:no-unsafe-any + // If normalized value is a primitive, there are no branches left to walk, so we can just bail out, as theres no point in going down that branch any further + + + var normalized = normalizeValue(value, key); + + if (isPrimitive(normalized)) { + return normalized; + } // Create source that we will use for next itterations, either objectified error object (Error type with extracted keys:value pairs) or the input itself + + + var source = getWalkSource(value); // Create an accumulator that will act as a parent for all future itterations of that branch + + var acc = Array.isArray(value) ? [] : {}; // If we already walked that branch, bail out, as it's circular reference + + if (memo.memoize(value)) { + return '[Circular ~]'; + } // Walk all keys of the source + + + for (var innerKey in source) { + // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration. + if (!Object.prototype.hasOwnProperty.call(source, innerKey)) { + continue; + } // Recursively walk through all the child nodes + + + acc[innerKey] = walk(innerKey, source[innerKey], depth - 1, memo); + } // Once walked through all the branches, remove the parent from memo storage + + + memo.unmemoize(value); // Return accumulated values + + return acc; + } + /** + * normalize() + * + * - Creates a copy to prevent original input mutation + * - Skip non-enumerablers + * - Calls `toJSON` if implemented + * - Removes circular references + * - Translates non-serializeable values (undefined/NaN/Functions) to serializable format + * - Translates known global objects/Classes to a string representations + * - Takes care of Error objects serialization + * - Optionally limit depth of final output + */ + + function normalize$1(input, depth) { + try { + // tslint:disable-next-line:no-unsafe-any + return JSON.parse(JSON.stringify(input, function (key, value) { + return walk(key, value, depth); + })); + } catch (_oO) { + return '**non-serializable**'; + } + } + /** + * Given any captured exception, extract its keys and create a sorted + * and truncated list that will be used inside the event message. + * eg. `Non-error exception captured with keys: foo, bar, baz` + */ + + function extractExceptionKeysForMessage(exception, maxLength) { + if (maxLength === void 0) { + maxLength = 40; + } // tslint:disable:strict-type-predicates + + + var keys = Object.keys(getWalkSource(exception)); + keys.sort(); + + if (!keys.length) { + return '[object has no keys]'; + } + + if (keys[0].length >= maxLength) { + return truncate(keys[0], maxLength); + } + + for (var includedKeys = keys.length; includedKeys > 0; includedKeys--) { + var serialized = keys.slice(0, includedKeys).join(', '); + + if (serialized.length > maxLength) { + continue; + } + + if (includedKeys === keys.length) { + return serialized; + } + + return truncate(serialized, maxLength); } return ''; } - function sanitize(input, sanitizeKeys) { - if (!isArray$1(sanitizeKeys) || isArray$1(sanitizeKeys) && sanitizeKeys.length === 0) return input; - var sanitizeRegExp = joinRegExp(sanitizeKeys); - var sanitizeMask = '********'; - var safeInput; + var $filter$1 = arrayIteration.filter; - try { - safeInput = JSON.parse(stringify_1(input)); - } catch (o_O) { - return input; + + + var HAS_SPECIES_SUPPORT$3 = arrayMethodHasSpeciesSupport('filter'); + // Edge 14- issue + var USES_TO_LENGTH$7 = arrayMethodUsesToLength('filter'); + + // `Array.prototype.filter` method + // https://tc39.github.io/ecma262/#sec-array.prototype.filter + // with adding support of @@species + _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$3 || !USES_TO_LENGTH$7 }, { + filter: function filter(callbackfn /* , thisArg */) { + return $filter$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); } + }); - function sanitizeWorker(workerInput) { - if (isArray$1(workerInput)) { - return workerInput.map(function (val) { - return sanitizeWorker(val); - }); - } + // Safari bug https://bugs.webkit.org/show_bug.cgi?id=200829 + var NON_GENERIC = !!nativePromiseConstructor && fails(function () { + nativePromiseConstructor.prototype['finally'].call({ then: function () { /* empty */ } }, function () { /* empty */ }); + }); - if (isPlainObject(workerInput)) { - return Object.keys(workerInput).reduce(function (acc, k) { - if (sanitizeRegExp.test(k)) { - acc[k] = sanitizeMask; - } else { - acc[k] = sanitizeWorker(workerInput[k]); - } - - return acc; - }, {}); - } - - return workerInput; + // `Promise.prototype.finally` method + // https://tc39.github.io/ecma262/#sec-promise.prototype.finally + _export({ target: 'Promise', proto: true, real: true, forced: NON_GENERIC }, { + 'finally': function (onFinally) { + var C = speciesConstructor(this, getBuiltIn('Promise')); + var isFunction = typeof onFinally == 'function'; + return this.then( + isFunction ? function (x) { + return promiseResolve(C, onFinally()).then(function () { return x; }); + } : onFinally, + isFunction ? function (e) { + return promiseResolve(C, onFinally()).then(function () { throw e; }); + } : onFinally + ); } + }); - return sanitizeWorker(safeInput); + // patch native Promise.prototype for native async functions + if ( typeof nativePromiseConstructor == 'function' && !nativePromiseConstructor.prototype['finally']) { + redefine(nativePromiseConstructor.prototype, 'finally', getBuiltIn('Promise').prototype['finally']); } - var utils = { - isObject: isObject$1, - isError: isError, - isErrorEvent: isErrorEvent, - isDOMError: isDOMError, - isDOMException: isDOMException, - isUndefined: isUndefined, - isFunction: isFunction, - isPlainObject: isPlainObject, - isString: isString, - isArray: isArray$1, - isEmptyObject: isEmptyObject, - supportsErrorEvent: supportsErrorEvent, - supportsDOMError: supportsDOMError, - supportsDOMException: supportsDOMException, - supportsFetch: supportsFetch, - supportsReferrerPolicy: supportsReferrerPolicy, - supportsPromiseRejectionEvent: supportsPromiseRejectionEvent, - wrappedCallback: wrappedCallback, - each: each, - objectMerge: objectMerge, - truncate: truncate, - objectFrozen: objectFrozen, - hasKey: hasKey, - joinRegExp: joinRegExp, - urlencode: urlencode, - uuid4: uuid4, - htmlTreeAsString: htmlTreeAsString, - htmlElementAsString: htmlElementAsString, - isSameException: isSameException, - isSameStacktrace: isSameStacktrace, - parseUrl: parseUrl, - fill: fill, - safeJoin: safeJoin, - serializeException: serializeException, - serializeKeysForMessage: serializeKeysForMessage, - sanitize: sanitize - }; + /** SyncPromise internal states */ - /* - TraceKit - Cross brower stack traces + var States; - This was originally forked from github.com/occ/TraceKit, but has since been - largely re-written and is now maintained as part of raven-js. Tests for - this are in test/vendor. + (function (States) { + /** Pending */ + States["PENDING"] = "PENDING"; + /** Resolved / OK */ - MIT license - */ + States["RESOLVED"] = "RESOLVED"; + /** Rejected / Error */ - var TraceKit = { - collectWindowErrors: true, - debug: false - }; // This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785) - - var _window$1 = typeof window !== 'undefined' ? window : typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof self !== 'undefined' ? self : {}; // global reference to slice - - - var _slice = [].slice; - var UNKNOWN_FUNCTION = '?'; // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types - - var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/; - - function getLocationHref() { - if (typeof document === 'undefined' || document.location == null) return ''; - return document.location.href; - } - - function getLocationOrigin() { - if (typeof document === 'undefined' || document.location == null) return ''; // Oh dear IE10... - - if (!document.location.origin) { - return document.location.protocol + '//' + document.location.hostname + (document.location.port ? ':' + document.location.port : ''); - } - - return document.location.origin; - } + States["REJECTED"] = "REJECTED"; + })(States || (States = {})); /** - * TraceKit.report: cross-browser processing of unhandled exceptions - * - * Syntax: - * TraceKit.report.subscribe(function(stackInfo) { ... }) - * TraceKit.report.unsubscribe(function(stackInfo) { ... }) - * TraceKit.report(exception) - * try { ...code... } catch(ex) { TraceKit.report(ex); } - * - * Supports: - * - Firefox: full stack trace with line numbers, plus column number - * on top frame; column number is not guaranteed - * - Opera: full stack trace with line and column numbers - * - Chrome: full stack trace with line and column numbers - * - Safari: line and column number for the top frame only; some frames - * may be missing, and column number is not guaranteed - * - IE: line and column number for the top frame only; some frames - * may be missing, and column number is not guaranteed - * - * In theory, TraceKit should work on all of the following versions: - * - IE5.5+ (only 8.0 tested) - * - Firefox 0.9+ (only 3.5+ tested) - * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require - * Exceptions Have Stacktrace to be enabled in opera:config) - * - Safari 3+ (only 4+ tested) - * - Chrome 1+ (only 5+ tested) - * - Konqueror 3.5+ (untested) - * - * Requires TraceKit.computeStackTrace. - * - * Tries to catch all unhandled exceptions and report them to the - * subscribed handlers. Please note that TraceKit.report will rethrow the - * exception. This is REQUIRED in order to get a useful stack trace in IE. - * If the exception does not reach the top of the browser, you will only - * get a stack trace from the point where TraceKit.report was called. - * - * Handlers receive a stackInfo object as described in the - * TraceKit.computeStackTrace docs. + * Thenable class that behaves like a Promise and follows it's interface + * but is not async internally */ - TraceKit.report = function reportModuleWrapper() { - var handlers = [], - lastArgs = null, - lastException = null, - lastExceptionStack = null; - /** - * Add a crash handler. - * @param {Function} handler - */ + var SyncPromise = + /** @class */ + function () { + function SyncPromise(executor) { + var _this = this; - function subscribe(handler) { - installGlobalHandler(); - handlers.push(handler); - } - /** - * Remove a crash handler. - * @param {Function} handler - */ + this._state = States.PENDING; + this._handlers = []; + /** JSDoc */ + + this._resolve = function (value) { + _this._setResult(States.RESOLVED, value); + }; + /** JSDoc */ - function unsubscribe(handler) { - for (var i = handlers.length - 1; i >= 0; --i) { - if (handlers[i] === handler) { - handlers.splice(i, 1); + this._reject = function (reason) { + _this._setResult(States.REJECTED, reason); + }; + /** JSDoc */ + + + this._setResult = function (state, value) { + if (_this._state !== States.PENDING) { + return; } - } - } - /** - * Remove all crash handlers. - */ + + if (isThenable$1(value)) { + value.then(_this._resolve, _this._reject); + return; + } + + _this._state = state; + _this._value = value; + + _this._executeHandlers(); + }; // TODO: FIXME + + /** JSDoc */ - function unsubscribeAll() { - uninstallGlobalHandler(); - handlers = []; - } - /** - * Dispatch stack information to all handlers. - * @param {Object.} stack - */ + this._attachHandler = function (handler) { + _this._handlers = _this._handlers.concat(handler); + + _this._executeHandlers(); + }; + /** JSDoc */ - function notifyHandlers(stack, isWindowError) { - var exception = null; + this._executeHandlers = function () { + if (_this._state === States.PENDING) { + return; + } - if (isWindowError && !TraceKit.collectWindowErrors) { - return; - } + var cachedHandlers = _this._handlers.slice(); - for (var i in handlers) { - if (handlers.hasOwnProperty(i)) { - try { - handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2))); - } catch (inner) { - exception = inner; + _this._handlers = []; + cachedHandlers.forEach(function (handler) { + if (handler.done) { + return; } - } - } - if (exception) { - throw exception; + if (_this._state === States.RESOLVED) { + if (handler.onfulfilled) { + handler.onfulfilled(_this._value); + } + } + + if (_this._state === States.REJECTED) { + if (handler.onrejected) { + handler.onrejected(_this._value); + } + } + + handler.done = true; + }); + }; + + try { + executor(this._resolve, this._reject); + } catch (e) { + this._reject(e); } } + /** JSDoc */ - var _oldOnerrorHandler, _onErrorHandlerInstalled; + + SyncPromise.prototype.toString = function () { + return '[object SyncPromise]'; + }; + /** JSDoc */ + + + SyncPromise.resolve = function (value) { + return new SyncPromise(function (resolve) { + resolve(value); + }); + }; + /** JSDoc */ + + + SyncPromise.reject = function (reason) { + return new SyncPromise(function (_, reject) { + reject(reason); + }); + }; + /** JSDoc */ + + + SyncPromise.all = function (collection) { + return new SyncPromise(function (resolve, reject) { + if (!Array.isArray(collection)) { + reject(new TypeError("Promise.all requires an array as input.")); + return; + } + + if (collection.length === 0) { + resolve([]); + return; + } + + var counter = collection.length; + var resolvedCollection = []; + collection.forEach(function (item, index) { + SyncPromise.resolve(item).then(function (value) { + resolvedCollection[index] = value; + counter -= 1; + + if (counter !== 0) { + return; + } + + resolve(resolvedCollection); + }).then(null, reject); + }); + }); + }; + /** JSDoc */ + + + SyncPromise.prototype.then = function (_onfulfilled, _onrejected) { + var _this = this; + + return new SyncPromise(function (resolve, reject) { + _this._attachHandler({ + done: false, + onfulfilled: function onfulfilled(result) { + if (!_onfulfilled) { + // TODO: ¯\_(ツ)_/¯ + // TODO: FIXME + resolve(result); + return; + } + + try { + resolve(_onfulfilled(result)); + return; + } catch (e) { + reject(e); + return; + } + }, + onrejected: function onrejected(reason) { + if (!_onrejected) { + reject(reason); + return; + } + + try { + resolve(_onrejected(reason)); + return; + } catch (e) { + reject(e); + return; + } + } + }); + }); + }; + /** JSDoc */ + + + SyncPromise.prototype.catch = function (onrejected) { + return this.then(function (val) { + return val; + }, onrejected); + }; + /** JSDoc */ + + + SyncPromise.prototype.finally = function (onfinally) { + var _this = this; + + return new SyncPromise(function (resolve, reject) { + var val; + var isRejected; + return _this.then(function (value) { + isRejected = false; + val = value; + + if (onfinally) { + onfinally(); + } + }, function (reason) { + isRejected = true; + val = reason; + + if (onfinally) { + onfinally(); + } + }).then(function () { + if (isRejected) { + reject(val); + return; + } + + resolve(val); + }); + }); + }; + + return SyncPromise; + }(); + + /** A simple queue that holds promises. */ + + var PromiseBuffer = + /** @class */ + function () { + function PromiseBuffer(_limit) { + this._limit = _limit; + /** Internal set of queued Promises */ + + this._buffer = []; + } /** - * Ensures all global unhandled exceptions are recorded. - * Supported by Gecko and IE. - * @param {string} msg Error message. - * @param {string} url URL of script that generated the exception. - * @param {(number|string)} lineNo The line number at which the error - * occurred. - * @param {?(number|string)} colNo The column number at which the error - * occurred. - * @param {?Error} ex The actual Error object. + * Says if the buffer is ready to take more requests */ - function traceKitWindowOnError(msg, url, lineNo, colNo, ex) { - var stack = null; // If 'ex' is ErrorEvent, get real Error from inside + PromiseBuffer.prototype.isReady = function () { + return this._limit === undefined || this.length() < this._limit; + }; + /** + * Add a promise to the queue. + * + * @param task Can be any PromiseLike + * @returns The original promise. + */ - var exception = utils.isErrorEvent(ex) ? ex.error : ex; // If 'msg' is ErrorEvent, get real message from inside - var message = utils.isErrorEvent(msg) ? msg.message : msg; + PromiseBuffer.prototype.add = function (task) { + var _this = this; - if (lastExceptionStack) { - TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(lastExceptionStack, url, lineNo, message); - processLastException(); - } else if (exception && utils.isError(exception)) { - // non-string `exception` arg; attempt to extract stack trace - // New chrome and blink send along a real error object - // Let's just report that like a normal error. - // See: https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror - stack = TraceKit.computeStackTrace(exception); - notifyHandlers(stack, true); - } else { - var location = { - url: url, - line: lineNo, - column: colNo - }; - var name = undefined; - var groups; + if (!this.isReady()) { + return SyncPromise.reject(new SentryError('Not adding Promise due to buffer limit reached.')); + } - if ({}.toString.call(message) === '[object String]') { - var groups = message.match(ERROR_TYPES_RE); + if (this._buffer.indexOf(task) === -1) { + this._buffer.push(task); + } - if (groups) { - name = groups[1]; - message = groups[2]; + task.then(function () { + return _this.remove(task); + }).then(null, function () { + return _this.remove(task).then(null, function () {// We have to add this catch here otherwise we have an unhandledPromiseRejection + // because it's a new Promise chain. + }); + }); + return task; + }; + /** + * Remove a promise to the queue. + * + * @param task Can be any PromiseLike + * @returns Removed promise. + */ + + + PromiseBuffer.prototype.remove = function (task) { + var removedTask = this._buffer.splice(this._buffer.indexOf(task), 1)[0]; + + return removedTask; + }; + /** + * This function returns the number of unresolved promises in the queue. + */ + + + PromiseBuffer.prototype.length = function () { + return this._buffer.length; + }; + /** + * This will drain the whole queue, returns true if queue is empty or drained. + * If timeout is provided and the queue takes longer to drain, the promise still resolves but with false. + * + * @param timeout Number in ms to wait until it resolves with false. + */ + + + PromiseBuffer.prototype.drain = function (timeout) { + var _this = this; + + return new SyncPromise(function (resolve) { + var capturedSetTimeout = setTimeout(function () { + if (timeout && timeout > 0) { + resolve(false); } - } + }, timeout); + SyncPromise.all(_this._buffer).then(function () { + clearTimeout(capturedSetTimeout); + resolve(true); + }).then(null, function () { + resolve(true); + }); + }); + }; - location.func = UNKNOWN_FUNCTION; - stack = { - name: name, - message: message, - url: getLocationHref(), - stack: [location] - }; - notifyHandlers(stack, true); - } + return PromiseBuffer; + }(); - if (_oldOnerrorHandler) { - return _oldOnerrorHandler.apply(this, arguments); - } + /** + * Tells whether current environment supports Fetch API + * {@link supportsFetch}. + * + * @returns Answer to the given question. + */ + function supportsFetch() { + if (!('fetch' in getGlobalObject())) { return false; } - function installGlobalHandler() { - if (_onErrorHandlerInstalled) { - return; - } + try { + // tslint:disable-next-line:no-unused-expression + new Headers(); // tslint:disable-next-line:no-unused-expression - _oldOnerrorHandler = _window$1.onerror; - _window$1.onerror = traceKitWindowOnError; - _onErrorHandlerInstalled = true; + new Request(''); // tslint:disable-next-line:no-unused-expression + + new Response(); + return true; + } catch (e) { + return false; } - - function uninstallGlobalHandler() { - if (!_onErrorHandlerInstalled) { - return; - } - - _window$1.onerror = _oldOnerrorHandler; - _onErrorHandlerInstalled = false; - _oldOnerrorHandler = undefined; - } - - function processLastException() { - var _lastExceptionStack = lastExceptionStack, - _lastArgs = lastArgs; - lastArgs = null; - lastExceptionStack = null; - lastException = null; - notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs)); - } - /** - * Reports an unhandled Error to TraceKit. - * @param {Error} ex - * @param {?boolean} rethrow If false, do not re-throw the exception. - * Only used for window.onerror to not cause an infinite loop of - * rethrowing. - */ - - - function report(ex, rethrow) { - var args = _slice.call(arguments, 1); - - if (lastExceptionStack) { - if (lastException === ex) { - return; // already caught by an inner catch block, ignore - } else { - processLastException(); - } - } - - var stack = TraceKit.computeStackTrace(ex); - lastExceptionStack = stack; - lastException = ex; - lastArgs = args; // If the stack trace is incomplete, wait for 2 seconds for - // slow slow IE to see if onerror occurs or not before reporting - // this exception; otherwise, we will end up with an incomplete - // stack trace - - setTimeout(function () { - if (lastException === ex) { - processLastException(); - } - }, stack.incomplete ? 2000 : 0); - - if (rethrow !== false) { - throw ex; // re-throw to propagate to the top level (and cause window.onerror) - } - } - - report.subscribe = subscribe; - report.unsubscribe = unsubscribe; - report.uninstall = unsubscribeAll; - return report; - }(); + } /** - * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript - * - * Syntax: - * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below) - * Returns: - * s.name - exception name - * s.message - exception message - * s.stack[i].url - JavaScript or HTML file URL - * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work) - * s.stack[i].args - arguments passed to the function, if known - * s.stack[i].line - line number, if known - * s.stack[i].column - column number, if known - * - * Supports: - * - Firefox: full stack trace with line numbers and unreliable column - * number on top frame - * - Opera 10: full stack trace with line and column numbers - * - Opera 9-: full stack trace with line numbers - * - Chrome: full stack trace with line and column numbers - * - Safari: line and column number for the topmost stacktrace element - * only - * - IE: no line numbers whatsoever - * - * Tries to guess names of anonymous functions by looking for assignments - * in the source code. In IE and Safari, we have to guess source file names - * by searching for function bodies inside all page scripts. This will not - * work for scripts that are loaded cross-domain. - * Here be dragons: some function names may be guessed incorrectly, and - * duplicate functions may be mismatched. - * - * TraceKit.computeStackTrace should only be used for tracing purposes. - * Logging of unhandled exceptions should be done with TraceKit.report, - * which builds on top of TraceKit.computeStackTrace and provides better - * IE support by utilizing the window.onerror event to retrieve information - * about the top of the stack. - * - * Note: In IE and Safari, no stack trace is recorded on the Error object, - * so computeStackTrace instead walks its *own* chain of callers. - * This means that: - * * in Safari, some methods may be missing from the stack trace; - * * in IE, the topmost function in the stack trace will always be the - * caller of computeStackTrace. - * - * This is okay for tracing (because you are likely to be calling - * computeStackTrace from the function you want to be the topmost element - * of the stack trace anyway), but not okay for logging unhandled - * exceptions (because your catch block will likely be far away from the - * inner function that actually caused the exception). + * isNativeFetch checks if the given function is a native implementation of fetch() + */ + + function isNativeFetch(func) { + return func && /^function fetch\(\)\s+\{\s+\[native code\]\s+\}$/.test(func.toString()); + } + /** + * Tells whether current environment supports Fetch API natively + * {@link supportsNativeFetch}. * + * @returns true if `window.fetch` is natively implemented, false otherwise */ - TraceKit.computeStackTrace = function computeStackTraceWrapper() { - // Contents of Exception in various browsers. - // - // SAFARI: - // ex.message = Can't find variable: qq - // ex.line = 59 - // ex.sourceId = 580238192 - // ex.sourceURL = http://... - // ex.expressionBeginOffset = 96 - // ex.expressionCaretOffset = 98 - // ex.expressionEndOffset = 98 - // ex.name = ReferenceError - // - // FIREFOX: - // ex.message = qq is not defined - // ex.fileName = http://... - // ex.lineNumber = 59 - // ex.columnNumber = 69 - // ex.stack = ...stack trace... (see the example below) - // ex.name = ReferenceError - // - // CHROME: - // ex.message = qq is not defined - // ex.name = ReferenceError - // ex.type = not_defined - // ex.arguments = ['aa'] - // ex.stack = ...stack trace... - // - // INTERNET EXPLORER: - // ex.message = ... - // ex.name = ReferenceError - // - // OPERA: - // ex.message = ...message... (see the example below) - // ex.name = ReferenceError - // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message) - // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace' + function supportsNativeFetch() { + if (!supportsFetch()) { + return false; + } - /** - * Computes stack trace information from the stack property. - * Chrome and Gecko use this property. - * @param {Error} ex - * @return {?Object.} Stack trace information. - */ - function computeStackTraceFromStackProp(ex) { - if (typeof ex.stack === 'undefined' || !ex.stack) return; - var chrome = /^\s*at (?:(.*?) ?\()?((?:file|https?|blob|chrome-extension|native|eval|webpack||[a-z]:|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i; - var winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx(?:-web)|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i; // NOTE: blob urls are now supposed to always have an origin, therefore it's format - // which is `blob:http://url/path/with-some-uuid`, is matched by `blob.*?:\/` as well + var global = getGlobalObject(); // Fast path to avoid DOM I/O + // tslint:disable-next-line:no-unbound-method - var gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js))(?::(\d+))?(?::(\d+))?\s*$/i; // Used to additionally parse URL/line/column from eval frames + if (isNativeFetch(global.fetch)) { + return true; + } // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension) + // so create a "pure" iframe to see if that has native fetch - var geckoEval = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i; - var chromeEval = /\((\S*)(?::(\d+))(?::(\d+))\)/; - var lines = ex.stack.split('\n'); - var stack = []; - var submatch; - var parts; - var element; - var 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') === 0; // start of line + var result = false; + var doc = global.document; // tslint:disable-next-line:no-unbound-method deprecation - var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line + if (doc && typeof doc.createElement === "function") { + try { + var sandbox = doc.createElement('iframe'); + sandbox.hidden = true; + doc.head.appendChild(sandbox); - 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, - args: isNative ? [parts[2]] : [], - line: parts[3] ? +parts[3] : null, - column: parts[4] ? +parts[4] : null - }; - } 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 = 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, - args: parts[2] ? parts[2].split(',') : [], - line: parts[4] ? +parts[4] : null, - column: parts[5] ? +parts[5] : null - }; - } else { - continue; + if (sandbox.contentWindow && sandbox.contentWindow.fetch) { + // tslint:disable-next-line:no-unbound-method + result = isNativeFetch(sandbox.contentWindow.fetch); } + doc.head.removeChild(sandbox); + } catch (err) { + logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err); + } + } + + return result; + } + /** + * Tells whether current environment supports Referrer Policy API + * {@link supportsReferrerPolicy}. + * + * @returns Answer to the given question. + */ + + function supportsReferrerPolicy() { + // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default + // https://caniuse.com/#feat=referrer-policy + // It doesn't. And it throw exception instead of ignoring this parameter... + // REF: https://github.com/getsentry/raven-js/issues/1233 + if (!supportsFetch()) { + return false; + } + + try { + // tslint:disable:no-unused-expression + new Request('_', { + referrerPolicy: 'origin' + }); + return true; + } catch (e) { + return false; + } + } + /** + * Tells whether current environment supports History API + * {@link supportsHistory}. + * + * @returns Answer to the given question. + */ + + function supportsHistory() { + // NOTE: in Chrome App environment, touching history.pushState, *even inside + // a try/catch block*, will cause Chrome to output an error to console.error + // borrowed from: https://github.com/angular/angular.js/pull/13945/files + var global = getGlobalObject(); + var chrome = global.chrome; // tslint:disable-next-line:no-unsafe-any + + var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime; + var hasHistoryApi = 'history' in global && !!global.history.pushState && !!global.history.replaceState; + return !isChromePackagedApp && hasHistoryApi; + } + + var global$2 = getGlobalObject(); + /** + * Instrument native APIs to call handlers that can be used to create breadcrumbs, APM spans etc. + * - Console API + * - Fetch API + * - XHR API + * - History API + * - DOM API (click/typing) + * - Error API + * - UnhandledRejection API + */ + + var handlers = {}; + var instrumented = {}; + /** Instruments given API */ + + function instrument(type) { + if (instrumented[type]) { + return; + } + + instrumented[type] = true; + + switch (type) { + case 'console': + instrumentConsole(); + break; + + case 'dom': + instrumentDOM(); + break; + + case 'xhr': + instrumentXHR(); + break; + + case 'fetch': + instrumentFetch(); + break; + + case 'history': + instrumentHistory(); + break; + + case 'error': + instrumentError(); + break; + + case 'unhandledrejection': + instrumentUnhandledRejection(); + break; + + default: + logger.warn('unknown instrumentation type:', type); + } + } + /** + * Add handler that will be called when given type of instrumentation triggers. + * Use at your own risk, this might break without changelog notice, only used internally. + * @hidden + */ + + + function addInstrumentationHandler(handler) { + // tslint:disable-next-line:strict-type-predicates + if (!handler || typeof handler.type !== 'string' || typeof handler.callback !== 'function') { + return; + } + + handlers[handler.type] = handlers[handler.type] || []; + handlers[handler.type].push(handler.callback); + instrument(handler.type); + } + /** JSDoc */ + + function triggerHandlers(type, data) { + var e_1, _a; + + if (!type || !handlers[type]) { + return; + } + + try { + for (var _b = __values(handlers[type] || []), _c = _b.next(); !_c.done; _c = _b.next()) { + var handler = _c.value; + + try { + handler(data); + } catch (e) { + logger.error("Error while triggering instrumentation handler.\nType: " + type + "\nName: " + getFunctionName(handler) + "\nError: " + e); + } + } + } catch (e_1_1) { + e_1 = { + error: e_1_1 + }; + } finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } finally { + if (e_1) throw e_1.error; + } + } + } + /** JSDoc */ + + + function instrumentConsole() { + if (!('console' in global$2)) { + return; + } + + ['debug', 'info', 'warn', 'error', 'log', 'assert'].forEach(function (level) { + if (!(level in global$2.console)) { + return; + } + + fill(global$2.console, level, function (originalConsoleLevel) { + return function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + triggerHandlers('console', { + args: args, + level: level + }); // this fails for some browsers. :( + + if (originalConsoleLevel) { + Function.prototype.apply.call(originalConsoleLevel, global$2.console, args); + } + }; + }); + }); + } + /** JSDoc */ + + + function instrumentFetch() { + if (!supportsNativeFetch()) { + return; + } + + fill(global$2, 'fetch', function (originalFetch) { + return function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + var commonHandlerData = { + args: args, + fetchData: { + method: getFetchMethod(args), + url: getFetchUrl(args) + }, + startTimestamp: Date.now() + }; + triggerHandlers('fetch', _assign({}, commonHandlerData)); + return originalFetch.apply(global$2, args).then(function (response) { + triggerHandlers('fetch', _assign({}, commonHandlerData, { + endTimestamp: Date.now(), + response: response + })); + return response; + }, function (error) { + triggerHandlers('fetch', _assign({}, commonHandlerData, { + endTimestamp: Date.now(), + error: error + })); + throw error; + }); + }; + }); + } + /** Extract `method` from fetch call arguments */ + + + function getFetchMethod(fetchArgs) { + if (fetchArgs === void 0) { + fetchArgs = []; + } + + if ('Request' in global$2 && isInstanceOf(fetchArgs[0], Request) && fetchArgs[0].method) { + return String(fetchArgs[0].method).toUpperCase(); + } + + if (fetchArgs[1] && fetchArgs[1].method) { + return String(fetchArgs[1].method).toUpperCase(); + } + + return 'GET'; + } + /** Extract `url` from fetch call arguments */ + + + function getFetchUrl(fetchArgs) { + if (fetchArgs === void 0) { + fetchArgs = []; + } + + if (typeof fetchArgs[0] === 'string') { + return fetchArgs[0]; + } + + if ('Request' in global$2 && isInstanceOf(fetchArgs[0], Request)) { + return fetchArgs[0].url; + } + + return String(fetchArgs[0]); + } + /** JSDoc */ + + + function instrumentXHR() { + if (!('XMLHttpRequest' in global$2)) { + return; + } + + var xhrproto = XMLHttpRequest.prototype; + fill(xhrproto, 'open', function (originalOpen) { + return function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + var url = args[1]; + this.__sentry_xhr__ = { + method: isString(args[0]) ? args[0].toUpperCase() : args[0], + url: args[1] + }; // if Sentry key appears in URL, don't capture it as a request + + if (isString(url) && this.__sentry_xhr__.method === 'POST' && url.match(/sentry_key/)) { + this.__sentry_own_request__ = true; + } + + return originalOpen.apply(this, args); + }; + }); + fill(xhrproto, 'send', function (originalSend) { + return function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + var xhr = this; // tslint:disable-line:no-this-assignment + + var commonHandlerData = { + args: args, + startTimestamp: Date.now(), + xhr: xhr + }; + triggerHandlers('xhr', _assign({}, commonHandlerData)); + xhr.addEventListener('readystatechange', function () { + if (xhr.readyState === 4) { + try { + // touching statusCode in some platforms throws + // an exception + if (xhr.__sentry_xhr__) { + xhr.__sentry_xhr__.status_code = xhr.status; + } + } catch (e) { + /* do nothing */ + } + + triggerHandlers('xhr', _assign({}, commonHandlerData, { + endTimestamp: Date.now() + })); + } + }); + return originalSend.apply(this, args); + }; + }); + } + + var lastHref; + /** JSDoc */ + + function instrumentHistory() { + if (!supportsHistory()) { + return; + } + + var oldOnPopState = global$2.onpopstate; + + global$2.onpopstate = function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + var to = global$2.location.href; // keep track of the current URL state, as we always receive only the updated state + + var from = lastHref; + lastHref = to; + triggerHandlers('history', { + from: from, + to: to + }); + + if (oldOnPopState) { + return oldOnPopState.apply(this, args); + } + }; + /** @hidden */ + + + function historyReplacementFunction(originalHistoryFunction) { + return function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + var url = args.length > 2 ? args[2] : undefined; + + if (url) { + // coerce to string (this is what pushState does) + var from = lastHref; + var to = String(url); // keep track of the current URL state, as we always receive only the updated state + + lastHref = to; + triggerHandlers('history', { + from: from, + to: to + }); + } + + return originalHistoryFunction.apply(this, args); + }; + } + + fill(global$2.history, 'pushState', historyReplacementFunction); + fill(global$2.history, 'replaceState', historyReplacementFunction); + } + /** JSDoc */ + + + function instrumentDOM() { + if (!('document' in global$2)) { + return; + } // Capture breadcrumbs from any click that is unhandled / bubbled up all the way + // to the document. Do this before we instrument addEventListener. + + + global$2.document.addEventListener('click', domEventHandler('click', triggerHandlers.bind(null, 'dom')), false); + global$2.document.addEventListener('keypress', keypressEventHandler(triggerHandlers.bind(null, 'dom')), false); // After hooking into document bubbled up click and keypresses events, we also hook into user handled click & keypresses. + + ['EventTarget', 'Node'].forEach(function (target) { + var proto = global$2[target] && global$2[target].prototype; + + if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) { + return; + } + + fill(proto, 'addEventListener', function (original) { + return function (eventName, fn, options) { + if (fn && fn.handleEvent) { + if (eventName === 'click') { + fill(fn, 'handleEvent', function (innerOriginal) { + return function (event) { + domEventHandler('click', triggerHandlers.bind(null, 'dom'))(event); + return innerOriginal.call(this, event); + }; + }); + } + + if (eventName === 'keypress') { + fill(fn, 'handleEvent', function (innerOriginal) { + return function (event) { + keypressEventHandler(triggerHandlers.bind(null, 'dom'))(event); + return innerOriginal.call(this, event); + }; + }); + } + } else { + if (eventName === 'click') { + domEventHandler('click', triggerHandlers.bind(null, 'dom'), true)(this); + } + + if (eventName === 'keypress') { + keypressEventHandler(triggerHandlers.bind(null, 'dom'))(this); + } + } + + return original.call(this, eventName, fn, options); + }; + }); + fill(proto, 'removeEventListener', function (original) { + return function (eventName, fn, options) { + var callback = fn; + + try { + callback = callback && (callback.__sentry_wrapped__ || callback); + } catch (e) {// ignore, accessing __sentry_wrapped__ will throw in some Selenium environments + } + + return original.call(this, eventName, callback, options); + }; + }); + }); + } + + var debounceDuration = 1000; + var debounceTimer = 0; + var keypressTimeout; + var lastCapturedEvent; + /** + * Wraps addEventListener to capture UI breadcrumbs + * @param name the event name (e.g. "click") + * @param handler function that will be triggered + * @param debounce decides whether it should wait till another event loop + * @returns wrapped breadcrumb events handler + * @hidden + */ + + function domEventHandler(name, handler, debounce) { + if (debounce === void 0) { + debounce = false; + } + + return function (event) { + // reset keypress timeout; e.g. triggering a 'click' after + // a 'keypress' will reset the keypress debounce so that a new + // set of keypresses can be recorded + keypressTimeout = undefined; // It's possible this handler might trigger multiple times for the same + // event (e.g. event propagation through node ancestors). Ignore if we've + // already captured the event. + + if (!event || lastCapturedEvent === event) { + return; + } + + lastCapturedEvent = event; + + if (debounceTimer) { + clearTimeout(debounceTimer); + } + + if (debounce) { + debounceTimer = setTimeout(function () { + handler({ + event: event, + name: name + }); + }); + } else { + handler({ + event: event, + name: name + }); + } + }; + } + /** + * Wraps addEventListener to capture keypress UI events + * @param handler function that will be triggered + * @returns wrapped keypress events handler + * @hidden + */ + + + function keypressEventHandler(handler) { + // TODO: if somehow user switches keypress target before + // debounce timeout is triggered, we will only capture + // a single breadcrumb from the FIRST target (acceptable?) + return function (event) { + var target; + + try { + target = event.target; + } catch (e) { + // just accessing event properties can throw an exception in some rare circumstances + // see: https://github.com/getsentry/raven-js/issues/838 + return; + } + + var tagName = target && target.tagName; // only consider keypress events on actual input elements + // this will disregard keypresses targeting body (e.g. tabbing + // through elements, hotkeys, etc) + + if (!tagName || tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable) { + return; + } // record first keypress in a series, but ignore subsequent + // keypresses until debounce clears + + + if (!keypressTimeout) { + domEventHandler('input', handler)(event); + } + + clearTimeout(keypressTimeout); + keypressTimeout = setTimeout(function () { + keypressTimeout = undefined; + }, debounceDuration); + }; + } + + var _oldOnErrorHandler = null; + /** JSDoc */ + + function instrumentError() { + _oldOnErrorHandler = global$2.onerror; + + global$2.onerror = function (msg, url, line, column, error) { + triggerHandlers('error', { + column: column, + error: error, + line: line, + msg: msg, + url: url + }); + + if (_oldOnErrorHandler) { + return _oldOnErrorHandler.apply(this, arguments); + } + + return false; + }; + } + + var _oldOnUnhandledRejectionHandler = null; + /** JSDoc */ + + function instrumentUnhandledRejection() { + _oldOnUnhandledRejectionHandler = global$2.onunhandledrejection; + + global$2.onunhandledrejection = function (e) { + triggerHandlers('unhandledrejection', e); + + if (_oldOnUnhandledRejectionHandler) { + return _oldOnUnhandledRejectionHandler.apply(this, arguments); + } + + return true; + }; + } + + /** Regular expression used to parse a Dsn. */ + + var DSN_REGEX = /^(?:(\w+):)\/\/(?:(\w+)(?::(\w+))?@)([\w\.-]+)(?::(\d+))?\/(.+)/; + /** Error message */ + + var ERROR_MESSAGE = 'Invalid Dsn'; + /** The Sentry Dsn, identifying a Sentry instance and project. */ + + var Dsn = + /** @class */ + function () { + /** Creates a new Dsn component */ + function Dsn(from) { + if (typeof from === 'string') { + this._fromString(from); + } else { + this._fromComponents(from); + } + + this._validate(); + } + /** + * Renders the string representation of this Dsn. + * + * By default, this will render the public representation without the password + * component. To get the deprecated private representation, set `withPassword` + * to true. + * + * @param withPassword When set to true, the password will be included. + */ + + + Dsn.prototype.toString = function (withPassword) { + if (withPassword === void 0) { + withPassword = false; + } // tslint:disable-next-line:no-this-assignment + + + var _a = this, + host = _a.host, + path = _a.path, + pass = _a.pass, + port = _a.port, + projectId = _a.projectId, + protocol = _a.protocol, + user = _a.user; + + return protocol + "://" + user + (withPassword && pass ? ":" + pass : '') + ("@" + host + (port ? ":" + port : '') + "/" + (path ? path + "/" : path) + projectId); + }; + /** Parses a string into this Dsn. */ + + + Dsn.prototype._fromString = function (str) { + var match = DSN_REGEX.exec(str); + + if (!match) { + throw new SentryError(ERROR_MESSAGE); + } + + var _a = __read(match.slice(1), 6), + protocol = _a[0], + user = _a[1], + _b = _a[2], + pass = _b === void 0 ? '' : _b, + host = _a[3], + _c = _a[4], + port = _c === void 0 ? '' : _c, + lastPath = _a[5]; + + var path = ''; + var projectId = lastPath; + var split = projectId.split('/'); + + if (split.length > 1) { + path = split.slice(0, -1).join('/'); + projectId = split.pop(); + } + + this._fromComponents({ + host: host, + pass: pass, + path: path, + projectId: projectId, + port: port, + protocol: protocol, + user: user + }); + }; + /** Maps Dsn components into this instance. */ + + + Dsn.prototype._fromComponents = function (components) { + this.protocol = components.protocol; + this.user = components.user; + this.pass = components.pass || ''; + this.host = components.host; + this.port = components.port || ''; + this.path = components.path || ''; + this.projectId = components.projectId; + }; + /** Validates this Dsn and throws on error. */ + + + Dsn.prototype._validate = function () { + var _this = this; + + ['protocol', 'user', 'host', 'projectId'].forEach(function (component) { + if (!_this[component]) { + throw new SentryError(ERROR_MESSAGE); + } + }); + + if (this.protocol !== 'http' && this.protocol !== 'https') { + throw new SentryError(ERROR_MESSAGE); + } + + if (this.port && isNaN(parseInt(this.port, 10))) { + throw new SentryError(ERROR_MESSAGE); + } + }; + + return Dsn; + }(); + + /** + * Holds additional event information. {@link Scope.applyToEvent} will be + * called by the client before an event will be sent. + */ + + var Scope = + /** @class */ + function () { + function Scope() { + /** Flag if notifiying is happening. */ + this._notifyingListeners = false; + /** Callback for client to receive scope changes. */ + + this._scopeListeners = []; + /** Callback list that will be called after {@link applyToEvent}. */ + + this._eventProcessors = []; + /** Array of breadcrumbs. */ + + this._breadcrumbs = []; + /** User */ + + this._user = {}; + /** Tags */ + + this._tags = {}; + /** Extra */ + + this._extra = {}; + /** Contexts */ + + this._context = {}; + } + /** + * Add internal on change listener. Used for sub SDKs that need to store the scope. + * @hidden + */ + + + Scope.prototype.addScopeListener = function (callback) { + this._scopeListeners.push(callback); + }; + /** + * @inheritDoc + */ + + + Scope.prototype.addEventProcessor = function (callback) { + this._eventProcessors.push(callback); + + return this; + }; + /** + * This will be called on every set call. + */ + + + Scope.prototype._notifyScopeListeners = function () { + var _this = this; + + if (!this._notifyingListeners) { + this._notifyingListeners = true; + setTimeout(function () { + _this._scopeListeners.forEach(function (callback) { + callback(_this); + }); + + _this._notifyingListeners = false; + }); + } + }; + /** + * This will be called after {@link applyToEvent} is finished. + */ + + + Scope.prototype._notifyEventProcessors = function (processors, event, hint, index) { + var _this = this; + + if (index === void 0) { + index = 0; + } + + return new SyncPromise(function (resolve, reject) { + var processor = processors[index]; // tslint:disable-next-line:strict-type-predicates + + if (event === null || typeof processor !== 'function') { + resolve(event); + } else { + var result = processor(_assign({}, event), hint); + + if (isThenable$1(result)) { + result.then(function (final) { + return _this._notifyEventProcessors(processors, final, hint, index + 1).then(resolve); + }).then(null, reject); + } else { + _this._notifyEventProcessors(processors, result, hint, index + 1).then(resolve).then(null, reject); + } + } + }); + }; + /** + * @inheritDoc + */ + + + Scope.prototype.setUser = function (user) { + this._user = user || {}; + + this._notifyScopeListeners(); + + return this; + }; + /** + * @inheritDoc + */ + + + Scope.prototype.setTags = function (tags) { + this._tags = _assign({}, this._tags, tags); + + this._notifyScopeListeners(); + + return this; + }; + /** + * @inheritDoc + */ + + + Scope.prototype.setTag = function (key, value) { + var _a; + + this._tags = _assign({}, this._tags, (_a = {}, _a[key] = value, _a)); + + this._notifyScopeListeners(); + + return this; + }; + /** + * @inheritDoc + */ + + + Scope.prototype.setExtras = function (extras) { + this._extra = _assign({}, this._extra, extras); + + this._notifyScopeListeners(); + + return this; + }; + /** + * @inheritDoc + */ + + + Scope.prototype.setExtra = function (key, extra) { + var _a; + + this._extra = _assign({}, this._extra, (_a = {}, _a[key] = extra, _a)); + + this._notifyScopeListeners(); + + return this; + }; + /** + * @inheritDoc + */ + + + Scope.prototype.setFingerprint = function (fingerprint) { + this._fingerprint = fingerprint; + + this._notifyScopeListeners(); + + return this; + }; + /** + * @inheritDoc + */ + + + Scope.prototype.setLevel = function (level) { + this._level = level; + + this._notifyScopeListeners(); + + return this; + }; + /** + * @inheritDoc + */ + + + Scope.prototype.setTransaction = function (transaction) { + this._transaction = transaction; + + if (this._span) { + this._span.transaction = transaction; + } + + this._notifyScopeListeners(); + + return this; + }; + /** + * @inheritDoc + */ + + + Scope.prototype.setContext = function (key, context) { + var _a; + + this._context = _assign({}, this._context, (_a = {}, _a[key] = context, _a)); + + this._notifyScopeListeners(); + + return this; + }; + /** + * @inheritDoc + */ + + + Scope.prototype.setSpan = function (span) { + this._span = span; + + this._notifyScopeListeners(); + + return this; + }; + /** + * Internal getter for Span, used in Hub. + * @hidden + */ + + + Scope.prototype.getSpan = function () { + return this._span; + }; + /** + * Inherit values from the parent scope. + * @param scope to clone. + */ + + + Scope.clone = function (scope) { + var newScope = new Scope(); + + if (scope) { + newScope._breadcrumbs = __spread(scope._breadcrumbs); + newScope._tags = _assign({}, scope._tags); + newScope._extra = _assign({}, scope._extra); + newScope._context = _assign({}, scope._context); + newScope._user = scope._user; + newScope._level = scope._level; + newScope._span = scope._span; + newScope._transaction = scope._transaction; + newScope._fingerprint = scope._fingerprint; + newScope._eventProcessors = __spread(scope._eventProcessors); + } + + return newScope; + }; + /** + * @inheritDoc + */ + + + Scope.prototype.clear = function () { + this._breadcrumbs = []; + this._tags = {}; + this._extra = {}; + this._user = {}; + this._context = {}; + this._level = undefined; + this._transaction = undefined; + this._fingerprint = undefined; + this._span = undefined; + + this._notifyScopeListeners(); + + return this; + }; + /** + * @inheritDoc + */ + + + Scope.prototype.addBreadcrumb = function (breadcrumb, maxBreadcrumbs) { + var mergedBreadcrumb = _assign({ + timestamp: timestampWithMs() + }, breadcrumb); + + this._breadcrumbs = maxBreadcrumbs !== undefined && maxBreadcrumbs >= 0 ? __spread(this._breadcrumbs, [mergedBreadcrumb]).slice(-maxBreadcrumbs) : __spread(this._breadcrumbs, [mergedBreadcrumb]); + + this._notifyScopeListeners(); + + return this; + }; + /** + * @inheritDoc + */ + + + Scope.prototype.clearBreadcrumbs = function () { + this._breadcrumbs = []; + + this._notifyScopeListeners(); + + return this; + }; + /** + * Applies fingerprint from the scope to the event if there's one, + * uses message if there's one instead or get rid of empty fingerprint + */ + + + Scope.prototype._applyFingerprint = function (event) { + // Make sure it's an array first and we actually have something in place + event.fingerprint = event.fingerprint ? Array.isArray(event.fingerprint) ? event.fingerprint : [event.fingerprint] : []; // If we have something on the scope, then merge it with event + + if (this._fingerprint) { + event.fingerprint = event.fingerprint.concat(this._fingerprint); + } // If we have no data at all, remove empty array default + + + if (event.fingerprint && !event.fingerprint.length) { + delete event.fingerprint; + } + }; + /** + * Applies the current context and fingerprint to the event. + * Note that breadcrumbs will be added by the client. + * Also if the event has already breadcrumbs on it, we do not merge them. + * @param event Event + * @param hint May contain additional informartion about the original exception. + * @hidden + */ + + + Scope.prototype.applyToEvent = function (event, hint) { + if (this._extra && Object.keys(this._extra).length) { + event.extra = _assign({}, this._extra, event.extra); + } + + if (this._tags && Object.keys(this._tags).length) { + event.tags = _assign({}, this._tags, event.tags); + } + + if (this._user && Object.keys(this._user).length) { + event.user = _assign({}, this._user, event.user); + } + + if (this._context && Object.keys(this._context).length) { + event.contexts = _assign({}, this._context, event.contexts); + } + + if (this._level) { + event.level = this._level; + } + + if (this._transaction) { + event.transaction = this._transaction; + } + + if (this._span) { + event.contexts = _assign({ + trace: this._span.getTraceContext() + }, event.contexts); + } + + this._applyFingerprint(event); + + event.breadcrumbs = __spread(event.breadcrumbs || [], this._breadcrumbs); + event.breadcrumbs = event.breadcrumbs.length > 0 ? event.breadcrumbs : undefined; + return this._notifyEventProcessors(__spread(getGlobalEventProcessors(), this._eventProcessors), event, hint); + }; + + return Scope; + }(); + /** + * Retruns the global event processors. + */ + + function getGlobalEventProcessors() { + var global = getGlobalObject(); + global.__SENTRY__ = global.__SENTRY__ || {}; + global.__SENTRY__.globalEventProcessors = global.__SENTRY__.globalEventProcessors || []; + return global.__SENTRY__.globalEventProcessors; + } + /** + * Add a EventProcessor to be kept globally. + * @param callback EventProcessor to add + */ + + + function addGlobalEventProcessor(callback) { + getGlobalEventProcessors().push(callback); + } + + /** + * API compatibility version of this hub. + * + * WARNING: This number should only be incresed when the global interface + * changes a and new methods are introduced. + * + * @hidden + */ + + var API_VERSION = 3; + /** + * Default maximum number of breadcrumbs added to an event. Can be overwritten + * with {@link Options.maxBreadcrumbs}. + */ + + var DEFAULT_BREADCRUMBS = 100; + /** + * Absolute maximum number of breadcrumbs added to an event. The + * `maxBreadcrumbs` option cannot be higher than this value. + */ + + var MAX_BREADCRUMBS = 100; + /** + * @inheritDoc + */ + + var Hub = + /** @class */ + function () { + /** + * Creates a new instance of the hub, will push one {@link Layer} into the + * internal stack on creation. + * + * @param client bound to the hub. + * @param scope bound to the hub. + * @param version number, higher number means higher priority. + */ + function Hub(client, scope, _version) { + if (scope === void 0) { + scope = new Scope(); + } + + if (_version === void 0) { + _version = API_VERSION; + } + + this._version = _version; + /** Is a {@link Layer}[] containing the client and scope */ + + this._stack = []; + + this._stack.push({ + client: client, + scope: scope + }); + } + /** + * Internal helper function to call a method on the top client if it exists. + * + * @param method The method to call on the client. + * @param args Arguments to pass to the client function. + */ + + + Hub.prototype._invokeClient = function (method) { + var _a; + + var args = []; + + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + + var top = this.getStackTop(); + + if (top && top.client && top.client[method]) { + (_a = top.client)[method].apply(_a, __spread(args, [top.scope])); + } + }; + /** + * @inheritDoc + */ + + + Hub.prototype.isOlderThan = function (version) { + return this._version < version; + }; + /** + * @inheritDoc + */ + + + Hub.prototype.bindClient = function (client) { + var top = this.getStackTop(); + top.client = client; + + if (client && client.setupIntegrations) { + client.setupIntegrations(); + } + }; + /** + * @inheritDoc + */ + + + Hub.prototype.pushScope = function () { + // We want to clone the content of prev scope + var stack = this.getStack(); + var parentScope = stack.length > 0 ? stack[stack.length - 1].scope : undefined; + var scope = Scope.clone(parentScope); + this.getStack().push({ + client: this.getClient(), + scope: scope + }); + return scope; + }; + /** + * @inheritDoc + */ + + + Hub.prototype.popScope = function () { + return this.getStack().pop() !== undefined; + }; + /** + * @inheritDoc + */ + + + Hub.prototype.withScope = function (callback) { + var scope = this.pushScope(); + + try { + callback(scope); + } finally { + this.popScope(); + } + }; + /** + * @inheritDoc + */ + + + Hub.prototype.getClient = function () { + return this.getStackTop().client; + }; + /** Returns the scope of the top stack. */ + + + Hub.prototype.getScope = function () { + return this.getStackTop().scope; + }; + /** Returns the scope stack for domains or the process. */ + + + Hub.prototype.getStack = function () { + return this._stack; + }; + /** Returns the topmost scope layer in the order domain > local > process. */ + + + Hub.prototype.getStackTop = function () { + return this._stack[this._stack.length - 1]; + }; + /** + * @inheritDoc + */ + + + Hub.prototype.captureException = function (exception, hint) { + var eventId = this._lastEventId = uuid4(); + var finalHint = hint; // If there's no explicit hint provided, mimick the same thing that would happen + // in the minimal itself to create a consistent behavior. + // We don't do this in the client, as it's the lowest level API, and doing this, + // would prevent user from having full control over direct calls. + + if (!hint) { + var syntheticException = void 0; + + try { + throw new Error('Sentry syntheticException'); + } catch (exception) { + syntheticException = exception; + } + + finalHint = { + originalException: exception, + syntheticException: syntheticException + }; + } + + this._invokeClient('captureException', exception, _assign({}, finalHint, { + event_id: eventId + })); + + return eventId; + }; + /** + * @inheritDoc + */ + + + Hub.prototype.captureMessage = function (message, level, hint) { + var eventId = this._lastEventId = uuid4(); + var finalHint = hint; // If there's no explicit hint provided, mimick the same thing that would happen + // in the minimal itself to create a consistent behavior. + // We don't do this in the client, as it's the lowest level API, and doing this, + // would prevent user from having full control over direct calls. + + if (!hint) { + var syntheticException = void 0; + + try { + throw new Error(message); + } catch (exception) { + syntheticException = exception; + } + + finalHint = { + originalException: message, + syntheticException: syntheticException + }; + } + + this._invokeClient('captureMessage', message, level, _assign({}, finalHint, { + event_id: eventId + })); + + return eventId; + }; + /** + * @inheritDoc + */ + + + Hub.prototype.captureEvent = function (event, hint) { + var eventId = this._lastEventId = uuid4(); + + this._invokeClient('captureEvent', event, _assign({}, hint, { + event_id: eventId + })); + + return eventId; + }; + /** + * @inheritDoc + */ + + + Hub.prototype.lastEventId = function () { + return this._lastEventId; + }; + /** + * @inheritDoc + */ + + + Hub.prototype.addBreadcrumb = function (breadcrumb, hint) { + var top = this.getStackTop(); + + if (!top.scope || !top.client) { + return; + } + + var _a = top.client.getOptions && top.client.getOptions() || {}, + _b = _a.beforeBreadcrumb, + beforeBreadcrumb = _b === void 0 ? null : _b, + _c = _a.maxBreadcrumbs, + maxBreadcrumbs = _c === void 0 ? DEFAULT_BREADCRUMBS : _c; + + if (maxBreadcrumbs <= 0) { + return; + } + + var timestamp = timestampWithMs(); + + var mergedBreadcrumb = _assign({ + timestamp: timestamp + }, breadcrumb); + + var finalBreadcrumb = beforeBreadcrumb ? consoleSandbox(function () { + return beforeBreadcrumb(mergedBreadcrumb, hint); + }) : mergedBreadcrumb; + + if (finalBreadcrumb === null) { + return; + } + + top.scope.addBreadcrumb(finalBreadcrumb, Math.min(maxBreadcrumbs, MAX_BREADCRUMBS)); + }; + /** + * @inheritDoc + */ + + + Hub.prototype.setUser = function (user) { + var top = this.getStackTop(); + + if (!top.scope) { + return; + } + + top.scope.setUser(user); + }; + /** + * @inheritDoc + */ + + + Hub.prototype.setTags = function (tags) { + var top = this.getStackTop(); + + if (!top.scope) { + return; + } + + top.scope.setTags(tags); + }; + /** + * @inheritDoc + */ + + + Hub.prototype.setExtras = function (extras) { + var top = this.getStackTop(); + + if (!top.scope) { + return; + } + + top.scope.setExtras(extras); + }; + /** + * @inheritDoc + */ + + + Hub.prototype.setTag = function (key, value) { + var top = this.getStackTop(); + + if (!top.scope) { + return; + } + + top.scope.setTag(key, value); + }; + /** + * @inheritDoc + */ + + + Hub.prototype.setExtra = function (key, extra) { + var top = this.getStackTop(); + + if (!top.scope) { + return; + } + + top.scope.setExtra(key, extra); + }; + /** + * @inheritDoc + */ + + + Hub.prototype.setContext = function (name, context) { + var top = this.getStackTop(); + + if (!top.scope) { + return; + } + + top.scope.setContext(name, context); + }; + /** + * @inheritDoc + */ + + + Hub.prototype.configureScope = function (callback) { + var top = this.getStackTop(); + + if (top.scope && top.client) { + callback(top.scope); + } + }; + /** + * @inheritDoc + */ + + + Hub.prototype.run = function (callback) { + var oldHub = makeMain(this); + + try { + callback(this); + } finally { + makeMain(oldHub); + } + }; + /** + * @inheritDoc + */ + + + Hub.prototype.getIntegration = function (integration) { + var client = this.getClient(); + + if (!client) { + return null; + } + + try { + return client.getIntegration(integration); + } catch (_oO) { + logger.warn("Cannot retrieve integration " + integration.id + " from the current Hub"); + return null; + } + }; + /** + * @inheritDoc + */ + + + Hub.prototype.startSpan = function (spanOrSpanContext, forceNoChild) { + if (forceNoChild === void 0) { + forceNoChild = false; + } + + return this._callExtensionMethod('startSpan', spanOrSpanContext, forceNoChild); + }; + /** + * @inheritDoc + */ + + + Hub.prototype.traceHeaders = function () { + return this._callExtensionMethod('traceHeaders'); + }; + /** + * Calls global extension method and binding current instance to the function call + */ + // @ts-ignore + + + Hub.prototype._callExtensionMethod = function (method) { + var args = []; + + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + + var carrier = getMainCarrier(); + var sentry = carrier.__SENTRY__; // tslint:disable-next-line: strict-type-predicates + + if (sentry && sentry.extensions && typeof sentry.extensions[method] === 'function') { + return sentry.extensions[method].apply(this, args); + } + + logger.warn("Extension method " + method + " couldn't be found, doing nothing."); + }; + + return Hub; + }(); + /** Returns the global shim registry. */ + + function getMainCarrier() { + var carrier = getGlobalObject(); + carrier.__SENTRY__ = carrier.__SENTRY__ || { + extensions: {}, + hub: undefined + }; + return carrier; + } + /** + * Replaces the current main hub with the passed one on the global object + * + * @returns The old replaced hub + */ + + function makeMain(hub) { + var registry = getMainCarrier(); + var oldHub = getHubFromCarrier(registry); + setHubOnCarrier(registry, hub); + return oldHub; + } + /** + * Returns the default hub instance. + * + * If a hub is already registered in the global carrier but this module + * contains a more recent version, it replaces the registered version. + * Otherwise, the currently registered hub will be returned. + */ + + function getCurrentHub() { + // Get main carrier (global for every environment) + var registry = getMainCarrier(); // If there's no hub, or its an old API, assign a new one + + if (!hasHubOnCarrier(registry) || getHubFromCarrier(registry).isOlderThan(API_VERSION)) { + setHubOnCarrier(registry, new Hub()); + } // Prefer domains over global if they are there (applicable only to Node environment) + + + if (isNodeEnv()) { + return getHubFromActiveDomain(registry); + } // Return hub that lives on a global object + + + return getHubFromCarrier(registry); + } + /** + * Try to read the hub from an active domain, fallback to the registry if one doesnt exist + * @returns discovered hub + */ + + function getHubFromActiveDomain(registry) { + try { + var property = 'domain'; + var carrier = getMainCarrier(); + var sentry = carrier.__SENTRY__; // tslint:disable-next-line: strict-type-predicates + + if (!sentry || !sentry.extensions || !sentry.extensions[property]) { + return getHubFromCarrier(registry); + } + + var domain = sentry.extensions[property]; + var activeDomain = domain.active; // If there no active domain, just return global hub + + if (!activeDomain) { + return getHubFromCarrier(registry); + } // If there's no hub on current domain, or its an old API, assign a new one + + + if (!hasHubOnCarrier(activeDomain) || getHubFromCarrier(activeDomain).isOlderThan(API_VERSION)) { + var registryHubTopStack = getHubFromCarrier(registry).getStackTop(); + setHubOnCarrier(activeDomain, new Hub(registryHubTopStack.client, Scope.clone(registryHubTopStack.scope))); + } // Return hub that lives on a domain + + + return getHubFromCarrier(activeDomain); + } catch (_Oo) { + // Return hub that lives on a global object + return getHubFromCarrier(registry); + } + } + /** + * This will tell whether a carrier has a hub on it or not + * @param carrier object + */ + + + function hasHubOnCarrier(carrier) { + if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) { + return true; + } + + return false; + } + /** + * This will create a new {@link Hub} and add to the passed object on + * __SENTRY__.hub. + * @param carrier object + * @hidden + */ + + + function getHubFromCarrier(carrier) { + if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) { + return carrier.__SENTRY__.hub; + } + + carrier.__SENTRY__ = carrier.__SENTRY__ || {}; + carrier.__SENTRY__.hub = new Hub(); + return carrier.__SENTRY__.hub; + } + /** + * This will set passed {@link Hub} on the passed object's __SENTRY__.hub attribute + * @param carrier object + * @param hub Hub + */ + + function setHubOnCarrier(carrier, hub) { + if (!carrier) { + return false; + } + + carrier.__SENTRY__ = carrier.__SENTRY__ || {}; + carrier.__SENTRY__.hub = hub; + return true; + } + + /** + * This calls a function on the current hub. + * @param method function to call on hub. + * @param args to pass to function. + */ + + function callOnHub(method) { + var args = []; + + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + + var hub = getCurrentHub(); + + if (hub && hub[method]) { + // tslint:disable-next-line:no-unsafe-any + return hub[method].apply(hub, __spread(args)); + } + + throw new Error("No hub defined or " + method + " was not found on the hub, please open a bug report."); + } + /** + * Captures an exception event and sends it to Sentry. + * + * @param exception An exception-like object. + * @returns The generated eventId. + */ + + + function captureException(exception) { + var syntheticException; + + try { + throw new Error('Sentry syntheticException'); + } catch (exception) { + syntheticException = exception; + } + + return callOnHub('captureException', exception, { + originalException: exception, + syntheticException: syntheticException + }); + } + /** + * Creates a new scope with and executes the given operation within. + * The scope is automatically removed once the operation + * finishes or throws. + * + * This is essentially a convenience function for: + * + * pushScope(); + * callback(); + * popScope(); + * + * @param callback that will be enclosed into push/popScope. + */ + + function withScope(callback) { + callOnHub('withScope', callback); + } + + var SENTRY_API_VERSION = '7'; + /** Helper class to provide urls to different Sentry endpoints. */ + + var API = + /** @class */ + function () { + /** Create a new instance of API */ + function API(dsn) { + this.dsn = dsn; + this._dsnObject = new Dsn(dsn); + } + /** Returns the Dsn object. */ + + + API.prototype.getDsn = function () { + return this._dsnObject; + }; + /** Returns a string with auth headers in the url to the store endpoint. */ + + + API.prototype.getStoreEndpoint = function () { + return "" + this._getBaseUrl() + this.getStoreEndpointPath(); + }; + /** Returns the store endpoint with auth added in url encoded. */ + + + API.prototype.getStoreEndpointWithUrlEncodedAuth = function () { + var dsn = this._dsnObject; + var auth = { + sentry_key: dsn.user, + sentry_version: SENTRY_API_VERSION + }; // Auth is intentionally sent as part of query string (NOT as custom HTTP header) + // to avoid preflight CORS requests + + return this.getStoreEndpoint() + "?" + urlEncode(auth); + }; + /** Returns the base path of the url including the port. */ + + + API.prototype._getBaseUrl = function () { + var dsn = this._dsnObject; + var protocol = dsn.protocol ? dsn.protocol + ":" : ''; + var port = dsn.port ? ":" + dsn.port : ''; + return protocol + "//" + dsn.host + port; + }; + /** Returns only the path component for the store endpoint. */ + + + API.prototype.getStoreEndpointPath = function () { + var dsn = this._dsnObject; + return (dsn.path ? "/" + dsn.path : '') + "/api/" + dsn.projectId + "/store/"; + }; + /** Returns an object that can be used in request headers. */ + + + API.prototype.getRequestHeaders = function (clientName, clientVersion) { + var dsn = this._dsnObject; + var header = ["Sentry sentry_version=" + SENTRY_API_VERSION]; + header.push("sentry_client=" + clientName + "/" + clientVersion); + header.push("sentry_key=" + dsn.user); + + if (dsn.pass) { + header.push("sentry_secret=" + dsn.pass); + } + + return { + 'Content-Type': 'application/json', + 'X-Sentry-Auth': header.join(', ') + }; + }; + /** Returns the url to the report dialog endpoint. */ + + + API.prototype.getReportDialogEndpoint = function (dialogOptions) { + if (dialogOptions === void 0) { + dialogOptions = {}; + } + + var dsn = this._dsnObject; + var endpoint = "" + this._getBaseUrl() + (dsn.path ? "/" + dsn.path : '') + "/api/embed/error-page/"; + var encodedOptions = []; + encodedOptions.push("dsn=" + dsn.toString()); + + for (var key in dialogOptions) { + if (key === 'user') { + if (!dialogOptions.user) { + continue; + } + + if (dialogOptions.user.name) { + encodedOptions.push("name=" + encodeURIComponent(dialogOptions.user.name)); + } + + if (dialogOptions.user.email) { + encodedOptions.push("email=" + encodeURIComponent(dialogOptions.user.email)); + } + } else { + encodedOptions.push(encodeURIComponent(key) + "=" + encodeURIComponent(dialogOptions[key])); + } + } + + if (encodedOptions.length) { + return endpoint + "?" + encodedOptions.join('&'); + } + + return endpoint; + }; + + return API; + }(); + + var installedIntegrations = []; + /** Gets integration to install */ + + function getIntegrationsToSetup(options) { + var defaultIntegrations = options.defaultIntegrations && __spread(options.defaultIntegrations) || []; + var userIntegrations = options.integrations; + var integrations = []; + + if (Array.isArray(userIntegrations)) { + var userIntegrationsNames_1 = userIntegrations.map(function (i) { + return i.name; + }); + var pickedIntegrationsNames_1 = []; // Leave only unique default integrations, that were not overridden with provided user integrations + + defaultIntegrations.forEach(function (defaultIntegration) { + if (userIntegrationsNames_1.indexOf(defaultIntegration.name) === -1 && pickedIntegrationsNames_1.indexOf(defaultIntegration.name) === -1) { + integrations.push(defaultIntegration); + pickedIntegrationsNames_1.push(defaultIntegration.name); + } + }); // Don't add same user integration twice + + userIntegrations.forEach(function (userIntegration) { + if (pickedIntegrationsNames_1.indexOf(userIntegration.name) === -1) { + integrations.push(userIntegration); + pickedIntegrationsNames_1.push(userIntegration.name); + } + }); + } else if (typeof userIntegrations === 'function') { + integrations = userIntegrations(defaultIntegrations); + integrations = Array.isArray(integrations) ? integrations : [integrations]; + } else { + integrations = __spread(defaultIntegrations); + } // Make sure that if present, `Debug` integration will always run last + + + var integrationsNames = integrations.map(function (i) { + return i.name; + }); + var alwaysLastToRun = 'Debug'; + + if (integrationsNames.indexOf(alwaysLastToRun) !== -1) { + integrations.push.apply(integrations, __spread(integrations.splice(integrationsNames.indexOf(alwaysLastToRun), 1))); + } + + return integrations; + } + /** Setup given integration */ + + function setupIntegration(integration) { + if (installedIntegrations.indexOf(integration.name) !== -1) { + return; + } + + integration.setupOnce(addGlobalEventProcessor, getCurrentHub); + installedIntegrations.push(integration.name); + logger.log("Integration installed: " + integration.name); + } + /** + * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default + * integrations are added unless they were already provided before. + * @param integrations array of integration instances + * @param withDefault should enable default integrations + */ + + function setupIntegrations(options) { + var integrations = {}; + getIntegrationsToSetup(options).forEach(function (integration) { + integrations[integration.name] = integration; + setupIntegration(integration); + }); + return integrations; + } + + /** + * Base implementation for all JavaScript SDK clients. + * + * Call the constructor with the corresponding backend constructor and options + * specific to the client subclass. To access these options later, use + * {@link Client.getOptions}. Also, the Backend instance is available via + * {@link Client.getBackend}. + * + * If a Dsn is specified in the options, it will be parsed and stored. Use + * {@link Client.getDsn} to retrieve the Dsn at any moment. In case the Dsn is + * invalid, the constructor will throw a {@link SentryException}. Note that + * without a valid Dsn, the SDK will not send any events to Sentry. + * + * Before sending an event via the backend, it is passed through + * {@link BaseClient.prepareEvent} to add SDK information and scope data + * (breadcrumbs and context). To add more custom information, override this + * method and extend the resulting prepared event. + * + * To issue automatically created events (e.g. via instrumentation), use + * {@link Client.captureEvent}. It will prepare the event and pass it through + * the callback lifecycle. To issue auto-breadcrumbs, use + * {@link Client.addBreadcrumb}. + * + * @example + * class NodeClient extends BaseClient { + * public constructor(options: NodeOptions) { + * super(NodeBackend, options); + * } + * + * // ... + * } + */ + + var BaseClient = + /** @class */ + function () { + /** + * Initializes this client instance. + * + * @param backendClass A constructor function to create the backend. + * @param options Options for the client. + */ + function BaseClient(backendClass, options) { + /** Array of used integrations. */ + this._integrations = {}; + /** Is the client still processing a call? */ + + this._processing = false; + this._backend = new backendClass(options); + this._options = options; + + if (options.dsn) { + this._dsn = new Dsn(options.dsn); + } + } + /** + * @inheritDoc + */ + + + BaseClient.prototype.captureException = function (exception, hint, scope) { + var _this = this; + + var eventId = hint && hint.event_id; + this._processing = true; + + this._getBackend().eventFromException(exception, hint).then(function (event) { + return _this._processEvent(event, hint, scope); + }).then(function (finalEvent) { + // We need to check for finalEvent in case beforeSend returned null + eventId = finalEvent && finalEvent.event_id; + _this._processing = false; + }).then(null, function (reason) { + logger.error(reason); + _this._processing = false; + }); + + return eventId; + }; + /** + * @inheritDoc + */ + + + BaseClient.prototype.captureMessage = function (message, level, hint, scope) { + var _this = this; + + var eventId = hint && hint.event_id; + this._processing = true; + var promisedEvent = isPrimitive(message) ? this._getBackend().eventFromMessage("" + message, level, hint) : this._getBackend().eventFromException(message, hint); + promisedEvent.then(function (event) { + return _this._processEvent(event, hint, scope); + }).then(function (finalEvent) { + // We need to check for finalEvent in case beforeSend returned null + eventId = finalEvent && finalEvent.event_id; + _this._processing = false; + }).then(null, function (reason) { + logger.error(reason); + _this._processing = false; + }); + return eventId; + }; + /** + * @inheritDoc + */ + + + BaseClient.prototype.captureEvent = function (event, hint, scope) { + var _this = this; + + var eventId = hint && hint.event_id; + this._processing = true; + + this._processEvent(event, hint, scope).then(function (finalEvent) { + // We need to check for finalEvent in case beforeSend returned null + eventId = finalEvent && finalEvent.event_id; + _this._processing = false; + }).then(null, function (reason) { + logger.error(reason); + _this._processing = false; + }); + + return eventId; + }; + /** + * @inheritDoc + */ + + + BaseClient.prototype.getDsn = function () { + return this._dsn; + }; + /** + * @inheritDoc + */ + + + BaseClient.prototype.getOptions = function () { + return this._options; + }; + /** + * @inheritDoc + */ + + + BaseClient.prototype.flush = function (timeout) { + var _this = this; + + return this._isClientProcessing(timeout).then(function (status) { + clearInterval(status.interval); + return _this._getBackend().getTransport().close(timeout).then(function (transportFlushed) { + return status.ready && transportFlushed; + }); + }); + }; + /** + * @inheritDoc + */ + + + BaseClient.prototype.close = function (timeout) { + var _this = this; + + return this.flush(timeout).then(function (result) { + _this.getOptions().enabled = false; + return result; + }); + }; + /** + * Sets up the integrations + */ + + + BaseClient.prototype.setupIntegrations = function () { + if (this._isEnabled()) { + this._integrations = setupIntegrations(this._options); + } + }; + /** + * @inheritDoc + */ + + + BaseClient.prototype.getIntegration = function (integration) { + try { + return this._integrations[integration.id] || null; + } catch (_oO) { + logger.warn("Cannot retrieve integration " + integration.id + " from the current Client"); + return null; + } + }; + /** Waits for the client to be done with processing. */ + + + BaseClient.prototype._isClientProcessing = function (timeout) { + var _this = this; + + return new SyncPromise(function (resolve) { + var ticked = 0; + var tick = 1; + var interval = 0; + clearInterval(interval); + interval = setInterval(function () { + if (!_this._processing) { + resolve({ + interval: interval, + ready: true + }); + } else { + ticked += tick; + + if (timeout && ticked >= timeout) { + resolve({ + interval: interval, + ready: false + }); + } + } + }, tick); + }); + }; + /** Returns the current backend. */ + + + BaseClient.prototype._getBackend = function () { + return this._backend; + }; + /** Determines whether this SDK is enabled and a valid Dsn is present. */ + + + BaseClient.prototype._isEnabled = function () { + return this.getOptions().enabled !== false && this._dsn !== undefined; + }; + /** + * Adds common information to events. + * + * The information includes release and environment from `options`, + * breadcrumbs and context (extra, tags and user) from the scope. + * + * Information that is already present in the event is never overwritten. For + * nested objects, such as the context, keys are merged. + * + * @param event The original event. + * @param hint May contain additional informartion about the original exception. + * @param scope A scope containing event metadata. + * @returns A new event with more information. + */ + + + BaseClient.prototype._prepareEvent = function (event, scope, hint) { + var _this = this; + + var _a = this.getOptions(), + environment = _a.environment, + release = _a.release, + dist = _a.dist, + _b = _a.maxValueLength, + maxValueLength = _b === void 0 ? 250 : _b, + _c = _a.normalizeDepth, + normalizeDepth = _c === void 0 ? 3 : _c; + + var prepared = _assign({}, event); + + if (prepared.environment === undefined && environment !== undefined) { + prepared.environment = environment; + } + + if (prepared.release === undefined && release !== undefined) { + prepared.release = release; + } + + if (prepared.dist === undefined && dist !== undefined) { + prepared.dist = dist; + } + + if (prepared.message) { + prepared.message = truncate(prepared.message, maxValueLength); + } + + var exception = prepared.exception && prepared.exception.values && prepared.exception.values[0]; + + if (exception && exception.value) { + exception.value = truncate(exception.value, maxValueLength); + } + + var request = prepared.request; + + if (request && request.url) { + request.url = truncate(request.url, maxValueLength); + } + + if (prepared.event_id === undefined) { + prepared.event_id = hint && hint.event_id ? hint.event_id : uuid4(); + } + + this._addIntegrations(prepared.sdk); // We prepare the result here with a resolved Event. + + + var result = SyncPromise.resolve(prepared); // This should be the last thing called, since we want that + // {@link Hub.addEventProcessor} gets the finished prepared event. + + if (scope) { + // In case we have a hub we reassign it. + result = scope.applyToEvent(prepared, hint); + } + + return result.then(function (evt) { + // tslint:disable-next-line:strict-type-predicates + if (typeof normalizeDepth === 'number' && normalizeDepth > 0) { + return _this._normalizeEvent(evt, normalizeDepth); + } + + return evt; + }); + }; + /** + * Applies `normalize` function on necessary `Event` attributes to make them safe for serialization. + * Normalized keys: + * - `breadcrumbs.data` + * - `user` + * - `contexts` + * - `extra` + * @param event Event + * @returns Normalized event + */ + + + BaseClient.prototype._normalizeEvent = function (event, depth) { + if (!event) { + return null; + } // tslint:disable:no-unsafe-any + + + return _assign({}, event, event.breadcrumbs && { + breadcrumbs: event.breadcrumbs.map(function (b) { + return _assign({}, b, b.data && { + data: normalize$1(b.data, depth) + }); + }) + }, event.user && { + user: normalize$1(event.user, depth) + }, event.contexts && { + contexts: normalize$1(event.contexts, depth) + }, event.extra && { + extra: normalize$1(event.extra, depth) + }); + }; + /** + * This function adds all used integrations to the SDK info in the event. + * @param sdkInfo The sdkInfo of the event that will be filled with all integrations. + */ + + + BaseClient.prototype._addIntegrations = function (sdkInfo) { + var integrationsArray = Object.keys(this._integrations); + + if (sdkInfo && integrationsArray.length > 0) { + sdkInfo.integrations = integrationsArray; + } + }; + /** + * Processes an event (either error or message) and sends it to Sentry. + * + * This also adds breadcrumbs and context information to the event. However, + * platform specific meta data (such as the User's IP address) must be added + * by the SDK implementor. + * + * + * @param event The event to send to Sentry. + * @param hint May contain additional informartion about the original exception. + * @param scope A scope containing event metadata. + * @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send. + */ + + + BaseClient.prototype._processEvent = function (event, hint, scope) { + var _this = this; + + var _a = this.getOptions(), + beforeSend = _a.beforeSend, + sampleRate = _a.sampleRate; + + if (!this._isEnabled()) { + return SyncPromise.reject('SDK not enabled, will not send event.'); + } // 1.0 === 100% events are sent + // 0.0 === 0% events are sent + + + if (typeof sampleRate === 'number' && Math.random() > sampleRate) { + return SyncPromise.reject('This event has been sampled, will not send event.'); + } + + return new SyncPromise(function (resolve, reject) { + _this._prepareEvent(event, scope, hint).then(function (prepared) { + if (prepared === null) { + reject('An event processor returned null, will not send event.'); + return; + } + + var finalEvent = prepared; + var isInternalException = hint && hint.data && hint.data.__sentry__ === true; + + if (isInternalException || !beforeSend) { + _this._getBackend().sendEvent(finalEvent); + + resolve(finalEvent); + return; + } + + var beforeSendResult = beforeSend(prepared, hint); // tslint:disable-next-line:strict-type-predicates + + if (typeof beforeSendResult === 'undefined') { + logger.error('`beforeSend` method has to return `null` or a valid event.'); + } else if (isThenable$1(beforeSendResult)) { + _this._handleAsyncBeforeSend(beforeSendResult, resolve, reject); + } else { + finalEvent = beforeSendResult; + + if (finalEvent === null) { + logger.log('`beforeSend` returned `null`, will not send event.'); + resolve(null); + return; + } // From here on we are really async + + + _this._getBackend().sendEvent(finalEvent); + + resolve(finalEvent); + } + }).then(null, function (reason) { + _this.captureException(reason, { + data: { + __sentry__: true + }, + originalException: reason + }); + + reject("Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\nReason: " + reason); + }); + }); + }; + /** + * Resolves before send Promise and calls resolve/reject on parent SyncPromise. + */ + + + BaseClient.prototype._handleAsyncBeforeSend = function (beforeSend, resolve, reject) { + var _this = this; + + beforeSend.then(function (processedEvent) { + if (processedEvent === null) { + reject('`beforeSend` returned `null`, will not send event.'); + return; + } // From here on we are really async + + + _this._getBackend().sendEvent(processedEvent); + + resolve(processedEvent); + }).then(null, function (e) { + reject("beforeSend rejected with " + e); + }); + }; + + return BaseClient; + }(); + + /** Noop transport */ + + var NoopTransport = + /** @class */ + function () { + function NoopTransport() {} + /** + * @inheritDoc + */ + + + NoopTransport.prototype.sendEvent = function (_) { + return SyncPromise.resolve({ + reason: "NoopTransport: Event has been skipped because no Dsn is configured.", + status: Status.Skipped + }); + }; + /** + * @inheritDoc + */ + + + NoopTransport.prototype.close = function (_) { + return SyncPromise.resolve(true); + }; + + return NoopTransport; + }(); + + /** + * This is the base implemention of a Backend. + * @hidden + */ + + var BaseBackend = + /** @class */ + function () { + /** Creates a new backend instance. */ + function BaseBackend(options) { + this._options = options; + + if (!this._options.dsn) { + logger.warn('No DSN provided, backend will not do anything.'); + } + + this._transport = this._setupTransport(); + } + /** + * Sets up the transport so it can be used later to send requests. + */ + + + BaseBackend.prototype._setupTransport = function () { + return new NoopTransport(); + }; + /** + * @inheritDoc + */ + + + BaseBackend.prototype.eventFromException = function (_exception, _hint) { + throw new SentryError('Backend has to implement `eventFromException` method'); + }; + /** + * @inheritDoc + */ + + + BaseBackend.prototype.eventFromMessage = function (_message, _level, _hint) { + throw new SentryError('Backend has to implement `eventFromMessage` method'); + }; + /** + * @inheritDoc + */ + + + BaseBackend.prototype.sendEvent = function (event) { + this._transport.sendEvent(event).then(null, function (reason) { + logger.error("Error while sending event: " + reason); + }); + }; + /** + * @inheritDoc + */ + + + BaseBackend.prototype.getTransport = function () { + return this._transport; + }; + + return BaseBackend; + }(); + + /** + * Internal function to create a new SDK client instance. The client is + * installed and then bound to the current scope. + * + * @param clientClass The client class to instanciate. + * @param options Options to pass to the client. + */ + + function initAndBind(clientClass, options) { + if (options.debug === true) { + logger.enable(); + } + + var hub = getCurrentHub(); + var client = new clientClass(options); + hub.bindClient(client); + } + + var originalFunctionToString; + /** Patch toString calls to return proper name for wrapped functions */ + + var FunctionToString = + /** @class */ + function () { + function FunctionToString() { + /** + * @inheritDoc + */ + this.name = FunctionToString.id; + } + /** + * @inheritDoc + */ + + + FunctionToString.prototype.setupOnce = function () { + originalFunctionToString = Function.prototype.toString; + + Function.prototype.toString = function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + var context = this.__sentry_original__ || this; // tslint:disable-next-line:no-unsafe-any + + return originalFunctionToString.apply(context, args); + }; + }; + /** + * @inheritDoc + */ + + + FunctionToString.id = 'FunctionToString'; + return FunctionToString; + }(); + + var $some$1 = arrayIteration.some; + + + + var STRICT_METHOD$4 = arrayMethodIsStrict('some'); + var USES_TO_LENGTH$8 = arrayMethodUsesToLength('some'); + + // `Array.prototype.some` method + // https://tc39.github.io/ecma262/#sec-array.prototype.some + _export({ target: 'Array', proto: true, forced: !STRICT_METHOD$4 || !USES_TO_LENGTH$8 }, { + some: function some(callbackfn /* , thisArg */) { + return $some$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + } + }); + + // this is the result of a script being pulled in from an external domain and CORS. + + var DEFAULT_IGNORE_ERRORS = [/^Script error\.?$/, /^Javascript error: Script error\.? on line 0$/]; + /** Inbound filters configurable by the user */ + + var InboundFilters = + /** @class */ + function () { + function InboundFilters(_options) { + if (_options === void 0) { + _options = {}; + } + + this._options = _options; + /** + * @inheritDoc + */ + + this.name = InboundFilters.id; + } + /** + * @inheritDoc + */ + + + InboundFilters.prototype.setupOnce = function () { + addGlobalEventProcessor(function (event) { + var hub = getCurrentHub(); + + if (!hub) { + return event; + } + + var self = hub.getIntegration(InboundFilters); + + if (self) { + var client = hub.getClient(); + var clientOptions = client ? client.getOptions() : {}; + + var options = self._mergeOptions(clientOptions); + + if (self._shouldDropEvent(event, options)) { + return null; + } + } + + return event; + }); + }; + /** JSDoc */ + + + InboundFilters.prototype._shouldDropEvent = function (event, options) { + if (this._isSentryError(event, options)) { + logger.warn("Event dropped due to being internal Sentry Error.\nEvent: " + getEventDescription(event)); + return true; + } + + if (this._isIgnoredError(event, options)) { + logger.warn("Event dropped due to being matched by `ignoreErrors` option.\nEvent: " + getEventDescription(event)); + return true; + } + + if (this._isBlacklistedUrl(event, options)) { + logger.warn("Event dropped due to being matched by `blacklistUrls` option.\nEvent: " + getEventDescription(event) + ".\nUrl: " + this._getEventFilterUrl(event)); + return true; + } + + if (!this._isWhitelistedUrl(event, options)) { + logger.warn("Event dropped due to not being matched by `whitelistUrls` option.\nEvent: " + getEventDescription(event) + ".\nUrl: " + this._getEventFilterUrl(event)); + return true; + } + + return false; + }; + /** JSDoc */ + + + InboundFilters.prototype._isSentryError = function (event, options) { + if (options === void 0) { + options = {}; + } + + if (!options.ignoreInternal) { + return false; + } + + try { + return event && event.exception && event.exception.values && event.exception.values[0] && event.exception.values[0].type === 'SentryError' || false; + } catch (_oO) { + return false; + } + }; + /** JSDoc */ + + + InboundFilters.prototype._isIgnoredError = function (event, options) { + if (options === void 0) { + options = {}; + } + + if (!options.ignoreErrors || !options.ignoreErrors.length) { + return false; + } + + return this._getPossibleEventMessages(event).some(function (message) { + // Not sure why TypeScript complains here... + return options.ignoreErrors.some(function (pattern) { + return isMatchingPattern(message, pattern); + }); + }); + }; + /** JSDoc */ + + + InboundFilters.prototype._isBlacklistedUrl = function (event, options) { + if (options === void 0) { + options = {}; + } // TODO: Use Glob instead? + + + if (!options.blacklistUrls || !options.blacklistUrls.length) { + return false; + } + + var url = this._getEventFilterUrl(event); + + return !url ? false : options.blacklistUrls.some(function (pattern) { + return isMatchingPattern(url, pattern); + }); + }; + /** JSDoc */ + + + InboundFilters.prototype._isWhitelistedUrl = function (event, options) { + if (options === void 0) { + options = {}; + } // TODO: Use Glob instead? + + + if (!options.whitelistUrls || !options.whitelistUrls.length) { + return true; + } + + var url = this._getEventFilterUrl(event); + + return !url ? true : options.whitelistUrls.some(function (pattern) { + return isMatchingPattern(url, pattern); + }); + }; + /** JSDoc */ + + + InboundFilters.prototype._mergeOptions = function (clientOptions) { + if (clientOptions === void 0) { + clientOptions = {}; + } + + return { + blacklistUrls: __spread(this._options.blacklistUrls || [], clientOptions.blacklistUrls || []), + ignoreErrors: __spread(this._options.ignoreErrors || [], clientOptions.ignoreErrors || [], DEFAULT_IGNORE_ERRORS), + ignoreInternal: typeof this._options.ignoreInternal !== 'undefined' ? this._options.ignoreInternal : true, + whitelistUrls: __spread(this._options.whitelistUrls || [], clientOptions.whitelistUrls || []) + }; + }; + /** JSDoc */ + + + InboundFilters.prototype._getPossibleEventMessages = function (event) { + if (event.message) { + return [event.message]; + } + + if (event.exception) { + try { + var _a = event.exception.values && event.exception.values[0] || {}, + _b = _a.type, + type = _b === void 0 ? '' : _b, + _c = _a.value, + value = _c === void 0 ? '' : _c; + + return ["" + value, type + ": " + value]; + } catch (oO) { + logger.error("Cannot extract message for event " + getEventDescription(event)); + return []; + } + } + + return []; + }; + /** JSDoc */ + + + InboundFilters.prototype._getEventFilterUrl = function (event) { + try { + if (event.stacktrace) { + var frames_1 = event.stacktrace.frames; + return frames_1 && frames_1[frames_1.length - 1].filename || null; + } + + if (event.exception) { + var frames_2 = event.exception.values && event.exception.values[0].stacktrace && event.exception.values[0].stacktrace.frames; + return frames_2 && frames_2[frames_2.length - 1].filename || null; + } + + return null; + } catch (oO) { + logger.error("Cannot extract url for event " + getEventDescription(event)); + return null; + } + }; + /** + * @inheritDoc + */ + + + InboundFilters.id = 'InboundFilters'; + return InboundFilters; + }(); + + var UNKNOWN_FUNCTION = '?'; // Chromium based browsers: Chrome, Brave, new Opera, new Edge + + var chrome = /^\s*at (?:(.*?) ?\()?((?:file|https?|blob|chrome-extension|address|native|eval|webpack||[-a-z]+:|.*bundle|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i; // gecko regex: `(?:bundle|\d+\.js)`: `bundle` is for react native, `\d+\.js` also but specifically for ram bundles because it + // generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js + // We need this specific case for now because we want no other regex to match. + + var gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js))(?::(\d+))?(?::(\d+))?\s*$/i; + var winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i; + var geckoEval = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i; + var chromeEval = /\((\S*)(?::(\d+))(?::(\d+))\)/; + /** JSDoc */ + + function computeStackTrace(ex) { + // tslint:disable:no-unsafe-any + var stack = null; + var popSize = ex && ex.framesToPop; + + try { + // This must be tried first because Opera 10 *destroys* + // its stacktrace property if you try to access the stack + // property first!! + stack = computeStackTraceFromStacktraceProp(ex); + + if (stack) { + return popFrames(stack, popSize); + } + } catch (e) {// no-empty + } + + try { + stack = computeStackTraceFromStackProp(ex); + + if (stack) { + return popFrames(stack, popSize); + } + } catch (e) {// no-empty + } + + return { + message: extractMessage(ex), + name: ex && ex.name, + stack: [], + failed: true + }; + } + /** JSDoc */ + // tslint:disable-next-line:cyclomatic-complexity + + function computeStackTraceFromStackProp(ex) { + // tslint:disable:no-conditional-assignment + if (!ex || !ex.stack) { + return null; + } + + var stack = []; + var lines = ex.stack.split('\n'); + var isEval; + var submatch; + var parts; + var element; + + for (var i = 0; i < lines.length; ++i) { + if (parts = chrome.exec(lines[i])) { + var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line + + 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 = { + // working with the regexp above is super painful. it is quite a hack, but just stripping the `address at ` + // prefix here seems like the quickest solution for now. + url: parts[2] && parts[2].indexOf('address at ') === 0 ? parts[2].substr('address at '.length) : parts[2], + func: parts[1] || UNKNOWN_FUNCTION, + args: isNative ? [parts[2]] : [], + line: parts[3] ? +parts[3] : null, + column: parts[4] ? +parts[4] : null + }; + } 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 = gecko.exec(lines[i])) { + 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[1] = parts[1] || "eval"; + parts[3] = submatch[1]; + parts[4] = submatch[2]; + parts[5] = ''; // no column when eval + } else if (i === 0 && !parts[5] && ex.columnNumber !== void 0) { + // 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, + args: parts[2] ? parts[2].split(',') : [], + line: parts[4] ? +parts[4] : null, + column: parts[5] ? +parts[5] : null + }; + } else { + continue; + } + + if (!element.func && element.line) { + element.func = UNKNOWN_FUNCTION; + } + + stack.push(element); + } + + if (!stack.length) { + return null; + } + + return { + message: extractMessage(ex), + name: ex.name, + stack: stack + }; + } + /** JSDoc */ + + + function computeStackTraceFromStacktraceProp(ex) { + if (!ex || !ex.stacktrace) { + return null; + } // Access and store the stacktrace property before doing ANYTHING + // else to it because Opera is not very good at providing it + // reliably in other circumstances. + + + var stacktrace = ex.stacktrace; + var opera10Regex = / line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i; + var opera11Regex = / line (\d+), column (\d+)\s*(?:in (?:]+)>|([^\)]+))\((.*)\))? in (.*):\s*$/i; + var lines = stacktrace.split('\n'); + var stack = []; + var parts; + + for (var line = 0; line < lines.length; line += 2) { + // tslint:disable:no-conditional-assignment + var element = null; + + if (parts = opera10Regex.exec(lines[line])) { + element = { + url: parts[2], + func: parts[3], + args: [], + line: +parts[1], + column: null + }; + } else if (parts = opera11Regex.exec(lines[line])) { + element = { + url: parts[6], + func: parts[3] || parts[4], + args: parts[5] ? parts[5].split(',') : [], + line: +parts[1], + column: +parts[2] + }; + } + + if (element) { if (!element.func && element.line) { element.func = UNKNOWN_FUNCTION; } - if (element.url && element.url.substr(0, 5) === 'blob:') { - // Special case for handling JavaScript loaded into a blob. - // We use a synchronous AJAX request here as a blob is already in - // memory - it's not making a network request. This will generate a warning - // in the browser console, but there has already been an error so that's not - // that much of an issue. - var xhr = new XMLHttpRequest(); - xhr.open('GET', element.url, false); - xhr.send(null); // If we failed to download the source, skip this patch - - if (xhr.status === 200) { - var source = xhr.responseText || ''; // We trim the source down to the last 300 characters as sourceMappingURL is always at the end of the file. - // Why 300? To be in line with: https://github.com/getsentry/sentry/blob/4af29e8f2350e20c28a6933354e4f42437b4ba42/src/sentry/lang/javascript/processor.py#L164-L175 - - source = source.slice(-300); // Now we dig out the source map URL - - var sourceMaps = source.match(/\/\/# sourceMappingURL=(.*)$/); // If we don't find a source map comment or we find more than one, continue on to the next element. - - if (sourceMaps) { - var sourceMapAddress = sourceMaps[1]; // Now we check to see if it's a relative URL. - // If it is, convert it to an absolute one. - - if (sourceMapAddress.charAt(0) === '~') { - sourceMapAddress = getLocationOrigin() + sourceMapAddress.slice(1); - } // Now we strip the '.map' off of the end of the URL and update the - // element so that Sentry can match the map to the blob. - - - element.url = sourceMapAddress.slice(0, -4); - } - } - } - stack.push(element); } + } - if (!stack.length) { - return null; + if (!stack.length) { + return null; + } + + return { + message: extractMessage(ex), + name: ex.name, + stack: stack + }; + } + /** Remove N number of frames from the stack */ + + + function popFrames(stacktrace, popSize) { + try { + return _assign({}, stacktrace, { + stack: stacktrace.stack.slice(popSize) + }); + } catch (e) { + return stacktrace; + } + } + /** + * There are cases where stacktrace.message is an Event object + * https://github.com/getsentry/sentry-javascript/issues/1949 + * In this specific case we try to extract stacktrace.message.error.message + */ + + + function extractMessage(ex) { + var message = ex && ex.message; + + if (!message) { + return 'No error message'; + } + + if (message.error && typeof message.error.message === 'string') { + return message.error.message; + } + + return message; + } + + var STACKTRACE_LIMIT = 50; + /** + * This function creates an exception from an TraceKitStackTrace + * @param stacktrace TraceKitStackTrace that will be converted to an exception + * @hidden + */ + + function exceptionFromStacktrace(stacktrace) { + var frames = prepareFramesForEvent(stacktrace.stack); + var exception = { + type: stacktrace.name, + value: stacktrace.message + }; + + if (frames && frames.length) { + exception.stacktrace = { + frames: frames + }; + } // tslint:disable-next-line:strict-type-predicates + + + if (exception.type === undefined && exception.value === '') { + exception.value = 'Unrecoverable error caught'; + } + + return exception; + } + /** + * @hidden + */ + + function eventFromPlainObject(exception, syntheticException, rejection) { + var event = { + exception: { + values: [{ + type: isEvent(exception) ? exception.constructor.name : rejection ? 'UnhandledRejection' : 'Error', + value: "Non-Error " + (rejection ? 'promise rejection' : 'exception') + " captured with keys: " + extractExceptionKeysForMessage(exception) + }] + }, + extra: { + __serialized__: normalizeToSize(exception) } + }; + if (syntheticException) { + var stacktrace = computeStackTrace(syntheticException); + var frames_1 = prepareFramesForEvent(stacktrace.stack); + event.stacktrace = { + frames: frames_1 + }; + } + + return event; + } + /** + * @hidden + */ + + function eventFromStacktrace(stacktrace) { + var exception = exceptionFromStacktrace(stacktrace); + return { + exception: { + values: [exception] + } + }; + } + /** + * @hidden + */ + + function prepareFramesForEvent(stack) { + if (!stack || !stack.length) { + return []; + } + + var localStack = stack; + var firstFrameFunction = localStack[0].func || ''; + var lastFrameFunction = localStack[localStack.length - 1].func || ''; // If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call) + + if (firstFrameFunction.indexOf('captureMessage') !== -1 || firstFrameFunction.indexOf('captureException') !== -1) { + localStack = localStack.slice(1); + } // If stack ends with one of our internal API calls, remove it (ends, meaning it's the bottom of the stack - aka top-most call) + + + if (lastFrameFunction.indexOf('sentryWrapped') !== -1) { + localStack = localStack.slice(0, -1); + } // The frame where the crash happened, should be the last entry in the array + + + return localStack.map(function (frame) { return { - name: ex.name, - message: ex.message, - url: getLocationHref(), - stack: stack + colno: frame.column === null ? undefined : frame.column, + filename: frame.url || localStack[0].url, + function: frame.func || '?', + in_app: true, + lineno: frame.line === null ? undefined : frame.line + }; + }).slice(0, STACKTRACE_LIMIT).reverse(); + } + + /** JSDoc */ + + function eventFromUnknownInput(exception, syntheticException, options) { + if (options === void 0) { + options = {}; + } + + var event; + + if (isErrorEvent(exception) && exception.error) { + // If it is an ErrorEvent with `error` property, extract it to get actual Error + var errorEvent = exception; + exception = errorEvent.error; // tslint:disable-line:no-parameter-reassignment + + event = eventFromStacktrace(computeStackTrace(exception)); + return event; + } + + if (isDOMError(exception) || isDOMException(exception)) { + // If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers) + // then we just extract the name and message, as they don't provide anything else + // https://developer.mozilla.org/en-US/docs/Web/API/DOMError + // https://developer.mozilla.org/en-US/docs/Web/API/DOMException + var domException = exception; + var name_1 = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException'); + var message = domException.message ? name_1 + ": " + domException.message : name_1; + event = eventFromString(message, syntheticException, options); + addExceptionTypeValue(event, message); + return event; + } + + if (isError(exception)) { + // we have a real Error object, do nothing + event = eventFromStacktrace(computeStackTrace(exception)); + return event; + } + + if (isPlainObject(exception) || isEvent(exception)) { + // If it is plain Object or Event, serialize it manually and extract options + // This will allow us to group events based on top-level keys + // which is much better than creating new group when any key/value change + var objectException = exception; + event = eventFromPlainObject(objectException, syntheticException, options.rejection); + addExceptionMechanism(event, { + synthetic: true + }); + return event; + } // If none of previous checks were valid, then it means that it's not: + // - an instance of DOMError + // - an instance of DOMException + // - an instance of Event + // - an instance of Error + // - a valid ErrorEvent (one with an error property) + // - a plain Object + // + // So bail out and capture it as a simple message: + + + event = eventFromString(exception, syntheticException, options); + addExceptionTypeValue(event, "" + exception, undefined); + addExceptionMechanism(event, { + synthetic: true + }); + return event; + } // this._options.attachStacktrace + + /** JSDoc */ + + function eventFromString(input, syntheticException, options) { + if (options === void 0) { + options = {}; + } + + var event = { + message: input + }; + + if (options.attachStacktrace && syntheticException) { + var stacktrace = computeStackTrace(syntheticException); + var frames_1 = prepareFramesForEvent(stacktrace.stack); + event.stacktrace = { + frames: frames_1 }; } + + return event; + } + + /** Base Transport class implementation */ + + var BaseTransport = + /** @class */ + function () { + function BaseTransport(options) { + this.options = options; + /** A simple buffer holding all requests. */ + + this._buffer = new PromiseBuffer(30); + this.url = new API(this.options.dsn).getStoreEndpointWithUrlEncodedAuth(); + } /** - * Adds information about the first frame to incomplete stack traces. - * Safari and IE require this to get complete data on the first frame. - * @param {Object.} stackInfo Stack trace information from - * one of the compute* methods. - * @param {string} url The URL of the script that caused an error. - * @param {(number|string)} lineNo The line number of the script that - * caused an error. - * @param {string=} message The error generated by the browser, which - * hopefully contains the name of the object that caused the error. - * @return {boolean} Whether or not the stack information was - * augmented. + * @inheritDoc */ - function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) { - var initial = { - url: url, - line: lineNo - }; - - if (initial.url && initial.line) { - stackInfo.incomplete = false; - - if (!initial.func) { - initial.func = UNKNOWN_FUNCTION; - } - - if (stackInfo.stack.length > 0) { - if (stackInfo.stack[0].url === initial.url) { - if (stackInfo.stack[0].line === initial.line) { - return false; // already in stack trace - } else if (!stackInfo.stack[0].line && stackInfo.stack[0].func === initial.func) { - stackInfo.stack[0].line = initial.line; - return false; - } - } - } - - stackInfo.stack.unshift(initial); - stackInfo.partial = true; - return true; - } else { - stackInfo.incomplete = true; - } - - return false; - } + BaseTransport.prototype.sendEvent = function (_) { + throw new SentryError('Transport Class has to implement `sendEvent` method'); + }; /** - * Computes stack trace information by walking the arguments.caller - * chain at the time the exception occurred. This will cause earlier - * frames to be missed but is the only way to get any stack trace in - * Safari and IE. The top frame is restored by - * {@link augmentStackTraceWithInitialElement}. - * @param {Error} ex - * @return {?Object.} Stack trace information. + * @inheritDoc */ - function computeStackTraceByWalkingCallerChain(ex, depth) { - var functionName = /function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i, - stack = [], - funcs = {}, - recursion = false, - parts, - item; + BaseTransport.prototype.close = function (timeout) { + return this._buffer.drain(timeout); + }; - for (var curr = computeStackTraceByWalkingCallerChain.caller; curr && !recursion; curr = curr.caller) { - if (curr === computeStackTrace || curr === TraceKit.report) { - // console.log('skipping internal function'); - continue; - } - - item = { - url: null, - func: UNKNOWN_FUNCTION, - line: null, - column: null - }; - - if (curr.name) { - item.func = curr.name; - } else if (parts = functionName.exec(curr.toString())) { - item.func = parts[1]; - } - - if (typeof item.func === 'undefined') { - try { - item.func = parts.input.substring(0, parts.input.indexOf('{')); - } catch (e) {} - } - - if (funcs['' + curr]) { - recursion = true; - } else { - funcs['' + curr] = true; - } - - stack.push(item); - } - - if (depth) { - // console.log('depth is ' + depth); - // console.log('stack is ' + stack.length); - stack.splice(0, depth); - } - - var result = { - name: ex.name, - message: ex.message, - url: getLocationHref(), - stack: stack - }; - augmentStackTraceWithInitialElement(result, ex.sourceURL || ex.fileName, ex.line || ex.lineNumber, ex.message || ex.description); - return result; - } - /** - * Computes a stack trace for an exception. - * @param {Error} ex - * @param {(string|number)=} depth - */ - - - function computeStackTrace(ex, depth) { - var stack = null; - depth = depth == null ? 0 : +depth; - - try { - stack = computeStackTraceFromStackProp(ex); - - if (stack) { - return stack; - } - } catch (e) { - if (TraceKit.debug) { - throw e; - } - } - - try { - stack = computeStackTraceByWalkingCallerChain(ex, depth + 1); - - if (stack) { - return stack; - } - } catch (e) { - if (TraceKit.debug) { - throw e; - } - } - - return { - name: ex.name, - message: ex.message, - url: getLocationHref() - }; - } - - computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement; - computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp; - return computeStackTrace; + return BaseTransport; }(); - var tracekit = TraceKit; + var global$3 = getGlobalObject(); + /** `fetch` based transport */ - /* - * JavaScript MD5 - * https://github.com/blueimp/JavaScript-MD5 - * - * Copyright 2011, Sebastian Tschan - * https://blueimp.net - * - * Licensed under the MIT license: - * https://opensource.org/licenses/MIT - * - * Based on - * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message - * Digest Algorithm, as defined in RFC 1321. - * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * Distributed under the BSD License - * See http://pajhome.org.uk/crypt/md5 for more info. - */ + var FetchTransport = + /** @class */ + function (_super) { + __extends(FetchTransport, _super); - /* - * Add integers, wrapping at 2^32. This uses 16-bit operations internally - * to work around bugs in some JS interpreters. - */ - function safeAdd(x, y) { - var lsw = (x & 0xffff) + (y & 0xffff); - var msw = (x >> 16) + (y >> 16) + (lsw >> 16); - return msw << 16 | lsw & 0xffff; - } - /* - * Bitwise rotate a 32-bit number to the left. - */ + function FetchTransport() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** Locks transport after receiving 429 response */ - function bitRotateLeft(num, cnt) { - return num << cnt | num >>> 32 - cnt; - } - /* - * These functions implement the four basic operations the algorithm uses. - */ - - - function md5cmn(q, a, b, x, s, t) { - return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b); - } - - function md5ff(a, b, c, d, x, s, t) { - return md5cmn(b & c | ~b & d, a, b, x, s, t); - } - - function md5gg(a, b, c, d, x, s, t) { - return md5cmn(b & d | c & ~d, a, b, x, s, t); - } - - function md5hh(a, b, c, d, x, s, t) { - return md5cmn(b ^ c ^ d, a, b, x, s, t); - } - - function md5ii(a, b, c, d, x, s, t) { - return md5cmn(c ^ (b | ~d), a, b, x, s, t); - } - /* - * Calculate the MD5 of an array of little-endian words, and a bit length. - */ - - - function binlMD5(x, len) { - /* append padding */ - x[len >> 5] |= 0x80 << len % 32; - x[(len + 64 >>> 9 << 4) + 14] = len; - var i; - var olda; - var oldb; - var oldc; - var oldd; - var a = 1732584193; - var b = -271733879; - var c = -1732584194; - var d = 271733878; - - for (i = 0; i < x.length; i += 16) { - olda = a; - oldb = b; - oldc = c; - oldd = d; - a = md5ff(a, b, c, d, x[i], 7, -680876936); - d = md5ff(d, a, b, c, x[i + 1], 12, -389564586); - c = md5ff(c, d, a, b, x[i + 2], 17, 606105819); - b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330); - a = md5ff(a, b, c, d, x[i + 4], 7, -176418897); - d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426); - c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341); - b = md5ff(b, c, d, a, x[i + 7], 22, -45705983); - a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416); - d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417); - c = md5ff(c, d, a, b, x[i + 10], 17, -42063); - b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162); - a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682); - d = md5ff(d, a, b, c, x[i + 13], 12, -40341101); - c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290); - b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329); - a = md5gg(a, b, c, d, x[i + 1], 5, -165796510); - d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632); - c = md5gg(c, d, a, b, x[i + 11], 14, 643717713); - b = md5gg(b, c, d, a, x[i], 20, -373897302); - a = md5gg(a, b, c, d, x[i + 5], 5, -701558691); - d = md5gg(d, a, b, c, x[i + 10], 9, 38016083); - c = md5gg(c, d, a, b, x[i + 15], 14, -660478335); - b = md5gg(b, c, d, a, x[i + 4], 20, -405537848); - a = md5gg(a, b, c, d, x[i + 9], 5, 568446438); - d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690); - c = md5gg(c, d, a, b, x[i + 3], 14, -187363961); - b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501); - a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467); - d = md5gg(d, a, b, c, x[i + 2], 9, -51403784); - c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473); - b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734); - a = md5hh(a, b, c, d, x[i + 5], 4, -378558); - d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463); - c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562); - b = md5hh(b, c, d, a, x[i + 14], 23, -35309556); - a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060); - d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353); - c = md5hh(c, d, a, b, x[i + 7], 16, -155497632); - b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640); - a = md5hh(a, b, c, d, x[i + 13], 4, 681279174); - d = md5hh(d, a, b, c, x[i], 11, -358537222); - c = md5hh(c, d, a, b, x[i + 3], 16, -722521979); - b = md5hh(b, c, d, a, x[i + 6], 23, 76029189); - a = md5hh(a, b, c, d, x[i + 9], 4, -640364487); - d = md5hh(d, a, b, c, x[i + 12], 11, -421815835); - c = md5hh(c, d, a, b, x[i + 15], 16, 530742520); - b = md5hh(b, c, d, a, x[i + 2], 23, -995338651); - a = md5ii(a, b, c, d, x[i], 6, -198630844); - d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415); - c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905); - b = md5ii(b, c, d, a, x[i + 5], 21, -57434055); - a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571); - d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606); - c = md5ii(c, d, a, b, x[i + 10], 15, -1051523); - b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799); - a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359); - d = md5ii(d, a, b, c, x[i + 15], 10, -30611744); - c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380); - b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649); - a = md5ii(a, b, c, d, x[i + 4], 6, -145523070); - d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379); - c = md5ii(c, d, a, b, x[i + 2], 15, 718787259); - b = md5ii(b, c, d, a, x[i + 9], 21, -343485551); - a = safeAdd(a, olda); - b = safeAdd(b, oldb); - c = safeAdd(c, oldc); - d = safeAdd(d, oldd); + _this._disabledUntil = new Date(Date.now()); + return _this; } + /** + * @inheritDoc + */ - return [a, b, c, d]; - } - /* - * Convert an array of little-endian words to a string - */ + FetchTransport.prototype.sendEvent = function (event) { + var _this = this; - function binl2rstr(input) { - var i; - var output = ''; - var length32 = input.length * 32; - - for (i = 0; i < length32; i += 8) { - output += String.fromCharCode(input[i >> 5] >>> i % 32 & 0xff); - } - - return output; - } - /* - * Convert a raw string to an array of little-endian words - * Characters >255 have their high-byte silently ignored. - */ - - - function rstr2binl(input) { - var i; - var output = []; - output[(input.length >> 2) - 1] = undefined; - - for (i = 0; i < output.length; i += 1) { - output[i] = 0; - } - - var length8 = input.length * 8; - - for (i = 0; i < length8; i += 8) { - output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << i % 32; - } - - return output; - } - /* - * Calculate the MD5 of a raw string - */ - - - function rstrMD5(s) { - return binl2rstr(binlMD5(rstr2binl(s), s.length * 8)); - } - /* - * Calculate the HMAC-MD5, of a key and some data (raw strings) - */ - - - function rstrHMACMD5(key, data) { - var i; - var bkey = rstr2binl(key); - var ipad = []; - var opad = []; - var hash; - ipad[15] = opad[15] = undefined; - - if (bkey.length > 16) { - bkey = binlMD5(bkey, key.length * 8); - } - - for (i = 0; i < 16; i += 1) { - ipad[i] = bkey[i] ^ 0x36363636; - opad[i] = bkey[i] ^ 0x5c5c5c5c; - } - - hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8); - return binl2rstr(binlMD5(opad.concat(hash), 512 + 128)); - } - /* - * Convert a raw string to a hex string - */ - - - function rstr2hex(input) { - var hexTab = '0123456789abcdef'; - var output = ''; - var x; - var i; - - for (i = 0; i < input.length; i += 1) { - x = input.charCodeAt(i); - output += hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f); - } - - return output; - } - /* - * Encode a string as utf-8 - */ - - - function str2rstrUTF8(input) { - return unescape(encodeURIComponent(input)); - } - /* - * Take string arguments and return either raw or hex encoded strings - */ - - - function rawMD5(s) { - return rstrMD5(str2rstrUTF8(s)); - } - - function hexMD5(s) { - return rstr2hex(rawMD5(s)); - } - - function rawHMACMD5(k, d) { - return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d)); - } - - function hexHMACMD5(k, d) { - return rstr2hex(rawHMACMD5(k, d)); - } - - function md5(string, key, raw) { - if (!key) { - if (!raw) { - return hexMD5(string); - } - - return rawMD5(string); - } - - if (!raw) { - return hexHMACMD5(key, string); - } - - return rawHMACMD5(key, string); - } - - var md5_1 = md5; - - function RavenConfigError(message) { - this.name = 'RavenConfigError'; - this.message = message; - } - - RavenConfigError.prototype = new Error(); - RavenConfigError.prototype.constructor = RavenConfigError; - var configError = RavenConfigError; - - var wrapMethod = function wrapMethod(console, level, callback) { - var originalConsoleLevel = console[level]; - var originalConsole = console; - - if (!(level in console)) { - return; - } - - var sentryLevel = level === 'warn' ? 'warning' : level; - - console[level] = function () { - var args = [].slice.call(arguments); - var msg = utils.safeJoin(args, ' '); - var data = { - level: sentryLevel, - logger: 'console', - extra: { - arguments: args - } - }; - - if (level === 'assert') { - if (args[0] === false) { - // Default browsers message - msg = 'Assertion failed: ' + (utils.safeJoin(args.slice(1), ' ') || 'console.assert'); - data.extra.arguments = args.slice(1); - callback && callback(msg, data); - } - } else { - callback && callback(msg, data); - } // this fails for some browsers. :( - - - if (originalConsoleLevel) { - // IE9 doesn't allow calling apply on console functions directly - // See: https://stackoverflow.com/questions/5472938/does-ie9-support-console-log-and-is-it-a-real-function#answer-5473193 - Function.prototype.apply.call(originalConsoleLevel, originalConsole, args); - } - }; - }; - - var console$1 = { - wrapMethod: wrapMethod - }; - - /*global XDomainRequest:false */ - - var isErrorEvent$1 = utils.isErrorEvent; - var isDOMError$1 = utils.isDOMError; - var isDOMException$1 = utils.isDOMException; - var isError$1 = utils.isError; - var isObject$2 = utils.isObject; - var isPlainObject$1 = utils.isPlainObject; - var isUndefined$1 = utils.isUndefined; - var isFunction$1 = utils.isFunction; - var isString$1 = utils.isString; - var isArray$2 = utils.isArray; - var isEmptyObject$1 = utils.isEmptyObject; - var each$1 = utils.each; - var objectMerge$1 = utils.objectMerge; - var truncate$1 = utils.truncate; - var objectFrozen$1 = utils.objectFrozen; - var hasKey$1 = utils.hasKey; - var joinRegExp$1 = utils.joinRegExp; - var urlencode$1 = utils.urlencode; - var uuid4$1 = utils.uuid4; - var htmlTreeAsString$1 = utils.htmlTreeAsString; - var isSameException$1 = utils.isSameException; - var isSameStacktrace$1 = utils.isSameStacktrace; - var parseUrl$1 = utils.parseUrl; - var fill$1 = utils.fill; - var supportsFetch$1 = utils.supportsFetch; - var supportsReferrerPolicy$1 = utils.supportsReferrerPolicy; - var serializeKeysForMessage$1 = utils.serializeKeysForMessage; - var serializeException$1 = utils.serializeException; - var sanitize$1 = utils.sanitize; - var wrapConsoleMethod = console$1.wrapMethod; - var dsnKeys = 'source protocol user pass host port path'.split(' '), - dsnPattern = /^(?:(\w+):)?\/\/(?:(\w+)(:\w+)?@)?([\w\.-]+)(?::(\d+))?(\/.*)/; - - function now() { - return +new Date(); - } // This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785) - - - var _window$2 = typeof window !== 'undefined' ? window : typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof self !== 'undefined' ? self : {}; - - var _document = _window$2.document; - var _navigator = _window$2.navigator; - - function keepOriginalCallback(original, callback) { - return isFunction$1(callback) ? function (data) { - return callback(data, original); - } : callback; - } // First, check for JSON support - // If there is no JSON, we no-op the core features of Raven - // since JSON is required to encode the payload - - - function Raven() { - this._hasJSON = !!((typeof JSON === "undefined" ? "undefined" : _typeof(JSON)) === 'object' && JSON.stringify); // Raven can run in contexts where there's no document (react-native) - - this._hasDocument = !isUndefined$1(_document); - this._hasNavigator = !isUndefined$1(_navigator); - this._lastCapturedException = null; - this._lastData = null; - this._lastEventId = null; - this._globalServer = null; - this._globalKey = null; - this._globalProject = null; - this._globalContext = {}; - this._globalOptions = { - // SENTRY_RELEASE can be injected by https://github.com/getsentry/sentry-webpack-plugin - release: _window$2.SENTRY_RELEASE && _window$2.SENTRY_RELEASE.id, - logger: 'javascript', - ignoreErrors: [], - ignoreUrls: [], - whitelistUrls: [], - includePaths: [], - headers: null, - collectWindowErrors: true, - captureUnhandledRejections: true, - maxMessageLength: 0, - // By default, truncates URL values to 250 chars - maxUrlLength: 250, - stackTraceLimit: 50, - autoBreadcrumbs: true, - instrument: true, - sampleRate: 1, - sanitizeKeys: [] - }; - this._fetchDefaults = { - method: 'POST', - // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default - // https://caniuse.com/#feat=referrer-policy - // It doesn't. And it throw exception instead of ignoring this parameter... - // REF: https://github.com/getsentry/raven-js/issues/1233 - referrerPolicy: supportsReferrerPolicy$1() ? 'origin' : '' - }; - this._ignoreOnError = 0; - this._isRavenInstalled = false; - this._originalErrorStackTraceLimit = Error.stackTraceLimit; // capture references to window.console *and* all its methods first - // before the console plugin has a chance to monkey patch - - this._originalConsole = _window$2.console || {}; - this._originalConsoleMethods = {}; - this._plugins = []; - this._startTime = now(); - this._wrappedBuiltIns = []; - this._breadcrumbs = []; - this._lastCapturedEvent = null; - this._keypressTimeout; - this._location = _window$2.location; - this._lastHref = this._location && this._location.href; - - this._resetBackoff(); // eslint-disable-next-line guard-for-in - - - for (var method in this._originalConsole) { - this._originalConsoleMethods[method] = this._originalConsole[method]; - } - } - /* - * The core Raven singleton - * - * @this {Raven} - */ - - - Raven.prototype = { - // Hardcode version string so that raven source can be loaded directly via - // 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.27.2', - debug: false, - TraceKit: tracekit, - // alias to TraceKit - - /* - * Configure Raven with a DSN and extra options - * - * @param {string} dsn The public Sentry DSN - * @param {object} options Set of global options [optional] - * @return {Raven} - */ - config: function config(dsn, options) { - var self = this; - - if (self._globalServer) { - this._logDebug('error', 'Error: Raven has already been configured'); - - return self; - } - - if (!dsn) return self; - var globalOptions = self._globalOptions; // merge in options - - if (options) { - each$1(options, function (key, value) { - // tags and extra are special and need to be put into context - if (key === 'tags' || key === 'extra' || key === 'user') { - self._globalContext[key] = value; - } else { - globalOptions[key] = value; - } + if (new Date(Date.now()) < this._disabledUntil) { + return Promise.reject({ + event: event, + reason: "Transport locked till " + this._disabledUntil + " due to too many requests.", + status: 429 }); } - self.setDSN(dsn); // "Script error." is hard coded into browsers for errors that it can't read. - // this is the result of a script being pulled in from an external domain and CORS. - - globalOptions.ignoreErrors.push(/^Script error\.?$/); - globalOptions.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/); // join regexp rules into one big rule - - globalOptions.ignoreErrors = joinRegExp$1(globalOptions.ignoreErrors); - globalOptions.ignoreUrls = globalOptions.ignoreUrls.length ? joinRegExp$1(globalOptions.ignoreUrls) : false; - globalOptions.whitelistUrls = globalOptions.whitelistUrls.length ? joinRegExp$1(globalOptions.whitelistUrls) : false; - globalOptions.includePaths = joinRegExp$1(globalOptions.includePaths); - globalOptions.maxBreadcrumbs = Math.max(0, Math.min(globalOptions.maxBreadcrumbs || 100, 100)); // default and hard limit is 100 - - var autoBreadcrumbDefaults = { - xhr: true, - console: true, - dom: true, - location: true, - sentry: true + var defaultOptions = { + body: JSON.stringify(event), + method: 'POST', + // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default + // https://caniuse.com/#feat=referrer-policy + // It doesn't. And it throw exception instead of ignoring this parameter... + // REF: https://github.com/getsentry/raven-js/issues/1233 + referrerPolicy: supportsReferrerPolicy() ? 'origin' : '' }; - var autoBreadcrumbs = globalOptions.autoBreadcrumbs; - if ({}.toString.call(autoBreadcrumbs) === '[object Object]') { - autoBreadcrumbs = objectMerge$1(autoBreadcrumbDefaults, autoBreadcrumbs); - } else if (autoBreadcrumbs !== false) { - autoBreadcrumbs = autoBreadcrumbDefaults; + if (this.options.headers !== undefined) { + defaultOptions.headers = this.options.headers; } - globalOptions.autoBreadcrumbs = autoBreadcrumbs; - var instrumentDefaults = { - tryCatch: true - }; - var instrument = globalOptions.instrument; + return this._buffer.add(new SyncPromise(function (resolve, reject) { + global$3.fetch(_this.url, defaultOptions).then(function (response) { + var status = Status.fromHttpCode(response.status); - if ({}.toString.call(instrument) === '[object Object]') { - instrument = objectMerge$1(instrumentDefaults, instrument); - } else if (instrument !== false) { - instrument = instrumentDefaults; - } - - globalOptions.instrument = instrument; - tracekit.collectWindowErrors = !!globalOptions.collectWindowErrors; // return for chaining - - return self; - }, - - /* - * Installs a global window.onerror error handler - * to capture and report uncaught exceptions. - * At this point, install() is required to be called due - * to the way TraceKit is set up. - * - * @return {Raven} - */ - install: function install() { - var self = this; - - if (self.isSetup() && !self._isRavenInstalled) { - tracekit.report.subscribe(function () { - self._handleOnErrorStackInfo.apply(self, arguments); - }); - - if (self._globalOptions.captureUnhandledRejections) { - self._attachPromiseRejectionHandler(); - } - - self._patchFunctionToString(); - - if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) { - self._instrumentTryCatch(); - } - - if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs(); // Install all of the plugins - - self._drainPlugins(); - - self._isRavenInstalled = true; - } - - Error.stackTraceLimit = self._globalOptions.stackTraceLimit; - return this; - }, - - /* - * Set the DSN (can be called multiple time unlike config) - * - * @param {string} dsn The public Sentry DSN - */ - setDSN: function setDSN(dsn) { - var self = this, - uri = self._parseDSN(dsn), - lastSlash = uri.path.lastIndexOf('/'), - path = uri.path.substr(1, lastSlash); - - self._dsn = dsn; - self._globalKey = uri.user; - self._globalSecret = uri.pass && uri.pass.substr(1); - self._globalProject = uri.path.substr(lastSlash + 1); - self._globalServer = self._getGlobalServer(uri); - self._globalEndpoint = self._globalServer + '/' + path + 'api/' + self._globalProject + '/store/'; // Reset backoff state since we may be pointing at a - // new project/server - - this._resetBackoff(); - }, - - /* - * Wrap code within a context so Raven can capture errors - * reliably across domains that is executed immediately. - * - * @param {object} options A specific set of options for this context [optional] - * @param {function} func The callback to be immediately executed within the context - * @param {array} args An array of arguments to be called with the callback [optional] - */ - context: function context(options, func, args) { - if (isFunction$1(options)) { - args = func || []; - func = options; - options = {}; - } - - return this.wrap(options, func).apply(this, args); - }, - - /* - * Wrap code within a context and returns back a new function to be executed - * - * @param {object} options A specific set of options for this context [optional] - * @param {function} func The function to be wrapped in a new context - * @param {function} _before A function to call before the try/catch wrapper [optional, private] - * @return {function} The newly wrapped functions with a context - */ - wrap: function wrap(options, func, _before) { - var self = this; // 1 argument has been passed, and it's not a function - // so just return it - - if (isUndefined$1(func) && !isFunction$1(options)) { - return options; - } // options is optional - - - if (isFunction$1(options)) { - func = options; - options = undefined; - } // At this point, we've passed along 2 arguments, and the second one - // is not a function either, so we'll just return the second argument. - - - if (!isFunction$1(func)) { - return func; - } // We don't wanna wrap it twice! - - - try { - if (func.__raven__) { - return func; - } // If this has already been wrapped in the past, return that - - - if (func.__raven_wrapper__) { - return func.__raven_wrapper__; - } - } catch (e) { - // Just accessing custom props in some Selenium environments - // can cause a "Permission denied" exception (see raven-js#495). - // Bail on wrapping and return the function as-is (defers to window.onerror). - return func; - } - - function wrapped() { - var args = [], - i = arguments.length, - deep = !options || options && options.deep !== false; - - if (_before && isFunction$1(_before)) { - _before.apply(this, arguments); - } // Recursively wrap all of a function's arguments that are - // functions themselves. - - - while (i--) { - args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i]; - } - - try { - // Attempt to invoke user-land function - // NOTE: If you are a Sentry user, and you are seeing this stack frame, it - // means Raven caught an error invoking your application code. This is - // expected behavior and NOT indicative of a bug with Raven.js. - return func.apply(this, args); - } catch (e) { - self._ignoreNextOnError(); - - self.captureException(e, options); - throw e; - } - } // copy over properties of the old function - - - for (var property in func) { - if (hasKey$1(func, property)) { - wrapped[property] = func[property]; - } - } - - wrapped.prototype = func.prototype; - func.__raven_wrapper__ = wrapped; // Signal that this function has been wrapped/filled already - // for both debugging and to prevent it to being wrapped/filled twice - - wrapped.__raven__ = true; - wrapped.__orig__ = func; - return wrapped; - }, - - /** - * Uninstalls the global error handler. - * - * @return {Raven} - */ - uninstall: function uninstall() { - tracekit.report.uninstall(); - - this._detachPromiseRejectionHandler(); - - this._unpatchFunctionToString(); - - this._restoreBuiltIns(); - - this._restoreConsole(); - - Error.stackTraceLimit = this._originalErrorStackTraceLimit; - this._isRavenInstalled = false; - return this; - }, - - /** - * Callback used for `unhandledrejection` event - * - * @param {PromiseRejectionEvent} event An object containing - * promise: the Promise that was rejected - * reason: the value with which the Promise was rejected - * @return void - */ - _promiseRejectionHandler: function _promiseRejectionHandler(event) { - this._logDebug('debug', 'Raven caught unhandled promise rejection:', event); - - this.captureException(event.reason, { - mechanism: { - type: 'onunhandledrejection', - handled: false - } - }); - }, - - /** - * Installs the global promise rejection handler. - * - * @return {raven} - */ - _attachPromiseRejectionHandler: function _attachPromiseRejectionHandler() { - this._promiseRejectionHandler = this._promiseRejectionHandler.bind(this); - _window$2.addEventListener && _window$2.addEventListener('unhandledrejection', this._promiseRejectionHandler); - return this; - }, - - /** - * Uninstalls the global promise rejection handler. - * - * @return {raven} - */ - _detachPromiseRejectionHandler: function _detachPromiseRejectionHandler() { - _window$2.removeEventListener && _window$2.removeEventListener('unhandledrejection', this._promiseRejectionHandler); - return this; - }, - - /** - * Manually capture an exception and send it over to Sentry - * - * @param {error} ex An exception to be logged - * @param {object} options A specific set of options for this error [optional] - * @return {Raven} - */ - captureException: function captureException(ex, options) { - options = objectMerge$1({ - trimHeadFrames: 0 - }, options ? options : {}); - - if (isErrorEvent$1(ex) && ex.error) { - // If it is an ErrorEvent with `error` property, extract it to get actual Error - ex = ex.error; - } else if (isDOMError$1(ex) || isDOMException$1(ex)) { - // If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers) - // then we just extract the name and message, as they don't provide anything else - // https://developer.mozilla.org/en-US/docs/Web/API/DOMError - // https://developer.mozilla.org/en-US/docs/Web/API/DOMException - var name = ex.name || (isDOMError$1(ex) ? 'DOMError' : 'DOMException'); - var message = ex.message ? name + ': ' + ex.message : name; - return this.captureMessage(message, objectMerge$1(options, { - // neither DOMError or DOMException provide stack trace and we most likely wont get it this way as well - // but it's barely any overhead so we may at least try - stacktrace: true, - trimHeadFrames: options.trimHeadFrames + 1 - })); - } else if (isError$1(ex)) { - // we have a real Error object - ex = ex; - } else if (isPlainObject$1(ex)) { - // If it is plain Object, serialize it manually and extract options - // This will allow us to group events based on top-level keys - // which is much better than creating new group when any key/value change - options = this._getCaptureExceptionOptionsFromPlainObject(options, ex); - ex = new Error(options.message); - } else { - // If none of previous checks were valid, then it means that - // it's not a DOMError/DOMException - // it's not a plain Object - // it's not a valid ErrorEvent (one with an error property) - // it's not an Error - // So bail out and capture it as a simple message: - return this.captureMessage(ex, objectMerge$1(options, { - stacktrace: true, - // if we fall back to captureMessage, default to attempting a new trace - trimHeadFrames: options.trimHeadFrames + 1 - })); - } // Store the raw exception object for potential debugging and introspection - - - this._lastCapturedException = ex; // TraceKit.report will re-raise any exception passed to it, - // which means you have to wrap it in try/catch. Instead, we - // can wrap it here and only re-raise if TraceKit.report - // raises an exception different from the one we asked to - // report on. - - try { - var stack = tracekit.computeStackTrace(ex); - - this._handleStackInfo(stack, options); - } catch (ex1) { - if (ex !== ex1) { - throw ex1; - } - } - - return this; - }, - _getCaptureExceptionOptionsFromPlainObject: function _getCaptureExceptionOptionsFromPlainObject(currentOptions, ex) { - var exKeys = Object.keys(ex).sort(); - var options = objectMerge$1(currentOptions, { - message: 'Non-Error exception captured with keys: ' + serializeKeysForMessage$1(exKeys), - fingerprint: [md5_1(exKeys)], - extra: currentOptions.extra || {} - }); - options.extra.__serialized__ = serializeException$1(ex); - return options; - }, - - /* - * Manually send a message to Sentry - * - * @param {string} msg A plain message to be captured in Sentry - * @param {object} options A specific set of options for this message [optional] - * @return {Raven} - */ - captureMessage: function captureMessage(msg, options) { - // config() automagically converts ignoreErrors from a list to a RegExp so we need to test for an - // early call; we'll error on the side of logging anything called before configuration since it's - // probably something you should see: - if (!!this._globalOptions.ignoreErrors.test && this._globalOptions.ignoreErrors.test(msg)) { - return; - } - - options = options || {}; - msg = msg + ''; // Make sure it's actually a string - - var data = objectMerge$1({ - message: msg - }, options); - var ex; // 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) { - ex = ex1; - } // null exception name so `Error` isn't prefixed to msg - - - ex.name = null; - var stack = tracekit.computeStackTrace(ex); // stack[0] is `throw new Error(msg)` call itself, we are interested in the frame that was just before that, stack[1] - - var initialCall = isArray$2(stack.stack) && stack.stack[1]; // if stack[1] is `Raven.captureException`, it means that someone passed a string to it and we redirected that call - // to be handled by `captureMessage`, thus `initialCall` is the 3rd one, not 2nd - // initialCall => captureException(string) => captureMessage(string) - - if (initialCall && initialCall.func === 'Raven.captureException') { - initialCall = stack.stack[2]; - } - - var fileurl = initialCall && initialCall.url || ''; - - if (!!this._globalOptions.ignoreUrls.test && this._globalOptions.ignoreUrls.test(fileurl)) { - return; - } - - if (!!this._globalOptions.whitelistUrls.test && !this._globalOptions.whitelistUrls.test(fileurl)) { - return; - } // Always attempt to get stacktrace if message is empty. - // It's the only way to provide any helpful information to the user. - - - if (this._globalOptions.stacktrace || options.stacktrace || data.message === '') { - // fingerprint on msg, not stack trace (legacy behavior, could be revisited) - data.fingerprint = data.fingerprint == null ? msg : data.fingerprint; - options = objectMerge$1({ - trimHeadFrames: 0 - }, options); // Since we know this is a synthetic trace, the top frame (this function call) - // MUST be from Raven.js, so mark it for trimming - // We add to the trim counter so that callers can choose to trim extra frames, such - // as utility functions. - - options.trimHeadFrames += 1; - - var frames = this._prepareFrames(stack, options); - - data.stacktrace = { - // Sentry expects frames oldest to newest - frames: frames.reverse() - }; - } // Make sure that fingerprint is always wrapped in an array - - - if (data.fingerprint) { - data.fingerprint = isArray$2(data.fingerprint) ? data.fingerprint : [data.fingerprint]; - } // Fire away! - - - this._send(data); - - return this; - }, - captureBreadcrumb: function captureBreadcrumb(obj) { - var crumb = objectMerge$1({ - timestamp: now() / 1000 - }, obj); - - if (isFunction$1(this._globalOptions.breadcrumbCallback)) { - var result = this._globalOptions.breadcrumbCallback(crumb); - - if (isObject$2(result) && !isEmptyObject$1(result)) { - crumb = result; - } else if (result === false) { - return this; - } - } - - this._breadcrumbs.push(crumb); - - if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) { - this._breadcrumbs.shift(); - } - - return this; - }, - addPlugin: function addPlugin(plugin - /*arg1, arg2, ... argN*/ - ) { - var pluginArgs = [].slice.call(arguments, 1); - - this._plugins.push([plugin, pluginArgs]); - - if (this._isRavenInstalled) { - this._drainPlugins(); - } - - return this; - }, - - /* - * Set/clear a user to be sent along with the payload. - * - * @param {object} user An object representing user data [optional] - * @return {Raven} - */ - setUserContext: function setUserContext(user) { - // Intentionally do not merge here since that's an unexpected behavior. - this._globalContext.user = user; - return this; - }, - - /* - * Merge extra attributes to be sent along with the payload. - * - * @param {object} extra An object representing extra data [optional] - * @return {Raven} - */ - setExtraContext: function setExtraContext(extra) { - this._mergeContext('extra', extra); - - return this; - }, - - /* - * Merge tags to be sent along with the payload. - * - * @param {object} tags An object representing tags [optional] - * @return {Raven} - */ - setTagsContext: function setTagsContext(tags) { - this._mergeContext('tags', tags); - - return this; - }, - - /* - * Clear all of the context. - * - * @return {Raven} - */ - clearContext: function clearContext() { - this._globalContext = {}; - return this; - }, - - /* - * Get a copy of the current context. This cannot be mutated. - * - * @return {object} copy of context - */ - getContext: function getContext() { - // lol javascript - return JSON.parse(stringify_1(this._globalContext)); - }, - - /* - * Set environment of application - * - * @param {string} environment Typically something like 'production'. - * @return {Raven} - */ - setEnvironment: function setEnvironment(environment) { - this._globalOptions.environment = environment; - return this; - }, - - /* - * Set release version of application - * - * @param {string} release Typically something like a git SHA to identify version - * @return {Raven} - */ - setRelease: function setRelease(release) { - this._globalOptions.release = release; - return this; - }, - - /* - * Set the dataCallback option - * - * @param {function} callback The callback to run which allows the - * data blob to be mutated before sending - * @return {Raven} - */ - setDataCallback: function setDataCallback(callback) { - var original = this._globalOptions.dataCallback; - this._globalOptions.dataCallback = keepOriginalCallback(original, callback); - return this; - }, - - /* - * Set the breadcrumbCallback option - * - * @param {function} callback The callback to run which allows filtering - * or mutating breadcrumbs - * @return {Raven} - */ - setBreadcrumbCallback: function setBreadcrumbCallback(callback) { - var original = this._globalOptions.breadcrumbCallback; - this._globalOptions.breadcrumbCallback = keepOriginalCallback(original, callback); - return this; - }, - - /* - * Set the shouldSendCallback option - * - * @param {function} callback The callback to run which allows - * introspecting the blob before sending - * @return {Raven} - */ - setShouldSendCallback: function setShouldSendCallback(callback) { - var original = this._globalOptions.shouldSendCallback; - this._globalOptions.shouldSendCallback = keepOriginalCallback(original, callback); - return this; - }, - - /** - * Override the default HTTP transport mechanism that transmits data - * to the Sentry server. - * - * @param {function} transport Function invoked instead of the default - * `makeRequest` handler. - * - * @return {Raven} - */ - setTransport: function setTransport(transport) { - this._globalOptions.transport = transport; - return this; - }, - - /* - * Get the latest raw exception that was captured by Raven. - * - * @return {error} - */ - lastException: function lastException() { - return this._lastCapturedException; - }, - - /* - * Get the last event id - * - * @return {string} - */ - lastEventId: function lastEventId() { - return this._lastEventId; - }, - - /* - * Determine if Raven is setup and ready to go. - * - * @return {boolean} - */ - isSetup: function isSetup() { - if (!this._hasJSON) return false; // needs JSON support - - if (!this._globalServer) { - if (!this.ravenNotConfiguredError) { - this.ravenNotConfiguredError = true; - - this._logDebug('error', 'Error: Raven has not been configured.'); - } - - return false; - } - - return true; - }, - afterLoad: function afterLoad() { - // TODO: remove window dependence? - // Attempt to initialize Raven on load - var RavenConfig = _window$2.RavenConfig; - - if (RavenConfig) { - this.config(RavenConfig.dsn, RavenConfig.config).install(); - } - }, - showReportDialog: function showReportDialog(options) { - if (!_document // doesn't work without a document (React native) - ) return; - options = objectMerge$1({ - eventId: this.lastEventId(), - dsn: this._dsn, - user: this._globalContext.user || {} - }, options); - - if (!options.eventId) { - throw new configError('Missing eventId'); - } - - if (!options.dsn) { - throw new configError('Missing DSN'); - } - - var encode = encodeURIComponent; - var encodedOptions = []; - - for (var key in options) { - if (key === 'user') { - var user = options.user; - if (user.name) encodedOptions.push('name=' + encode(user.name)); - if (user.email) encodedOptions.push('email=' + encode(user.email)); - } else { - encodedOptions.push(encode(key) + '=' + encode(options[key])); - } - } - - var globalServer = this._getGlobalServer(this._parseDSN(options.dsn)); - - var script = _document.createElement('script'); - - script.async = true; - script.src = globalServer + '/api/embed/error-page/?' + encodedOptions.join('&'); - - (_document.head || _document.body).appendChild(script); - }, - - /**** Private functions ****/ - _ignoreNextOnError: function _ignoreNextOnError() { - var self = this; - this._ignoreOnError += 1; - setTimeout(function () { - // onerror should trigger before setTimeout - self._ignoreOnError -= 1; - }); - }, - _triggerEvent: function _triggerEvent(eventType, options) { - // NOTE: `event` is a native browser thing, so let's avoid conflicting wiht it - var evt, key; - if (!this._hasDocument) return; - options = options || {}; - eventType = 'raven' + eventType.substr(0, 1).toUpperCase() + eventType.substr(1); - - if (_document.createEvent) { - evt = _document.createEvent('HTMLEvents'); - evt.initEvent(eventType, true, true); - } else { - evt = _document.createEventObject(); - evt.eventType = eventType; - } - - for (key in options) { - if (hasKey$1(options, key)) { - evt[key] = options[key]; - } - } - - if (_document.createEvent) { - // IE9 if standards - _document.dispatchEvent(evt); - } else { - // IE8 regardless of Quirks or Standards - // IE9 if quirks - try { - _document.fireEvent('on' + evt.eventType.toLowerCase(), evt); - } catch (e) {// Do nothing - } - } - }, - - /** - * Wraps addEventListener to capture UI breadcrumbs - * @param evtName the event name (e.g. "click") - * @returns {Function} - * @private - */ - _breadcrumbEventHandler: function _breadcrumbEventHandler(evtName) { - var self = this; - return function (evt) { - // reset keypress timeout; e.g. triggering a 'click' after - // a 'keypress' will reset the keypress debounce so that a new - // set of keypresses can be recorded - self._keypressTimeout = null; // It's possible this handler might trigger multiple times for the same - // event (e.g. event propagation through node ancestors). Ignore if we've - // already captured the event. - - if (self._lastCapturedEvent === evt) return; - self._lastCapturedEvent = evt; // try/catch both: - // - accessing evt.target (see getsentry/raven-js#838, #768) - // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly - // can throw an exception in some circumstances. - - var target; - - try { - target = htmlTreeAsString$1(evt.target); - } catch (e) { - target = ''; - } - - self.captureBreadcrumb({ - category: 'ui.' + evtName, - // e.g. ui.click, ui.input - message: target - }); - }; - }, - - /** - * Wraps addEventListener to capture keypress UI events - * @returns {Function} - * @private - */ - _keypressEventHandler: function _keypressEventHandler() { - var self = this, - debounceDuration = 1000; // milliseconds - // TODO: if somehow user switches keypress target before - // debounce timeout is triggered, we will only capture - // a single breadcrumb from the FIRST target (acceptable?) - - return function (evt) { - var target; - - try { - target = evt.target; - } catch (e) { - // just accessing event properties can throw an exception in some rare circumstances - // see: https://github.com/getsentry/raven-js/issues/838 - return; - } - - var tagName = target && target.tagName; // only consider keypress events on actual input elements - // this will disregard keypresses targeting body (e.g. tabbing - // through elements, hotkeys, etc) - - if (!tagName || tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable) return; // record first keypress in a series, but ignore subsequent - // keypresses until debounce clears - - var timeout = self._keypressTimeout; - - if (!timeout) { - self._breadcrumbEventHandler('input')(evt); - } - - clearTimeout(timeout); - self._keypressTimeout = setTimeout(function () { - self._keypressTimeout = null; - }, debounceDuration); - }; - }, - - /** - * Captures a breadcrumb of type "navigation", normalizing input URLs - * @param to the originating URL - * @param from the target URL - * @private - */ - _captureUrlChange: function _captureUrlChange(from, to) { - var parsedLoc = parseUrl$1(this._location.href); - var parsedTo = parseUrl$1(to); - var parsedFrom = parseUrl$1(from); // because onpopstate only tells you the "new" (to) value of location.href, and - // not the previous (from) value, we need to track the value of the current URL - // state ourselves - - this._lastHref = to; // Use only the path component of the URL if the URL matches the current - // document (almost all the time when using pushState) - - if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) to = parsedTo.relative; - if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) from = parsedFrom.relative; - this.captureBreadcrumb({ - category: 'navigation', - data: { - to: to, - from: from - } - }); - }, - _patchFunctionToString: function _patchFunctionToString() { - var self = this; - self._originalFunctionToString = Function.prototype.toString; // eslint-disable-next-line no-extend-native - - Function.prototype.toString = function () { - if (typeof this === 'function' && this.__raven__) { - return self._originalFunctionToString.apply(this.__orig__, arguments); - } - - return self._originalFunctionToString.apply(this, arguments); - }; - }, - _unpatchFunctionToString: function _unpatchFunctionToString() { - if (this._originalFunctionToString) { - // eslint-disable-next-line no-extend-native - Function.prototype.toString = this._originalFunctionToString; - } - }, - - /** - * Wrap timer functions and event targets to catch errors and provide - * better metadata. - */ - _instrumentTryCatch: function _instrumentTryCatch() { - var self = this; - var wrappedBuiltIns = self._wrappedBuiltIns; - - function wrapTimeFn(orig) { - return function (fn, t) { - // preserve arity - // Make a copy of the arguments to prevent deoptimization - // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments - var args = new Array(arguments.length); - - for (var i = 0; i < args.length; ++i) { - args[i] = arguments[i]; - } - - var originalCallback = args[0]; - - if (isFunction$1(originalCallback)) { - args[0] = self.wrap({ - mechanism: { - type: 'instrument', - data: { - function: orig.name || '' - } - } - }, originalCallback); - } // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it - // also supports only two arguments and doesn't care what this is, so we - // can just call the original function directly. - - - if (orig.apply) { - return orig.apply(this, args); - } else { - return orig(args[0], args[1]); - } - }; - } - - var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs; - - function wrapEventTarget(global) { - var proto = _window$2[global] && _window$2[global].prototype; - - if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) { - fill$1(proto, 'addEventListener', function (orig) { - return function (evtName, fn, capture, secure) { - // preserve arity - try { - if (fn && fn.handleEvent) { - fn.handleEvent = self.wrap({ - mechanism: { - type: 'instrument', - data: { - target: global, - function: 'handleEvent', - handler: fn && fn.name || '' - } - } - }, fn.handleEvent); - } - } catch (err) {} // can sometimes get 'Permission denied to access property "handle Event' - // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs` - // so that we don't have more than one wrapper function - - - var before, clickHandler, keypressHandler; - - if (autoBreadcrumbs && autoBreadcrumbs.dom && (global === 'EventTarget' || global === 'Node')) { - // NOTE: generating multiple handlers per addEventListener invocation, should - // revisit and verify we can just use one (almost certainly) - clickHandler = self._breadcrumbEventHandler('click'); - keypressHandler = self._keypressEventHandler(); - - before = function before(evt) { - // need to intercept every DOM event in `before` argument, in case that - // same wrapped method is re-used for different events (e.g. mousemove THEN click) - // see #724 - if (!evt) return; - var eventType; - - try { - eventType = evt.type; - } catch (e) { - // just accessing event properties can throw an exception in some rare circumstances - // see: https://github.com/getsentry/raven-js/issues/838 - return; - } - - if (eventType === 'click') return clickHandler(evt);else if (eventType === 'keypress') return keypressHandler(evt); - }; - } - - return orig.call(this, evtName, self.wrap({ - mechanism: { - type: 'instrument', - data: { - target: global, - function: 'addEventListener', - handler: fn && fn.name || '' - } - } - }, fn, before), capture, secure); - }; - }, wrappedBuiltIns); - fill$1(proto, 'removeEventListener', function (orig) { - return function (evt, fn, capture, secure) { - try { - fn = fn && (fn.__raven_wrapper__ ? fn.__raven_wrapper__ : fn); - } catch (e) {// ignore, accessing __raven_wrapper__ will throw in some Selenium environments - } - - return orig.call(this, evt, fn, capture, secure); - }; - }, wrappedBuiltIns); - } - } - - fill$1(_window$2, 'setTimeout', wrapTimeFn, wrappedBuiltIns); - fill$1(_window$2, 'setInterval', wrapTimeFn, wrappedBuiltIns); - - if (_window$2.requestAnimationFrame) { - fill$1(_window$2, 'requestAnimationFrame', function (orig) { - return function (cb) { - return orig(self.wrap({ - mechanism: { - type: 'instrument', - data: { - function: 'requestAnimationFrame', - handler: orig && orig.name || '' - } - } - }, cb)); - }; - }, wrappedBuiltIns); - } // event targets borrowed from bugsnag-js: - // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666 - - - var eventTargets = ['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']; - - for (var i = 0; i < eventTargets.length; i++) { - wrapEventTarget(eventTargets[i]); - } - }, - - /** - * Instrument browser built-ins w/ breadcrumb capturing - * - XMLHttpRequests - * - DOM interactions (click/typing) - * - window.location changes - * - console - * - * Can be disabled or individually configured via the `autoBreadcrumbs` config option - */ - _instrumentBreadcrumbs: function _instrumentBreadcrumbs() { - var self = this; - var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs; - var wrappedBuiltIns = self._wrappedBuiltIns; - - function wrapProp(prop, xhr) { - if (prop in xhr && isFunction$1(xhr[prop])) { - fill$1(xhr, prop, function (orig) { - return self.wrap({ - mechanism: { - type: 'instrument', - data: { - function: prop, - handler: orig && orig.name || '' - } - } - }, orig); - }); // intentionally don't track filled methods on XHR instances - } - } - - if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window$2) { - var xhrproto = _window$2.XMLHttpRequest && _window$2.XMLHttpRequest.prototype; - fill$1(xhrproto, 'open', function (origOpen) { - return function (method, url) { - // preserve arity - // if Sentry key appears in URL, don't capture - if (isString$1(url) && url.indexOf(self._globalKey) === -1) { - this.__raven_xhr = { - method: method, - url: url, - status_code: null - }; - } - - return origOpen.apply(this, arguments); - }; - }, wrappedBuiltIns); - fill$1(xhrproto, 'send', function (origSend) { - return function () { - // preserve arity - var xhr = this; - - function onreadystatechangeHandler() { - if (xhr.__raven_xhr && xhr.readyState === 4) { - try { - // touching statusCode in some platforms throws - // an exception - xhr.__raven_xhr.status_code = xhr.status; - } catch (e) { - /* do nothing */ - } - - self.captureBreadcrumb({ - type: 'http', - category: 'xhr', - data: xhr.__raven_xhr - }); - } - } - - var props = ['onload', 'onerror', 'onprogress']; - - for (var j = 0; j < props.length; j++) { - wrapProp(props[j], xhr); - } - - if ('onreadystatechange' in xhr && isFunction$1(xhr.onreadystatechange)) { - fill$1(xhr, 'onreadystatechange', function (orig) { - return self.wrap({ - mechanism: { - type: 'instrument', - data: { - function: 'onreadystatechange', - handler: orig && orig.name || '' - } - } - }, orig, onreadystatechangeHandler); - } - /* intentionally don't track this instrumentation */ - ); - } else { - // if onreadystatechange wasn't actually set by the page on this xhr, we - // are free to set our own and capture the breadcrumb - xhr.onreadystatechange = onreadystatechangeHandler; - } - - return origSend.apply(this, arguments); - }; - }, wrappedBuiltIns); - } - - if (autoBreadcrumbs.xhr && supportsFetch$1()) { - fill$1(_window$2, 'fetch', function (origFetch) { - return function () { - // preserve arity - // Make a copy of the arguments to prevent deoptimization - // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments - var args = new Array(arguments.length); - - for (var i = 0; i < args.length; ++i) { - args[i] = arguments[i]; - } - - var fetchInput = args[0]; - var method = 'GET'; - var url; - - if (typeof fetchInput === 'string') { - url = fetchInput; - } else if ('Request' in _window$2 && fetchInput instanceof _window$2.Request) { - url = fetchInput.url; - - if (fetchInput.method) { - method = fetchInput.method; - } - } else { - url = '' + fetchInput; - } // if Sentry key appears in URL, don't capture, as it's our own request - - - if (url.indexOf(self._globalKey) !== -1) { - return origFetch.apply(this, args); - } - - if (args[1] && args[1].method) { - method = args[1].method; - } - - var fetchData = { - method: method, - url: url, - status_code: null - }; - return origFetch.apply(this, args).then(function (response) { - fetchData.status_code = response.status; - self.captureBreadcrumb({ - type: 'http', - category: 'fetch', - data: fetchData - }); - return response; - })['catch'](function (err) { - // if there is an error performing the request - self.captureBreadcrumb({ - type: 'http', - category: 'fetch', - data: fetchData, - level: 'error' - }); - throw err; + if (status === Status.Success) { + resolve({ + status: status }); - }; - }, wrappedBuiltIns); - } // Capture breadcrumbs from any click that is unhandled / bubbled up all the way - // to the document. Do this before we instrument addEventListener. - - - if (autoBreadcrumbs.dom && this._hasDocument) { - if (_document.addEventListener) { - _document.addEventListener('click', self._breadcrumbEventHandler('click'), false); - - _document.addEventListener('keypress', self._keypressEventHandler(), false); - } else if (_document.attachEvent) { - // IE8 Compatibility - _document.attachEvent('onclick', self._breadcrumbEventHandler('click')); - - _document.attachEvent('onkeypress', self._keypressEventHandler()); - } - } // record navigation (URL) changes - // NOTE: in Chrome App environment, touching history.pushState, *even inside - // a try/catch block*, will cause Chrome to output an error to console.error - // borrowed from: https://github.com/angular/angular.js/pull/13945/files - - - var chrome = _window$2.chrome; - var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime; - var hasPushAndReplaceState = !isChromePackagedApp && _window$2.history && _window$2.history.pushState && _window$2.history.replaceState; - - if (autoBreadcrumbs.location && hasPushAndReplaceState) { - // TODO: remove onpopstate handler on uninstall() - var oldOnPopState = _window$2.onpopstate; - - _window$2.onpopstate = function () { - var currentHref = self._location.href; - - self._captureUrlChange(self._lastHref, currentHref); - - if (oldOnPopState) { - return oldOnPopState.apply(this, arguments); + return; } - }; - var historyReplacementFunction = function historyReplacementFunction(origHistFunction) { - // note history.pushState.length is 0; intentionally not declaring - // params to preserve 0 arity - return function () - /* state, title, url */ - { - var url = arguments.length > 2 ? arguments[2] : undefined; // url argument is optional - - if (url) { - // coerce to string (this is what pushState does) - self._captureUrlChange(self._lastHref, url + ''); - } - - return origHistFunction.apply(this, arguments); - }; - }; - - fill$1(_window$2.history, 'pushState', historyReplacementFunction, wrappedBuiltIns); - fill$1(_window$2.history, 'replaceState', historyReplacementFunction, wrappedBuiltIns); - } - - if (autoBreadcrumbs.console && 'console' in _window$2 && console.log) { - // console - var consoleMethodCallback = function consoleMethodCallback(msg, data) { - self.captureBreadcrumb({ - message: msg, - level: data.level, - category: 'console' - }); - }; - - each$1(['debug', 'info', 'warn', 'error', 'log'], function (_, level) { - wrapConsoleMethod(console, level, consoleMethodCallback); - }); - } - }, - _restoreBuiltIns: function _restoreBuiltIns() { - // 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; - } - }, - _restoreConsole: function _restoreConsole() { - // eslint-disable-next-line guard-for-in - for (var method in this._originalConsoleMethods) { - this._originalConsole[method] = this._originalConsoleMethods[method]; - } - }, - _drainPlugins: function _drainPlugins() { - var self = this; // FIX ME TODO - - each$1(this._plugins, function (_, plugin) { - var installer = plugin[0]; - var args = plugin[1]; - installer.apply(self, [self].concat(args)); - }); - }, - _parseDSN: function _parseDSN(str) { - var m = dsnPattern.exec(str), - dsn = {}, - i = 7; - - try { - while (i--) { - dsn[dsnKeys[i]] = m[i] || ''; - } - } catch (e) { - throw new configError('Invalid DSN: ' + str); - } - - if (dsn.pass && !this._globalOptions.allowSecretKey) { - throw new configError('Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key'); - } - - return dsn; - }, - _getGlobalServer: function _getGlobalServer(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 _handleOnErrorStackInfo(stackInfo, options) { - options = options || {}; - options.mechanism = options.mechanism || { - type: 'onerror', - handled: false - }; // if we are intentionally ignoring errors via onerror, bail out - - if (!this._ignoreOnError) { - this._handleStackInfo(stackInfo, options); - } - }, - _handleStackInfo: function _handleStackInfo(stackInfo, options) { - var frames = this._prepareFrames(stackInfo, options); - - this._triggerEvent('handle', { - stackInfo: stackInfo, - options: options - }); - - this._processException(stackInfo.name, stackInfo.message, stackInfo.url, stackInfo.lineno, frames, options); - }, - _prepareFrames: function _prepareFrames(stackInfo, options) { - var self = this; - var frames = []; - - if (stackInfo.stack && stackInfo.stack.length) { - each$1(stackInfo.stack, function (i, stack) { - var frame = self._normalizeFrame(stack, stackInfo.url); - - if (frame) { - frames.push(frame); + if (status === Status.RateLimit) { + var now = Date.now(); + _this._disabledUntil = new Date(now + parseRetryAfterHeader(now, response.headers.get('Retry-After'))); + logger.warn("Too many requests, backing off till: " + _this._disabledUntil); } - }); // e.g. frames captured via captureMessage throw - if (options && options.trimHeadFrames) { - for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) { - frames[j].in_app = false; - } - } - } + reject(response); + }).catch(reject); + })); + }; - frames = frames.slice(0, this._globalOptions.stackTraceLimit); - return frames; - }, - _normalizeFrame: function _normalizeFrame(frame, stackInfoUrl) { - // normalize the frames data - var normalized = { - filename: frame.url, - lineno: frame.line, - colno: frame.column, - function: frame.func || '?' - }; // Case when we don't have any information about the error - // E.g. throwing a string or raw object, instead of an `Error` in Firefox - // Generating synthetic error doesn't add any value here - // - // We should probably somehow let a user know that they should fix their code + return FetchTransport; + }(BaseTransport); - if (!frame.url) { - normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler - } + /** `XHR` based transport */ - normalized.in_app = !( // determine if an exception came from outside of our app - // first we check the global includePaths list. - !!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']) || // finally, we do a last ditch effort and check for raven.min.js - /raven\.(min\.)?js$/.test(normalized.filename)); - return normalized; - }, - _processException: function _processException(type, message, fileurl, lineno, frames, options) { - var prefixedMessage = (type ? type + ': ' : '') + (message || ''); + var XHRTransport = + /** @class */ + function (_super) { + __extends(XHRTransport, _super); - if (!!this._globalOptions.ignoreErrors.test && (this._globalOptions.ignoreErrors.test(message) || this._globalOptions.ignoreErrors.test(prefixedMessage))) { - return; - } - - var stacktrace; - - if (frames && frames.length) { - fileurl = frames[0].filename || fileurl; // Sentry expects frames oldest to newest - // and JS sends them as newest to oldest - - frames.reverse(); - stacktrace = { - frames: frames - }; - } else if (fileurl) { - stacktrace = { - frames: [{ - filename: fileurl, - lineno: lineno, - in_app: true - }] - }; - } - - if (!!this._globalOptions.ignoreUrls.test && this._globalOptions.ignoreUrls.test(fileurl)) { - return; - } - - if (!!this._globalOptions.whitelistUrls.test && !this._globalOptions.whitelistUrls.test(fileurl)) { - return; - } - - var data = objectMerge$1({ - // sentry.interfaces.Exception - exception: { - values: [{ - type: type, - value: message, - stacktrace: stacktrace - }] - }, - transaction: fileurl - }, options); - var ex = data.exception.values[0]; - - if (ex.type == null && ex.value === '') { - ex.value = 'Unrecoverable error caught'; - } // Move mechanism from options to exception interface - // We do this, as requiring user to pass `{exception:{mechanism:{ ... }}}` would be - // too much + function XHRTransport() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** Locks transport after receiving 429 response */ - if (!data.exception.mechanism && data.mechanism) { - data.exception.mechanism = data.mechanism; - delete data.mechanism; - } - - data.exception.mechanism = objectMerge$1({ - type: 'generic', - handled: true - }, data.exception.mechanism || {}); // Fire away! - - this._send(data); - }, - _trimPacket: function _trimPacket(data) { - // For now, we only want to truncate the two different messages - // but this could/should be expanded to just trim everything - var max = this._globalOptions.maxMessageLength; - - if (data.message) { - data.message = truncate$1(data.message, max); - } - - if (data.exception) { - var exception = data.exception.values[0]; - exception.value = truncate$1(exception.value, max); - } - - var request = data.request; - - if (request) { - if (request.url) { - request.url = truncate$1(request.url, this._globalOptions.maxUrlLength); - } - - if (request.Referer) { - request.Referer = truncate$1(request.Referer, this._globalOptions.maxUrlLength); - } - } - - if (data.breadcrumbs && data.breadcrumbs.values) this._trimBreadcrumbs(data.breadcrumbs); - return data; - }, - + _this._disabledUntil = new Date(Date.now()); + return _this; + } /** - * Truncate breadcrumb values (right now just URLs) + * @inheritDoc */ - _trimBreadcrumbs: function _trimBreadcrumbs(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$2(crumb.data) || objectFrozen$1(crumb.data)) continue; - data = objectMerge$1({}, crumb.data); - - for (var j = 0; j < urlProps.length; ++j) { - urlProp = urlProps[j]; - - if (data.hasOwnProperty(urlProp) && data[urlProp]) { - data[urlProp] = truncate$1(data[urlProp], this._globalOptions.maxUrlLength); - } - } - - breadcrumbs.values[i].data = data; - } - }, - _getHttpData: function _getHttpData() { - if (!this._hasNavigator && !this._hasDocument) return; - var httpData = {}; - - if (this._hasNavigator && _navigator.userAgent) { - httpData.headers = { - 'User-Agent': _navigator.userAgent - }; - } // Check in `window` instead of `document`, as we may be in ServiceWorker environment - if (_window$2.location && _window$2.location.href) { - httpData.url = _window$2.location.href; - } - - if (this._hasDocument && _document.referrer) { - if (!httpData.headers) httpData.headers = {}; - httpData.headers.Referer = _document.referrer; - } - - return httpData; - }, - _resetBackoff: function _resetBackoff() { - this._backoffDuration = 0; - this._backoffStart = null; - }, - _shouldBackoff: function _shouldBackoff() { - return this._backoffDuration && now() - this._backoffStart < this._backoffDuration; - }, - - /** - * Returns true if the in-process data payload matches the signature - * of the previously-sent data - * - * NOTE: This has to be done at this level because TraceKit can generate - * data from window.onerror WITHOUT an exception object (IE8, IE9, - * other old browsers). This can take the form of an "exception" - * data object with a single frame (derived from the onerror args). - */ - _isRepeatData: function _isRepeatData(current) { - var last = this._lastData; - if (!last || current.message !== last.message || // defined for captureMessage - current.transaction !== last.transaction // defined for captureException/onerror - ) return false; // Stacktrace interface (i.e. from captureMessage) - - if (current.stacktrace || last.stacktrace) { - return isSameStacktrace$1(current.stacktrace, last.stacktrace); - } else if (current.exception || last.exception) { - // Exception interface (i.e. from captureException/onerror) - return isSameException$1(current.exception, last.exception); - } else if (current.fingerprint || last.fingerprint) { - return Boolean(current.fingerprint && last.fingerprint) && JSON.stringify(current.fingerprint) === JSON.stringify(last.fingerprint); - } - - return true; - }, - _setBackoffState: function _setBackoffState(request) { - // If we are already in a backoff state, don't change anything - if (this._shouldBackoff()) { - return; - } - - var status = request.status; // 400 - project_id doesn't exist or some other fatal - // 401 - invalid/revoked dsn - // 429 - too many requests - - if (!(status === 400 || status === 401 || status === 429)) return; - var retry; - - try { - // If Retry-After is not in Access-Control-Expose-Headers, most - // browsers will throw an exception trying to access it - if (supportsFetch$1()) { - retry = request.headers.get('Retry-After'); - } else { - retry = request.getResponseHeader('Retry-After'); - } // Retry-After is returned in seconds - - - retry = parseInt(retry, 10) * 1000; - } catch (e) { - /* eslint no-empty:0 */ - } - - this._backoffDuration = retry ? // If Sentry server returned a Retry-After value, use it - retry : // Otherwise, double the last backoff duration (starts at 1 sec) - this._backoffDuration * 2 || 1000; - this._backoffStart = now(); - }, - _send: function _send(data) { - var globalOptions = this._globalOptions; - - var baseData = { - project: this._globalProject, - logger: globalOptions.logger, - platform: 'javascript' - }, - httpData = this._getHttpData(); - - if (httpData) { - baseData.request = httpData; - } // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload - - - if (data.trimHeadFrames) delete data.trimHeadFrames; - data = objectMerge$1(baseData, data); // Merge in the tags and extra separately since objectMerge doesn't handle a deep merge - - data.tags = objectMerge$1(objectMerge$1({}, this._globalContext.tags), data.tags); - data.extra = objectMerge$1(objectMerge$1({}, this._globalContext.extra), data.extra); // Send along our own collected metadata with extra - - data.extra['session:duration'] = now() - this._startTime; - - if (this._breadcrumbs && this._breadcrumbs.length > 0) { - // intentionally make shallow copy so that additions - // to breadcrumbs aren't accidentally sent in this request - data.breadcrumbs = { - values: [].slice.call(this._breadcrumbs, 0) - }; - } - - if (this._globalContext.user) { - // sentry.interfaces.User - data.user = this._globalContext.user; - } // Include the environment if it's defined in globalOptions - - - if (globalOptions.environment) data.environment = globalOptions.environment; // Include the release if it's defined in globalOptions - - if (globalOptions.release) data.release = globalOptions.release; // Include server_name if it's defined in globalOptions - - if (globalOptions.serverName) data.server_name = globalOptions.serverName; - data = this._sanitizeData(data); // Cleanup empty properties before sending them to the server - - Object.keys(data).forEach(function (key) { - if (data[key] == null || data[key] === '' || isEmptyObject$1(data[key])) { - delete data[key]; - } - }); - - if (isFunction$1(globalOptions.dataCallback)) { - data = globalOptions.dataCallback(data) || data; - } // Why?????????? - - - if (!data || isEmptyObject$1(data)) { - return; - } // Check if the request should be filtered or not - - - if (isFunction$1(globalOptions.shouldSendCallback) && !globalOptions.shouldSendCallback(data)) { - return; - } // Backoff state: Sentry server previously responded w/ an error (e.g. 429 - too many requests), - // so drop requests until "cool-off" period has elapsed. - - - if (this._shouldBackoff()) { - this._logDebug('warn', 'Raven dropped error due to backoff: ', data); - - return; - } - - if (typeof globalOptions.sampleRate === 'number') { - if (Math.random() < globalOptions.sampleRate) { - this._sendProcessedPayload(data); - } - } else { - this._sendProcessedPayload(data); - } - }, - _sanitizeData: function _sanitizeData(data) { - return sanitize$1(data, this._globalOptions.sanitizeKeys); - }, - _getUuid: function _getUuid() { - return uuid4$1(); - }, - _sendProcessedPayload: function _sendProcessedPayload(data, callback) { - var self = this; - var globalOptions = this._globalOptions; - if (!this.isSetup()) return; // Try and clean up the packet before sending by truncating long values - - data = this._trimPacket(data); // ideally duplicate error testing should occur *before* dataCallback/shouldSendCallback, - // but this would require copying an un-truncated copy of the data packet, which can be - // arbitrarily deep (extra_data) -- could be worthwhile? will revisit - - if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) { - this._logDebug('warn', 'Raven dropped repeat event: ', data); - - return; - } // Send along an event_id if not explicitly passed. - // This event_id can be used to reference the error within Sentry itself. - // Set lastEventId after we know the error should actually be sent - - - this._lastEventId = data.event_id || (data.event_id = this._getUuid()); // Store outbound payload after trim - - this._lastData = data; - - this._logDebug('debug', 'Raven about to send:', data); - - var auth = { - sentry_version: '7', - sentry_client: 'raven-js/' + this.VERSION, - sentry_key: this._globalKey - }; - - if (this._globalSecret) { - auth.sentry_secret = this._globalSecret; - } - - var exception = data.exception && data.exception.values[0]; // only capture 'sentry' breadcrumb is autoBreadcrumbs is truthy - - if (this._globalOptions.autoBreadcrumbs && this._globalOptions.autoBreadcrumbs.sentry) { - this.captureBreadcrumb({ - category: 'sentry', - message: exception ? (exception.type ? exception.type + ': ' : '') + exception.value : data.message, - event_id: data.event_id, - level: data.level || 'error' // presume error unless specified + XHRTransport.prototype.sendEvent = function (event) { + var _this = this; + if (new Date(Date.now()) < this._disabledUntil) { + return Promise.reject({ + event: event, + reason: "Transport locked till " + this._disabledUntil + " due to too many requests.", + status: 429 }); } - var url = this._globalEndpoint; + return this._buffer.add(new SyncPromise(function (resolve, reject) { + var request = new XMLHttpRequest(); - (globalOptions.transport || this._makeRequest).call(this, { - url: url, - auth: auth, - data: data, - options: globalOptions, - onSuccess: function success() { - self._resetBackoff(); - - self._triggerEvent('success', { - data: data, - src: url - }); - - callback && callback(); - }, - onError: function failure(error) { - self._logDebug('error', 'Raven transport failed to send: ', error); - - if (error.request) { - self._setBackoffState(error.request); - } - - self._triggerEvent('failure', { - data: data, - src: url - }); - - error = error || new Error('Raven send failed (no additional details provided)'); - callback && callback(error); - } - }); - }, - _makeRequest: function _makeRequest(opts) { - // Auth is intentionally sent as part of query string (NOT as custom HTTP header) to avoid preflight CORS requests - var url = opts.url + '?' + urlencode$1(opts.auth); - var evaluatedHeaders = null; - var evaluatedFetchParameters = {}; - - if (opts.options.headers) { - evaluatedHeaders = this._evaluateHash(opts.options.headers); - } - - if (opts.options.fetchParameters) { - evaluatedFetchParameters = this._evaluateHash(opts.options.fetchParameters); - } - - if (supportsFetch$1()) { - evaluatedFetchParameters.body = stringify_1(opts.data); - var defaultFetchOptions = objectMerge$1({}, this._fetchDefaults); - var fetchOptions = objectMerge$1(defaultFetchOptions, evaluatedFetchParameters); - - if (evaluatedHeaders) { - fetchOptions.headers = evaluatedHeaders; - } - - return _window$2.fetch(url, fetchOptions).then(function (response) { - if (response.ok) { - opts.onSuccess && opts.onSuccess(); - } else { - var error = new Error('Sentry error code: ' + response.status); // It's called request only to keep compatibility with XHR interface - // and not add more redundant checks in setBackoffState method - - error.request = response; - opts.onError && opts.onError(error); - } - })['catch'](function () { - opts.onError && opts.onError(new Error('Sentry error code: network unavailable')); - }); - } - - var request = _window$2.XMLHttpRequest && new _window$2.XMLHttpRequest(); - if (!request) return; // if browser doesn't support CORS (e.g. IE7), we are out of luck - - var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined'; - if (!hasCORS) return; - - if ('withCredentials' in request) { request.onreadystatechange = function () { if (request.readyState !== 4) { return; - } else if (request.status === 200) { - opts.onSuccess && opts.onSuccess(); - } else if (opts.onError) { - var err = new Error('Sentry error code: ' + request.status); - err.request = request; - opts.onError(err); } + + var status = Status.fromHttpCode(request.status); + + if (status === Status.Success) { + resolve({ + status: status + }); + return; + } + + if (status === Status.RateLimit) { + var now = Date.now(); + _this._disabledUntil = new Date(now + parseRetryAfterHeader(now, request.getResponseHeader('Retry-After'))); + logger.warn("Too many requests, backing off till: " + _this._disabledUntil); + } + + reject(request); }; - } else { - request = new XDomainRequest(); // xdomainrequest cannot go http -> https (or vice versa), - // so always use protocol relative - url = url.replace(/^https?:/, ''); // onreadystatechange not supported by XDomainRequest + request.open('POST', _this.url); - if (opts.onSuccess) { - request.onload = opts.onSuccess; + for (var header in _this.options.headers) { + if (_this.options.headers.hasOwnProperty(header)) { + request.setRequestHeader(header, _this.options.headers[header]); + } } - if (opts.onError) { - request.onerror = function () { - var err = new Error('Sentry error code: XDomainRequest'); - err.request = request; - opts.onError(err); - }; + request.send(JSON.stringify(event)); + })); + }; + + return XHRTransport; + }(BaseTransport); + + /** + * The Sentry Browser SDK Backend. + * @hidden + */ + + var BrowserBackend = + /** @class */ + function (_super) { + __extends(BrowserBackend, _super); + + function BrowserBackend() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @inheritDoc + */ + + + BrowserBackend.prototype._setupTransport = function () { + if (!this._options.dsn) { + // We return the noop transport here in case there is no Dsn. + return _super.prototype._setupTransport.call(this); + } + + var transportOptions = _assign({}, this._options.transportOptions, { + dsn: this._options.dsn + }); + + if (this._options.transport) { + return new this._options.transport(transportOptions); + } + + if (supportsFetch()) { + return new FetchTransport(transportOptions); + } + + return new XHRTransport(transportOptions); + }; + /** + * @inheritDoc + */ + + + BrowserBackend.prototype.eventFromException = function (exception, hint) { + var syntheticException = hint && hint.syntheticException || undefined; + var event = eventFromUnknownInput(exception, syntheticException, { + attachStacktrace: this._options.attachStacktrace + }); + addExceptionMechanism(event, { + handled: true, + type: 'generic' + }); + event.level = Severity.Error; + + if (hint && hint.event_id) { + event.event_id = hint.event_id; + } + + return SyncPromise.resolve(event); + }; + /** + * @inheritDoc + */ + + + BrowserBackend.prototype.eventFromMessage = function (message, level, hint) { + if (level === void 0) { + level = Severity.Info; + } + + var syntheticException = hint && hint.syntheticException || undefined; + var event = eventFromString(message, syntheticException, { + attachStacktrace: this._options.attachStacktrace + }); + event.level = level; + + if (hint && hint.event_id) { + event.event_id = hint.event_id; + } + + return SyncPromise.resolve(event); + }; + + return BrowserBackend; + }(BaseBackend); + + var SDK_NAME = 'sentry.javascript.browser'; + var SDK_VERSION = '5.15.4'; + + /** + * The Sentry Browser SDK Client. + * + * @see BrowserOptions for documentation on configuration options. + * @see SentryClient for usage documentation. + */ + + var BrowserClient = + /** @class */ + function (_super) { + __extends(BrowserClient, _super); + /** + * Creates a new Browser SDK instance. + * + * @param options Configuration options for this SDK. + */ + + + function BrowserClient(options) { + if (options === void 0) { + options = {}; + } + + return _super.call(this, BrowserBackend, options) || this; + } + /** + * @inheritDoc + */ + + + BrowserClient.prototype._prepareEvent = function (event, scope, hint) { + event.platform = event.platform || 'javascript'; + event.sdk = _assign({}, event.sdk, { + name: SDK_NAME, + packages: __spread(event.sdk && event.sdk.packages || [], [{ + name: 'npm:@sentry/browser', + version: SDK_VERSION + }]), + version: SDK_VERSION + }); + return _super.prototype._prepareEvent.call(this, event, scope, hint); + }; + /** + * Show a report dialog to the user to send feedback to a specific event. + * + * @param options Set individual options for the dialog + */ + + + BrowserClient.prototype.showReportDialog = function (options) { + if (options === void 0) { + options = {}; + } // doesn't work without a document (React Native) + + + var document = getGlobalObject().document; + + if (!document) { + return; + } + + if (!this._isEnabled()) { + logger.error('Trying to call showReportDialog with Sentry Client is disabled'); + return; + } + + var dsn = options.dsn || this.getDsn(); + + if (!options.eventId) { + logger.error('Missing `eventId` option in showReportDialog call'); + return; + } + + if (!dsn) { + logger.error('Missing `Dsn` option in showReportDialog call'); + return; + } + + var script = document.createElement('script'); + script.async = true; + script.src = new API(dsn).getReportDialogEndpoint(options); + + if (options.onLoad) { + script.onload = options.onLoad; + } + + (document.head || document.body).appendChild(script); + }; + + return BrowserClient; + }(BaseClient); + + var ignoreOnError = 0; + /** + * @hidden + */ + + function shouldIgnoreOnError() { + return ignoreOnError > 0; + } + /** + * @hidden + */ + + function ignoreNextOnError() { + // onerror should trigger before setTimeout + ignoreOnError += 1; + setTimeout(function () { + ignoreOnError -= 1; + }); + } + /** + * Instruments the given function and sends an event to Sentry every time the + * function throws an exception. + * + * @param fn A function to wrap. + * @returns The wrapped function. + * @hidden + */ + + function wrap$1(fn, options, before) { + if (options === void 0) { + options = {}; + } // tslint:disable-next-line:strict-type-predicates + + + if (typeof fn !== 'function') { + return fn; + } + + try { + // We don't wanna wrap it twice + if (fn.__sentry__) { + return fn; + } // If this has already been wrapped in the past, return that wrapped function + + + if (fn.__sentry_wrapped__) { + return fn.__sentry_wrapped__; + } + } catch (e) { + // Just accessing custom props in some Selenium environments + // can cause a "Permission denied" exception (see raven-js#495). + // Bail on wrapping and return the function as-is (defers to window.onerror). + return fn; + } + + var sentryWrapped = function sentryWrapped() { + var args = Array.prototype.slice.call(arguments); // tslint:disable:no-unsafe-any + + try { + // tslint:disable-next-line:strict-type-predicates + if (before && typeof before === 'function') { + before.apply(this, arguments); + } + + var wrappedArguments = args.map(function (arg) { + return wrap$1(arg, options); + }); + + if (fn.handleEvent) { + // Attempt to invoke user-land function + // NOTE: If you are a Sentry user, and you are seeing this stack frame, it + // means the sentry.javascript SDK caught an error invoking your application code. This + // is expected behavior and NOT indicative of a bug with sentry.javascript. + return fn.handleEvent.apply(this, wrappedArguments); + } // Attempt to invoke user-land function + // NOTE: If you are a Sentry user, and you are seeing this stack frame, it + // means the sentry.javascript SDK caught an error invoking your application code. This + // is expected behavior and NOT indicative of a bug with sentry.javascript. + + + return fn.apply(this, wrappedArguments); // tslint:enable:no-unsafe-any + } catch (ex) { + ignoreNextOnError(); + withScope(function (scope) { + scope.addEventProcessor(function (event) { + var processedEvent = _assign({}, event); + + if (options.mechanism) { + addExceptionTypeValue(processedEvent, undefined, undefined); + addExceptionMechanism(processedEvent, options.mechanism); + } + + processedEvent.extra = _assign({}, processedEvent.extra, { + arguments: args + }); + return processedEvent; + }); + captureException(ex); + }); + throw ex; + } + }; // Accessing some objects may throw + // ref: https://github.com/getsentry/sentry-javascript/issues/1168 + + + try { + for (var property in fn) { + if (Object.prototype.hasOwnProperty.call(fn, property)) { + sentryWrapped[property] = fn[property]; + } + } + } catch (_oO) {} // tslint:disable-line:no-empty + + + fn.prototype = fn.prototype || {}; + sentryWrapped.prototype = fn.prototype; + Object.defineProperty(fn, '__sentry_wrapped__', { + enumerable: false, + value: sentryWrapped + }); // Signal that this function has been wrapped/filled already + // for both debugging and to prevent it to being wrapped/filled twice + + Object.defineProperties(sentryWrapped, { + __sentry__: { + enumerable: false, + value: true + }, + __sentry_original__: { + enumerable: false, + value: fn + } + }); // Restore original function name (not all browsers allow that) + + try { + var descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name'); + + if (descriptor.configurable) { + Object.defineProperty(sentryWrapped, 'name', { + get: function get() { + return fn.name; + } + }); + } + } catch (_oO) { + /*no-empty*/ + } + + return sentryWrapped; + } + + /** Global handlers */ + + var GlobalHandlers = + /** @class */ + function () { + /** JSDoc */ + function GlobalHandlers(options) { + /** + * @inheritDoc + */ + this.name = GlobalHandlers.id; + /** JSDoc */ + + this._onErrorHandlerInstalled = false; + /** JSDoc */ + + this._onUnhandledRejectionHandlerInstalled = false; + this._options = _assign({ + onerror: true, + onunhandledrejection: true + }, options); + } + /** + * @inheritDoc + */ + + + GlobalHandlers.prototype.setupOnce = function () { + Error.stackTraceLimit = 50; + + if (this._options.onerror) { + logger.log('Global Handler attached: onerror'); + + this._installGlobalOnErrorHandler(); + } + + if (this._options.onunhandledrejection) { + logger.log('Global Handler attached: onunhandledrejection'); + + this._installGlobalOnUnhandledRejectionHandler(); + } + }; + /** JSDoc */ + + + GlobalHandlers.prototype._installGlobalOnErrorHandler = function () { + var _this = this; + + if (this._onErrorHandlerInstalled) { + return; + } + + addInstrumentationHandler({ + callback: function callback(data) { + var error = data.error; + var currentHub = getCurrentHub(); + var hasIntegration = currentHub.getIntegration(GlobalHandlers); + var isFailedOwnDelivery = error && error.__sentry_own_request__ === true; + + if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) { + return; + } + + var client = currentHub.getClient(); + var event = isPrimitive(error) ? _this._eventFromIncompleteOnError(data.msg, data.url, data.line, data.column) : _this._enhanceEventWithInitialFrame(eventFromUnknownInput(error, undefined, { + attachStacktrace: client && client.getOptions().attachStacktrace, + rejection: false + }), data.url, data.line, data.column); + addExceptionMechanism(event, { + handled: false, + type: 'onerror' + }); + currentHub.captureEvent(event, { + originalException: error + }); + }, + type: 'error' + }); + this._onErrorHandlerInstalled = true; + }; + /** JSDoc */ + + + GlobalHandlers.prototype._installGlobalOnUnhandledRejectionHandler = function () { + var _this = this; + + if (this._onUnhandledRejectionHandlerInstalled) { + return; + } + + addInstrumentationHandler({ + callback: function callback(e) { + var error = e; // dig the object of the rejection out of known event types + + try { + // PromiseRejectionEvents store the object of the rejection under 'reason' + // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent + if ('reason' in e) { + error = e.reason; + } // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents + // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into + // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec + // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and + // https://github.com/getsentry/sentry-javascript/issues/2380 + else if ('detail' in e && 'reason' in e.detail) { + error = e.detail.reason; + } + } catch (_oO) {// no-empty + } + + var currentHub = getCurrentHub(); + var hasIntegration = currentHub.getIntegration(GlobalHandlers); + var isFailedOwnDelivery = error && error.__sentry_own_request__ === true; + + if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) { + return true; + } + + var client = currentHub.getClient(); + var event = isPrimitive(error) ? _this._eventFromIncompleteRejection(error) : eventFromUnknownInput(error, undefined, { + attachStacktrace: client && client.getOptions().attachStacktrace, + rejection: true + }); + event.level = Severity.Error; + addExceptionMechanism(event, { + handled: false, + type: 'onunhandledrejection' + }); + currentHub.captureEvent(event, { + originalException: error + }); + return; + }, + type: 'unhandledrejection' + }); + this._onUnhandledRejectionHandlerInstalled = true; + }; + /** + * This function creates a stack from an old, error-less onerror handler. + */ + + + GlobalHandlers.prototype._eventFromIncompleteOnError = function (msg, url, line, column) { + var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i; // If 'message' is ErrorEvent, get real message from inside + + var message = isErrorEvent(msg) ? msg.message : msg; + var name; + + if (isString(message)) { + var groups = message.match(ERROR_TYPES_RE); + + if (groups) { + name = groups[1]; + message = groups[2]; } } - request.open('POST', url); + var event = { + exception: { + values: [{ + type: name || 'Error', + value: message + }] + } + }; + return this._enhanceEventWithInitialFrame(event, url, line, column); + }; + /** + * This function creates an Event from an TraceKitStackTrace that has part of it missing. + */ - if (evaluatedHeaders) { - each$1(evaluatedHeaders, function (key, value) { - request.setRequestHeader(key, value); + + GlobalHandlers.prototype._eventFromIncompleteRejection = function (error) { + return { + exception: { + values: [{ + type: 'UnhandledRejection', + value: "Non-Error promise rejection captured with value: " + error + }] + } + }; + }; + /** JSDoc */ + + + GlobalHandlers.prototype._enhanceEventWithInitialFrame = function (event, url, line, column) { + event.exception = event.exception || {}; + event.exception.values = event.exception.values || []; + event.exception.values[0] = event.exception.values[0] || {}; + event.exception.values[0].stacktrace = event.exception.values[0].stacktrace || {}; + event.exception.values[0].stacktrace.frames = event.exception.values[0].stacktrace.frames || []; + var colno = isNaN(parseInt(column, 10)) ? undefined : column; + var lineno = isNaN(parseInt(line, 10)) ? undefined : line; + var filename = isString(url) && url.length > 0 ? url : getLocationHref(); + + if (event.exception.values[0].stacktrace.frames.length === 0) { + event.exception.values[0].stacktrace.frames.push({ + colno: colno, + filename: filename, + function: '?', + in_app: true, + lineno: lineno }); } - request.send(stringify_1(opts.data)); - }, - _evaluateHash: function _evaluateHash(hash) { - var evaluated = {}; + return event; + }; + /** + * @inheritDoc + */ - for (var key in hash) { - if (hash.hasOwnProperty(key)) { - var value = hash[key]; - evaluated[key] = typeof value === 'function' ? value() : value; + + GlobalHandlers.id = 'GlobalHandlers'; + return GlobalHandlers; + }(); + + /** Wrap timer functions and event targets to catch errors and provide better meta data */ + + var TryCatch = + /** @class */ + function () { + function TryCatch() { + /** JSDoc */ + this._ignoreOnError = 0; + /** + * @inheritDoc + */ + + this.name = TryCatch.id; + } + /** JSDoc */ + + + TryCatch.prototype._wrapTimeFunction = function (original) { + return function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + var originalCallback = args[0]; + args[0] = wrap$1(originalCallback, { + mechanism: { + data: { + function: getFunctionName(original) + }, + handled: true, + type: 'instrument' + } + }); + return original.apply(this, args); + }; + }; + /** JSDoc */ + + + TryCatch.prototype._wrapRAF = function (original) { + return function (callback) { + return original(wrap$1(callback, { + mechanism: { + data: { + function: 'requestAnimationFrame', + handler: getFunctionName(original) + }, + handled: true, + type: 'instrument' + } + })); + }; + }; + /** JSDoc */ + + + TryCatch.prototype._wrapEventTarget = function (target) { + var global = getGlobalObject(); + var proto = global[target] && global[target].prototype; + + if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) { + return; + } + + fill(proto, 'addEventListener', function (original) { + return function (eventName, fn, options) { + try { + // tslint:disable-next-line:no-unbound-method strict-type-predicates + if (typeof fn.handleEvent === 'function') { + fn.handleEvent = wrap$1(fn.handleEvent.bind(fn), { + mechanism: { + data: { + function: 'handleEvent', + handler: getFunctionName(fn), + target: target + }, + handled: true, + type: 'instrument' + } + }); + } + } catch (err) {// can sometimes get 'Permission denied to access property "handle Event' + } + + return original.call(this, eventName, wrap$1(fn, { + mechanism: { + data: { + function: 'addEventListener', + handler: getFunctionName(fn), + target: target + }, + handled: true, + type: 'instrument' + } + }), options); + }; + }); + fill(proto, 'removeEventListener', function (original) { + return function (eventName, fn, options) { + var callback = fn; + + try { + callback = callback && (callback.__sentry_wrapped__ || callback); + } catch (e) {// ignore, accessing __sentry_wrapped__ will throw in some Selenium environments + } + + return original.call(this, eventName, callback, options); + }; + }); + }; + /** JSDoc */ + + + TryCatch.prototype._wrapXHR = function (originalSend) { + return function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + var xhr = this; // tslint:disable-line:no-this-assignment + + var xmlHttpRequestProps = ['onload', 'onerror', 'onprogress', 'onreadystatechange']; + xmlHttpRequestProps.forEach(function (prop) { + if (prop in xhr && typeof xhr[prop] === 'function') { + fill(xhr, prop, function (original) { + var wrapOptions = { + mechanism: { + data: { + function: prop, + handler: getFunctionName(original) + }, + handled: true, + type: 'instrument' + } + }; // If Instrument integration has been called before TryCatch, get the name of original function + + if (original.__sentry_original__) { + wrapOptions.mechanism.data.handler = getFunctionName(original.__sentry_original__); + } // Otherwise wrap directly + + + return wrap$1(original, wrapOptions); + }); + } + }); + return originalSend.apply(this, args); + }; + }; + /** + * Wrap timer functions and event targets to catch errors + * and provide better metadata. + */ + + + TryCatch.prototype.setupOnce = function () { + this._ignoreOnError = this._ignoreOnError; + var global = getGlobalObject(); + fill(global, 'setTimeout', this._wrapTimeFunction.bind(this)); + fill(global, 'setInterval', this._wrapTimeFunction.bind(this)); + fill(global, 'requestAnimationFrame', this._wrapRAF.bind(this)); + + if ('XMLHttpRequest' in global) { + fill(XMLHttpRequest.prototype, 'send', this._wrapXHR.bind(this)); + } + + ['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'].forEach(this._wrapEventTarget.bind(this)); + }; + /** + * @inheritDoc + */ + + + TryCatch.id = 'TryCatch'; + return TryCatch; + }(); + + /** + * Default Breadcrumbs instrumentations + * TODO: Deprecated - with v6, this will be renamed to `Instrument` + */ + + var Breadcrumbs = + /** @class */ + function () { + /** + * @inheritDoc + */ + function Breadcrumbs(options) { + /** + * @inheritDoc + */ + this.name = Breadcrumbs.id; + this._options = _assign({ + console: true, + dom: true, + fetch: true, + history: true, + sentry: true, + xhr: true + }, options); + } + /** + * Creates breadcrumbs from console API calls + */ + + + Breadcrumbs.prototype._consoleBreadcrumb = function (handlerData) { + var breadcrumb = { + category: 'console', + data: { + arguments: handlerData.args, + logger: 'console' + }, + level: Severity.fromString(handlerData.level), + message: safeJoin(handlerData.args, ' ') + }; + + if (handlerData.level === 'assert') { + if (handlerData.args[0] === false) { + breadcrumb.message = "Assertion failed: " + (safeJoin(handlerData.args.slice(1), ' ') || 'console.assert'); + breadcrumb.data.arguments = handlerData.args.slice(1); + } else { + // Don't capture a breadcrumb for passed assertions + return; } } - return evaluated; - }, - _logDebug: function _logDebug(level) { - // We allow `Raven.debug` and `Raven.config(DSN, { debug: true })` to not make backward incompatible API change - if (this._originalConsoleMethods[level] && (this.debug || this._globalOptions.debug)) { - // 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)); + getCurrentHub().addBreadcrumb(breadcrumb, { + input: handlerData.args, + level: handlerData.level + }); + }; + /** + * Creates breadcrumbs from DOM API calls + */ + + + Breadcrumbs.prototype._domBreadcrumb = function (handlerData) { + var target; // Accessing event.target can throw (see getsentry/raven-js#838, #768) + + try { + target = handlerData.event.target ? htmlTreeAsString(handlerData.event.target) : htmlTreeAsString(handlerData.event); + } catch (e) { + target = ''; } - }, - _mergeContext: function _mergeContext(key, context) { - if (isUndefined$1(context)) { - delete this._globalContext[key]; + + if (target.length === 0) { + return; + } + + getCurrentHub().addBreadcrumb({ + category: "ui." + handlerData.name, + message: target + }, { + event: handlerData.event, + name: handlerData.name + }); + }; + /** + * Creates breadcrumbs from XHR API calls + */ + + + Breadcrumbs.prototype._xhrBreadcrumb = function (handlerData) { + if (handlerData.endTimestamp) { + // We only capture complete, non-sentry requests + if (handlerData.xhr.__sentry_own_request__) { + return; + } + + getCurrentHub().addBreadcrumb({ + category: 'xhr', + data: handlerData.xhr.__sentry_xhr__, + type: 'http' + }, { + xhr: handlerData.xhr + }); + return; + } // We only capture issued sentry requests + + + if (this._options.sentry && handlerData.xhr.__sentry_own_request__) { + addSentryBreadcrumb(handlerData.args[0]); + } + }; + /** + * Creates breadcrumbs from fetch API calls + */ + + + Breadcrumbs.prototype._fetchBreadcrumb = function (handlerData) { + // We only capture complete fetch requests + if (!handlerData.endTimestamp) { + return; + } + + var client = getCurrentHub().getClient(); + var dsn = client && client.getDsn(); + + if (this._options.sentry && dsn) { + var filterUrl = new API(dsn).getStoreEndpoint(); // if Sentry key appears in URL, don't capture it as a request + // but rather as our own 'sentry' type breadcrumb + + if (filterUrl && handlerData.fetchData.url.indexOf(filterUrl) !== -1 && handlerData.fetchData.method === 'POST' && handlerData.args[1] && handlerData.args[1].body) { + addSentryBreadcrumb(handlerData.args[1].body); + return; + } + } + + if (handlerData.error) { + getCurrentHub().addBreadcrumb({ + category: 'fetch', + data: _assign({}, handlerData.fetchData, { + status_code: handlerData.response.status + }), + level: Severity.Error, + type: 'http' + }, { + data: handlerData.error, + input: handlerData.args + }); } else { - this._globalContext[key] = objectMerge$1(this._globalContext[key] || {}, context); + getCurrentHub().addBreadcrumb({ + category: 'fetch', + data: _assign({}, handlerData.fetchData, { + status_code: handlerData.response.status + }), + type: 'http' + }, { + input: handlerData.args, + response: handlerData.response + }); + } + }; + /** + * Creates breadcrumbs from history API calls + */ + + + Breadcrumbs.prototype._historyBreadcrumb = function (handlerData) { + var global = getGlobalObject(); + var from = handlerData.from; + var to = handlerData.to; + var parsedLoc = parseUrl(global.location.href); + var parsedFrom = parseUrl(from); + var parsedTo = parseUrl(to); // Initial pushState doesn't provide `from` information + + if (!parsedFrom.path) { + parsedFrom = parsedLoc; + } // Use only the path component of the URL if the URL matches the current + // document (almost all the time when using pushState) + + + if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) { + // tslint:disable-next-line:no-parameter-reassignment + to = parsedTo.relative; + } + + if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) { + // tslint:disable-next-line:no-parameter-reassignment + from = parsedFrom.relative; + } + + getCurrentHub().addBreadcrumb({ + category: 'navigation', + data: { + from: from, + to: to + } + }); + }; + /** + * Instrument browser built-ins w/ breadcrumb capturing + * - Console API + * - DOM API (click/typing) + * - XMLHttpRequest API + * - Fetch API + * - History API + */ + + + Breadcrumbs.prototype.setupOnce = function () { + var _this = this; + + if (this._options.console) { + addInstrumentationHandler({ + callback: function callback() { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + _this._consoleBreadcrumb.apply(_this, __spread(args)); + }, + type: 'console' + }); + } + + if (this._options.dom) { + addInstrumentationHandler({ + callback: function callback() { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + _this._domBreadcrumb.apply(_this, __spread(args)); + }, + type: 'dom' + }); + } + + if (this._options.xhr) { + addInstrumentationHandler({ + callback: function callback() { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + _this._xhrBreadcrumb.apply(_this, __spread(args)); + }, + type: 'xhr' + }); + } + + if (this._options.fetch) { + addInstrumentationHandler({ + callback: function callback() { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + _this._fetchBreadcrumb.apply(_this, __spread(args)); + }, + type: 'fetch' + }); + } + + if (this._options.history) { + addInstrumentationHandler({ + callback: function callback() { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + _this._historyBreadcrumb.apply(_this, __spread(args)); + }, + type: 'history' + }); + } + }; + /** + * @inheritDoc + */ + + + Breadcrumbs.id = 'Breadcrumbs'; + return Breadcrumbs; + }(); + /** + * Create a breadcrumb of `sentry` from the events themselves + */ + + function addSentryBreadcrumb(serializedData) { + // There's always something that can go wrong with deserialization... + try { + var event_1 = JSON.parse(serializedData); + getCurrentHub().addBreadcrumb({ + category: "sentry." + (event_1.type === 'transaction' ? 'transaction' : 'event'), + event_id: event_1.event_id, + level: event_1.level || Severity.fromString('error'), + message: getEventDescription(event_1) + }, { + event: event_1 + }); + } catch (_oO) { + logger.error('Error while adding sentry type breadcrumb'); + } + } + + var DEFAULT_KEY = 'cause'; + var DEFAULT_LIMIT = 5; + /** Adds SDK info to an event. */ + + var LinkedErrors = + /** @class */ + function () { + /** + * @inheritDoc + */ + function LinkedErrors(options) { + if (options === void 0) { + options = {}; + } + /** + * @inheritDoc + */ + + + this.name = LinkedErrors.id; + this._key = options.key || DEFAULT_KEY; + this._limit = options.limit || DEFAULT_LIMIT; + } + /** + * @inheritDoc + */ + + + LinkedErrors.prototype.setupOnce = function () { + addGlobalEventProcessor(function (event, hint) { + var self = getCurrentHub().getIntegration(LinkedErrors); + + if (self) { + return self._handler(event, hint); + } + + return event; + }); + }; + /** + * @inheritDoc + */ + + + LinkedErrors.prototype._handler = function (event, hint) { + if (!event.exception || !event.exception.values || !hint || !isInstanceOf(hint.originalException, Error)) { + return event; + } + + var linkedErrors = this._walkErrorTree(hint.originalException, this._key); + + event.exception.values = __spread(linkedErrors, event.exception.values); + return event; + }; + /** + * @inheritDoc + */ + + + LinkedErrors.prototype._walkErrorTree = function (error, key, stack) { + if (stack === void 0) { + stack = []; + } + + if (!isInstanceOf(error[key], Error) || stack.length + 1 >= this._limit) { + return stack; + } + + var stacktrace = computeStackTrace(error[key]); + var exception = exceptionFromStacktrace(stacktrace); + return this._walkErrorTree(error[key], key, __spread([exception], stack)); + }; + /** + * @inheritDoc + */ + + + LinkedErrors.id = 'LinkedErrors'; + return LinkedErrors; + }(); + + var global$4 = getGlobalObject(); + /** UserAgent */ + + var UserAgent = + /** @class */ + function () { + function UserAgent() { + /** + * @inheritDoc + */ + this.name = UserAgent.id; + } + /** + * @inheritDoc + */ + + + UserAgent.prototype.setupOnce = function () { + addGlobalEventProcessor(function (event) { + if (getCurrentHub().getIntegration(UserAgent)) { + if (!global$4.navigator || !global$4.location) { + return event; + } // Request Interface: https://docs.sentry.io/development/sdk-dev/event-payloads/request/ + + + var request = event.request || {}; + request.url = request.url || global$4.location.href; + request.headers = request.headers || {}; + request.headers['User-Agent'] = global$4.navigator.userAgent; + return _assign({}, event, { + request: request + }); + } + + return event; + }); + }; + /** + * @inheritDoc + */ + + + UserAgent.id = 'UserAgent'; + return UserAgent; + }(); + + var defaultIntegrations = [new InboundFilters(), new FunctionToString(), new TryCatch(), new Breadcrumbs(), new GlobalHandlers(), new LinkedErrors(), new UserAgent()]; + /** + * The Sentry Browser SDK Client. + * + * To use this SDK, call the {@link init} function as early as possible when + * loading the web page. To set context information or send manual events, use + * the provided methods. + * + * @example + * + * ``` + * + * import { init } from '@sentry/browser'; + * + * init({ + * dsn: '__DSN__', + * // ... + * }); + * ``` + * + * @example + * ``` + * + * import { configureScope } from '@sentry/browser'; + * configureScope((scope: Scope) => { + * scope.setExtra({ battery: 0.7 }); + * scope.setTag({ user_mode: 'admin' }); + * scope.setUser({ id: '4711' }); + * }); + * ``` + * + * @example + * ``` + * + * import { addBreadcrumb } from '@sentry/browser'; + * addBreadcrumb({ + * message: 'My Breadcrumb', + * // ... + * }); + * ``` + * + * @example + * + * ``` + * + * import * as Sentry from '@sentry/browser'; + * Sentry.captureMessage('Hello, world!'); + * Sentry.captureException(new Error('Good bye')); + * Sentry.captureEvent({ + * message: 'Manual', + * stacktrace: [ + * // ... + * ], + * }); + * ``` + * + * @see {@link BrowserOptions} for documentation on configuration options. + */ + + function init(options) { + if (options === void 0) { + options = {}; + } + + if (options.defaultIntegrations === undefined) { + options.defaultIntegrations = defaultIntegrations; + } + + if (options.release === undefined) { + var window_1 = getGlobalObject(); // This supports the variable that sentry-webpack-plugin injects + + if (window_1.SENTRY_RELEASE && window_1.SENTRY_RELEASE.id) { + options.release = window_1.SENTRY_RELEASE.id; } } - }; // Deprecations - Raven.prototype.setUser = Raven.prototype.setUserContext; - Raven.prototype.setReleaseContext = Raven.prototype.setRelease; - var raven = Raven; - - /** - * Enforces a single instance of the Raven client, and the - * main entry point for Raven. If you are a consumer of the - * Raven library, you SHOULD load this file (vs raven.js). - **/ - // This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785) - - var _window$3 = typeof window !== 'undefined' ? window : typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof self !== 'undefined' ? self : {}; - - var _Raven = _window$3.Raven; - var Raven$1 = new raven(); - /* - * Allow multiple versions of Raven to be installed. - * Strip Raven from the global context and returns the instance. - * - * @return {Raven} - */ - - Raven$1.noConflict = function () { - _window$3.Raven = _Raven; - return Raven$1; - }; - - Raven$1.afterLoad(); - var singleton = Raven$1; - /** - * DISCLAIMER: - * - * Expose `Client` constructor for cases where user want to track multiple "sub-applications" in one larger app. - * It's not meant to be used by a wide audience, so pleaaase make sure that you know what you're doing before using it. - * Accidentally calling `install` multiple times, may result in an unexpected behavior that's very hard to debug. - * - * It's called `Client' to be in-line with Raven Node implementation. - * - * HOWTO: - * - * import Raven from 'raven-js'; - * - * const someAppReporter = new Raven.Client(); - * const someOtherAppReporter = new Raven.Client(); - * - * someAppReporter.config('__DSN__', { - * ...config goes here - * }); - * - * someOtherAppReporter.config('__OTHER_DSN__', { - * ...config goes here - * }); - * - * someAppReporter.captureMessage(...); - * someAppReporter.captureException(...); - * someAppReporter.captureBreadcrumb(...); - * - * someOtherAppReporter.captureMessage(...); - * someOtherAppReporter.captureException(...); - * someOtherAppReporter.captureBreadcrumb(...); - * - * It should "just work". - */ - - var Client = raven; - singleton.Client = Client; + initAndBind(BrowserClient, options); + } var $find$1 = arrayIteration.find; @@ -10938,12 +13847,6 @@ typeof navigator === "object" && (function () { } }); - // `Object.assign` method - // https://tc39.github.io/ecma262/#sec-object.assign - _export({ target: 'Object', stat: true, forced: Object.assign !== objectAssign }, { - assign: objectAssign - }); - var propertyIsEnumerable = objectPropertyIsEnumerable.f; // `Object.{ entries, values }` methods implementation @@ -11052,47 +13955,47 @@ typeof navigator === "object" && (function () { isNullOrUndefined = function isNullOrUndefined(e) { return null == e; }, - isObject$3 = function isObject(e) { + isObject$1 = function isObject(e) { return getConstructor(e) === Object; }, isNumber = function isNumber(e) { return getConstructor(e) === Number && !Number.isNaN(e); }, - isString$2 = function isString(e) { + isString$1 = function isString(e) { return getConstructor(e) === String; }, isBoolean = function isBoolean(e) { return getConstructor(e) === Boolean; }, - isFunction$2 = function isFunction(e) { + isFunction = function isFunction(e) { return getConstructor(e) === Function; }, - isArray$3 = function isArray(e) { + isArray$1 = function isArray(e) { return Array.isArray(e); }, isNodeList = function isNodeList(e) { return instanceOf(e, NodeList); }, - isElement = function isElement(e) { + isElement$1 = function isElement(e) { return instanceOf(e, Element); }, - isEvent = function isEvent(e) { + isEvent$1 = function isEvent(e) { return instanceOf(e, Event); }, isEmpty = function isEmpty(e) { - return isNullOrUndefined(e) || (isString$2(e) || isArray$3(e) || isNodeList(e)) && !e.length || isObject$3(e) && !Object.keys(e).length; + return isNullOrUndefined(e) || (isString$1(e) || isArray$1(e) || isNodeList(e)) && !e.length || isObject$1(e) && !Object.keys(e).length; }, is = { nullOrUndefined: isNullOrUndefined, - object: isObject$3, + object: isObject$1, number: isNumber, - string: isString$2, + string: isString$1, boolean: isBoolean, - function: isFunction$2, - array: isArray$3, + function: isFunction, + array: isArray$1, nodeList: isNodeList, - element: isElement, - event: isEvent, + element: isElement$1, + event: isEvent$1, empty: isEmpty }, constants = { @@ -11226,7 +14129,7 @@ typeof navigator === "object" && (function () { }.call(e, t); } - function wrap$1(e, t) { + function wrap$2(e, t) { var n = e.length ? e : [e]; Array.from(n).reverse().forEach(function (e, n) { var r = 0 < n ? t.cloneNode(!0) : t, @@ -11414,7 +14317,7 @@ typeof navigator === "object" && (function () { }, c = formatNumber(i); - r.format && (1e6 < i ? c = "".concat(a(1e6), "M") : 1e3 < i && (c = "".concat(a(1e3), "K"))), is.element(this.elements.count) ? this.elements.count.textContent = c : (wrap$1(this.elements.trigger, createElement("span", { + r.format && (1e6 < i ? c = "".concat(a(1e6), "M") : 1e3 < i && (c = "".concat(a(1e3), "K"))), is.element(this.elements.count) ? this.elements.count.textContent = c : (wrap$2(this.elements.trigger, createElement("span", { class: o.className })), this.elements.count = createElement("span", { class: "".concat(r.className, " ").concat(r.className, "--").concat(s) @@ -11587,7 +14490,7 @@ typeof navigator === "object" && (function () { return indexedObject$1(requireObjectCoercible$1(it)); }; - var isObject$4 = function (it) { + var isObject$2 = function (it) { return typeof it === 'object' ? it !== null : typeof it === 'function'; }; @@ -11596,11 +14499,11 @@ typeof navigator === "object" && (function () { // instead of the ES6 spec version, we didn't implement @@toPrimitive case // and the second argument - flag - preferred type is a string var toPrimitive$1 = function (input, PREFERRED_STRING) { - if (!isObject$4(input)) return input; + if (!isObject$2(input)) return input; var fn, val; - if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject$4(val = fn.call(input))) return val; - if (typeof (fn = input.valueOf) == 'function' && !isObject$4(val = fn.call(input))) return val; - if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject$4(val = fn.call(input))) return val; + if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject$2(val = fn.call(input))) return val; + if (typeof (fn = input.valueOf) == 'function' && !isObject$2(val = fn.call(input))) return val; + if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject$2(val = fn.call(input))) return val; throw TypeError("Can't convert object to primitive value"); }; @@ -11612,7 +14515,7 @@ typeof navigator === "object" && (function () { var document$3 = global_1$1.document; // typeof document.createElement is 'object' in old IE - var EXISTS$1 = isObject$4(document$3) && isObject$4(document$3.createElement); + var EXISTS$1 = isObject$2(document$3) && isObject$2(document$3.createElement); var documentCreateElement$1 = function (it) { return EXISTS$1 ? document$3.createElement(it) : {}; @@ -11625,15 +14528,15 @@ typeof navigator === "object" && (function () { }).a != 7; }); - var nativeGetOwnPropertyDescriptor$2 = Object.getOwnPropertyDescriptor; + var nativeGetOwnPropertyDescriptor$3 = Object.getOwnPropertyDescriptor; // `Object.getOwnPropertyDescriptor` method // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor - var f$9 = descriptors$1 ? nativeGetOwnPropertyDescriptor$2 : function getOwnPropertyDescriptor(O, P) { + var f$9 = descriptors$1 ? nativeGetOwnPropertyDescriptor$3 : function getOwnPropertyDescriptor(O, P) { O = toIndexedObject$1(O); P = toPrimitive$1(P, true); if (ie8DomDefine$1) try { - return nativeGetOwnPropertyDescriptor$2(O, P); + return nativeGetOwnPropertyDescriptor$3(O, P); } catch (error) { /* empty */ } if (has$2(O, P)) return createPropertyDescriptor$1(!objectPropertyIsEnumerable$1.f.call(O, P), O[P]); }; @@ -11643,7 +14546,7 @@ typeof navigator === "object" && (function () { }; var anObject$1 = function (it) { - if (!isObject$4(it)) { + if (!isObject$2(it)) { throw TypeError(String(it) + ' is not an object'); } return it; }; @@ -11715,11 +14618,11 @@ typeof navigator === "object" && (function () { }); }); - var id$1 = 0; + var id$2 = 0; var postfix$1 = Math.random(); var uid$1 = function (key) { - return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id$1 + postfix$1).toString(36); + return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id$2 + postfix$1).toString(36); }; var keys$4 = shared$1('keys'); @@ -11740,7 +14643,7 @@ typeof navigator === "object" && (function () { var getterFor$1 = function (TYPE) { return function (it) { var state; - if (!isObject$4(it) || (state = get$2(it)).type !== TYPE) { + if (!isObject$2(it) || (state = get$2(it)).type !== TYPE) { throw TypeError('Incompatible receiver, ' + TYPE + ' required'); } return state; }; @@ -11947,14 +14850,14 @@ typeof navigator === "object" && (function () { var replacement$1 = /#|\.prototype\./; var isForced$1 = function (feature, detection) { - var value = data$1[normalize$1(feature)]; + var value = data$1[normalize$2(feature)]; return value == POLYFILL$1 ? true : value == NATIVE$1 ? false : typeof detection == 'function' ? fails$1(detection) : !!detection; }; - var normalize$1 = isForced$1.normalize = function (string) { + var normalize$2 = isForced$1.normalize = function (string) { return String(string).replace(replacement$1, '.').toLowerCase(); }; @@ -12020,7 +14923,7 @@ typeof navigator === "object" && (function () { // `IsArray` abstract operation // https://tc39.github.io/ecma262/#sec-isarray - var isArray$4 = Array.isArray || function isArray(arg) { + var isArray$2 = Array.isArray || function isArray(arg) { return classofRaw$1(arg) == 'Array'; }; @@ -12065,11 +14968,11 @@ typeof navigator === "object" && (function () { // https://tc39.github.io/ecma262/#sec-arrayspeciescreate var arraySpeciesCreate$1 = function (originalArray, length) { var C; - if (isArray$4(originalArray)) { + if (isArray$2(originalArray)) { C = originalArray.constructor; // cross-realm fallback - if (typeof C == 'function' && (C === Array || isArray$4(C.prototype))) C = undefined; - else if (isObject$4(C)) { + if (typeof C == 'function' && (C === Array || isArray$2(C.prototype))) C = undefined; + else if (isObject$2(C)) { C = C[SPECIES$7]; if (C === null) C = undefined; } @@ -12078,8 +14981,8 @@ typeof navigator === "object" && (function () { var engineUserAgent$1 = getBuiltIn$1('navigator', 'userAgent') || ''; - var process$4 = global_1$1.process; - var versions$1 = process$4 && process$4.versions; + var process$5 = global_1$1.process; + var versions$1 = process$5 && process$5.versions; var v8$1 = versions$1 && versions$1.v8; var match$1, version$1; @@ -12128,17 +15031,17 @@ typeof navigator === "object" && (function () { var SPECIES_SUPPORT$1 = arrayMethodHasSpeciesSupport$1('concat'); var isConcatSpreadable$1 = function (O) { - if (!isObject$4(O)) return false; + if (!isObject$2(O)) return false; var spreadable = O[IS_CONCAT_SPREADABLE$1]; - return spreadable !== undefined ? !!spreadable : isArray$4(O); + return spreadable !== undefined ? !!spreadable : isArray$2(O); }; - var FORCED$7 = !IS_CONCAT_SPREADABLE_SUPPORT$1 || !SPECIES_SUPPORT$1; + var FORCED$8 = !IS_CONCAT_SPREADABLE_SUPPORT$1 || !SPECIES_SUPPORT$1; // `Array.prototype.concat` method // https://tc39.github.io/ecma262/#sec-array.prototype.concat // with adding support of @@isConcatSpreadable and @@species - _export$1({ target: 'Array', proto: true, forced: FORCED$7 }, { + _export$1({ target: 'Array', proto: true, forced: FORCED$8 }, { concat: function concat(arg) { // eslint-disable-line no-unused-vars var O = toObject$1(this); var A = arraySpeciesCreate$1(O, 0); @@ -12657,7 +15560,7 @@ typeof navigator === "object" && (function () { }; var aPossiblePrototype$1 = function (it) { - if (!isObject$4(it) && it !== null) { + if (!isObject$2(it) && it !== null) { throw TypeError("Can't set " + String(it) + ' as a prototype'); } return it; }; @@ -12762,7 +15665,7 @@ typeof navigator === "object" && (function () { }; var ARRAY_ITERATOR$1 = 'Array Iterator'; - var setInternalState$8 = internalState$1.set; + var setInternalState$9 = internalState$1.set; var getInternalState$5 = internalState$1.getterFor(ARRAY_ITERATOR$1); // `Array.prototype.entries` method @@ -12776,7 +15679,7 @@ typeof navigator === "object" && (function () { // `CreateArrayIterator` internal method // https://tc39.github.io/ecma262/#sec-createarrayiterator var es_array_iterator$1 = defineIterator$1(Array, 'Array', function (iterated, kind) { - setInternalState$8(this, { + setInternalState$9(this, { type: ARRAY_ITERATOR$1, target: toIndexedObject$1(iterated), // target index: 0, // next index @@ -12855,7 +15758,7 @@ typeof navigator === "object" && (function () { // we haven't completely correct pre-ES6 way for getting `new.target`, so use this typeof (NewTarget = dummy.constructor) == 'function' && NewTarget !== Wrapper && - isObject$4(NewTargetPrototype = NewTarget.prototype) && + isObject$2(NewTargetPrototype = NewTarget.prototype) && NewTargetPrototype !== Wrapper.prototype ) objectSetPrototypeOf$1($this, NewTargetPrototype); return $this; @@ -13134,7 +16037,7 @@ typeof navigator === "object" && (function () { // https://tc39.github.io/ecma262/#sec-isregexp var isRegexp$1 = function (it) { var isRegExp; - return isObject$4(it) && ((isRegExp = it[MATCH$3]) !== undefined ? !!isRegExp : classofRaw$1(it) == 'RegExp'); + return isObject$2(it) && ((isRegExp = it[MATCH$3]) !== undefined ? !!isRegExp : classofRaw$1(it) == 'RegExp'); }; var notARegexp$1 = function (it) { @@ -13196,13 +16099,13 @@ typeof navigator === "object" && (function () { var STRING_ITERATOR$1 = 'String Iterator'; - var setInternalState$9 = internalState$1.set; + var setInternalState$a = internalState$1.set; var getInternalState$6 = internalState$1.getterFor(STRING_ITERATOR$1); // `String.prototype[@@iterator]` method // https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator defineIterator$1(String, 'String', function (iterated) { - setInternalState$9(this, { + setInternalState$a(this, { type: STRING_ITERATOR$1, string: String(iterated), index: 0 @@ -13404,11 +16307,11 @@ typeof navigator === "object" && (function () { return target; }; - var freezing = !fails$1(function () { + var freezing$1 = !fails$1(function () { return Object.isExtensible(Object.preventExtensions({})); }); - var internalMetadata = createCommonjsModule(function (module) { + var internalMetadata$1 = createCommonjsModule(function (module) { var defineProperty = objectDefineProperty$1.f; @@ -13429,7 +16332,7 @@ typeof navigator === "object" && (function () { var fastKey = function (it, create) { // return a primitive with prefix - if (!isObject$4(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; + if (!isObject$2(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; if (!has$2(it, METADATA)) { // can't set metadata to uncaught frozen object if (!isExtensible(it)) return 'F'; @@ -13455,7 +16358,7 @@ typeof navigator === "object" && (function () { // add metadata on freeze-family methods calling var onFreeze = function (it) { - if (freezing && meta.REQUIRED && isExtensible(it) && !has$2(it, METADATA)) setMetadata(it); + if (freezing$1 && meta.REQUIRED && isExtensible(it) && !has$2(it, METADATA)) setMetadata(it); return it; }; @@ -13468,10 +16371,10 @@ typeof navigator === "object" && (function () { hiddenKeys$2[METADATA] = true; }); - var internalMetadata_1 = internalMetadata.REQUIRED; - var internalMetadata_2 = internalMetadata.fastKey; - var internalMetadata_3 = internalMetadata.getWeakData; - var internalMetadata_4 = internalMetadata.onFreeze; + var internalMetadata_1$1 = internalMetadata$1.REQUIRED; + var internalMetadata_2$1 = internalMetadata$1.fastKey; + var internalMetadata_3$1 = internalMetadata$1.getWeakData; + var internalMetadata_4$1 = internalMetadata$1.onFreeze; var iterate_1$1 = createCommonjsModule(function (module) { var Result = function (stopped, result) { @@ -13518,7 +16421,7 @@ typeof navigator === "object" && (function () { } return it; }; - var collection = function (CONSTRUCTOR_NAME, wrapper, common) { + var collection$1 = function (CONSTRUCTOR_NAME, wrapper, common) { var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1; var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1; var ADDER = IS_MAP ? 'set' : 'add'; @@ -13534,11 +16437,11 @@ typeof navigator === "object" && (function () { nativeMethod.call(this, value === 0 ? 0 : value); return this; } : KEY == 'delete' ? function (key) { - return IS_WEAK && !isObject$4(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key); + return IS_WEAK && !isObject$2(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key); } : KEY == 'get' ? function get(key) { - return IS_WEAK && !isObject$4(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key); + return IS_WEAK && !isObject$2(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key); } : KEY == 'has' ? function has(key) { - return IS_WEAK && !isObject$4(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key); + return IS_WEAK && !isObject$2(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key); } : function set(key, value) { nativeMethod.call(this, key === 0 ? 0 : key, value); return this; @@ -13552,7 +16455,7 @@ typeof navigator === "object" && (function () { })))) { // create collection constructor Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER); - internalMetadata.REQUIRED = true; + internalMetadata$1.REQUIRED = true; } else if (isForced_1$1(CONSTRUCTOR_NAME, true)) { var instance = new Constructor(); // early implementations not supports chaining @@ -13604,7 +16507,7 @@ typeof navigator === "object" && (function () { return Constructor; }; - var getWeakData = internalMetadata.getWeakData; + var getWeakData$1 = internalMetadata$1.getWeakData; @@ -13613,42 +16516,42 @@ typeof navigator === "object" && (function () { - var setInternalState$a = internalState$1.set; - var internalStateGetterFor = internalState$1.getterFor; - var find$1 = arrayIteration$1.find; - var findIndex = arrayIteration$1.findIndex; - var id$2 = 0; + var setInternalState$b = internalState$1.set; + var internalStateGetterFor$1 = internalState$1.getterFor; + var find$2 = arrayIteration$1.find; + var findIndex$1 = arrayIteration$1.findIndex; + var id$3 = 0; // fallback for uncaught frozen keys - var uncaughtFrozenStore = function (store) { - return store.frozen || (store.frozen = new UncaughtFrozenStore()); + var uncaughtFrozenStore$1 = function (store) { + return store.frozen || (store.frozen = new UncaughtFrozenStore$1()); }; - var UncaughtFrozenStore = function () { + var UncaughtFrozenStore$1 = function () { this.entries = []; }; - var findUncaughtFrozen = function (store, key) { - return find$1(store.entries, function (it) { + var findUncaughtFrozen$1 = function (store, key) { + return find$2(store.entries, function (it) { return it[0] === key; }); }; - UncaughtFrozenStore.prototype = { + UncaughtFrozenStore$1.prototype = { get: function (key) { - var entry = findUncaughtFrozen(this, key); + var entry = findUncaughtFrozen$1(this, key); if (entry) return entry[1]; }, has: function (key) { - return !!findUncaughtFrozen(this, key); + return !!findUncaughtFrozen$1(this, key); }, set: function (key, value) { - var entry = findUncaughtFrozen(this, key); + var entry = findUncaughtFrozen$1(this, key); if (entry) entry[1] = value; else this.entries.push([key, value]); }, 'delete': function (key) { - var index = findIndex(this.entries, function (it) { + var index = findIndex$1(this.entries, function (it) { return it[0] === key; }); if (~index) this.entries.splice(index, 1); @@ -13656,24 +16559,24 @@ typeof navigator === "object" && (function () { } }; - var collectionWeak = { + var collectionWeak$1 = { getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) { var C = wrapper(function (that, iterable) { anInstance$1(that, C, CONSTRUCTOR_NAME); - setInternalState$a(that, { + setInternalState$b(that, { type: CONSTRUCTOR_NAME, - id: id$2++, + id: id$3++, frozen: undefined }); if (iterable != undefined) iterate_1$1(iterable, that[ADDER], that, IS_MAP); }); - var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME); + var getInternalState = internalStateGetterFor$1(CONSTRUCTOR_NAME); var define = function (that, key, value) { var state = getInternalState(that); - var data = getWeakData(anObject$1(key), true); - if (data === true) uncaughtFrozenStore(state).set(key, value); + var data = getWeakData$1(anObject$1(key), true); + if (data === true) uncaughtFrozenStore$1(state).set(key, value); else data[state.id] = value; return that; }; @@ -13683,18 +16586,18 @@ typeof navigator === "object" && (function () { // 23.4.3.3 WeakSet.prototype.delete(value) 'delete': function (key) { var state = getInternalState(this); - if (!isObject$4(key)) return false; - var data = getWeakData(key); - if (data === true) return uncaughtFrozenStore(state)['delete'](key); + if (!isObject$2(key)) return false; + var data = getWeakData$1(key); + if (data === true) return uncaughtFrozenStore$1(state)['delete'](key); return data && has$2(data, state.id) && delete data[state.id]; }, // 23.3.3.4 WeakMap.prototype.has(key) // 23.4.3.4 WeakSet.prototype.has(value) has: function has(key) { var state = getInternalState(this); - if (!isObject$4(key)) return false; - var data = getWeakData(key); - if (data === true) return uncaughtFrozenStore(state).has(key); + if (!isObject$2(key)) return false; + var data = getWeakData$1(key); + if (data === true) return uncaughtFrozenStore$1(state).has(key); return data && has$2(data, state.id); } }); @@ -13703,9 +16606,9 @@ typeof navigator === "object" && (function () { // 23.3.3.3 WeakMap.prototype.get(key) get: function get(key) { var state = getInternalState(this); - if (isObject$4(key)) { - var data = getWeakData(key); - if (data === true) return uncaughtFrozenStore(state).get(key); + if (isObject$2(key)) { + var data = getWeakData$1(key); + if (data === true) return uncaughtFrozenStore$1(state).get(key); return data ? data[state.id] : undefined; } }, @@ -13746,14 +16649,14 @@ typeof navigator === "object" && (function () { // `WeakMap` constructor // https://tc39.github.io/ecma262/#sec-weakmap-constructor - var $WeakMap = module.exports = collection('WeakMap', wrapper, collectionWeak); + var $WeakMap = module.exports = collection$1('WeakMap', wrapper, collectionWeak$1); // IE11 WeakMap frozen keys fix // We can't use feature detection because it crash some old IE builds // https://github.com/zloirock/core-js/issues/485 if (nativeWeakMap$1 && IS_IE11) { - InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true); - internalMetadata.REQUIRED = true; + InternalWeakMap = collectionWeak$1.getConstructor(wrapper, 'WeakMap', true); + internalMetadata$1.REQUIRED = true; var WeakMapPrototype = $WeakMap.prototype; var nativeDelete = WeakMapPrototype['delete']; var nativeHas = WeakMapPrototype.has; @@ -13761,28 +16664,28 @@ typeof navigator === "object" && (function () { var nativeSet = WeakMapPrototype.set; redefineAll$1(WeakMapPrototype, { 'delete': function (key) { - if (isObject$4(key) && !isExtensible(key)) { + if (isObject$2(key) && !isExtensible(key)) { var state = enforceIternalState(this); if (!state.frozen) state.frozen = new InternalWeakMap(); return nativeDelete.call(this, key) || state.frozen['delete'](key); } return nativeDelete.call(this, key); }, has: function has(key) { - if (isObject$4(key) && !isExtensible(key)) { + if (isObject$2(key) && !isExtensible(key)) { var state = enforceIternalState(this); if (!state.frozen) state.frozen = new InternalWeakMap(); return nativeHas.call(this, key) || state.frozen.has(key); } return nativeHas.call(this, key); }, get: function get(key) { - if (isObject$4(key) && !isExtensible(key)) { + if (isObject$2(key) && !isExtensible(key)) { var state = enforceIternalState(this); if (!state.frozen) state.frozen = new InternalWeakMap(); return nativeHas.call(this, key) ? nativeGet.call(this, key) : state.frozen.get(key); } return nativeGet.call(this, key); }, set: function set(key, value) { - if (isObject$4(key) && !isExtensible(key)) { + if (isObject$2(key) && !isExtensible(key)) { var state = enforceIternalState(this); if (!state.frozen) state.frozen = new InternalWeakMap(); nativeHas.call(this, key) ? nativeSet.call(this, key, value) : state.frozen.set(key, value); @@ -14367,7 +17270,7 @@ typeof navigator === "object" && (function () { var ITERATOR$g = wellKnownSymbol$1('iterator'); var URL_SEARCH_PARAMS$1 = 'URLSearchParams'; var URL_SEARCH_PARAMS_ITERATOR$1 = URL_SEARCH_PARAMS$1 + 'Iterator'; - var setInternalState$b = internalState$1.set; + var setInternalState$c = internalState$1.set; var getInternalParamsState$1 = internalState$1.getterFor(URL_SEARCH_PARAMS$1); var getInternalIteratorState$1 = internalState$1.getterFor(URL_SEARCH_PARAMS_ITERATOR$1); @@ -14399,7 +17302,7 @@ typeof navigator === "object" && (function () { } }; - var find$2 = /[!'()~]|%20/g; + var find$3 = /[!'()~]|%20/g; var replace$1 = { '!': '%21', @@ -14415,7 +17318,7 @@ typeof navigator === "object" && (function () { }; var serialize$1 = function (it) { - return encodeURIComponent(it).replace(find$2, replacer$1); + return encodeURIComponent(it).replace(find$3, replacer$1); }; var parseSearchParams$1 = function (result, query) { @@ -14446,7 +17349,7 @@ typeof navigator === "object" && (function () { }; var URLSearchParamsIterator$1 = createIteratorConstructor$1(function Iterator(params, kind) { - setInternalState$b(this, { + setInternalState$c(this, { type: URL_SEARCH_PARAMS_ITERATOR$1, iterator: getIterator$1(getInternalParamsState$1(params).entries), kind: kind @@ -14470,7 +17373,7 @@ typeof navigator === "object" && (function () { var entries = []; var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key; - setInternalState$b(that, { + setInternalState$c(that, { type: URL_SEARCH_PARAMS$1, entries: entries, updateURL: function () { /* empty */ }, @@ -14478,7 +17381,7 @@ typeof navigator === "object" && (function () { }); if (init !== undefined) { - if (isObject$4(init)) { + if (isObject$2(init)) { iteratorMethod = getIteratorMethod$1(init); if (typeof iteratorMethod === 'function') { iterator = iteratorMethod.call(init); @@ -14663,7 +17566,7 @@ typeof navigator === "object" && (function () { var init, body, headers; if (arguments.length > 1) { init = arguments[1]; - if (isObject$4(init)) { + if (isObject$2(init)) { body = init.body; if (classof$1(body) === URL_SEARCH_PARAMS$1) { headers = init.headers ? new Headers$2(init.headers) : new Headers$2(); @@ -14708,7 +17611,7 @@ typeof navigator === "object" && (function () { var NativeURL$1 = global_1$1.URL; var URLSearchParams$2 = web_urlSearchParams$1.URLSearchParams; var getInternalSearchParamsState$1 = web_urlSearchParams$1.getState; - var setInternalState$c = internalState$1.set; + var setInternalState$d = internalState$1.set; var getInternalURLState$1 = internalState$1.getterFor('URL'); var floor$8 = Math.floor; var pow$2 = Math.pow; @@ -15425,7 +18328,7 @@ typeof navigator === "object" && (function () { var that = anInstance$1(this, URLConstructor$1, 'URL'); var base = arguments.length > 1 ? arguments[1] : undefined; var urlString = String(url); - var state = setInternalState$c(that, { type: 'URL' }); + var state = setInternalState$d(that, { type: 'URL' }); var baseState, failure; if (base !== undefined) { if (base instanceof URLConstructor$1) baseState = getInternalURLState$1(base); @@ -15694,7 +18597,7 @@ typeof navigator === "object" && (function () { URL: URLConstructor$1 }); - var $some$1 = arrayIteration$1.some; + var $some$2 = arrayIteration$1.some; @@ -15705,7 +18608,7 @@ typeof navigator === "object" && (function () { // https://tc39.github.io/ecma262/#sec-array.prototype.some _export$1({ target: 'Array', proto: true, forced: !STRICT_METHOD$9 || !USES_TO_LENGTH$h }, { some: function some(callbackfn /* , thisArg */) { - return $some$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); + return $some$2(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined); } }); @@ -15749,7 +18652,7 @@ typeof navigator === "object" && (function () { } return n; }; - var FORCED$8 = nativeToFixed && ( + var FORCED$9 = nativeToFixed && ( 0.00008.toFixed(3) !== '0.000' || 0.9.toFixed(0) !== '1' || 1.255.toFixed(2) !== '1.25' || @@ -15761,7 +18664,7 @@ typeof navigator === "object" && (function () { // `Number.prototype.toFixed` method // https://tc39.github.io/ecma262/#sec-number.prototype.tofixed - _export$1({ target: 'Number', proto: true, forced: FORCED$8 }, { + _export$1({ target: 'Number', proto: true, forced: FORCED$9 }, { // eslint-disable-next-line max-statements toFixed: function toFixed(fractionDigits) { var number = thisNumberValue(this); @@ -16072,12 +18975,12 @@ typeof navigator === "object" && (function () { var SYMBOL$1 = 'Symbol'; var PROTOTYPE$4 = 'prototype'; var TO_PRIMITIVE$1 = wellKnownSymbol$1('toPrimitive'); - var setInternalState$d = internalState$1.set; + var setInternalState$e = internalState$1.set; var getInternalState$7 = internalState$1.getterFor(SYMBOL$1); var ObjectPrototype$5 = Object[PROTOTYPE$4]; var $Symbol$1 = global_1$1.Symbol; var $stringify$1 = getBuiltIn$1('JSON', 'stringify'); - var nativeGetOwnPropertyDescriptor$3 = objectGetOwnPropertyDescriptor$1.f; + var nativeGetOwnPropertyDescriptor$4 = objectGetOwnPropertyDescriptor$1.f; var nativeDefineProperty$3 = objectDefineProperty$1.f; var nativeGetOwnPropertyNames$3 = objectGetOwnPropertyNamesExternal$1.f; var nativePropertyIsEnumerable$3 = objectPropertyIsEnumerable$1.f; @@ -16096,7 +18999,7 @@ typeof navigator === "object" && (function () { get: function () { return nativeDefineProperty$3(this, 'a', { value: 7 }).a; } })).a != 7; }) ? function (O, P, Attributes) { - var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor$3(ObjectPrototype$5, P); + var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor$4(ObjectPrototype$5, P); if (ObjectPrototypeDescriptor) delete ObjectPrototype$5[P]; nativeDefineProperty$3(O, P, Attributes); if (ObjectPrototypeDescriptor && O !== ObjectPrototype$5) { @@ -16104,9 +19007,9 @@ typeof navigator === "object" && (function () { } } : nativeDefineProperty$3; - var wrap$2 = function (tag, description) { + var wrap$3 = function (tag, description) { var symbol = AllSymbols$1[tag] = objectCreate$1($Symbol$1[PROTOTYPE$4]); - setInternalState$d(symbol, { + setInternalState$e(symbol, { type: SYMBOL$1, tag: tag, description: description @@ -16162,7 +19065,7 @@ typeof navigator === "object" && (function () { var it = toIndexedObject$1(O); var key = toPrimitive$1(P, true); if (it === ObjectPrototype$5 && has$2(AllSymbols$1, key) && !has$2(ObjectPrototypeSymbols$1, key)) return; - var descriptor = nativeGetOwnPropertyDescriptor$3(it, key); + var descriptor = nativeGetOwnPropertyDescriptor$4(it, key); if (descriptor && has$2(AllSymbols$1, key) && !(has$2(it, HIDDEN$1) && it[HIDDEN$1][key])) { descriptor.enumerable = true; } @@ -16203,7 +19106,7 @@ typeof navigator === "object" && (function () { setSymbolDescriptor$1(this, tag, createPropertyDescriptor$1(1, value)); }; if (descriptors$1 && USE_SETTER$1) setSymbolDescriptor$1(ObjectPrototype$5, tag, { configurable: true, set: setter }); - return wrap$2(tag, description); + return wrap$3(tag, description); }; redefine$1($Symbol$1[PROTOTYPE$4], 'toString', function toString() { @@ -16211,7 +19114,7 @@ typeof navigator === "object" && (function () { }); redefine$1($Symbol$1, 'withoutSetter', function (description) { - return wrap$2(uid$1(description), description); + return wrap$3(uid$1(description), description); }); objectPropertyIsEnumerable$1.f = $propertyIsEnumerable$1; @@ -16221,7 +19124,7 @@ typeof navigator === "object" && (function () { objectGetOwnPropertySymbols$1.f = $getOwnPropertySymbols$1; wellKnownSymbolWrapped$1.f = function (name) { - return wrap$2(wellKnownSymbol$1(name), name); + return wrap$3(wellKnownSymbol$1(name), name); }; if (descriptors$1) { @@ -16320,8 +19223,8 @@ typeof navigator === "object" && (function () { var $replacer; while (arguments.length > index) args.push(arguments[index++]); $replacer = replacer; - if (!isObject$4(replacer) && it === undefined || isSymbol$1(it)) return; // IE8 returns string on undefined - if (!isArray$4(replacer)) replacer = function (key, value) { + if (!isObject$2(replacer) && it === undefined || isSymbol$1(it)) return; // IE8 returns string on undefined + if (!isArray$2(replacer)) replacer = function (key, value) { if (typeof $replacer == 'function') value = $replacer.call(this, key, value); if (!isSymbol$1(value)) return value; }; @@ -16351,17 +19254,17 @@ typeof navigator === "object" && (function () { } }); - var nativeGetOwnPropertyDescriptor$4 = objectGetOwnPropertyDescriptor$1.f; + var nativeGetOwnPropertyDescriptor$5 = objectGetOwnPropertyDescriptor$1.f; - var FAILS_ON_PRIMITIVES$3 = fails$1(function () { nativeGetOwnPropertyDescriptor$4(1); }); - var FORCED$9 = !descriptors$1 || FAILS_ON_PRIMITIVES$3; + var FAILS_ON_PRIMITIVES$3 = fails$1(function () { nativeGetOwnPropertyDescriptor$5(1); }); + var FORCED$a = !descriptors$1 || FAILS_ON_PRIMITIVES$3; // `Object.getOwnPropertyDescriptor` method // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor - _export$1({ target: 'Object', stat: true, forced: FORCED$9, sham: !descriptors$1 }, { + _export$1({ target: 'Object', stat: true, forced: FORCED$a, sham: !descriptors$1 }, { getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) { - return nativeGetOwnPropertyDescriptor$4(toIndexedObject$1(it), key); + return nativeGetOwnPropertyDescriptor$5(toIndexedObject$1(it), key); } }); @@ -16500,47 +19403,47 @@ typeof navigator === "object" && (function () { isNullOrUndefined$1 = function isNullOrUndefined(e) { return null == e; }, - isObject$5 = function isObject(e) { + isObject$3 = function isObject(e) { return getConstructor$1(e) === Object; }, isNumber$1 = function isNumber(e) { return getConstructor$1(e) === Number && !Number.isNaN(e); }, - isString$3 = function isString(e) { + isString$2 = function isString(e) { return getConstructor$1(e) === String; }, isBoolean$1 = function isBoolean(e) { return getConstructor$1(e) === Boolean; }, - isFunction$3 = function isFunction(e) { + isFunction$1 = function isFunction(e) { return getConstructor$1(e) === Function; }, - isArray$5 = function isArray(e) { + isArray$3 = function isArray(e) { return Array.isArray(e); }, isNodeList$1 = function isNodeList(e) { return instanceOf$1(e, NodeList); }, - isElement$1 = function isElement(e) { + isElement$2 = function isElement(e) { return instanceOf$1(e, Element); }, - isEvent$1 = function isEvent(e) { + isEvent$2 = function isEvent(e) { return instanceOf$1(e, Event); }, isEmpty$1 = function isEmpty(e) { - return isNullOrUndefined$1(e) || (isString$3(e) || isArray$5(e) || isNodeList$1(e)) && !e.length || isObject$5(e) && !Object.keys(e).length; + return isNullOrUndefined$1(e) || (isString$2(e) || isArray$3(e) || isNodeList$1(e)) && !e.length || isObject$3(e) && !Object.keys(e).length; }, is$1 = { nullOrUndefined: isNullOrUndefined$1, - object: isObject$5, + object: isObject$3, number: isNumber$1, - string: isString$3, + string: isString$2, boolean: isBoolean$1, - function: isFunction$3, - array: isArray$5, + function: isFunction$1, + array: isArray$3, nodeList: isNodeList$1, - element: isElement$1, - event: isEvent$1, + element: isElement$2, + event: isEvent$2, empty: isEmpty$1 }; @@ -16659,7 +19562,7 @@ typeof navigator === "object" && (function () { var location$1 = global_1$1.location; var set$4 = global_1$1.setImmediate; var clear$1 = global_1$1.clearImmediate; - var process$5 = global_1$1.process; + var process$6 = global_1$1.process; var MessageChannel$1 = global_1$1.MessageChannel; var Dispatch$1 = global_1$1.Dispatch; var counter$1 = 0; @@ -16708,9 +19611,9 @@ typeof navigator === "object" && (function () { delete queue$1[id]; }; // Node.js 0.8- - if (classofRaw$1(process$5) == 'process') { + if (classofRaw$1(process$6) == 'process') { defer$1 = function (id) { - process$5.nextTick(runner$1(id)); + process$6.nextTick(runner$1(id)); }; // Sphere (JS game engine) Dispatch API } else if (Dispatch$1 && Dispatch$1.now) { @@ -16756,9 +19659,9 @@ typeof navigator === "object" && (function () { var MutationObserver$2 = global_1$1.MutationObserver || global_1$1.WebKitMutationObserver; - var process$6 = global_1$1.process; + var process$7 = global_1$1.process; var Promise$2 = global_1$1.Promise; - var IS_NODE$2 = classofRaw$1(process$6) == 'process'; + var IS_NODE$2 = classofRaw$1(process$7) == 'process'; // Node.js 11 shows ExperimentalWarning on getting `queueMicrotask` var queueMicrotaskDescriptor$1 = getOwnPropertyDescriptor$7(global_1$1, 'queueMicrotask'); var queueMicrotask$1 = queueMicrotaskDescriptor$1 && queueMicrotaskDescriptor$1.value; @@ -16769,7 +19672,7 @@ typeof navigator === "object" && (function () { if (!queueMicrotask$1) { flush$1 = function () { var parent, fn; - if (IS_NODE$2 && (parent = process$6.domain)) parent.exit(); + if (IS_NODE$2 && (parent = process$7.domain)) parent.exit(); while (head$1) { fn = head$1.fn; head$1 = head$1.next; @@ -16787,7 +19690,7 @@ typeof navigator === "object" && (function () { // Node.js if (IS_NODE$2) { notify$2 = function () { - process$6.nextTick(flush$1); + process$7.nextTick(flush$1); }; // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339 } else if (MutationObserver$2 && !engineIsIos$1) { @@ -16850,7 +19753,7 @@ typeof navigator === "object" && (function () { var promiseResolve$1 = function (C, x) { anObject$1(C); - if (isObject$4(x) && x.constructor === C) return x; + if (isObject$2(x) && x.constructor === C) return x; var promiseCapability = newPromiseCapability$2.f(C); var resolve = promiseCapability.resolve; resolve(x); @@ -16886,16 +19789,16 @@ typeof navigator === "object" && (function () { var SPECIES$c = wellKnownSymbol$1('species'); var PROMISE$1 = 'Promise'; var getInternalState$8 = internalState$1.get; - var setInternalState$e = internalState$1.set; + var setInternalState$f = internalState$1.set; var getInternalPromiseState$1 = internalState$1.getterFor(PROMISE$1); var PromiseConstructor$1 = nativePromiseConstructor$1; var TypeError$2 = global_1$1.TypeError; var document$4 = global_1$1.document; - var process$7 = global_1$1.process; + var process$8 = global_1$1.process; var $fetch$3 = getBuiltIn$1('fetch'); var newPromiseCapability$3 = newPromiseCapability$2.f; var newGenericPromiseCapability$1 = newPromiseCapability$3; - var IS_NODE$3 = classofRaw$1(process$7) == 'process'; + var IS_NODE$3 = classofRaw$1(process$8) == 'process'; var DISPATCH_EVENT$1 = !!(document$4 && document$4.createEvent && global_1$1.dispatchEvent); var UNHANDLED_REJECTION$1 = 'unhandledrejection'; var REJECTION_HANDLED$1 = 'rejectionhandled'; @@ -16906,7 +19809,7 @@ typeof navigator === "object" && (function () { var UNHANDLED$1 = 2; var Internal$1, OwnPromiseCapability$1, PromiseWrapper$1, nativeThen$1; - var FORCED$a = isForced_1$1(PROMISE$1, function () { + var FORCED$b = isForced_1$1(PROMISE$1, function () { var GLOBAL_CORE_JS_PROMISE = inspectSource$1(PromiseConstructor$1) !== String(PromiseConstructor$1); if (!GLOBAL_CORE_JS_PROMISE) { // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables @@ -16930,14 +19833,14 @@ typeof navigator === "object" && (function () { return !(promise.then(function () { /* empty */ }) instanceof FakePromise); }); - var INCORRECT_ITERATION$3 = FORCED$a || !checkCorrectnessOfIteration$1(function (iterable) { + var INCORRECT_ITERATION$3 = FORCED$b || !checkCorrectnessOfIteration$1(function (iterable) { PromiseConstructor$1.all(iterable)['catch'](function () { /* empty */ }); }); // helpers - var isThenable$1 = function (it) { + var isThenable$2 = function (it) { var then; - return isObject$4(it) && typeof (then = it.then) == 'function' ? then : false; + return isObject$2(it) && typeof (then = it.then) == 'function' ? then : false; }; var notify$3 = function (promise, state, isReject) { @@ -16973,7 +19876,7 @@ typeof navigator === "object" && (function () { } if (result === reaction.promise) { reject(TypeError$2('Promise-chain cycle')); - } else if (then = isThenable$1(result)) { + } else if (then = isThenable$2(result)) { then.call(result, resolve, reject); } else resolve(result); } else reject(value); @@ -17009,7 +19912,7 @@ typeof navigator === "object" && (function () { if (IS_UNHANDLED) { result = perform$1(function () { if (IS_NODE$3) { - process$7.emit('unhandledRejection', value, promise); + process$8.emit('unhandledRejection', value, promise); } else dispatchEvent$1(UNHANDLED_REJECTION$1, promise, value); }); // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should @@ -17026,7 +19929,7 @@ typeof navigator === "object" && (function () { var onHandleUnhandled$1 = function (promise, state) { task$3.call(global_1$1, function () { if (IS_NODE$3) { - process$7.emit('rejectionHandled', promise); + process$8.emit('rejectionHandled', promise); } else dispatchEvent$1(REJECTION_HANDLED$1, promise, state.value); }); }; @@ -17052,7 +19955,7 @@ typeof navigator === "object" && (function () { if (unwrap) state = unwrap; try { if (promise === value) throw TypeError$2("Promise can't be resolved itself"); - var then = isThenable$1(value); + var then = isThenable$2(value); if (then) { microtask$1(function () { var wrapper = { done: false }; @@ -17076,7 +19979,7 @@ typeof navigator === "object" && (function () { }; // constructor polyfill - if (FORCED$a) { + if (FORCED$b) { // 25.4.3.1 Promise(executor) PromiseConstructor$1 = function Promise(executor) { anInstance$1(this, PromiseConstructor$1, PROMISE$1); @@ -17091,7 +19994,7 @@ typeof navigator === "object" && (function () { }; // eslint-disable-next-line no-unused-vars Internal$1 = function Promise(executor) { - setInternalState$e(this, { + setInternalState$f(this, { type: PROMISE$1, done: false, notified: false, @@ -17110,7 +20013,7 @@ typeof navigator === "object" && (function () { var reaction = newPromiseCapability$3(speciesConstructor$1(this, PromiseConstructor$1)); reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; reaction.fail = typeof onRejected == 'function' && onRejected; - reaction.domain = IS_NODE$3 ? process$7.domain : undefined; + reaction.domain = IS_NODE$3 ? process$8.domain : undefined; state.parent = true; state.reactions.push(reaction); if (state.state != PENDING$1) notify$3(this, state, false); @@ -17157,7 +20060,7 @@ typeof navigator === "object" && (function () { } } - _export$1({ global: true, wrap: true, forced: FORCED$a }, { + _export$1({ global: true, wrap: true, forced: FORCED$b }, { Promise: PromiseConstructor$1 }); @@ -17167,7 +20070,7 @@ typeof navigator === "object" && (function () { PromiseWrapper$1 = getBuiltIn$1(PROMISE$1); // statics - _export$1({ target: PROMISE$1, stat: true, forced: FORCED$a }, { + _export$1({ target: PROMISE$1, stat: true, forced: FORCED$b }, { // `Promise.reject` method // https://tc39.github.io/ecma262/#sec-promise.reject reject: function reject(r) { @@ -17177,7 +20080,7 @@ typeof navigator === "object" && (function () { } }); - _export$1({ target: PROMISE$1, stat: true, forced: FORCED$a }, { + _export$1({ target: PROMISE$1, stat: true, forced: FORCED$b }, { // `Promise.resolve` method // https://tc39.github.io/ecma262/#sec-promise.resolve resolve: function resolve(x) { @@ -17278,7 +20181,7 @@ typeof navigator === "object" && (function () { return input === null || typeof input === 'undefined'; }; - var isObject$6 = function isObject(input) { + var isObject$4 = function isObject(input) { return getConstructor$2(input) === Object; }; @@ -17286,7 +20189,7 @@ typeof navigator === "object" && (function () { return getConstructor$2(input) === Number && !Number.isNaN(input); }; - var isString$4 = function isString(input) { + var isString$3 = function isString(input) { return getConstructor$2(input) === String; }; @@ -17294,11 +20197,11 @@ typeof navigator === "object" && (function () { return getConstructor$2(input) === Boolean; }; - var isFunction$4 = function isFunction(input) { + var isFunction$2 = function isFunction(input) { return getConstructor$2(input) === Function; }; - var isArray$6 = function isArray(input) { + var isArray$4 = function isArray(input) { return Array.isArray(input); }; @@ -17310,7 +20213,7 @@ typeof navigator === "object" && (function () { return instanceOf$2(input, NodeList); }; - var isElement$2 = function isElement(input) { + var isElement$3 = function isElement(input) { return instanceOf$2(input, Element); }; @@ -17318,7 +20221,7 @@ typeof navigator === "object" && (function () { return getConstructor$2(input) === Text; }; - var isEvent$2 = function isEvent(input) { + var isEvent$3 = function isEvent(input) { return instanceOf$2(input, Event); }; @@ -17331,15 +20234,15 @@ typeof navigator === "object" && (function () { }; var isTrack = function isTrack(input) { - return instanceOf$2(input, TextTrack) || !isNullOrUndefined$2(input) && isString$4(input.kind); + return instanceOf$2(input, TextTrack) || !isNullOrUndefined$2(input) && isString$3(input.kind); }; var isPromise = function isPromise(input) { - return instanceOf$2(input, Promise) && isFunction$4(input.then); + return instanceOf$2(input, Promise) && isFunction$2(input.then); }; var isEmpty$2 = function isEmpty(input) { - return isNullOrUndefined$2(input) || (isString$4(input) || isArray$6(input) || isNodeList$2(input)) && !input.length || isObject$6(input) && !Object.keys(input).length; + return isNullOrUndefined$2(input) || (isString$3(input) || isArray$4(input) || isNodeList$2(input)) && !input.length || isObject$4(input) && !Object.keys(input).length; }; var isUrl = function isUrl(input) { @@ -17349,7 +20252,7 @@ typeof navigator === "object" && (function () { } // Must be string from here - if (!isString$4(input)) { + if (!isString$3(input)) { return false; } // Add the protocol if required @@ -17369,17 +20272,17 @@ typeof navigator === "object" && (function () { var is$2 = { nullOrUndefined: isNullOrUndefined$2, - object: isObject$6, + object: isObject$4, number: isNumber$2, - string: isString$4, + string: isString$3, boolean: isBoolean$2, - function: isFunction$4, - array: isArray$6, + function: isFunction$2, + array: isArray$4, weakMap: isWeakMap, nodeList: isNodeList$2, - element: isElement$2, + element: isElement$3, textNode: isTextNode, - event: isEvent$2, + event: isEvent$3, keyboardEvent: isKeyboardEvent, cue: isCue, track: isTrack, @@ -17466,7 +20369,7 @@ typeof navigator === "object" && (function () { right: createMethod$b(true) }; - var $reduce$2 = arrayReduce$1.left; + var $reduce$1 = arrayReduce$1.left; @@ -17477,7 +20380,7 @@ typeof navigator === "object" && (function () { // https://tc39.github.io/ecma262/#sec-array.prototype.reduce _export$1({ target: 'Array', proto: true, forced: !STRICT_METHOD$a || !USES_TO_LENGTH$i }, { reduce: function reduce(callbackfn /* , initialValue */) { - return $reduce$2(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined); + return $reduce$1(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined); } }); @@ -17522,7 +20425,7 @@ typeof navigator === "object" && (function () { return extend$1.apply(void 0, [target].concat(sources)); } - function wrap$3(elements, wrapper) { + function wrap$4(elements, wrapper) { // Convert `elements` to an array, if necessary. var targets = elements.length ? elements : [elements]; // Loops backwards to prevent having to clone the wrapper on the // first element (see `child` below). @@ -18269,12 +21172,12 @@ typeof navigator === "object" && (function () { var fin = toAbsoluteIndex$1(end === undefined ? length : end, length); // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible var Constructor, result, n; - if (isArray$4(O)) { + if (isArray$2(O)) { Constructor = O.constructor; // cross-realm fallback - if (typeof Constructor == 'function' && (Constructor === Array || isArray$4(Constructor.prototype))) { + if (typeof Constructor == 'function' && (Constructor === Array || isArray$2(Constructor.prototype))) { Constructor = undefined; - } else if (isObject$4(Constructor)) { + } else if (isObject$2(Constructor)) { Constructor = Constructor[SPECIES$d]; if (Constructor === null) Constructor = undefined; } @@ -18296,7 +21199,7 @@ typeof navigator === "object" && (function () { - var setInternalState$f = internalState$1.set; + var setInternalState$g = internalState$1.set; @@ -18311,7 +21214,7 @@ typeof navigator === "object" && (function () { var UNSUPPORTED_Y$5 = regexpStickyHelpers$1.UNSUPPORTED_Y; - var FORCED$b = descriptors$1 && isForced_1$1('RegExp', (!CORRECT_NEW$1 || UNSUPPORTED_Y$5 || fails$1(function () { + var FORCED$c = descriptors$1 && isForced_1$1('RegExp', (!CORRECT_NEW$1 || UNSUPPORTED_Y$5 || fails$1(function () { re2$1[MATCH$5] = false; // RegExp constructor can alter flags and IsRegExp works correct with @@match return NativeRegExp$1(re1$1) != re1$1 || NativeRegExp$1(re2$1) == re2$1 || NativeRegExp$1(re1$1, 'i') != '/a/i'; @@ -18319,7 +21222,7 @@ typeof navigator === "object" && (function () { // `RegExp` constructor // https://tc39.github.io/ecma262/#sec-regexp-constructor - if (FORCED$b) { + if (FORCED$c) { var RegExpWrapper$1 = function RegExp(pattern, flags) { var thisIsRegExp = this instanceof RegExpWrapper$1; var patternIsRegExp = isRegexp$1(pattern); @@ -18348,7 +21251,7 @@ typeof navigator === "object" && (function () { RegExpWrapper$1 ); - if (UNSUPPORTED_Y$5 && sticky) setInternalState$f(result, { sticky: sticky }); + if (UNSUPPORTED_Y$5 && sticky) setInternalState$g(result, { sticky: sticky }); return result; }; @@ -20210,7 +23113,7 @@ typeof navigator === "object" && (function () { * @param {Boolean} safe - failsafe parsing */ - function parseUrl$2(input) { + function parseUrl$1(input) { var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; var url = input; @@ -20273,7 +23176,7 @@ typeof navigator === "object" && (function () { var elements = this.media.querySelectorAll('track'); Array.from(elements).forEach(function (track) { var src = track.getAttribute('src'); - var url = parseUrl$2(src); + var url = parseUrl$1(src); if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) { fetch(src, 'blob').then(function (blob) { @@ -23484,7 +26387,7 @@ typeof navigator === "object" && (function () { class: this.config.classNames.video }); // Wrap the video in a container - wrap$3(this.media, this.elements.wrapper); // Faux poster container + wrap$4(this.media, this.elements.wrapper); // Faux poster container if (this.isEmbed) { this.elements.poster = createElement$1('div', { @@ -24177,11 +27080,11 @@ typeof navigator === "object" && (function () { var STRICT_METHOD$b = arrayMethodIsStrict$1('lastIndexOf'); // For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method var USES_TO_LENGTH$m = arrayMethodUsesToLength$1('indexOf', { ACCESSORS: true, 1: 0 }); - var FORCED$c = NEGATIVE_ZERO$3 || !STRICT_METHOD$b || !USES_TO_LENGTH$m; + var FORCED$d = NEGATIVE_ZERO$3 || !STRICT_METHOD$b || !USES_TO_LENGTH$m; // `Array.prototype.lastIndexOf` method implementation // https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof - var arrayLastIndexOf$1 = FORCED$c ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) { + var arrayLastIndexOf$1 = FORCED$d ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) { // convert -0 to +0 if (NEGATIVE_ZERO$3) return nativeLastIndexOf$1.apply(this, arguments) || 0; var O = toIndexedObject$1(this); @@ -25224,7 +28127,7 @@ typeof navigator === "object" && (function () { if (is$2.element(iframe)) { // Detect provider - url = parseUrl$2(iframe.getAttribute('src')); + url = parseUrl$1(iframe.getAttribute('src')); this.provider = getProviderByUrl(url.toString()); // Rework elements this.elements.container = this.media; @@ -25321,7 +28224,7 @@ typeof navigator === "object" && (function () { this.elements.container = createElement$1('div', { tabindex: 0 }); - wrap$3(this.media, this.elements.container); + wrap$4(this.media, this.elements.container); } // Add style hook @@ -26444,132 +29347,131 @@ typeof navigator === "object" && (function () { }; (function () { - var host = window.location.host; - var env = { - prod: host === 'plyr.io', - dev: host === 'dev.plyr.io' - }; - document.addEventListener('DOMContentLoaded', function () { - singleton.context(function () { - var selector = '#player'; // Setup share buttons + var production = 'plyr.io'; // Sentry for demo site (https://plyr.io) only - Shr.setup('.js-shr', { - count: { - className: 'button__count' - }, - wrapper: { - className: 'button--with-count' - } - }); // Setup the player - - var player = new Plyr(selector, { - debug: true, - title: 'View From A Blue Moon', - iconUrl: 'dist/demo.svg', - keyboard: { - global: true - }, - tooltips: { - controls: true - }, - captions: { - active: true - }, - ads: { - enabled: env.prod || env.dev, - publisherId: '918848828995742' - }, - previewThumbnails: { - enabled: true, - src: ['https://cdn.plyr.io/static/demo/thumbs/100p.vtt', 'https://cdn.plyr.io/static/demo/thumbs/240p.vtt'] - }, - vimeo: { - // Prevent Vimeo blocking plyr.io demo site - referrerPolicy: 'no-referrer' - } - }); // Expose for tinkering in the console - - window.player = player; // Setup type toggle - - var buttons = document.querySelectorAll('[data-source]'); - var types = Object.keys(sources); - var historySupport = Boolean(window.history && window.history.pushState); - var currentType = window.location.hash.substring(1); - var hasCurrentType = !currentType.length; - - function render(type) { - // Remove active classes - Array.from(buttons).forEach(function (button) { - return toggleClass$1(button.parentElement, 'active', false); - }); // Set active on parent - - toggleClass$1(document.querySelector("[data-source=\"".concat(type, "\"]")), 'active', true); // Show cite - - Array.from(document.querySelectorAll('.plyr__cite')).forEach(function (cite) { - // eslint-disable-next-line no-param-reassign - cite.hidden = true; - }); - document.querySelector(".plyr__cite--".concat(type)).hidden = false; - } // Set a new source - - - function setSource(type, init) { - // Bail if new type isn't known, it's the current type, or current type is empty (video is default) and new type is video - if (!types.includes(type) || !init && type === currentType || !currentType.length && type === 'video') { - return; - } // Set the new source - - - player.source = sources[type]; // Set the current type for next time - - currentType = type; - render(type); - } // Bind to each button - - - Array.from(buttons).forEach(function (button) { - button.addEventListener('click', function () { - var type = button.getAttribute('data-source'); - setSource(type); - - if (historySupport) { - window.history.pushState({ - type: type - }, '', "#".concat(type)); - } - }); - }); // List for backwards/forwards - - window.addEventListener('popstate', function (event) { - if (event.state && Object.keys(event.state).includes('type')) { - setSource(event.state.type); - } - }); // If there's no current type set, assume video - - if (hasCurrentType) { - currentType = 'video'; - } // Replace current history state - - - if (historySupport && types.includes(currentType)) { - window.history.replaceState({ - type: currentType - }, '', hasCurrentType ? '' : "#".concat(currentType)); - } // If it's not video, load the source - - - if (currentType !== 'video') { - setSource(currentType, true); - } - - render(currentType); + if (window.location.host === production) { + init({ + dsn: 'https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555', + whitelistUrls: [production].map(function (d) { + return new RegExp("https://(([a-z0-9])+(.))*".concat(d)); + }) }); - }); // Raven / Sentry - // For demo site (https://plyr.io) only - - if (env.prod) { - singleton.config('https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555').install(); } + + document.addEventListener('DOMContentLoaded', function () { + var selector = '#player'; // Setup share buttons + + Shr.setup('.js-shr', { + count: { + className: 'button__count' + }, + wrapper: { + className: 'button--with-count' + } + }); // Setup the player + + var player = new Plyr(selector, { + debug: true, + title: 'View From A Blue Moon', + iconUrl: 'dist/demo.svg', + keyboard: { + global: true + }, + tooltips: { + controls: true + }, + captions: { + active: true + }, + ads: { + enabled: window.location.host.includes(production), + publisherId: '918848828995742' + }, + previewThumbnails: { + enabled: true, + src: ['https://cdn.plyr.io/static/demo/thumbs/100p.vtt', 'https://cdn.plyr.io/static/demo/thumbs/240p.vtt'] + }, + vimeo: { + // Prevent Vimeo blocking plyr.io demo site + referrerPolicy: 'no-referrer' + } + }); // Expose for tinkering in the console + + window.player = player; // Setup type toggle + + var buttons = document.querySelectorAll('[data-source]'); + var types = Object.keys(sources); + var historySupport = Boolean(window.history && window.history.pushState); + var currentType = window.location.hash.substring(1); + var hasInitialType = currentType.length; + + function render(type) { + // Remove active classes + Array.from(buttons).forEach(function (button) { + return toggleClass$1(button.parentElement, 'active', false); + }); // Set active on parent + + toggleClass$1(document.querySelector("[data-source=\"".concat(type, "\"]")), 'active', true); // Show cite + + Array.from(document.querySelectorAll('.plyr__cite')).forEach(function (cite) { + // eslint-disable-next-line no-param-reassign + cite.hidden = true; + }); + document.querySelector(".plyr__cite--".concat(type)).hidden = false; + } // Set a new source + + + function setSource(type, init) { + // Bail if new type isn't known, it's the current type, or current type is empty (video is default) and new type is video + if (!types.includes(type) || !init && type === currentType || !currentType.length && type === 'video') { + return; + } // Set the new source + + + player.source = sources[type]; // Set the current type for next time + + currentType = type; + render(type); + } // Bind to each button + + + Array.from(buttons).forEach(function (button) { + button.addEventListener('click', function () { + var type = button.getAttribute('data-source'); + setSource(type); + + if (historySupport) { + window.history.pushState({ + type: type + }, '', "#".concat(type)); + } + }); + }); // List for backwards/forwards + + window.addEventListener('popstate', function (event) { + if (event.state && Object.keys(event.state).includes('type')) { + setSource(event.state.type); + } + }); // If there's no current type set, assume video + + if (!hasInitialType) { + currentType = 'video'; + } // Replace current history state + + + if (historySupport && types.includes(currentType)) { + window.history.replaceState({ + type: currentType + }, '', hasInitialType ? "#".concat(currentType) : ''); + } // If it's not video, load the source + + + if (currentType !== 'video') { + setSource(currentType, true); + } + + render(currentType); + }); })(); }()); diff --git a/demo/dist/demo.min.js b/demo/dist/demo.min.js index a94e2f80..4cf9cec8 100644 --- a/demo/dist/demo.min.js +++ b/demo/dist/demo.min.js @@ -1,4 +1,19 @@ -"object"==typeof navigator&&function(){"use strict";var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function t(e,t){return e(t={exports:{}},t.exports),t.exports}var n=function(e){return e&&e.Math==Math&&e},r=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof e&&e)||Function("return this")(),i=function(e){try{return!!e()}catch(e){return!0}},o=!i((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),a={}.propertyIsEnumerable,s=Object.getOwnPropertyDescriptor,c={f:s&&!a.call({1:2},1)?function(e){var t=s(this,e);return!!t&&t.enumerable}:a},l=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},u={}.toString,f=function(e){return u.call(e).slice(8,-1)},h="".split,d=i((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==f(e)?h.call(e,""):Object(e)}:Object,p=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},g=function(e){return d(p(e))},m=function(e){return"object"==typeof e?null!==e:"function"==typeof e},v=function(e,t){if(!m(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!m(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!m(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!m(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")},y={}.hasOwnProperty,b=function(e,t){return y.call(e,t)},w=r.document,k=m(w)&&m(w.createElement),S=function(e){return k?w.createElement(e):{}},E=!o&&!i((function(){return 7!=Object.defineProperty(S("div"),"a",{get:function(){return 7}}).a})),_=Object.getOwnPropertyDescriptor,T={f:o?_:function(e,t){if(e=g(e),t=v(t,!0),E)try{return _(e,t)}catch(e){}if(b(e,t))return l(!c.f.call(e,t),e[t])}},A=function(e){if(!m(e))throw TypeError(String(e)+" is not an object");return e},x=Object.defineProperty,O={f:o?x:function(e,t,n){if(A(e),t=v(t,!0),A(n),E)try{return x(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},C=o?function(e,t,n){return O.f(e,t,l(1,n))}:function(e,t,n){return e[t]=n,e},P=function(e,t){try{C(r,e,t)}catch(n){r[e]=t}return t},I=r["__core-js_shared__"]||P("__core-js_shared__",{}),R=Function.toString;"function"!=typeof I.inspectSource&&(I.inspectSource=function(e){return R.call(e)});var j,L,M,N=I.inspectSource,U=r.WeakMap,F="function"==typeof U&&/native code/.test(N(U)),D=t((function(e){(e.exports=function(e,t){return I[e]||(I[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.6.4",mode:"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})})),B=0,q=Math.random(),H=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++B+q).toString(36)},V=D("keys"),z=function(e){return V[e]||(V[e]=H(e))},W={},$=r.WeakMap;if(F){var K=new $,Y=K.get,G=K.has,X=K.set;j=function(e,t){return X.call(K,e,t),t},L=function(e){return Y.call(K,e)||{}},M=function(e){return G.call(K,e)}}else{var J=z("state");W[J]=!0,j=function(e,t){return C(e,J,t),t},L=function(e){return b(e,J)?e[J]:{}},M=function(e){return b(e,J)}}var Q={set:j,get:L,has:M,enforce:function(e){return M(e)?L(e):j(e,{})},getterFor:function(e){return function(t){var n;if(!m(t)||(n=L(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}},Z=t((function(e){var t=Q.get,n=Q.enforce,i=String(String).split("String");(e.exports=function(e,t,o,a){var s=!!a&&!!a.unsafe,c=!!a&&!!a.enumerable,l=!!a&&!!a.noTargetGet;"function"==typeof o&&("string"!=typeof t||b(o,"name")||C(o,"name",t),n(o).source=i.join("string"==typeof t?t:"")),e!==r?(s?!l&&e[t]&&(c=!0):delete e[t],c?e[t]=o:C(e,t,o)):c?e[t]=o:P(t,o)})(Function.prototype,"toString",(function(){return"function"==typeof this&&t(this).source||N(this)}))})),ee=r,te=function(e){return"function"==typeof e?e:void 0},ne=function(e,t){return arguments.length<2?te(ee[e])||te(r[e]):ee[e]&&ee[e][t]||r[e]&&r[e][t]},re=Math.ceil,ie=Math.floor,oe=function(e){return isNaN(e=+e)?0:(e>0?ie:re)(e)},ae=Math.min,se=function(e){return e>0?ae(oe(e),9007199254740991):0},ce=Math.max,le=Math.min,ue=function(e,t){var n=oe(e);return n<0?ce(n+t,0):le(n,t)},fe=function(e){return function(t,n,r){var i,o=g(t),a=se(o.length),s=ue(r,a);if(e&&n!=n){for(;a>s;)if((i=o[s++])!=i)return!0}else for(;a>s;s++)if((e||s in o)&&o[s]===n)return e||s||0;return!e&&-1}},he={includes:fe(!0),indexOf:fe(!1)},de=he.indexOf,pe=function(e,t){var n,r=g(e),i=0,o=[];for(n in r)!b(W,n)&&b(r,n)&&o.push(n);for(;t.length>i;)b(r,n=t[i++])&&(~de(o,n)||o.push(n));return o},ge=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],me=ge.concat("length","prototype"),ve={f:Object.getOwnPropertyNames||function(e){return pe(e,me)}},ye={f:Object.getOwnPropertySymbols},be=ne("Reflect","ownKeys")||function(e){var t=ve.f(A(e)),n=ye.f;return n?t.concat(n(e)):t},we=function(e,t){for(var n=be(t),r=O.f,i=T.f,o=0;oy;y++)if((a||y in g)&&(h=m(f=g[y],y,p),e))if(t)w[y]=h;else if(h)switch(e){case 3:return!0;case 5:return f;case 6:return y;case 2:He.call(w,f)}else if(i)return!1;return o?-1:r||i?i:w}},ze={forEach:Ve(0),map:Ve(1),filter:Ve(2),some:Ve(3),every:Ve(4),find:Ve(5),findIndex:Ve(6)},We=function(e,t){var n=[][e];return!!n&&i((function(){n.call(null,t||function(){throw 1},1)}))},$e=Object.defineProperty,Ke={},Ye=function(e){throw e},Ge=function(e,t){if(b(Ke,e))return Ke[e];t||(t={});var n=[][e],r=!!b(t,"ACCESSORS")&&t.ACCESSORS,a=b(t,0)?t[0]:Ye,s=b(t,1)?t[1]:void 0;return Ke[e]=!!n&&!i((function(){if(r&&!o)return!0;var e={length:-1};r?$e(e,1,{enumerable:!0,get:Ye}):e[1]=1,n.call(e,a,s)}))},Xe=ze.forEach,Je=We("forEach"),Qe=Ge("forEach"),Ze=Je&&Qe?[].forEach:function(e){return Xe(this,e,arguments.length>1?arguments[1]:void 0)};Ce({target:"Array",proto:!0,forced:[].forEach!=Ze},{forEach:Ze});var et=function(e,t,n,r){try{return r?t(A(n)[0],n[1]):t(n)}catch(t){var i=e.return;throw void 0!==i&&A(i.call(e)),t}},tt={},nt=De("iterator"),rt=Array.prototype,it=function(e){return void 0!==e&&(tt.Array===e||rt[nt]===e)},ot=function(e,t,n){var r=v(t);r in e?O.f(e,r,l(0,n)):e[r]=n},at={};at[De("toStringTag")]="z";var st="[object z]"===String(at),ct=De("toStringTag"),lt="Arguments"==f(function(){return arguments}()),ut=st?f:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),ct))?n:lt?f(t):"Object"==(r=f(t))&&"function"==typeof t.callee?"Arguments":r},ft=De("iterator"),ht=function(e){if(null!=e)return e[ft]||e["@@iterator"]||tt[ut(e)]},dt=function(e){var t,n,r,i,o,a,s=Re(e),c="function"==typeof this?this:Array,l=arguments.length,u=l>1?arguments[1]:void 0,f=void 0!==u,h=ht(s),d=0;if(f&&(u=Ie(u,l>2?arguments[2]:void 0,2)),null==h||c==Array&&it(h))for(n=new c(t=se(s.length));t>d;d++)a=f?u(s[d],d):s[d],ot(n,d,a);else for(o=(i=h.call(s)).next,n=new c;!(r=o.call(i)).done;d++)a=f?et(i,u,[r.value,d],!0):r.value,ot(n,d,a);return n.length=d,n},pt=De("iterator"),gt=!1;try{var mt=0,vt={next:function(){return{done:!!mt++}},return:function(){gt=!0}};vt[pt]=function(){return this},Array.from(vt,(function(){throw 2}))}catch(e){}var yt=function(e,t){if(!t&&!gt)return!1;var n=!1;try{var r={};r[pt]=function(){return{next:function(){return{done:n=!0}}}},e(r)}catch(e){}return n},bt=!yt((function(e){Array.from(e)}));Ce({target:"Array",stat:!0,forced:bt},{from:dt});var wt,kt=Object.keys||function(e){return pe(e,ge)},St=o?Object.defineProperties:function(e,t){A(e);for(var n,r=kt(t),i=r.length,o=0;i>o;)O.f(e,n=r[o++],t[n]);return e},Et=ne("document","documentElement"),_t=z("IE_PROTO"),Tt=function(){},At=function(e){return"