diff options
Diffstat (limited to 'demo/dist/demo.js')
-rw-r--r-- | demo/dist/demo.js | 11931 |
1 files changed, 7629 insertions, 4302 deletions
diff --git a/demo/dist/demo.js b/demo/dist/demo.js index 87fcc70e..31021f2e 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 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 HAS_SPECIES_SUPPORT$1 = arrayMethodHasSpeciesSupport('slice'); + var USES_TO_LENGTH$4 = arrayMethodUsesToLength('slice', { ACCESSORS: true, 0: 0, 1: 2 }); - 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); @@ -4253,20 +4380,52 @@ typeof navigator === "object" && (function () { return target; } + function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + target[key] = source[key]; + } + + return target; + } + + function _objectWithoutProperties(source, excluded) { + if (source == null) return {}; + + var target = _objectWithoutPropertiesLoose(source, excluded); + + var key, i; + + if (Object.getOwnPropertySymbols) { + var sourceSymbolKeys = Object.getOwnPropertySymbols(source); + + for (i = 0; i < sourceSymbolKeys.length; i++) { + key = sourceSymbolKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; + target[key] = source[key]; + } + } + + return target; + } + function _slicedToArray(arr, i) { - return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); + return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; - - return arr2; - } + if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayWithHoles(arr) { @@ -4274,14 +4433,11 @@ typeof navigator === "object" && (function () { } function _iterableToArray(iter) { - if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); + if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } function _iterableToArrayLimit(arr, i) { - if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { - return; - } - + if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; @@ -4307,12 +4463,29 @@ typeof navigator === "object" && (function () { return _arr; } + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(n); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); + } + + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + + return arr2; + } + function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance"); + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _nonIterableRest() { - throw new TypeError("Invalid attempt to destructure non-iterable instance"); + throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } (function (global) { @@ -4793,6 +4966,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'; @@ -4814,12 +4991,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); @@ -4841,94 +5018,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; @@ -4973,7 +5084,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; @@ -5022,9 +5133,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) { @@ -5070,9 +5181,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; @@ -5083,7 +5194,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; @@ -5101,7 +5212,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) { @@ -5200,16 +5311,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'; @@ -5220,7 +5331,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 @@ -5244,7 +5355,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 */ }); }); @@ -5323,7 +5434,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 @@ -5340,7 +5451,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); }); }; @@ -5390,7 +5501,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); @@ -5405,7 +5516,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, @@ -5424,7 +5535,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); @@ -5471,7 +5582,7 @@ typeof navigator === "object" && (function () { } } - _export({ global: true, wrap: true, forced: FORCED$2 }, { + _export({ global: true, wrap: true, forced: FORCED$3 }, { Promise: PromiseConstructor }); @@ -5481,7 +5592,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) { @@ -5491,7 +5602,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) { @@ -5546,294 +5657,502 @@ 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.
+ ***************************************************************************** */ + + /* 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]; + } + }; - 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'; + return _extendStatics(d, b); + }; - // `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); + 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]; + } } - A = arraySpeciesCreate(O, actualDeleteCount); - for (k = 0; k < actualDeleteCount; k++) { - from = actualStart + k; - if (from in O) createProperty(A, k, O[from]); + + 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 + }; } - 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]; - } + }; + 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); } - for (k = 0; k < insertCount; k++) { - O[k + actualStart] = arguments[k + 2]; + } catch (error) { + e = { + error: error + }; + } finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } finally { + if (e) throw e.error; } - O.length = len - actualDeleteCount + insertCount; - return A; } - }); - // @@match logic - fixRegexpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) { - return [ - // `String.prototype.match` method - // https://tc39.github.io/ecma262/#sec-string.prototype.match - function match(regexp) { - var O = requireObjectCoercible(this); - var matcher = regexp == undefined ? undefined : regexp[MATCH]; - return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O)); - }, - // `RegExp.prototype[@@match]` method - // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match - function (regexp) { - var res = maybeCallNative(nativeMatch, regexp, this); - if (res.done) return res.value; + return ar; + } + function __spread() { + for (var ar = [], i = 0; i < arguments.length; i++) { + ar = ar.concat(__read(arguments[i])); + } - var rx = anObject(regexp); - var S = String(this); + return ar; + } - if (!rx.global) return regexpExecAbstract(rx, S); + /** JSDoc */ + var Severity; - var fullUnicode = rx.unicode; - rx.lastIndex = 0; - var A = []; - var n = 0; - var result; - while ((result = regexpExecAbstract(rx, S)) !== null) { - var matchStr = String(result[0]); - A[n] = matchStr; - if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode); - n++; - } - return n === 0 ? null : A; - } - ]; - }); + (function (Severity) { + /** JSDoc */ + Severity["Fatal"] = "fatal"; + /** JSDoc */ - var $filter = arrayIteration.filter; + Severity["Error"] = "error"; + /** JSDoc */ + Severity["Warning"] = "warning"; + /** JSDoc */ + Severity["Log"] = "log"; + /** JSDoc */ - var HAS_SPECIES_SUPPORT$2 = arrayMethodHasSpeciesSupport('filter'); - // Edge 14- issue - var USES_TO_LENGTH$6 = arrayMethodUsesToLength('filter'); + Severity["Info"] = "info"; + /** JSDoc */ - // `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); - } - }); + Severity["Debug"] = "debug"; + /** JSDoc */ - var $map = arrayIteration.map; + 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; - var HAS_SPECIES_SUPPORT$3 = arrayMethodHasSpeciesSupport('map'); - // FF49- issue - var USES_TO_LENGTH$7 = arrayMethodUsesToLength('map'); + case 'error': + return Severity.Error; - // `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); + case 'fatal': + return Severity.Fatal; + + case 'critical': + return Severity.Critical; + + case 'log': + default: + return Severity.Log; + } } - }); - // `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'); - } + 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; } - for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) { - memo = callbackfn(memo, self[index], index, O); + + if (code === 429) { + return Status.RateLimit; } - 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) - }; + if (code >= 400 && code < 500) { + return Status.Invalid; + } - var $reduce = arrayReduce.left; + if (code >= 500) { + return Status.Failed; + } + return Status.Unknown; + } + Status.fromHttpCode = fromHttpCode; + })(Status || (Status = {})); - var STRICT_METHOD$4 = arrayMethodIsStrict('reduce'); - var USES_TO_LENGTH$8 = arrayMethodUsesToLength('reduce', { 1: 0 }); + var defineProperty$6 = objectDefineProperty.f; - // `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 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__ + */ - var nativeIsFrozen = Object.isFrozen; - var FAILS_ON_PRIMITIVES$1 = fails(function () { nativeIsFrozen(1); }); + function setProtoOf(obj, proto) { + // @ts-ignore + obj.__proto__ = proto; + return obj; + } + /** + * setPrototypeOf polyfill using mixin + */ - // `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; + + function mixinProperties(obj, proto) { + for (var prop in proto) { + if (!obj.hasOwnProperty(prop)) { + // @ts-ignore + obj[prop] = proto[prop]; + } } - }); - // 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; - }; + return obj; + } - var defineProperty$6 = objectDefineProperty.f; - var getOwnPropertyNames = objectGetOwnPropertyNames.f; + /** 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 - var setInternalState$6 = internalState.set; + _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; - var MATCH$2 = wellKnownSymbol('match'); - var NativeRegExp = global_1.RegExp; - var RegExpPrototype$1 = NativeRegExp.prototype; - var re1 = /a/g; - var re2 = /a/g; + case '[object Exception]': + return true; - // "new" should create a new object, old webkit bug - var CORRECT_NEW = new NativeRegExp(re1) !== re1; + case '[object DOMException]': + return true; - var UNSUPPORTED_Y$2 = regexpStickyHelpers.UNSUPPORTED_Y; + 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. + */ - 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'; - }))); + 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. + */ - // `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; + 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. + */ - if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper && flagsAreUndefined) { - return pattern; - } + 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. + */ - if (CORRECT_NEW) { - if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source; - } else if (pattern instanceof RegExpWrapper) { - if (flagsAreUndefined) flags = regexpFlags.call(pattern); - pattern = pattern.source; - } + 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. + */ - if (UNSUPPORTED_Y$2) { - sticky = !!flags && flags.indexOf('y') > -1; - if (sticky) flags = flags.replace(/y/g, ''); - } + 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. + */ - var result = inheritIfRequired( - CORRECT_NEW ? new NativeRegExp(pattern, flags) : NativeRegExp(pattern, flags), - thisIsRegExp ? this : RegExpPrototype$1, - RegExpWrapper - ); + 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. + */ - if (UNSUPPORTED_Y$2 && sticky) setInternalState$6(result, { sticky: sticky }); + 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. + */ - 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); + 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. + */ - // https://tc39.github.io/ecma262/#sec-get-regexp-@@species - setSpecies('RegExp'); + 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) { + return [ + // `String.prototype.match` method + // https://tc39.github.io/ecma262/#sec-string.prototype.match + function match(regexp) { + var O = requireObjectCoercible(this); + var matcher = regexp == undefined ? undefined : regexp[MATCH]; + return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O)); + }, + // `RegExp.prototype[@@match]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match + function (regexp) { + var res = maybeCallNative(nativeMatch, regexp, this); + if (res.done) return res.value; + + var rx = anObject(regexp); + var S = String(this); + + if (!rx.global) return regexpExecAbstract(rx, S); + + var fullUnicode = rx.unicode; + rx.lastIndex = 0; + var A = []; + var n = 0; + var result; + while ((result = regexpExecAbstract(rx, S)) !== null) { + var matchStr = String(result[0]); + A[n] = matchStr; + if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode); + n++; + } + return n === 0 ? null : A; + } + ]; + }); var arrayBufferNative = typeof ArrayBuffer !== 'undefined' && typeof DataView !== 'undefined'; @@ -6107,6 +6426,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; @@ -6600,7 +6932,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 @@ -6610,7 +6942,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; @@ -6655,7 +6987,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; @@ -6665,7 +6997,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; @@ -6773,6 +7105,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; @@ -6798,7 +7152,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; @@ -6806,7 +7196,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; @@ -6842,7 +7232,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({}); }); @@ -6858,14 +7248,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(); }); @@ -6880,7 +7270,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; @@ -6930,7 +7320,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]); @@ -6940,7 +7330,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; @@ -6963,3840 +7353,6405 @@ 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; + /** + * 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 truncate(str, max) { + if (max === void 0) { + max = 0; + } // tslint:disable-next-line:strict-type-predicates - function indexOf(haystack, needle) { - for (var i = 0; i < haystack.length; ++i) { - if (haystack[i] === needle) return i; - } - return -1; + if (typeof str !== 'string' || max === 0) { + return str; } - 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 + return str.length <= max ? str : str.substr(0, max) + "..."; + } + /** + * 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 safeJoin(input, delimiter) { + if (!Array.isArray(input)) { + return ''; + } + var output = []; // tslint:disable-next-line:prefer-for-of - 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 = 0; i < input.length; i++) { + var value = input[i]; - for (var i in value) { - if (Object.prototype.hasOwnProperty.call(value, i)) { - err[i] = value[i]; - } + try { + output.push(String(value)); + } catch (e) { + output.push('[value cannot be serialized]'); } + } - return err; + 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); } - function serializer(replacer, cycleReplacer) { - var stack = []; - var keys = []; + if (typeof pattern === 'string') { + return value.indexOf(pattern) !== -1; + } - if (cycleReplacer == null) { - cycleReplacer = function cycleReplacer(key, value) { - if (stack[0] === value) { - return '[Circular ~]'; - } + return false; + } - return '[Circular ~.' + keys.slice(0, indexOf(stack, value)).join('.') + ']'; - }; - } + /** + * Requires a module which is protected against bundler minification. + * + * @param request The module path to resolve + */ - 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); + 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 + */ - if (~indexOf(stack, value)) { - value = cycleReplacer.call(this, key, value); - } - } else { - stack.push(value); + 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 global = getGlobalObject(); + var crypto = global.crypto || global.msCrypto; + + if (!(crypto === void 0) && crypto.getRandomValues) { + // Use window.crypto API if available + 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; + + var pad = function pad(num) { + var v = num.toString(16); + + while (v.length < 4) { + v = "0" + v; } - return replacer == null ? value instanceof Error ? stringifyError(value) : value : replacer.call(this, key, value); + 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]); + } // 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 <a/> 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 stringify_2 = stringify_1.getSerialize; - var _window = typeof window !== 'undefined' ? window : typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof self !== 'undefined' ? self : {}; + var match = url.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/); - function isObject$1(what) { - return _typeof(what) === 'object' && what !== null; - } // Yanked from https://git.io/vS8DV re-used under CC0 - // with some tiny modifications + if (!match) { + return {}; + } // coerce to undefined values to empty string so we don't get 'undefined' - function isError(value) { - switch (Object.prototype.toString.call(value)) { - case '[object Error]': - return true; + 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 + */ - case '[object Exception]': - return true; + function getEventDescription(event) { + if (event.message) { + return event.message; + } - case '[object DOMException]': - return true; + if (event.exception && event.exception.values && event.exception.values[0]) { + var exception = event.exception.values[0]; - default: - return value instanceof Error; + if (exception.type && exception.value) { + return exception.type + ": " + exception.value; + } + + return exception.type || exception.value || event.event_id || '<unknown>'; } - } - function isErrorEvent(value) { - return Object.prototype.toString.call(value) === '[object ErrorEvent]'; + return event.event_id || '<unknown>'; } + /** JSDoc */ - function isDOMError(value) { - return Object.prototype.toString.call(value) === '[object DOMError]'; - } + function consoleSandbox(callback) { + var global = getGlobalObject(); + var levels = ['debug', 'info', 'warn', 'error', 'log', 'assert']; - function isDOMException(value) { - return Object.prototype.toString.call(value) === '[object DOMException]'; - } + if (!('console' in global)) { + return callback(); + } - function isUndefined(what) { - return what === void 0; + 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 isFunction(what) { - return typeof what === 'function'; + 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? - function isPlainObject(what) { - return Object.prototype.toString.call(what) === '[object Object]'; + + 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 isString(what) { - return Object.prototype.toString.call(what) === '[object String]'; + 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] + * @returns generated DOM path + */ - function isArray$1(what) { - return Object.prototype.toString.call(what) === '[object Array]'; + function htmlTreeAsString(elem) { + // 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 (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; + } + + out.push(nextStr); + len += nextStr.length; + currentElem = currentElem.parentNode; + } + + return out.reverse().join(separator); + } catch (_oO) { + return '<unknown>'; + } } + /** + * Returns a simple, query-selector representation of a DOM element + * e.g. [HTMLElement] => input#foo.btn[name=baz] + * @returns generated DOM path + */ - function isEmptyObject(what) { - if (!isPlainObject(what)) return false; + function _htmlElementAsString(el) { + var elem = el; + var out = []; + var className; + var classes; + var key; + var attr; + var i; - for (var _ in what) { - if (what.hasOwnProperty(_)) { - return false; + if (!elem || !elem.tagName) { + return ''; + } + + out.push(elem.tagName.toLowerCase()); + + if (elem.id) { + out.push("#" + elem.id); + } + + className = elem.className; + + if (className && isString(className)) { + classes = className.split(/\s+/); + + for (i = 0; i < classes.length; i++) { + out.push("." + classes[i]); } } - return true; - } + var attrWhitelist = ['type', 'name', 'title', 'alt']; - function supportsErrorEvent() { - try { - new ErrorEvent(''); // eslint-disable-line no-new + for (i = 0; i < attrWhitelist.length; i++) { + key = attrWhitelist[i]; + attr = elem.getAttribute(key); - return true; - } catch (e) { - return false; + if (attr) { + out.push("[" + key + "=\"" + attr + "\"]"); + } } + + return out.join(''); } - function supportsDOMError() { - try { - new DOMError(''); // eslint-disable-line no-new + var INITIAL_TIME = Date.now(); + var prevNow = 0; + var performanceFallback = { + now: function now() { + var now = Date.now() - INITIAL_TIME; - return true; - } catch (e) { - return false; + if (now < prevNow) { + now = prevNow; + } + + prevNow = now; + return now; + }, + timeOrigin: INITIAL_TIME + }; + var crossPlatformPerformance = function () { + if (isNodeEnv()) { + try { + var perfHooks = dynamicRequire(module, 'perf_hooks'); + return perfHooks.performance; + } catch (_) { + return performanceFallback; + } + } + + 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 = '<anonymous>'; + /** + * Safely extract function name from itself + */ - function supportsDOMException() { + function getFunctionName(fn) { try { - new DOMException(''); // eslint-disable-line no-new + if (!fn || typeof fn !== 'function') { + return defaultFunctionName; + } - return true; + return fn.name || defaultFunctionName; } catch (e) { - return false; + // Just accessing custom props in some Selenium environments + // can cause a "Permission denied" exception (see raven-js#495). + return defaultFunctionName; } } - function supportsFetch() { - if (!('fetch' in _window)) return false; + var global$1 = getGlobalObject(); + /** Prefix for logging strings */ - try { - new Headers(); // eslint-disable-line no-new + var PREFIX = 'Sentry Logger '; + /** JSDoc */ - new Request(''); // eslint-disable-line no-new + var Logger = + /** @class */ + function () { + /** JSDoc */ + function Logger() { + this._enabled = false; + } + /** JSDoc */ - new Response(); // eslint-disable-line no-new - return true; - } catch (e) { - return false; + 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; } - } // 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 + }); + var freezing = !fails(function () { + return Object.isExtensible(Object.preventExtensions({})); + }); - function supportsReferrerPolicy() { - if (!supportsFetch()) return false; + var internalMetadata = createCommonjsModule(function (module) { + var defineProperty = objectDefineProperty.f; - try { + + + 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 - new Request('pickleRick', { - referrerPolicy: 'origin' + 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); }); - return true; - } catch (e) { + + 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 supportsPromiseRejectionEvent() { - return typeof PromiseRejectionEvent === 'function'; + 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 wrappedCallback(callback) { - function dataCallback(data, original) { - var normalizedData = callback(data) || data; + function getWalkSource(value) { + if (isError(value)) { + var error = value; + var err = { + message: error.message, + name: error.name, + stack: error.stack + }; - if (original) { - return original(normalizedData) || normalizedData; + for (var i in error) { + if (Object.prototype.hasOwnProperty.call(error, i)) { + err[i] = error[i]; + } } - return normalizedData; + return err; } - return dataCallback; - } + 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) - function each(obj, callback) { - var i, j; + try { + source.target = isElement(event_1.target) ? htmlTreeAsString(event_1.target) : Object.prototype.toString.call(event_1.target); + } catch (_oO) { + source.target = '<unknown>'; + } - if (isUndefined(obj.length)) { - for (i in obj) { - if (hasKey(obj, i)) { - callback.call(null, i, obj[i]); - } + try { + source.currentTarget = isElement(event_1.currentTarget) ? htmlTreeAsString(event_1.currentTarget) : Object.prototype.toString.call(event_1.currentTarget); + } catch (_oO) { + source.currentTarget = '<unknown>'; + } // tslint:disable-next-line:strict-type-predicates + + + if (typeof CustomEvent !== 'undefined' && isInstanceOf(value, CustomEvent)) { + source.detail = event_1.detail; } - } else { - j = obj.length; - if (j) { - for (i = 0; i < j; i++) { - callback.call(null, i, obj[i]); + 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 */ - function objectMerge(obj1, obj2) { - if (!obj2) { - return obj1; - } - each(obj2, function (key, value) { - obj1[key] = value; - }); - return obj1; + function utf8Length(value) { + // tslint:disable-next-line:no-bitwise + return ~-encodeURI(value).split(/%..|./).length; } - /** - * 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 - */ + /** Calculates bytes size of input object */ - function objectFrozen(obj) { - if (!Object.isFrozen) { - return false; + function jsonSize(value) { + return utf8Length(JSON.stringify(value)); + } + /** JSDoc */ + + + 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; } - return Object.isFrozen(obj); + if (maxSize === void 0) { + maxSize = 100 * 1024; + } + + var serialized = normalize$1(object, depth); + + 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 truncate(str, max) { - if (typeof max !== 'number') { - throw new Error('2nd argument to `truncate` function should be a number'); + function serializeValue(value) { + var type = Object.prototype.toString.call(value); // Node.js REPL notation + + if (typeof value === 'string') { + return value; } - if (typeof str !== 'string' || max === 0) { - return str; + if (type === '[object Object]') { + return '[Object]'; } - return str.length <= max ? str : str.substr(0, max) + "\u2026"; + if (type === '[object Array]') { + return '[Array]'; + } + + var normalized = normalizeValue(value); + return isPrimitive(normalized) ? normalized : type; } /** - * hasKey, a better form of hasOwnProperty - * Example: hasKey(MainHostObject, property) === true/false + * normalizeValue() + * + * Takes unserializable input and make it serializable friendly * - * @param {Object} host object to check property - * @param {string} key to check + * - translates undefined/NaN values to "[undefined]"/"[NaN]" respectively, + * - serializes Error objects + * - filter global objects */ + // tslint:disable-next-line:cyclomatic-complexity - function hasKey(object, key) { - return Object.prototype.hasOwnProperty.call(object, key); - } + 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 - 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 (typeof value === 'number' && value !== value) { + return '[NaN]'; + } - 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 + if (value === void 0) { + return '[undefined]'; + } + if (typeof value === 'function') { + return "[Function: " + getFunctionName(value) + "]"; } - return new RegExp(sources.join('|'), 'i'); + 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 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 <a/> href parsing trick because React Native and other - // environments where DOM might not be available + function walk(key, value, depth, memo) { + if (depth === void 0) { + depth = +Infinity; + } - 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' + if (memo === void 0) { + memo = new Memo(); + } // If we reach the maximum depth, serialize whatever has left - 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 - }; - } + if (depth === 0) { + return serializeValue(value); + } // If value implements `toJSON` method, call it and return early + // tslint:disable:no-unsafe-any - function uuid4() { - var crypto = _window.crypto || _window.msCrypto; - if (!isUndefined(crypto) && 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 + 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 - arr[3] = arr[3] & 0xfff | 0x4000; // set 2 most significant bits of byte 9 to '10' - arr[4] = arr[4] & 0x3fff | 0x8000; + var normalized = normalizeValue(value, key); - var pad = function pad(num) { - var v = num.toString(16); + 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 - while (v.length < 4) { - v = '0' + v; - } - return v; - }; + var source = getWalkSource(value); // Create an accumulator that will act as a parent for all future itterations of that branch - 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); - }); + 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 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} + * 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 - 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; - - 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) - - if (nextStr === 'html' || height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN) { - break; + + 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; } - out.push(nextStr); - len += nextStr.length; - elem = elem.parentNode; + return truncate(serialized, maxLength); } - return out.reverse().join(separator); + return ''; + } + + var $filter$1 = arrayIteration.filter; + + + + 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); + } + }); + + // 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 */ }); + }); + + // `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 + ); + } + }); + + // patch native Promise.prototype for native async functions + if ( typeof nativePromiseConstructor == 'function' && !nativePromiseConstructor.prototype['finally']) { + redefine(nativePromiseConstructor.prototype, 'finally', getBuiltIn('Promise').prototype['finally']); } + + /** SyncPromise internal states */ + + var States; + + (function (States) { + /** Pending */ + States["PENDING"] = "PENDING"; + /** Resolved / OK */ + + States["RESOLVED"] = "RESOLVED"; + /** Rejected / Error */ + + States["REJECTED"] = "REJECTED"; + })(States || (States = {})); /** - * Returns a simple, query-selector representation of a DOM element - * e.g. [HTMLElement] => input#foo.btn[name=baz] - * @param HTMLElement - * @returns {string} + * Thenable class that behaves like a Promise and follows it's interface + * but is not async internally */ - function htmlElementAsString(elem) { - var out = [], - className, - classes, - key, - attr, - i; + var SyncPromise = + /** @class */ + function () { + function SyncPromise(executor) { + var _this = this; - if (!elem || !elem.tagName) { - return ''; + this._state = States.PENDING; + this._handlers = []; + /** JSDoc */ + + this._resolve = function (value) { + _this._setResult(States.RESOLVED, value); + }; + /** JSDoc */ + + + this._reject = function (reason) { + _this._setResult(States.REJECTED, reason); + }; + /** JSDoc */ + + + this._setResult = function (state, value) { + if (_this._state !== States.PENDING) { + return; + } + + if (isThenable$1(value)) { + value.then(_this._resolve, _this._reject); + return; + } + + _this._state = state; + _this._value = value; + + _this._executeHandlers(); + }; // TODO: FIXME + + /** JSDoc */ + + + this._attachHandler = function (handler) { + _this._handlers = _this._handlers.concat(handler); + + _this._executeHandlers(); + }; + /** JSDoc */ + + + this._executeHandlers = function () { + if (_this._state === States.PENDING) { + return; + } + + var cachedHandlers = _this._handlers.slice(); + + _this._handlers = []; + cachedHandlers.forEach(function (handler) { + if (handler.done) { + return; + } + + 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 */ - out.push(elem.tagName.toLowerCase()); - if (elem.id) { - out.push('#' + elem.id); + 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 = []; } + /** + * Says if the buffer is ready to take more requests + */ - className = elem.className; - if (className && isString(className)) { - classes = className.split(/\s+/); + PromiseBuffer.prototype.isReady = function () { + return this._limit === undefined || this.length() < this._limit; + }; + /** + * Add a promise to the queue. + * + * @param task Can be any PromiseLike<T> + * @returns The original promise. + */ - for (i = 0; i < classes.length; i++) { - out.push('.' + classes[i]); + + PromiseBuffer.prototype.add = function (task) { + var _this = this; + + if (!this.isReady()) { + return SyncPromise.reject(new SentryError('Not adding Promise due to buffer limit reached.')); + } + + if (this._buffer.indexOf(task) === -1) { + this._buffer.push(task); } + + 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<T> + * @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); + }); + }); + }; + + return PromiseBuffer; + }(); + + /** + * Tells whether current environment supports Fetch API + * {@link supportsFetch}. + * + * @returns Answer to the given question. + */ + + function supportsFetch() { + if (!('fetch' in getGlobalObject())) { + return false; } - var attrWhitelist = ['type', 'name', 'title', 'alt']; + try { + // tslint:disable-next-line:no-unused-expression + new Headers(); // tslint:disable-next-line:no-unused-expression - for (i = 0; i < attrWhitelist.length; i++) { - key = attrWhitelist[i]; - attr = elem.getAttribute(key); + new Request(''); // tslint:disable-next-line:no-unused-expression - if (attr) { - out.push('[' + key + '="' + attr + '"]'); - } + new Response(); + return true; + } catch (e) { + return false; } + } + /** + * isNativeFetch checks if the given function is a native implementation of fetch() + */ - return out.join(''); + function isNativeFetch(func) { + return func && /^function fetch\(\)\s+\{\s+\[native code\]\s+\}$/.test(func.toString()); } /** - * Returns true if either a OR b is truthy, but not both + * Tells whether current environment supports Fetch API natively + * {@link supportsNativeFetch}. + * + * @returns true if `window.fetch` is natively implemented, false otherwise */ - function isOnlyOneTruthy(a, b) { - return !!(!!a ^ !!b); + function supportsNativeFetch() { + if (!supportsFetch()) { + return false; + } + + var global = getGlobalObject(); // Fast path to avoid DOM I/O + // tslint:disable-next-line:no-unbound-method + + 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 result = false; + var doc = global.document; // tslint:disable-next-line:no-unbound-method deprecation + + if (doc && typeof doc.createElement === "function") { + try { + var sandbox = doc.createElement('iframe'); + sandbox.hidden = true; + doc.head.appendChild(sandbox); + + 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; } /** - * Returns true if both parameters are undefined + * 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; + } - function isBothUndefined(a, b) { - return isUndefined(a) && isUndefined(b); + try { + // tslint:disable:no-unused-expression + new Request('_', { + referrerPolicy: 'origin' + }); + return true; + } catch (e) { + return false; + } } /** - * Returns true if the two input exception interfaces have the same content + * 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 - 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); + 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(); /** - * Returns true if the two input stack trace interfaces have the same content + * 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 isSameStacktrace(stack1, stack2) { - if (isOnlyOneTruthy(stack1, stack2)) return false; - var frames1 = stack1.frames; - var frames2 = stack2.frames; // Exit early if stacktrace is malformed + function instrument(type) { + if (instrumented[type]) { + return; + } - if (frames1 === undefined || frames2 === undefined) return false; // Exit early if frame count differs + instrumented[type] = true; - if (frames1.length !== frames2.length) return false; // Iterate through every frame; bail out if anything differs + switch (type) { + case 'console': + instrumentConsole(); + break; - var a, b; + case 'dom': + instrumentDOM(); + break; - 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; - } + case 'xhr': + instrumentXHR(); + break; - 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 - */ + case 'fetch': + instrumentFetch(); + break; + case 'history': + instrumentHistory(); + break; - 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; + case 'error': + instrumentError(); + break; + + case 'unhandledrejection': + instrumentUnhandledRejection(); + break; - if (track) { - track.push([obj, name, orig]); + default: + logger.warn('unknown instrumentation type:', type); } } /** - * Join values in array - * @param input array of values to be joined together - * @param delimiter string to be placed in-between values - * @returns {string} + * 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 safeJoin(input, delimiter) { - if (!isArray$1(input)) return ''; - var output = []; + function addInstrumentationHandler(handler) { + // tslint:disable-next-line:strict-type-predicates + if (!handler || typeof handler.type !== 'string' || typeof handler.callback !== 'function') { + return; + } - for (var i = 0; i < input.length; i++) { + 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 { - output.push(String(input[i])); - } catch (e) { - output.push('[value cannot be serialized]'); + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } finally { + if (e_1) throw e_1.error; } } + } + /** JSDoc */ - return output.join(delimiter); - } // Default Node.js REPL depth + function instrumentConsole() { + if (!('console' in global$2)) { + return; + } - var MAX_SERIALIZE_EXCEPTION_DEPTH = 3; // 50kB, as 100kB is max payload size, so half sounds reasonable + ['debug', 'info', 'warn', 'error', 'log', 'assert'].forEach(function (level) { + if (!(level in global$2.console)) { + return; + } - var MAX_SERIALIZE_EXCEPTION_SIZE = 50 * 1024; - var MAX_SERIALIZE_KEYS_LENGTH = 40; + fill(global$2.console, level, function (originalConsoleLevel) { + return function () { + var args = []; - function utf8Length(value) { - return ~-encodeURI(value).split(/%..|./).length; - } + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } - function jsonSize(value) { - return utf8Length(JSON.stringify(value)); + triggerHandlers('console', { + args: args, + level: level + }); // this fails for some browsers. :( + + if (originalConsoleLevel) { + Function.prototype.apply.call(originalConsoleLevel, global$2.console, args); + } + }; + }); + }); } + /** 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 instrumentFetch() { + if (!supportsNativeFetch()) { + return; } - var type = Object.prototype.toString.call(value); // Node.js REPL notation + fill(global$2, 'fetch', function (originalFetch) { + return function () { + var args = []; - 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; + 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 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); - }); + + 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(); } - return serializeValue(value); + if (fetchArgs[1] && fetchArgs[1].method) { + return String(fetchArgs[1].method).toUpperCase(); + } + + return 'GET'; } + /** Extract `url` from fetch call arguments */ - 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); + function getFetchUrl(fetchArgs) { + if (fetchArgs === void 0) { + fetchArgs = []; } - return serialized; + 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 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]; - 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"; + function instrumentXHR() { + if (!('XMLHttpRequest' in global$2)) { + return; } - 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); + }; + }); } - 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 lastHref; + /** JSDoc */ - try { - safeInput = JSON.parse(stringify_1(input)); - } catch (o_O) { - return input; + function instrumentHistory() { + if (!supportsHistory()) { + return; } - function sanitizeWorker(workerInput) { - if (isArray$1(workerInput)) { - return workerInput.map(function (val) { - return sanitizeWorker(val); - }); + var oldOnPopState = global$2.onpopstate; + + global$2.onpopstate = function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; } - if (isPlainObject(workerInput)) { - return Object.keys(workerInput).reduce(function (acc, k) { - if (sanitizeRegExp.test(k)) { - acc[k] = sanitizeMask; - } else { - acc[k] = sanitizeWorker(workerInput[k]); - } + 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 + }); - return acc; - }, {}); + 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; - return workerInput; + 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); + }; } - return sanitizeWorker(safeInput); + fill(global$2.history, 'pushState', historyReplacementFunction); + fill(global$2.history, 'replaceState', historyReplacementFunction); } + /** JSDoc */ - 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 - }; - /* - TraceKit - Cross brower stack traces + 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. - 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. - MIT license - */ + 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. - 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) + ['EventTarget', 'Node'].forEach(function (target) { + var proto = global$2[target] && global$2[target].prototype; - var _window$1 = typeof window !== 'undefined' ? window : typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof self !== 'undefined' ? self : {}; // global reference to slice + 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); + } - var _slice = [].slice; - var UNKNOWN_FUNCTION = '?'; // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_types + if (eventName === 'keypress') { + keypressEventHandler(triggerHandlers.bind(null, 'dom'))(this); + } + } - var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/; + return original.call(this, eventName, fn, options); + }; + }); + fill(proto, 'removeEventListener', function (original) { + return function (eventName, fn, options) { + var callback = fn; - function getLocationHref() { - if (typeof document === 'undefined' || document.location == null) return ''; - return document.location.href; + 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); + }; + }); + }); } - function getLocationOrigin() { - if (typeof document === 'undefined' || document.location == null) return ''; // Oh dear IE10... + 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 + */ - if (!document.location.origin) { - return document.location.protocol + '//' + document.location.hostname + (document.location.port ? ':' + document.location.port : ''); + function domEventHandler(name, handler, debounce) { + if (debounce === void 0) { + debounce = false; } - return document.location.origin; + 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 + }); + } + }; } /** - * 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. + * Wraps addEventListener to capture keypress UI events + * @param handler function that will be triggered + * @returns wrapped keypress events handler + * @hidden */ - TraceKit.report = function reportModuleWrapper() { - var handlers = [], - lastArgs = null, - lastException = null, - lastExceptionStack = null; - /** - * Add a crash handler. - * @param {Function} handler - */ + 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 + - function subscribe(handler) { - installGlobalHandler(); - handlers.push(handler); + 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(); } /** - * Remove a crash handler. - * @param {Function} handler + * 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. */ - function unsubscribe(handler) { - for (var i = handlers.length - 1; i >= 0; --i) { - if (handlers[i] === handler) { - handlers.splice(i, 1); + 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 = {}; } /** - * Remove all crash handlers. + * Add internal on change listener. Used for sub SDKs that need to store the scope. + * @hidden */ - function unsubscribeAll() { - uninstallGlobalHandler(); - handlers = []; - } + Scope.prototype.addScopeListener = function (callback) { + this._scopeListeners.push(callback); + }; /** - * Dispatch stack information to all handlers. - * @param {Object.<string, *>} stack + * @inheritDoc */ - function notifyHandlers(stack, isWindowError) { - var exception = null; + Scope.prototype.addEventProcessor = function (callback) { + this._eventProcessors.push(callback); - if (isWindowError && !TraceKit.collectWindowErrors) { - return; + 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; } - for (var i in handlers) { - if (handlers.hasOwnProperty(i)) { - try { - handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2))); - } catch (inner) { - exception = inner; + 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 + */ - if (exception) { - throw exception; - } - } - var _oldOnerrorHandler, _onErrorHandlerInstalled; + Scope.prototype.setUser = function (user) { + this._user = user || {}; + + this._notifyScopeListeners(); + + return this; + }; /** - * 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. + * @inheritDoc */ - function traceKitWindowOnError(msg, url, lineNo, colNo, ex) { - var stack = null; // If 'ex' is ErrorEvent, get real Error from inside + Scope.prototype.setTags = function (tags) { + this._tags = _assign({}, this._tags, tags); - var exception = utils.isErrorEvent(ex) ? ex.error : ex; // If 'msg' is ErrorEvent, get real message from inside + this._notifyScopeListeners(); - var message = utils.isErrorEvent(msg) ? msg.message : msg; + return this; + }; + /** + * @inheritDoc + */ - 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 ({}.toString.call(message) === '[object String]') { - var groups = message.match(ERROR_TYPES_RE); + Scope.prototype.setTag = function (key, value) { + var _a; - if (groups) { - name = groups[1]; - message = groups[2]; - } - } + this._tags = _assign({}, this._tags, (_a = {}, _a[key] = value, _a)); - location.func = UNKNOWN_FUNCTION; - stack = { - name: name, - message: message, - url: getLocationHref(), - stack: [location] - }; - notifyHandlers(stack, true); - } + this._notifyScopeListeners(); - if (_oldOnerrorHandler) { - return _oldOnerrorHandler.apply(this, arguments); - } + return this; + }; + /** + * @inheritDoc + */ - return false; - } - function installGlobalHandler() { - if (_onErrorHandlerInstalled) { - return; + 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; } - _oldOnerrorHandler = _window$1.onerror; - _window$1.onerror = traceKitWindowOnError; - _onErrorHandlerInstalled = true; - } + this._notifyScopeListeners(); - function uninstallGlobalHandler() { - if (!_onErrorHandlerInstalled) { - return; + 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); } - _window$1.onerror = _oldOnerrorHandler; - _onErrorHandlerInstalled = false; - _oldOnerrorHandler = undefined; - } + return newScope; + }; + /** + * @inheritDoc + */ - function processLastException() { - var _lastExceptionStack = lastExceptionStack, - _lastArgs = lastArgs; - lastArgs = null; - lastExceptionStack = null; - lastException = null; - notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs)); - } + + 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; + }; /** - * 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. + * @inheritDoc */ - function report(ex, rethrow) { - var args = _slice.call(arguments, 1); + Scope.prototype.addBreadcrumb = function (breadcrumb, maxBreadcrumbs) { + var mergedBreadcrumb = _assign({ + timestamp: timestampWithMs() + }, breadcrumb); - if (lastExceptionStack) { - if (lastException === ex) { - return; // already caught by an inner catch block, ignore - } else { - processLastException(); - } + 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 + */ - 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); + Scope.prototype.applyToEvent = function (event, hint) { + if (this._extra && Object.keys(this._extra).length) { + event.extra = _assign({}, this._extra, event.extra); + } - if (rethrow !== false) { - throw ex; // re-throw to propagate to the top level (and cause window.onerror) + if (this._tags && Object.keys(this._tags).length) { + event.tags = _assign({}, this._tags, event.tags); } - } - report.subscribe = subscribe; - report.unsubscribe = unsubscribe; - report.uninstall = unsubscribeAll; - return report; + 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; }(); /** - * 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. + * 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. * - * 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). + * 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}. + */ - 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' + 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 () { /** - * Computes stack trace information from the stack property. - * Chrome and Gecko use this property. - * @param {Error} ex - * @return {?Object.<string, *>} Stack trace information. + * 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 computeStackTraceFromStackProp(ex) { - if (typeof ex.stack === 'undefined' || !ex.stack) return; - var chrome = /^\s*at (?:(.*?) ?\()?((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|[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 + function Hub(client, scope, _version) { + if (scope === void 0) { + scope = new Scope(); + } - 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 (_version === void 0) { + _version = API_VERSION; + } - 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); + this._version = _version; + /** Is a {@link Layer}[] containing the client and scope */ - 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 + this._stack = []; - var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line + 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. + */ - 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 + Hub.prototype._invokeClient = function (method) { + var _a; - parts[4] = submatch[3]; // column - } + var args = []; - 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; - } + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } - 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; + 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; } - if (!element.func && element.line) { - element.func = UNKNOWN_FUNCTION; + 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; } - 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 + finalHint = { + originalException: message, + syntheticException: syntheticException + }; + } - 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 + this._invokeClient('captureMessage', message, level, _assign({}, finalHint, { + event_id: eventId + })); - source = source.slice(-300); // Now we dig out the source map URL + return eventId; + }; + /** + * @inheritDoc + */ - 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. + Hub.prototype.captureEvent = function (event, hint) { + var eventId = this._lastEventId = uuid4(); - 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. + this._invokeClient('captureEvent', event, _assign({}, hint, { + event_id: eventId + })); + return eventId; + }; + /** + * @inheritDoc + */ - element.url = sourceMapAddress.slice(0, -4); - } - } - } - stack.push(element); + Hub.prototype.lastEventId = function () { + return this._lastEventId; + }; + /** + * @inheritDoc + */ + + + Hub.prototype.addBreadcrumb = function (breadcrumb, hint) { + var top = this.getStackTop(); + + if (!top.scope || !top.client) { + return; } - if (!stack.length) { - return null; + 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; } - return { - name: ex.name, - message: ex.message, - url: getLocationHref(), - stack: stack - }; - } + 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)); + }; /** - * 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.<string, *>} 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 - }; + Hub.prototype.setUser = function (user) { + var top = this.getStackTop(); + + if (!top.scope) { + return; + } - if (initial.url && initial.line) { - stackInfo.incomplete = false; + top.scope.setUser(user); + }; + /** + * @inheritDoc + */ - 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; - } - } - } + Hub.prototype.setTags = function (tags) { + var top = this.getStackTop(); - stackInfo.stack.unshift(initial); - stackInfo.partial = true; - return true; - } else { - stackInfo.incomplete = true; + if (!top.scope) { + return; } - return false; - } + top.scope.setTags(tags); + }; /** - * 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.<string, *>} 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; + Hub.prototype.setExtras = function (extras) { + var top = this.getStackTop(); - for (var curr = computeStackTraceByWalkingCallerChain.caller; curr && !recursion; curr = curr.caller) { - if (curr === computeStackTrace || curr === TraceKit.report) { - // console.log('skipping internal function'); - continue; - } + if (!top.scope) { + return; + } - item = { - url: null, - func: UNKNOWN_FUNCTION, - line: null, - column: null - }; + top.scope.setExtras(extras); + }; + /** + * @inheritDoc + */ - 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) {} - } + Hub.prototype.setTag = function (key, value) { + var top = this.getStackTop(); - if (funcs['' + curr]) { - recursion = true; - } else { - funcs['' + curr] = true; - } + if (!top.scope) { + return; + } - stack.push(item); + top.scope.setTag(key, value); + }; + /** + * @inheritDoc + */ + + + Hub.prototype.setExtra = function (key, extra) { + var top = this.getStackTop(); + + if (!top.scope) { + return; } - if (depth) { - // console.log('depth is ' + depth); - // console.log('stack is ' + stack.length); - stack.splice(0, depth); + top.scope.setExtra(key, extra); + }; + /** + * @inheritDoc + */ + + + Hub.prototype.setContext = function (name, context) { + var top = this.getStackTop(); + + if (!top.scope) { + return; } - 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; - } + top.scope.setContext(name, context); + }; + /** + * @inheritDoc + */ + + + Hub.prototype.configureScope = function (callback) { + var top = this.getStackTop(); + + if (top.scope && top.client) { + callback(top.scope); + } + }; /** - * Computes a stack trace for an exception. - * @param {Error} ex - * @param {(string|number)=} depth + * @inheritDoc */ - function computeStackTrace(ex, depth) { - var stack = null; - depth = depth == null ? 0 : +depth; + Hub.prototype.run = function (callback) { + var oldHub = makeMain(this); try { - stack = computeStackTraceFromStackProp(ex); + callback(this); + } finally { + makeMain(oldHub); + } + }; + /** + * @inheritDoc + */ - if (stack) { - return stack; - } - } catch (e) { - if (TraceKit.debug) { - throw e; - } + + Hub.prototype.getIntegration = function (integration) { + var client = this.getClient(); + + if (!client) { + return null; } try { - stack = computeStackTraceByWalkingCallerChain(ex, depth + 1); + return client.getIntegration(integration); + } catch (_oO) { + logger.warn("Cannot retrieve integration " + integration.id + " from the current Hub"); + return null; + } + }; + /** + * @inheritDoc + */ - if (stack) { - return stack; - } - } catch (e) { - if (TraceKit.debug) { - throw e; - } + + Hub.prototype.startSpan = function (spanOrSpanContext, forceNoChild) { + if (forceNoChild === void 0) { + forceNoChild = false; } - return { - name: ex.name, - message: ex.message, - url: getLocationHref() - }; - } + return this._callExtensionMethod('startSpan', spanOrSpanContext, forceNoChild); + }; + /** + * @inheritDoc + */ - computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement; - computeStackTrace.computeStackTraceFromStackProp = computeStackTraceFromStackProp; - return computeStackTrace; - }(); - var tracekit = TraceKit; + Hub.prototype.traceHeaders = function () { + return this._callExtensionMethod('traceHeaders'); + }; + /** + * Calls global extension method and binding current instance to the function call + */ + // @ts-ignore - /* - * 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 + + 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 * - * 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. + * @returns The old replaced hub */ - /* - * 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; + function makeMain(hub) { + var registry = getMainCarrier(); + var oldHub = getHubFromCarrier(registry); + setHubOnCarrier(registry, hub); + return oldHub; } - /* - * Bitwise rotate a 32-bit number to the left. - */ + /** + * 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 - function bitRotateLeft(num, cnt) { - return num << cnt | num >>> 32 - cnt; - } - /* - * These functions implement the four basic operations the algorithm uses. - */ + 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) - function md5cmn(q, a, b, x, s, t) { - return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b); - } + if (isNodeEnv()) { + return getHubFromActiveDomain(registry); + } // Return hub that lives on a global object - 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); + return getHubFromCarrier(registry); } + /** + * Try to read the hub from an active domain, fallback to the registry if one doesnt exist + * @returns discovered hub + */ - function md5hh(a, b, c, d, x, s, t) { - return md5cmn(b ^ c ^ d, a, b, x, s, t); - } + function getHubFromActiveDomain(registry) { + try { + var property = 'domain'; + var carrier = getMainCarrier(); + var sentry = carrier.__SENTRY__; // tslint:disable-next-line: strict-type-predicates - 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. - */ + 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 - 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); - } - - return [a, b, c, d]; - } - /* - * Convert an array of little-endian words to a string - */ + if (!activeDomain) { + return getHubFromCarrier(registry); + } // If there's no hub on current domain, or its an old API, assign a new one - function binl2rstr(input) { - var i; - var output = ''; - var length32 = input.length * 32; + 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 - for (i = 0; i < length32; i += 8) { - output += String.fromCharCode(input[i >> 5] >>> i % 32 & 0xff); - } - return output; + return getHubFromCarrier(activeDomain); + } catch (_Oo) { + // Return hub that lives on a global object + return getHubFromCarrier(registry); + } } - /* - * Convert a raw string to an array of little-endian words - * Characters >255 have their high-byte silently ignored. - */ - + /** + * This will tell whether a carrier has a hub on it or not + * @param carrier object + */ - function rstr2binl(input) { - var i; - var output = []; - output[(input.length >> 2) - 1] = undefined; - for (i = 0; i < output.length; i += 1) { - output[i] = 0; + function hasHubOnCarrier(carrier) { + if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) { + return true; } - var length8 = input.length * 8; + return false; + } + /** + * This will create a new {@link Hub} and add to the passed object on + * __SENTRY__.hub. + * @param carrier object + * @hidden + */ + - for (i = 0; i < length8; i += 8) { - output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << i % 32; + function getHubFromCarrier(carrier) { + if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) { + return carrier.__SENTRY__.hub; } - return output; + carrier.__SENTRY__ = carrier.__SENTRY__ || {}; + carrier.__SENTRY__.hub = new Hub(); + return carrier.__SENTRY__.hub; } - /* - * Calculate the MD5 of a raw string - */ + /** + * 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; + } - function rstrMD5(s) { - return binl2rstr(binlMD5(rstr2binl(s), s.length * 8)); + carrier.__SENTRY__ = carrier.__SENTRY__ || {}; + carrier.__SENTRY__.hub = hub; + return true; } - /* - * Calculate the HMAC-MD5, of a key and some data (raw strings) - */ + /** + * This calls a function on the current hub. + * @param method function to call on hub. + * @param args to pass to function. + */ - function rstrHMACMD5(key, data) { - var i; - var bkey = rstr2binl(key); - var ipad = []; - var opad = []; - var hash; - ipad[15] = opad[15] = undefined; + function callOnHub(method) { + var args = []; - if (bkey.length > 16) { - bkey = binlMD5(bkey, key.length * 8); + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; } - for (i = 0; i < 16; i += 1) { - ipad[i] = bkey[i] ^ 0x36363636; - opad[i] = bkey[i] ^ 0x5c5c5c5c; + var hub = getCurrentHub(); + + if (hub && hub[method]) { + // tslint:disable-next-line:no-unsafe-any + return hub[method].apply(hub, __spread(args)); } - hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8); - return binl2rstr(binlMD5(opad.concat(hash), 512 + 128)); + throw new Error("No hub defined or " + method + " was not found on the hub, please open a bug report."); } - /* - * Convert a raw string to a hex string - */ + /** + * Captures an exception event and sends it to Sentry. + * + * @param exception An exception-like object. + * @returns The generated eventId. + */ - function rstr2hex(input) { - var hexTab = '0123456789abcdef'; - var output = ''; - var x; - var i; + function captureException(exception) { + var syntheticException; - for (i = 0; i < input.length; i += 1) { - x = input.charCodeAt(i); - output += hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f); + try { + throw new Error('Sentry syntheticException'); + } catch (exception) { + syntheticException = exception; } - return output; + return callOnHub('captureException', exception, { + originalException: exception, + syntheticException: syntheticException + }); } - /* - * Encode a string as utf-8 - */ - + /** + * 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 str2rstrUTF8(input) { - return unescape(encodeURIComponent(input)); + function withScope(callback) { + callOnHub('withScope', callback); } - /* - * Take string arguments and return either raw or hex encoded strings - */ + var SENTRY_API_VERSION = '7'; + /** Helper class to provide urls to different Sentry endpoints. */ - function rawMD5(s) { - return rstrMD5(str2rstrUTF8(s)); - } + 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. */ - function hexMD5(s) { - return rstr2hex(rawMD5(s)); - } - function rawHMACMD5(k, d) { - return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d)); - } + API.prototype.getDsn = function () { + return this._dsnObject; + }; + /** Returns a string with auth headers in the url to the store endpoint. */ - function hexHMACMD5(k, d) { - return rstr2hex(rawHMACMD5(k, d)); - } - function md5(string, key, raw) { - if (!key) { - if (!raw) { - return hexMD5(string); + 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 rawMD5(string); - } + return { + 'Content-Type': 'application/json', + 'X-Sentry-Auth': header.join(', ') + }; + }; + /** Returns the url to the report dialog endpoint. */ - if (!raw) { - return hexHMACMD5(key, string); - } - return rawHMACMD5(key, string); - } + API.prototype.getReportDialogEndpoint = function (dialogOptions) { + if (dialogOptions === void 0) { + dialogOptions = {}; + } - var md5_1 = md5; + var dsn = this._dsnObject; + var endpoint = "" + this._getBaseUrl() + (dsn.path ? "/" + dsn.path : '') + "/api/embed/error-page/"; + var encodedOptions = []; + encodedOptions.push("dsn=" + dsn.toString()); - function RavenConfigError(message) { - this.name = 'RavenConfigError'; - this.message = message; - } + for (var key in dialogOptions) { + if (key === 'user') { + if (!dialogOptions.user) { + continue; + } - RavenConfigError.prototype = new Error(); - RavenConfigError.prototype.constructor = RavenConfigError; - var configError = RavenConfigError; + if (dialogOptions.user.name) { + encodedOptions.push("name=" + encodeURIComponent(dialogOptions.user.name)); + } - var wrapMethod = function wrapMethod(console, level, callback) { - var originalConsoleLevel = console[level]; - var originalConsole = console; + if (dialogOptions.user.email) { + encodedOptions.push("email=" + encodeURIComponent(dialogOptions.user.email)); + } + } else { + encodedOptions.push(encodeURIComponent(key) + "=" + encodeURIComponent(dialogOptions[key])); + } + } - if (!(level in console)) { - return; - } + if (encodedOptions.length) { + return endpoint + "?" + encodedOptions.join('&'); + } + + return endpoint; + }; + + return API; + }(); - var sentryLevel = level === 'warn' ? 'warning' : level; + var installedIntegrations = []; + /** Gets integration to install */ - console[level] = function () { - var args = [].slice.call(arguments); - var msg = utils.safeJoin(args, ' '); - var data = { - level: sentryLevel, - logger: 'console', - extra: { - arguments: args + 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 - 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); + userIntegrations.forEach(function (userIntegration) { + if (pickedIntegrationsNames_1.indexOf(userIntegration.name) === -1) { + integrations.push(userIntegration); + pickedIntegrationsNames_1.push(userIntegration.name); } - } 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]; + }); + } 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; } - /* - * The core Raven singleton + /** 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. * - * @this {Raven} + * 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<NodeBackend, NodeOptions> { + * 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? */ - 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; + 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 + */ - if (self._globalServer) { - this._logDebug('error', 'Error: Raven has already been configured'); - return self; + 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. */ - 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; + 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 { - globalOptions[key] = value; + 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; } - 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. + if (prepared.release === undefined && release !== undefined) { + prepared.release = release; + } - globalOptions.ignoreErrors.push(/^Script error\.?$/); - globalOptions.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/); // join regexp rules into one big rule + if (prepared.dist === undefined && dist !== undefined) { + prepared.dist = dist; + } - 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 + if (prepared.message) { + prepared.message = truncate(prepared.message, maxValueLength); + } - var autoBreadcrumbDefaults = { - xhr: true, - console: true, - dom: true, - location: true, - sentry: true - }; - var autoBreadcrumbs = globalOptions.autoBreadcrumbs; + var exception = prepared.exception && prepared.exception.values && prepared.exception.values[0]; - if ({}.toString.call(autoBreadcrumbs) === '[object Object]') { - autoBreadcrumbs = objectMerge$1(autoBreadcrumbDefaults, autoBreadcrumbs); - } else if (autoBreadcrumbs !== false) { - autoBreadcrumbs = autoBreadcrumbDefaults; + if (exception && exception.value) { + exception.value = truncate(exception.value, maxValueLength); } - globalOptions.autoBreadcrumbs = autoBreadcrumbs; - var instrumentDefaults = { - tryCatch: true - }; - var instrument = globalOptions.instrument; + var request = prepared.request; - if ({}.toString.call(instrument) === '[object Object]') { - instrument = objectMerge$1(instrumentDefaults, instrument); - } else if (instrument !== false) { - instrument = instrumentDefaults; + if (request && request.url) { + request.url = truncate(request.url, maxValueLength); } - globalOptions.instrument = instrument; - tracekit.collectWindowErrors = !!globalOptions.collectWindowErrors; // return for chaining + if (prepared.event_id === undefined) { + prepared.event_id = hint && hint.event_id ? hint.event_id : uuid4(); + } - return self; - }, + this._addIntegrations(prepared.sdk); // We prepare the result here with a resolved Event. - /* - * 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); - }); + 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); + } - if (self._globalOptions.captureUnhandledRejections) { - self._attachPromiseRejectionHandler(); + return result.then(function (evt) { + // tslint:disable-next-line:strict-type-predicates + if (typeof normalizeDepth === 'number' && normalizeDepth > 0) { + return _this._normalizeEvent(evt, normalizeDepth); } - self._patchFunctionToString(); + 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 + */ - if (self._globalOptions.instrument && self._globalOptions.instrument.tryCatch) { - self._instrumentTryCatch(); - } - if (self._globalOptions.autoBreadcrumbs) self._instrumentBreadcrumbs(); // Install all of the plugins + BaseClient.prototype._normalizeEvent = function (event, depth) { + if (!event) { + return null; + } // tslint:disable:no-unsafe-any - self._drainPlugins(); - self._isRavenInstalled = true; + 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. + */ - 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(); - }, + BaseClient.prototype._processEvent = function (event, hint, scope) { + var _this = this; - /* - * 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 = {}; + 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 this.wrap(options, func).apply(this, args); - }, + 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; + } - /* - * 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 + var finalEvent = prepared; + var isInternalException = hint && hint.data && hint.data.__sentry__ === true; - if (isUndefined$1(func) && !isFunction$1(options)) { - return options; - } // options is optional + if (isInternalException || !beforeSend) { + _this._getBackend().sendEvent(finalEvent); + resolve(finalEvent); + return; + } - 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. + 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 (!isFunction$1(func)) { - return func; - } // We don't wanna wrap it twice! + if (finalEvent === null) { + logger.log('`beforeSend` returned `null`, will not send event.'); + resolve(null); + return; + } // From here on we are really async - try { - if (func.__raven__) { - return func; - } // If this has already been wrapped in the past, return that + _this._getBackend().sendEvent(finalEvent); + resolve(finalEvent); + } + }).then(null, function (reason) { + _this.captureException(reason, { + data: { + __sentry__: true + }, + originalException: reason + }); - 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; - } + 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. + */ - 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. + 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 - 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(); + _this._getBackend().sendEvent(processedEvent); - self.captureException(e, options); - throw e; - } - } // copy over properties of the old function + resolve(processedEvent); + }).then(null, function (e) { + reject("beforeSend rejected with " + e); + }); + }; + return BaseClient; + }(); - for (var property in func) { - if (hasKey$1(func, property)) { - wrapped[property] = func[property]; - } - } + /** Noop transport */ - 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 + var NoopTransport = + /** @class */ + function () { + function NoopTransport() {} + /** + * @inheritDoc + */ - wrapped.__raven__ = true; - wrapped.__orig__ = func; - return wrapped; - }, + NoopTransport.prototype.sendEvent = function (_) { + return SyncPromise.resolve({ + reason: "NoopTransport: Event has been skipped because no Dsn is configured.", + status: Status.Skipped + }); + }; /** - * Uninstalls the global error handler. - * - * @return {Raven} + * @inheritDoc */ - uninstall: function uninstall() { - tracekit.report.uninstall(); - this._detachPromiseRejectionHandler(); - this._unpatchFunctionToString(); + NoopTransport.prototype.close = function (_) { + return SyncPromise.resolve(true); + }; - this._restoreBuiltIns(); + return NoopTransport; + }(); - this._restoreConsole(); + /** + * This is the base implemention of a Backend. + * @hidden + */ - Error.stackTraceLimit = this._originalErrorStackTraceLimit; - this._isRavenInstalled = false; - return this; - }, + 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(); + } /** - * 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 + * Sets up the transport so it can be used later to send requests. */ - _promiseRejectionHandler: function _promiseRejectionHandler(event) { - this._logDebug('debug', 'Raven caught unhandled promise rejection:', event); - this.captureException(event.reason, { - mechanism: { - type: 'onunhandledrejection', - handled: false - } - }); - }, + BaseBackend.prototype._setupTransport = function () { + return new NoopTransport(); + }; /** - * Installs the global promise rejection handler. - * - * @return {raven} + * @inheritDoc */ - _attachPromiseRejectionHandler: function _attachPromiseRejectionHandler() { - this._promiseRejectionHandler = this._promiseRejectionHandler.bind(this); - _window$2.addEventListener && _window$2.addEventListener('unhandledrejection', this._promiseRejectionHandler); - return this; - }, + + BaseBackend.prototype.eventFromException = function (_exception, _hint) { + throw new SentryError('Backend has to implement `eventFromException` method'); + }; /** - * Uninstalls the global promise rejection handler. - * - * @return {raven} + * @inheritDoc */ - _detachPromiseRejectionHandler: function _detachPromiseRejectionHandler() { - _window$2.removeEventListener && _window$2.removeEventListener('unhandledrejection', this._promiseRejectionHandler); - return this; - }, + + BaseBackend.prototype.eventFromMessage = function (_message, _level, _hint) { + throw new SentryError('Backend has to implement `eventFromMessage` method'); + }; /** - * 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} + * @inheritDoc */ - 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. + BaseBackend.prototype.sendEvent = function (event) { + this._transport.sendEvent(event).then(null, function (reason) { + logger.error("Error while sending event: " + reason); + }); + }; + /** + * @inheritDoc + */ - try { - var stack = tracekit.computeStackTrace(ex); - this._handleStackInfo(stack, options); - } catch (ex1) { - if (ex !== ex1) { - throw ex1; - } - } + BaseBackend.prototype.getTransport = function () { + return this._transport; + }; - 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; - }, + 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(); + } - /* - * 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} + 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 */ - 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; - } + this.name = FunctionToString.id; + } + /** + * @inheritDoc + */ - 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. + FunctionToString.prototype.setupOnce = function () { + originalFunctionToString = Function.prototype.toString; - try { - throw new Error(msg); - } catch (ex1) { - ex = ex1; - } // null exception name so `Error` isn't prefixed to msg + Function.prototype.toString = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } - 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 context = this.__sentry_original__ || this; // tslint:disable-next-line:no-unsafe-any - 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) + return originalFunctionToString.apply(context, args); + }; + }; + /** + * @inheritDoc + */ - if (initialCall && initialCall.func === 'Raven.captureException') { - initialCall = stack.stack[2]; - } - var fileurl = initialCall && initialCall.url || ''; + FunctionToString.id = 'FunctionToString'; + return FunctionToString; + }(); - if (!!this._globalOptions.ignoreUrls.test && this._globalOptions.ignoreUrls.test(fileurl)) { - return; - } + var $some$1 = arrayIteration.some; - 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. + var STRICT_METHOD$4 = arrayMethodIsStrict('some'); + var USES_TO_LENGTH$8 = arrayMethodUsesToLength('some'); - options.trimHeadFrames += 1; + // `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); + } + }); - var frames = this._prepareFrames(stack, options); + // this is the result of a script being pulled in from an external domain and CORS. - data.stacktrace = { - // Sentry expects frames oldest to newest - frames: frames.reverse() - }; - } // Make sure that fingerprint is always wrapped in an array + 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 = {}; + } - if (data.fingerprint) { - data.fingerprint = isArray$2(data.fingerprint) ? data.fingerprint : [data.fingerprint]; - } // Fire away! + this._options = _options; + /** + * @inheritDoc + */ + this.name = InboundFilters.id; + } + /** + * @inheritDoc + */ - this._send(data); - return this; - }, - captureBreadcrumb: function captureBreadcrumb(obj) { - var crumb = objectMerge$1({ - timestamp: now() / 1000 - }, obj); + InboundFilters.prototype.setupOnce = function () { + addGlobalEventProcessor(function (event) { + var hub = getCurrentHub(); - if (isFunction$1(this._globalOptions.breadcrumbCallback)) { - var result = this._globalOptions.breadcrumbCallback(crumb); + if (!hub) { + return event; + } - if (isObject$2(result) && !isEmptyObject$1(result)) { - crumb = result; - } else if (result === false) { - return this; + 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; } - this._breadcrumbs.push(crumb); + if (this._isIgnoredError(event, options)) { + logger.warn("Event dropped due to being matched by `ignoreErrors` option.\nEvent: " + getEventDescription(event)); + return true; + } - if (this._breadcrumbs.length > this._globalOptions.maxBreadcrumbs) { - this._breadcrumbs.shift(); + 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; } - return this; - }, - addPlugin: function addPlugin(plugin - /*arg1, arg2, ... argN*/ - ) { - var pluginArgs = [].slice.call(arguments, 1); + 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; + } - this._plugins.push([plugin, pluginArgs]); + return false; + }; + /** JSDoc */ - if (this._isRavenInstalled) { - this._drainPlugins(); + + InboundFilters.prototype._isSentryError = function (event, options) { + if (options === void 0) { + options = {}; } - return this; - }, + if (!options.ignoreInternal) { + return false; + } - /* - * 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; - }, + try { + return event && event.exception && event.exception.values && event.exception.values[0] && event.exception.values[0].type === 'SentryError' || false; + } catch (_oO) { + return false; + } + }; + /** JSDoc */ - /* - * 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; - }, + InboundFilters.prototype._isIgnoredError = function (event, options) { + if (options === void 0) { + options = {}; + } - /* - * 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); + if (!options.ignoreErrors || !options.ignoreErrors.length) { + return false; + } - return this; - }, + return this._getPossibleEventMessages(event).some(function (message) { + // Not sure why TypeScript complains here... + return options.ignoreErrors.some(function (pattern) { + return isMatchingPattern(message, pattern); + }); + }); + }; + /** JSDoc */ - /* - * 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)); - }, + InboundFilters.prototype._isBlacklistedUrl = function (event, options) { + if (options === void 0) { + options = {}; + } // TODO: Use Glob instead? - /* - * 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; - }, + if (!options.blacklistUrls || !options.blacklistUrls.length) { + return false; + } - /* - * 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; - }, + var url = this._getEventFilterUrl(event); - /* - * 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; - }, + return !url ? false : options.blacklistUrls.some(function (pattern) { + return isMatchingPattern(url, pattern); + }); + }; + /** JSDoc */ - /* - * 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; - }, + InboundFilters.prototype._isWhitelistedUrl = function (event, options) { + if (options === void 0) { + options = {}; + } // TODO: Use Glob instead? - /* - * 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; - }, + if (!options.whitelistUrls || !options.whitelistUrls.length) { + return true; + } - /* - * Determine if Raven is setup and ready to go. - * - * @return {boolean} - */ - isSetup: function isSetup() { - if (!this._hasJSON) return false; // needs JSON support + var url = this._getEventFilterUrl(event); - if (!this._globalServer) { - if (!this.ravenNotConfiguredError) { - this.ravenNotConfiguredError = true; + return !url ? true : options.whitelistUrls.some(function (pattern) { + return isMatchingPattern(url, pattern); + }); + }; + /** JSDoc */ - this._logDebug('error', 'Error: Raven has not been configured.'); - } - return false; + InboundFilters.prototype._mergeOptions = function (clientOptions) { + if (clientOptions === void 0) { + clientOptions = {}; } - return true; - }, - afterLoad: function afterLoad() { - // TODO: remove window dependence? - // Attempt to initialize Raven on load - var RavenConfig = _window$2.RavenConfig; + 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 */ - 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'); + InboundFilters.prototype._getPossibleEventMessages = function (event) { + if (event.message) { + return [event.message]; } - if (!options.dsn) { - throw new configError('Missing DSN'); + 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 []; + } } - var encode = encodeURIComponent; - var encodedOptions = []; + return []; + }; + /** JSDoc */ - 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])); + + 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 + */ + - var globalServer = this._getGlobalServer(this._parseDSN(options.dsn)); + InboundFilters.id = 'InboundFilters'; + return InboundFilters; + }(); - var script = _document.createElement('script'); + var UNKNOWN_FUNCTION = '?'; // Chromium based browsers: Chrome, Brave, new Opera, new Edge - script.async = true; - script.src = globalServer + '/api/embed/error-page/?' + encodedOptions.join('&'); + var chrome = /^\s*at (?:(.*?) ?\()?((?:file|https?|blob|chrome-extension|address|native|eval|webpack|<anonymous>|[-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. - (_document.head || _document.body).appendChild(script); - }, + 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 */ - /**** 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; + 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 + } - for (key in options) { - if (hasKey$1(options, key)) { - evt[key] = options[key]; - } + try { + stack = computeStackTraceFromStackProp(ex); + + if (stack) { + return popFrames(stack, popSize); } + } catch (e) {// no-empty + } - 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 + 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; } - }, - /** - * 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; + if (!element.func && element.line) { + element.func = UNKNOWN_FUNCTION; + } - try { - target = htmlTreeAsString$1(evt.target); - } catch (e) { - target = '<unknown>'; - } + stack.push(element); + } - self.captureBreadcrumb({ - category: 'ui.' + evtName, - // e.g. ui.click, ui.input - message: target - }); - }; - }, + if (!stack.length) { + return null; + } - /** - * 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 { + message: extractMessage(ex), + name: ex.name, + stack: stack + }; + } + /** JSDoc */ - 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; + 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 (?:<anonymous function: ([^>]+)>|([^\)]+))\((.*)\))? 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; } - 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) + stack.push(element); + } + } - if (!tagName || tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable) return; // record first keypress in a series, but ignore subsequent - // keypresses until debounce clears + if (!stack.length) { + return null; + } - var timeout = self._keypressTimeout; + 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 + */ - if (!timeout) { - self._breadcrumbEventHandler('input')(evt); - } - clearTimeout(timeout); - self._keypressTimeout = setTimeout(function () { - self._keypressTimeout = null; - }, debounceDuration); + 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 - /** - * 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 + if (exception.type === undefined && exception.value === '') { + exception.value = 'Unrecoverable error caught'; + } - Function.prototype.toString = function () { - if (typeof this === 'function' && this.__raven__) { - return self._originalFunctionToString.apply(this.__orig__, arguments); - } + return exception; + } + /** + * @hidden + */ - return self._originalFunctionToString.apply(this, arguments); + 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 }; - }, - _unpatchFunctionToString: function _unpatchFunctionToString() { - if (this._originalFunctionToString) { - // eslint-disable-next-line no-extend-native - Function.prototype.toString = this._originalFunctionToString; + } + + return event; + } + /** + * @hidden + */ + + function eventFromStacktrace(stacktrace) { + var exception = exceptionFromStacktrace(stacktrace); + return { + exception: { + values: [exception] } - }, + }; + } + /** + * @hidden + */ - /** - * 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]; - } + function prepareFramesForEvent(stack) { + if (!stack || !stack.length) { + return []; + } - var originalCallback = args[0]; + 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 (isFunction$1(originalCallback)) { - args[0] = self.wrap({ - mechanism: { - type: 'instrument', - data: { - function: orig.name || '<anonymous>' - } - } - }, 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 (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 (orig.apply) { - return orig.apply(this, args); - } else { - return orig(args[0], args[1]); - } - }; - } + if (lastFrameFunction.indexOf('sentryWrapped') !== -1) { + localStack = localStack.slice(0, -1); + } // The frame where the crash happened, should be the last entry in the array - 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 || '<anonymous>' - } - } - }, 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 localStack.map(function (frame) { + return { + 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(); + } - return orig.call(this, evtName, self.wrap({ - mechanism: { - type: 'instrument', - data: { - target: global, - function: 'addEventListener', - handler: fn && fn.name || '<anonymous>' - } - } - }, 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 - } + /** JSDoc */ - return orig.call(this, evt, fn, capture, secure); - }; - }, wrappedBuiltIns); - } - } + function eventFromUnknownInput(exception, syntheticException, options) { + if (options === void 0) { + options = {}; + } - fill$1(_window$2, 'setTimeout', wrapTimeFn, wrappedBuiltIns); - fill$1(_window$2, 'setInterval', wrapTimeFn, wrappedBuiltIns); + var event; - 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 || '<anonymous>' - } - } - }, cb)); - }; - }, wrappedBuiltIns); - } // event targets borrowed from bugsnag-js: - // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666 + 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; + } - 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']; + if (isError(exception)) { + // we have a real Error object, do nothing + event = eventFromStacktrace(computeStackTrace(exception)); + return event; + } - for (var i = 0; i < eventTargets.length; i++) { - wrapEventTarget(eventTargets[i]); - } - }, + 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(); + } /** - * 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 + * @inheritDoc */ - _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 || '<anonymous>' - } - } - }, 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 - }); - } - } + BaseTransport.prototype.sendEvent = function (_) { + throw new SentryError('Transport Class has to implement `sendEvent` method'); + }; + /** + * @inheritDoc + */ - var props = ['onload', 'onerror', 'onprogress']; - for (var j = 0; j < props.length; j++) { - wrapProp(props[j], xhr); - } + BaseTransport.prototype.close = function (timeout) { + return this._buffer.drain(timeout); + }; - 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 || '<anonymous>' - } - } - }, 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 BaseTransport; + }(); - return origSend.apply(this, arguments); - }; - }, wrappedBuiltIns); - } + var global$3 = getGlobalObject(); + /** `fetch` based transport */ - 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); + var FetchTransport = + /** @class */ + function (_super) { + __extends(FetchTransport, _super); + + function FetchTransport() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** Locks transport after receiving 429 response */ - for (var i = 0; i < args.length; ++i) { - args[i] = arguments[i]; - } - var fetchInput = args[0]; - var method = 'GET'; - var url; + _this._disabledUntil = new Date(Date.now()); + return _this; + } + /** + * @inheritDoc + */ - 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 + FetchTransport.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 + }); + } - if (url.indexOf(self._globalKey) !== -1) { - return origFetch.apply(this, args); - } + 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' : '' + }; - if (args[1] && args[1].method) { - method = args[1].method; - } + if (this.options.headers !== undefined) { + defaultOptions.headers = this.options.headers; + } - 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; + 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 (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. + return; + } + 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); + } - if (autoBreadcrumbs.dom && this._hasDocument) { - if (_document.addEventListener) { - _document.addEventListener('click', self._breadcrumbEventHandler('click'), false); + reject(response); + }).catch(reject); + })); + }; - _document.addEventListener('keypress', self._keypressEventHandler(), false); - } else if (_document.attachEvent) { - // IE8 Compatibility - _document.attachEvent('onclick', self._breadcrumbEventHandler('click')); + return FetchTransport; + }(BaseTransport); - _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 + /** `XHR` based transport */ + var XHRTransport = + /** @class */ + function (_super) { + __extends(XHRTransport, _super); - 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; + function XHRTransport() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** Locks transport after receiving 429 response */ - if (autoBreadcrumbs.location && hasPushAndReplaceState) { - // TODO: remove onpopstate handler on uninstall() - var oldOnPopState = _window$2.onpopstate; - _window$2.onpopstate = function () { - var currentHref = self._location.href; + _this._disabledUntil = new Date(Date.now()); + return _this; + } + /** + * @inheritDoc + */ - self._captureUrlChange(self._lastHref, currentHref); - if (oldOnPopState) { - return oldOnPopState.apply(this, arguments); + 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 + }); + } + + return this._buffer.add(new SyncPromise(function (resolve, reject) { + var request = new XMLHttpRequest(); + + request.onreadystatechange = function () { + if (request.readyState !== 4) { + 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 + ''); - } + var status = Status.fromHttpCode(request.status); - return origHistFunction.apply(this, arguments); - }; - }; + if (status === Status.Success) { + resolve({ + status: status + }); + return; + } - fill$1(_window$2.history, 'pushState', historyReplacementFunction, wrappedBuiltIns); - fill$1(_window$2.history, 'replaceState', historyReplacementFunction, wrappedBuiltIns); - } + 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); + } - 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' - }); + reject(request); }; - each$1(['debug', 'info', 'warn', 'error', 'log'], function (_, level) { - wrapConsoleMethod(console, level, consoleMethodCallback); - }); - } - }, - _restoreBuiltIns: function _restoreBuiltIns() { - // restore any wrapped builtins - var builtin; + request.open('POST', _this.url); - 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]; + for (var header in _this.options.headers) { + if (_this.options.headers.hasOwnProperty(header)) { + request.setRequestHeader(header, _this.options.headers[header]); + } + } + + 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); } - }, - _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)); + var transportOptions = _assign({}, this._options.transportOptions, { + dsn: this._options.dsn }); - }, - _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 (this._options.transport) { + return new this._options.transport(transportOptions); } - 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'); + if (supportsFetch()) { + return new FetchTransport(transportOptions); } - return dsn; - }, - _getGlobalServer: function _getGlobalServer(uri) { - // assemble the endpoint from the uri pieces - var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : ''); + return new XHRTransport(transportOptions); + }; + /** + * @inheritDoc + */ - if (uri.protocol) { - globalServer = uri.protocol + ':' + globalServer; + + 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 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 + return SyncPromise.resolve(event); + }; + /** + * @inheritDoc + */ + - if (!this._ignoreOnError) { - this._handleStackInfo(stackInfo, options); + BrowserBackend.prototype.eventFromMessage = function (message, level, hint) { + if (level === void 0) { + level = Severity.Info; } - }, - _handleStackInfo: function _handleStackInfo(stackInfo, options) { - var frames = this._prepareFrames(stackInfo, options); - this._triggerEvent('handle', { - stackInfo: stackInfo, - options: options + var syntheticException = hint && hint.syntheticException || undefined; + var event = eventFromString(message, syntheticException, { + attachStacktrace: this._options.attachStacktrace }); + event.level = level; - this._processException(stackInfo.name, stackInfo.message, stackInfo.url, stackInfo.lineno, frames, options); - }, - _prepareFrames: function _prepareFrames(stackInfo, options) { - var self = this; - var frames = []; + if (hint && hint.event_id) { + event.event_id = hint.event_id; + } - if (stackInfo.stack && stackInfo.stack.length) { - each$1(stackInfo.stack, function (i, stack) { - var frame = self._normalizeFrame(stack, stackInfo.url); + return SyncPromise.resolve(event); + }; - if (frame) { - frames.push(frame); - } - }); // e.g. frames captured via captureMessage throw + return BrowserBackend; + }(BaseBackend); - if (options && options.trimHeadFrames) { - for (var j = 0; j < options.trimHeadFrames && j < frames.length; j++) { - frames[j].in_app = false; - } - } - } + var SDK_NAME = 'sentry.javascript.browser'; + var SDK_VERSION = '5.15.4'; - 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 + /** + * The Sentry Browser SDK Client. + * + * @see BrowserOptions for documentation on configuration options. + * @see SentryClient for usage documentation. + */ - if (!frame.url) { - normalized.filename = stackInfoUrl; // fallback to whole stacks url from onerror handler + 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 = {}; } - 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 || ''); + return _super.call(this, BrowserBackend, options) || this; + } + /** + * @inheritDoc + */ + - if (!!this._globalOptions.ignoreErrors.test && (this._globalOptions.ignoreErrors.test(message) || this._globalOptions.ignoreErrors.test(prefixedMessage))) { + 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; } - var stacktrace; + if (!this._isEnabled()) { + logger.error('Trying to call showReportDialog with Sentry Client is disabled'); + return; + } - if (frames && frames.length) { - fileurl = frames[0].filename || fileurl; // Sentry expects frames oldest to newest - // and JS sends them as newest to oldest + var dsn = options.dsn || this.getDsn(); - frames.reverse(); - stacktrace = { - frames: frames - }; - } else if (fileurl) { - stacktrace = { - frames: [{ - filename: fileurl, - lineno: lineno, - in_app: true - }] - }; + if (!options.eventId) { + logger.error('Missing `eventId` option in showReportDialog call'); + return; } - if (!!this._globalOptions.ignoreUrls.test && this._globalOptions.ignoreUrls.test(fileurl)) { + if (!dsn) { + logger.error('Missing `Dsn` option in showReportDialog call'); return; } - if (!!this._globalOptions.whitelistUrls.test && !this._globalOptions.whitelistUrls.test(fileurl)) { - return; + var script = document.createElement('script'); + script.async = true; + script.src = new API(dsn).getReportDialogEndpoint(options); + + if (options.onLoad) { + script.onload = options.onLoad; } - var data = objectMerge$1({ - // sentry.interfaces.Exception - exception: { - values: [{ - type: type, - value: message, - stacktrace: stacktrace - }] - }, - transaction: fileurl - }, options); - var ex = data.exception.values[0]; + (document.head || document.body).appendChild(script); + }; - 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 + return BrowserClient; + }(BaseClient); + var ignoreOnError = 0; + /** + * @hidden + */ - if (!data.exception.mechanism && data.mechanism) { - data.exception.mechanism = data.mechanism; - delete data.mechanism; - } + 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 + */ - data.exception.mechanism = objectMerge$1({ - type: 'generic', - handled: true - }, data.exception.mechanism || {}); // Fire away! + function wrap$1(fn, options, before) { + if (options === void 0) { + options = {}; + } // tslint:disable-next-line:strict-type-predicates - 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 (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 (data.exception) { - var exception = data.exception.values[0]; - exception.value = truncate$1(exception.value, max); + + 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 request = data.request; + var sentryWrapped = function sentryWrapped() { + var args = Array.prototype.slice.call(arguments); // tslint:disable:no-unsafe-any - if (request) { - if (request.url) { - request.url = truncate$1(request.url, this._globalOptions.maxUrlLength); + try { + // tslint:disable-next-line:strict-type-predicates + if (before && typeof before === 'function') { + before.apply(this, arguments); } - if (request.Referer) { - request.Referer = truncate$1(request.Referer, this._globalOptions.maxUrlLength); - } + 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 - if (data.breadcrumbs && data.breadcrumbs.values) this._trimBreadcrumbs(data.breadcrumbs); - return data; - }, - /** - * Truncate breadcrumb values (right now just URLs) - */ - _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); - } + try { + for (var property in fn) { + if (Object.prototype.hasOwnProperty.call(fn, property)) { + sentryWrapped[property] = fn[property]; } - - breadcrumbs.values[i].data = data; } - }, - _getHttpData: function _getHttpData() { - if (!this._hasNavigator && !this._hasDocument) return; - var httpData = {}; + } catch (_oO) {} // tslint:disable-line:no-empty - if (this._hasNavigator && _navigator.userAgent) { - httpData.headers = { - 'User-Agent': _navigator.userAgent - }; - } // Check in `window` instead of `document`, as we may be in ServiceWorker environment + 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 - if (_window$2.location && _window$2.location.href) { - httpData.url = _window$2.location.href; + 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 (this._hasDocument && _document.referrer) { - if (!httpData.headers) httpData.headers = {}; - httpData.headers.Referer = _document.referrer; + if (descriptor.configurable) { + Object.defineProperty(sentryWrapped, 'name', { + get: function get() { + return fn.name; + } + }); } + } catch (_oO) { + /*no-empty*/ + } - return httpData; - }, - _resetBackoff: function _resetBackoff() { - this._backoffDuration = 0; - this._backoffStart = null; - }, - _shouldBackoff: function _shouldBackoff() { - return this._backoffDuration && now() - this._backoffStart < this._backoffDuration; - }, + 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); + } /** - * 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). + * @inheritDoc */ - _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); + + GlobalHandlers.prototype.setupOnce = function () { + Error.stackTraceLimit = 50; + + if (this._options.onerror) { + logger.log('Global Handler attached: onerror'); + + this._installGlobalOnErrorHandler(); } - return true; - }, - _setBackoffState: function _setBackoffState(request) { - // If we are already in a backoff state, don't change anything - if (this._shouldBackoff()) { + if (this._options.onunhandledrejection) { + logger.log('Global Handler attached: onunhandledrejection'); + + this._installGlobalOnUnhandledRejectionHandler(); + } + }; + /** JSDoc */ + + + GlobalHandlers.prototype._installGlobalOnErrorHandler = function () { + var _this = this; + + if (this._onErrorHandlerInstalled) { return; } - var status = request.status; // 400 - project_id doesn't exist or some other fatal - // 401 - invalid/revoked dsn - // 429 - too many requests + 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 (!(status === 400 || status === 401 || status === 429)) return; - var retry; + if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) { + return; + } - 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 + 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 */ - retry = parseInt(retry, 10) * 1000; - } catch (e) { - /* eslint no-empty:0 */ + GlobalHandlers.prototype._installGlobalOnUnhandledRejectionHandler = function () { + var _this = this; + + if (this._onUnhandledRejectionHandlerInstalled) { + return; } - 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; + addInstrumentationHandler({ + callback: function callback(e) { + var error = e; // dig the object of the rejection out of known event types - var baseData = { - project: this._globalProject, - logger: globalOptions.logger, - platform: 'javascript' - }, - httpData = this._getHttpData(); + 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 + } - if (httpData) { - baseData.request = httpData; - } // HACK: delete `trimHeadFrames` to prevent from appearing in outbound payload + var currentHub = getCurrentHub(); + var hasIntegration = currentHub.getIntegration(GlobalHandlers); + var isFailedOwnDelivery = error && error.__sentry_own_request__ === true; + if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) { + return true; + } - 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 + 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. + */ - 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; + 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 - 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) - }; + 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]; + } } - if (this._globalContext.user) { - // sentry.interfaces.User - data.user = this._globalContext.user; - } // Include the environment if it's defined in globalOptions + 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 (globalOptions.environment) data.environment = globalOptions.environment; // Include the release if it's defined in globalOptions + 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 + }); + } + + return event; + }; + /** + * @inheritDoc + */ - 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 + 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 */ + - Object.keys(data).forEach(function (key) { - if (data[key] == null || data[key] === '' || isEmptyObject$1(data[key])) { - delete data[key]; + TryCatch.prototype._wrapTimeFunction = function (original) { + return function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; } - }); - if (isFunction$1(globalOptions.dataCallback)) { - data = globalOptions.dataCallback(data) || data; - } // Why?????????? + var originalCallback = args[0]; + args[0] = wrap$1(originalCallback, { + mechanism: { + data: { + function: getFunctionName(original) + }, + handled: true, + type: 'instrument' + } + }); + return original.apply(this, args); + }; + }; + /** JSDoc */ - if (!data || isEmptyObject$1(data)) { - return; - } // Check if the request should be filtered or not + 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 (isFunction$1(globalOptions.shouldSendCallback) && !globalOptions.shouldSendCallback(data)) { + if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) { 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. + } + + 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 + } - if (this._shouldBackoff()) { - this._logDebug('warn', 'Raven dropped error due to backoff: ', data); + return original.call(this, eventName, callback, options); + }; + }); + }; + /** JSDoc */ - return; + + 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)); } - if (typeof globalOptions.sampleRate === 'number') { - if (Math.random() < globalOptions.sampleRate) { - this._sendProcessedPayload(data); + ['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; } - } 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 + getCurrentHub().addBreadcrumb(breadcrumb, { + input: handlerData.args, + level: handlerData.level + }); + }; + /** + * Creates breadcrumbs from DOM API calls + */ + - if (!this._globalOptions.allowDuplicates && this._isRepeatData(data)) { - this._logDebug('warn', 'Raven dropped repeat event: ', data); + 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 = '<unknown>'; + } + + if (target.length === 0) { 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 + } + getCurrentHub().addBreadcrumb({ + category: "ui." + handlerData.name, + message: target + }, { + event: handlerData.event, + name: handlerData.name + }); + }; + /** + * Creates breadcrumbs from XHR API calls + */ - this._lastEventId = data.event_id || (data.event_id = this._getUuid()); // Store outbound payload after trim - this._lastData = data; + Breadcrumbs.prototype._xhrBreadcrumb = function (handlerData) { + if (handlerData.endTimestamp) { + // We only capture complete, non-sentry requests + if (handlerData.xhr.__sentry_own_request__) { + return; + } - this._logDebug('debug', 'Raven about to send:', data); + getCurrentHub().addBreadcrumb({ + category: 'xhr', + data: handlerData.xhr.__sentry_xhr__, + type: 'http' + }, { + xhr: handlerData.xhr + }); + return; + } // We only capture issued sentry requests - var auth = { - sentry_version: '7', - sentry_client: 'raven-js/' + this.VERSION, - sentry_key: this._globalKey - }; - if (this._globalSecret) { - auth.sentry_secret = this._globalSecret; + 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 exception = data.exception && data.exception.values[0]; // only capture 'sentry' breadcrumb is autoBreadcrumbs is truthy + var client = getCurrentHub().getClient(); + var dsn = client && client.getDsn(); - 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 + 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 { + 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 + */ - var url = this._globalEndpoint; - (globalOptions.transport || this._makeRequest).call(this, { - url: url, - auth: auth, - data: data, - options: globalOptions, - onSuccess: function success() { - self._resetBackoff(); + 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 - self._triggerEvent('success', { - data: data, - src: url - }); + 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) - callback && callback(); - }, - onError: function failure(error) { - self._logDebug('error', 'Raven transport failed to send: ', error); - if (error.request) { - self._setBackoffState(error.request); - } + if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) { + // tslint:disable-next-line:no-parameter-reassignment + to = parsedTo.relative; + } - self._triggerEvent('failure', { - data: data, - src: url - }); + if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) { + // tslint:disable-next-line:no-parameter-reassignment + from = parsedFrom.relative; + } - error = error || new Error('Raven send failed (no additional details provided)'); - callback && callback(error); + getCurrentHub().addBreadcrumb({ + category: 'navigation', + data: { + from: from, + to: to } }); - }, - _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 = {}; + }; + /** + * Instrument browser built-ins w/ breadcrumb capturing + * - Console API + * - DOM API (click/typing) + * - XMLHttpRequest API + * - Fetch API + * - History API + */ - if (opts.options.headers) { - evaluatedHeaders = this._evaluateHash(opts.options.headers); - } - if (opts.options.fetchParameters) { - evaluatedFetchParameters = this._evaluateHash(opts.options.fetchParameters); - } + Breadcrumbs.prototype.setupOnce = function () { + var _this = this; - if (supportsFetch$1()) { - evaluatedFetchParameters.body = stringify_1(opts.data); - var defaultFetchOptions = objectMerge$1({}, this._fetchDefaults); - var fetchOptions = objectMerge$1(defaultFetchOptions, evaluatedFetchParameters); + if (this._options.console) { + addInstrumentationHandler({ + callback: function callback() { + var args = []; - if (evaluatedHeaders) { - fetchOptions.headers = evaluatedHeaders; - } + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } - 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 + _this._consoleBreadcrumb.apply(_this, __spread(args)); + }, + type: 'console' + }); + } - error.request = response; - opts.onError && opts.onError(error); - } - })['catch'](function () { - opts.onError && opts.onError(new Error('Sentry error code: network unavailable')); + 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' }); } - 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 + if (this._options.xhr) { + addInstrumentationHandler({ + callback: function callback() { + var args = []; - var hasCORS = 'withCredentials' in request || typeof XDomainRequest !== 'undefined'; - if (!hasCORS) return; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } - 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); - } - }; - } else { - request = new XDomainRequest(); // xdomainrequest cannot go http -> https (or vice versa), - // so always use protocol relative + _this._xhrBreadcrumb.apply(_this, __spread(args)); + }, + type: 'xhr' + }); + } - url = url.replace(/^https?:/, ''); // onreadystatechange not supported by XDomainRequest + if (this._options.fetch) { + addInstrumentationHandler({ + callback: function callback() { + var args = []; - if (opts.onSuccess) { - request.onload = opts.onSuccess; - } + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } - if (opts.onError) { - request.onerror = function () { - var err = new Error('Sentry error code: XDomainRequest'); - err.request = request; - opts.onError(err); - }; - } + _this._fetchBreadcrumb.apply(_this, __spread(args)); + }, + type: 'fetch' + }); } - request.open('POST', url); + if (this._options.history) { + addInstrumentationHandler({ + callback: function callback() { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } - if (evaluatedHeaders) { - each$1(evaluatedHeaders, function (key, value) { - request.setRequestHeader(key, value); + _this._historyBreadcrumb.apply(_this, __spread(args)); + }, + type: 'history' }); } + }; + /** + * @inheritDoc + */ - request.send(stringify_1(opts.data)); - }, - _evaluateHash: function _evaluateHash(hash) { - var evaluated = {}; - for (var key in hash) { - if (hash.hasOwnProperty(key)) { - var value = hash[key]; - evaluated[key] = typeof value === 'function' ? value() : value; + 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; } - 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)); + 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 = []; } - }, - _mergeContext: function _mergeContext(key, context) { - if (isUndefined$1(context)) { - delete this._globalContext[key]; - } else { - this._globalContext[key] = objectMerge$1(this._globalContext[key] || {}, context); + + 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; } - }; // Deprecations + /** + * @inheritDoc + */ - 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) + 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 _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} - */ + 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 + */ - Raven$1.noConflict = function () { - _window$3.Raven = _Raven; - return Raven$1; - }; - Raven$1.afterLoad(); - var singleton = Raven$1; + UserAgent.id = 'UserAgent'; + return UserAgent; + }(); + + var defaultIntegrations = [new InboundFilters(), new FunctionToString(), new TryCatch(), new Breadcrumbs(), new GlobalHandlers(), new LinkedErrors(), new UserAgent()]; /** - * DISCLAIMER: + * The Sentry Browser SDK Client. * - * 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. + * 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. * - * It's called `Client' to be in-line with Raven Node implementation. + * @example * - * HOWTO: + * ``` * - * import Raven from 'raven-js'; + * import { init } from '@sentry/browser'; * - * const someAppReporter = new Raven.Client(); - * const someOtherAppReporter = new Raven.Client(); + * init({ + * dsn: '__DSN__', + * // ... + * }); + * ``` * - * someAppReporter.config('__DSN__', { - * ...config goes here + * @example + * ``` + * + * import { configureScope } from '@sentry/browser'; + * configureScope((scope: Scope) => { + * scope.setExtra({ battery: 0.7 }); + * scope.setTag({ user_mode: 'admin' }); + * scope.setUser({ id: '4711' }); * }); + * ``` + * + * @example + * ``` * - * someOtherAppReporter.config('__OTHER_DSN__', { - * ...config goes here + * import { addBreadcrumb } from '@sentry/browser'; + * addBreadcrumb({ + * message: 'My Breadcrumb', + * // ... * }); + * ``` * - * someAppReporter.captureMessage(...); - * someAppReporter.captureException(...); - * someAppReporter.captureBreadcrumb(...); + * @example * - * someOtherAppReporter.captureMessage(...); - * someOtherAppReporter.captureException(...); - * someOtherAppReporter.captureBreadcrumb(...); + * ``` + * + * import * as Sentry from '@sentry/browser'; + * Sentry.captureMessage('Hello, world!'); + * Sentry.captureException(new Error('Good bye')); + * Sentry.captureEvent({ + * message: 'Manual', + * stacktrace: [ + * // ... + * ], + * }); + * ``` * - * It should "just work". + * @see {@link BrowserOptions} for documentation on configuration options. */ - var Client = raven; - singleton.Client = Client; + 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; + } + } + + initAndBind(BrowserClient, options); + } var $find$1 = arrayIteration.find; @@ -10928,12 +13883,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 @@ -11042,47 +13991,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 = { @@ -11216,7 +14165,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, @@ -11404,7 +14353,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) @@ -11577,7 +14526,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'; }; @@ -11586,11 +14535,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"); }; @@ -11602,7 +14551,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) : {}; @@ -11615,15 +14564,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]); }; @@ -11633,7 +14582,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; }; @@ -11699,17 +14648,17 @@ typeof navigator === "object" && (function () { (module.exports = function (key, value) { return sharedStore$1[key] || (sharedStore$1[key] = value !== undefined ? value : {}); })('versions', []).push({ - version: '3.6.4', + version: '3.6.5', mode: 'global', copyright: '© 2020 Denis Pushkarev (zloirock.ru)' }); }); - 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'); @@ -11730,7 +14679,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; }; @@ -11937,14 +14886,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(); }; @@ -12010,7 +14959,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'; }; @@ -12055,11 +15004,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; } @@ -12068,8 +15017,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; @@ -12118,17 +15067,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); @@ -12647,7 +15596,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; }; @@ -12752,7 +15701,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 @@ -12766,7 +15715,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 @@ -12845,7 +15794,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; @@ -13124,7 +16073,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) { @@ -13186,13 +16135,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 @@ -13394,11 +16343,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; @@ -13419,7 +16368,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'; @@ -13445,7 +16394,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; }; @@ -13458,10 +16407,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) { @@ -13508,7 +16457,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'; @@ -13524,11 +16473,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; @@ -13542,7 +16491,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 @@ -13594,7 +16543,7 @@ typeof navigator === "object" && (function () { return Constructor; }; - var getWeakData = internalMetadata.getWeakData; + var getWeakData$1 = internalMetadata$1.getWeakData; @@ -13603,42 +16552,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); @@ -13646,24 +16595,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; }; @@ -13673,18 +16622,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); } }); @@ -13693,9 +16642,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; } }, @@ -13736,14 +16685,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; @@ -13751,28 +16700,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); @@ -14357,7 +17306,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); @@ -14389,7 +17338,7 @@ typeof navigator === "object" && (function () { } }; - var find$2 = /[!'()~]|%20/g; + var find$3 = /[!'()~]|%20/g; var replace$1 = { '!': '%21', @@ -14405,7 +17354,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) { @@ -14436,7 +17385,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 @@ -14460,7 +17409,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 */ }, @@ -14468,7 +17417,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); @@ -14653,7 +17602,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(); @@ -14698,7 +17647,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; @@ -14709,7 +17658,7 @@ typeof navigator === "object" && (function () { var INVALID_PORT$1 = 'Invalid port'; var ALPHA$1 = /[A-Za-z]/; - var ALPHANUMERIC$1 = /[\d+\-.A-Za-z]/; + var ALPHANUMERIC$1 = /[\d+-.A-Za-z]/; var DIGIT$1 = /\d/; var HEX_START$1 = /^(0x|0X)/; var OCT$1 = /^[0-7]+$/; @@ -15415,7 +18364,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); @@ -15684,7 +18633,7 @@ typeof navigator === "object" && (function () { URL: URLConstructor$1 }); - var $some$1 = arrayIteration$1.some; + var $some$2 = arrayIteration$1.some; @@ -15695,7 +18644,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); } }); @@ -15739,7 +18688,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' || @@ -15751,7 +18700,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); @@ -16015,115 +18964,363 @@ typeof navigator === "object" && (function () { } }); - var defaults$1 = { - addCSS: true, - // Add CSS to the element to improve usability (required here or in your CSS!) - thumbWidth: 15, - // The width of the thumb handle - watch: true // Watch for new elements that match a string target + var nativeGetOwnPropertyNames$2 = objectGetOwnPropertyNames$1.f; - }; + var toString$3 = {}.toString; - // Element matches a selector - function matches$1(element, selector) { + var windowNames$1 = typeof window == 'object' && window && Object.getOwnPropertyNames + ? Object.getOwnPropertyNames(window) : []; - function match() { - return Array.from(document.querySelectorAll(selector)).includes(this); + var getWindowNames$1 = function (it) { + try { + return nativeGetOwnPropertyNames$2(it); + } catch (error) { + return windowNames$1.slice(); } + }; - var matches = match; - return matches.call(element, selector); - } - - // Trigger event - function trigger(element, type) { - if (!element || !type) { - return; - } // Create and dispatch the event + // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window + var f$d = function getOwnPropertyNames(it) { + return windowNames$1 && toString$3.call(it) == '[object Window]' + ? getWindowNames$1(it) + : nativeGetOwnPropertyNames$2(toIndexedObject$1(it)); + }; + var objectGetOwnPropertyNamesExternal$1 = { + f: f$d + }; - var event = new Event(type); // Dispatch the event + var f$e = wellKnownSymbol$1; - element.dispatchEvent(event); - } + var wellKnownSymbolWrapped$1 = { + f: f$e + }; - // `Number.isNaN` method - // https://tc39.github.io/ecma262/#sec-number.isnan - _export$1({ target: 'Number', stat: true }, { - isNaN: function isNaN(number) { - // eslint-disable-next-line no-self-compare - return number != number; - } - }); + var defineProperty$e = objectDefineProperty$1.f; - // ========================================================================== - // Type checking utils - // ========================================================================== - var getConstructor$1 = function getConstructor(input) { - return input !== null && typeof input !== 'undefined' ? input.constructor : null; + var defineWellKnownSymbol$1 = function (NAME) { + var Symbol = path$1.Symbol || (path$1.Symbol = {}); + if (!has$2(Symbol, NAME)) defineProperty$e(Symbol, NAME, { + value: wellKnownSymbolWrapped$1.f(NAME) + }); }; - var instanceOf$1 = function instanceOf(input, constructor) { - return Boolean(input && constructor && input instanceof constructor); - }; + var $forEach$4 = arrayIteration$1.forEach; - var isNullOrUndefined$1 = function isNullOrUndefined(input) { - return input === null || typeof input === 'undefined'; - }; + var HIDDEN$1 = sharedKey$1('hidden'); + var SYMBOL$1 = 'Symbol'; + var PROTOTYPE$4 = 'prototype'; + var TO_PRIMITIVE$1 = wellKnownSymbol$1('toPrimitive'); + 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$4 = objectGetOwnPropertyDescriptor$1.f; + var nativeDefineProperty$3 = objectDefineProperty$1.f; + var nativeGetOwnPropertyNames$3 = objectGetOwnPropertyNamesExternal$1.f; + var nativePropertyIsEnumerable$3 = objectPropertyIsEnumerable$1.f; + var AllSymbols$1 = shared$1('symbols'); + var ObjectPrototypeSymbols$1 = shared$1('op-symbols'); + var StringToSymbolRegistry$1 = shared$1('string-to-symbol-registry'); + var SymbolToStringRegistry$1 = shared$1('symbol-to-string-registry'); + var WellKnownSymbolsStore$3 = shared$1('wks'); + var QObject$1 = global_1$1.QObject; + // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 + var USE_SETTER$1 = !QObject$1 || !QObject$1[PROTOTYPE$4] || !QObject$1[PROTOTYPE$4].findChild; - var isObject$5 = function isObject(input) { - return getConstructor$1(input) === Object; + // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 + var setSymbolDescriptor$1 = descriptors$1 && fails$1(function () { + return objectCreate$1(nativeDefineProperty$3({}, 'a', { + get: function () { return nativeDefineProperty$3(this, 'a', { value: 7 }).a; } + })).a != 7; + }) ? function (O, P, Attributes) { + var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor$4(ObjectPrototype$5, P); + if (ObjectPrototypeDescriptor) delete ObjectPrototype$5[P]; + nativeDefineProperty$3(O, P, Attributes); + if (ObjectPrototypeDescriptor && O !== ObjectPrototype$5) { + nativeDefineProperty$3(ObjectPrototype$5, P, ObjectPrototypeDescriptor); + } + } : nativeDefineProperty$3; + + var wrap$3 = function (tag, description) { + var symbol = AllSymbols$1[tag] = objectCreate$1($Symbol$1[PROTOTYPE$4]); + setInternalState$e(symbol, { + type: SYMBOL$1, + tag: tag, + description: description + }); + if (!descriptors$1) symbol.description = description; + return symbol; }; - var isNumber$1 = function isNumber(input) { - return getConstructor$1(input) === Number && !Number.isNaN(input); + var isSymbol$1 = useSymbolAsUid$1 ? function (it) { + return typeof it == 'symbol'; + } : function (it) { + return Object(it) instanceof $Symbol$1; }; - var isString$3 = function isString(input) { - return getConstructor$1(input) === String; + var $defineProperty$1 = function defineProperty(O, P, Attributes) { + if (O === ObjectPrototype$5) $defineProperty$1(ObjectPrototypeSymbols$1, P, Attributes); + anObject$1(O); + var key = toPrimitive$1(P, true); + anObject$1(Attributes); + if (has$2(AllSymbols$1, key)) { + if (!Attributes.enumerable) { + if (!has$2(O, HIDDEN$1)) nativeDefineProperty$3(O, HIDDEN$1, createPropertyDescriptor$1(1, {})); + O[HIDDEN$1][key] = true; + } else { + if (has$2(O, HIDDEN$1) && O[HIDDEN$1][key]) O[HIDDEN$1][key] = false; + Attributes = objectCreate$1(Attributes, { enumerable: createPropertyDescriptor$1(0, false) }); + } return setSymbolDescriptor$1(O, key, Attributes); + } return nativeDefineProperty$3(O, key, Attributes); }; - var isBoolean$1 = function isBoolean(input) { - return getConstructor$1(input) === Boolean; + var $defineProperties$1 = function defineProperties(O, Properties) { + anObject$1(O); + var properties = toIndexedObject$1(Properties); + var keys = objectKeys$1(properties).concat($getOwnPropertySymbols$1(properties)); + $forEach$4(keys, function (key) { + if (!descriptors$1 || $propertyIsEnumerable$1.call(properties, key)) $defineProperty$1(O, key, properties[key]); + }); + return O; }; - var isFunction$3 = function isFunction(input) { - return getConstructor$1(input) === Function; + var $create$1 = function create(O, Properties) { + return Properties === undefined ? objectCreate$1(O) : $defineProperties$1(objectCreate$1(O), Properties); }; - var isArray$5 = function isArray(input) { - return Array.isArray(input); + var $propertyIsEnumerable$1 = function propertyIsEnumerable(V) { + var P = toPrimitive$1(V, true); + var enumerable = nativePropertyIsEnumerable$3.call(this, P); + if (this === ObjectPrototype$5 && has$2(AllSymbols$1, P) && !has$2(ObjectPrototypeSymbols$1, P)) return false; + return enumerable || !has$2(this, P) || !has$2(AllSymbols$1, P) || has$2(this, HIDDEN$1) && this[HIDDEN$1][P] ? enumerable : true; }; - var isNodeList$1 = function isNodeList(input) { - return instanceOf$1(input, NodeList); + var $getOwnPropertyDescriptor$1 = function getOwnPropertyDescriptor(O, P) { + 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$4(it, key); + if (descriptor && has$2(AllSymbols$1, key) && !(has$2(it, HIDDEN$1) && it[HIDDEN$1][key])) { + descriptor.enumerable = true; + } + return descriptor; }; - var isElement$1 = function isElement(input) { - return instanceOf$1(input, Element); + var $getOwnPropertyNames$1 = function getOwnPropertyNames(O) { + var names = nativeGetOwnPropertyNames$3(toIndexedObject$1(O)); + var result = []; + $forEach$4(names, function (key) { + if (!has$2(AllSymbols$1, key) && !has$2(hiddenKeys$2, key)) result.push(key); + }); + return result; }; - var isEvent$1 = function isEvent(input) { - return instanceOf$1(input, Event); + var $getOwnPropertySymbols$1 = function getOwnPropertySymbols(O) { + var IS_OBJECT_PROTOTYPE = O === ObjectPrototype$5; + var names = nativeGetOwnPropertyNames$3(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols$1 : toIndexedObject$1(O)); + var result = []; + $forEach$4(names, function (key) { + if (has$2(AllSymbols$1, key) && (!IS_OBJECT_PROTOTYPE || has$2(ObjectPrototype$5, key))) { + result.push(AllSymbols$1[key]); + } + }); + return result; }; - var isEmpty$1 = function isEmpty(input) { - return isNullOrUndefined$1(input) || (isString$3(input) || isArray$5(input) || isNodeList$1(input)) && !input.length || isObject$5(input) && !Object.keys(input).length; - }; + // `Symbol` constructor + // https://tc39.github.io/ecma262/#sec-symbol-constructor + if (!nativeSymbol$1) { + $Symbol$1 = function Symbol() { + if (this instanceof $Symbol$1) throw TypeError('Symbol is not a constructor'); + var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]); + var tag = uid$1(description); + var setter = function (value) { + if (this === ObjectPrototype$5) setter.call(ObjectPrototypeSymbols$1, value); + if (has$2(this, HIDDEN$1) && has$2(this[HIDDEN$1], tag)) this[HIDDEN$1][tag] = false; + 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$3(tag, description); + }; - var is$1 = { - nullOrUndefined: isNullOrUndefined$1, - object: isObject$5, - number: isNumber$1, - string: isString$3, - boolean: isBoolean$1, - function: isFunction$3, - array: isArray$5, - nodeList: isNodeList$1, - element: isElement$1, - event: isEvent$1, - empty: isEmpty$1 - }; + redefine$1($Symbol$1[PROTOTYPE$4], 'toString', function toString() { + return getInternalState$7(this).tag; + }); + + redefine$1($Symbol$1, 'withoutSetter', function (description) { + return wrap$3(uid$1(description), description); + }); + + objectPropertyIsEnumerable$1.f = $propertyIsEnumerable$1; + objectDefineProperty$1.f = $defineProperty$1; + objectGetOwnPropertyDescriptor$1.f = $getOwnPropertyDescriptor$1; + objectGetOwnPropertyNames$1.f = objectGetOwnPropertyNamesExternal$1.f = $getOwnPropertyNames$1; + objectGetOwnPropertySymbols$1.f = $getOwnPropertySymbols$1; + + wellKnownSymbolWrapped$1.f = function (name) { + return wrap$3(wellKnownSymbol$1(name), name); + }; + + if (descriptors$1) { + // https://github.com/tc39/proposal-Symbol-description + nativeDefineProperty$3($Symbol$1[PROTOTYPE$4], 'description', { + configurable: true, + get: function description() { + return getInternalState$7(this).description; + } + }); + { + redefine$1(ObjectPrototype$5, 'propertyIsEnumerable', $propertyIsEnumerable$1, { unsafe: true }); + } + } + } + + _export$1({ global: true, wrap: true, forced: !nativeSymbol$1, sham: !nativeSymbol$1 }, { + Symbol: $Symbol$1 + }); + + $forEach$4(objectKeys$1(WellKnownSymbolsStore$3), function (name) { + defineWellKnownSymbol$1(name); + }); + + _export$1({ target: SYMBOL$1, stat: true, forced: !nativeSymbol$1 }, { + // `Symbol.for` method + // https://tc39.github.io/ecma262/#sec-symbol.for + 'for': function (key) { + var string = String(key); + if (has$2(StringToSymbolRegistry$1, string)) return StringToSymbolRegistry$1[string]; + var symbol = $Symbol$1(string); + StringToSymbolRegistry$1[string] = symbol; + SymbolToStringRegistry$1[symbol] = string; + return symbol; + }, + // `Symbol.keyFor` method + // https://tc39.github.io/ecma262/#sec-symbol.keyfor + keyFor: function keyFor(sym) { + if (!isSymbol$1(sym)) throw TypeError(sym + ' is not a symbol'); + if (has$2(SymbolToStringRegistry$1, sym)) return SymbolToStringRegistry$1[sym]; + }, + useSetter: function () { USE_SETTER$1 = true; }, + useSimple: function () { USE_SETTER$1 = false; } + }); + + _export$1({ target: 'Object', stat: true, forced: !nativeSymbol$1, sham: !descriptors$1 }, { + // `Object.create` method + // https://tc39.github.io/ecma262/#sec-object.create + create: $create$1, + // `Object.defineProperty` method + // https://tc39.github.io/ecma262/#sec-object.defineproperty + defineProperty: $defineProperty$1, + // `Object.defineProperties` method + // https://tc39.github.io/ecma262/#sec-object.defineproperties + defineProperties: $defineProperties$1, + // `Object.getOwnPropertyDescriptor` method + // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors + getOwnPropertyDescriptor: $getOwnPropertyDescriptor$1 + }); + + _export$1({ target: 'Object', stat: true, forced: !nativeSymbol$1 }, { + // `Object.getOwnPropertyNames` method + // https://tc39.github.io/ecma262/#sec-object.getownpropertynames + getOwnPropertyNames: $getOwnPropertyNames$1, + // `Object.getOwnPropertySymbols` method + // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols + getOwnPropertySymbols: $getOwnPropertySymbols$1 + }); + + // Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives + // https://bugs.chromium.org/p/v8/issues/detail?id=3443 + _export$1({ target: 'Object', stat: true, forced: fails$1(function () { objectGetOwnPropertySymbols$1.f(1); }) }, { + getOwnPropertySymbols: function getOwnPropertySymbols(it) { + return objectGetOwnPropertySymbols$1.f(toObject$1(it)); + } + }); + + // `JSON.stringify` method behavior with symbols + // https://tc39.github.io/ecma262/#sec-json.stringify + if ($stringify$1) { + var FORCED_JSON_STRINGIFY$1 = !nativeSymbol$1 || fails$1(function () { + var symbol = $Symbol$1(); + // MS Edge converts symbol values to JSON as {} + return $stringify$1([symbol]) != '[null]' + // WebKit converts symbol values to JSON as null + || $stringify$1({ a: symbol }) != '{}' + // V8 throws on boxed symbols + || $stringify$1(Object(symbol)) != '{}'; + }); + + _export$1({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY$1 }, { + // eslint-disable-next-line no-unused-vars + stringify: function stringify(it, replacer, space) { + var args = [it]; + var index = 1; + var $replacer; + while (arguments.length > index) args.push(arguments[index++]); + $replacer = replacer; + 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; + }; + args[1] = replacer; + return $stringify$1.apply(null, args); + } + }); + } + + // `Symbol.prototype[@@toPrimitive]` method + // https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive + if (!$Symbol$1[PROTOTYPE$4][TO_PRIMITIVE$1]) { + createNonEnumerableProperty$1($Symbol$1[PROTOTYPE$4], TO_PRIMITIVE$1, $Symbol$1[PROTOTYPE$4].valueOf); + } + // `Symbol.prototype[@@toStringTag]` property + // https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag + setToStringTag$1($Symbol$1, SYMBOL$1); + + hiddenKeys$2[HIDDEN$1] = true; + + // `Number.isNaN` method + // https://tc39.github.io/ecma262/#sec-number.isnan + _export$1({ target: 'Number', stat: true }, { + isNaN: function isNaN(number) { + // eslint-disable-next-line no-self-compare + return number != number; + } + }); + + var nativeGetOwnPropertyDescriptor$5 = objectGetOwnPropertyDescriptor$1.f; + + + 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$a, sham: !descriptors$1 }, { + getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) { + return nativeGetOwnPropertyDescriptor$5(toIndexedObject$1(it), key); + } + }); + + // `Object.getOwnPropertyDescriptors` method + // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors + _export$1({ target: 'Object', stat: true, sham: !descriptors$1 }, { + getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) { + var O = toIndexedObject$1(object); + var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor$1.f; + var keys = ownKeys$2(O); + var result = {}; + var index = 0; + var key, descriptor; + while (keys.length > index) { + descriptor = getOwnPropertyDescriptor(O, key = keys[index++]); + if (descriptor !== undefined) createProperty$1(result, key, descriptor); + } + return result; + } + }); // @@match logic fixRegexpWellKnownSymbolLogic$1('match', 1, function (MATCH, nativeMatch, maybeCallNative) { @@ -16162,219 +19359,222 @@ typeof navigator === "object" && (function () { ]; }); - // Get the number of decimal places - function getDecimalPlaces(value) { - var match = "".concat(value).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/); + function _classCallCheck$2(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } - if (!match) { - return 0; + function _defineProperties$2(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r); } + } + + function _createClass$2(e, t, n) { + return t && _defineProperties$2(e.prototype, t), n && _defineProperties$2(e, n), e; + } + + function _defineProperty$2(e, t, n) { + return t in e ? Object.defineProperty(e, t, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = n, e; + } - return Math.max(0, // Number of digits right of decimal point. - (match[1] ? match[1].length : 0) - ( // Adjust for scientific notation. - match[2] ? +match[2] : 0)); - } // Round to the nearest step + function ownKeys$3(e, t) { + var n = Object.keys(e); - function round(number, step) { - if (step < 1) { - var places = getDecimalPlaces(step); - return parseFloat(number.toFixed(places)); + if (Object.getOwnPropertySymbols) { + var r = Object.getOwnPropertySymbols(e); + t && (r = r.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), n.push.apply(n, r); } - return Math.round(number / step) * step; + return n; } - var RangeTouch = - /*#__PURE__*/ - function () { - /** - * Setup a new instance - * @param {String|Element} target - * @param {Object} options - */ - function RangeTouch(target, options) { - _classCallCheck(this, RangeTouch); + function _objectSpread2$1(e) { + for (var t = 1; t < arguments.length; t++) { + var n = null != arguments[t] ? arguments[t] : {}; + t % 2 ? ownKeys$3(Object(n), !0).forEach(function (t) { + _defineProperty$2(e, t, n[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : ownKeys$3(Object(n)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)); + }); + } - if (is$1.element(target)) { - // An Element is passed, use it directly - this.element = target; - } else if (is$1.string(target)) { - // A CSS Selector is passed, fetch it from the DOM - this.element = document.querySelector(target); - } + return e; + } - if (!is$1.element(this.element) || !is$1.empty(this.element.rangeTouch)) { - return; - } + var defaults$1 = { + addCSS: !0, + thumbWidth: 15, + watch: !0 + }; + + function matches$1(e, t) { + return function () { + return Array.from(document.querySelectorAll(t)).includes(this); + }.call(e, t); + } - this.config = Object.assign({}, defaults$1, options); - this.init(); + function trigger(e, t) { + if (e && t) { + var n = new Event(t, { + bubbles: !0 + }); + e.dispatchEvent(n); } + } - _createClass(RangeTouch, [{ - key: "init", - value: function init() { - // Bail if not a touch enabled device - if (!RangeTouch.enabled) { - return; - } // Add useful CSS + var getConstructor$1 = function getConstructor(e) { + return null != e ? e.constructor : null; + }, + instanceOf$1 = function instanceOf(e, t) { + return !!(e && t && e instanceof t); + }, + isNullOrUndefined$1 = function isNullOrUndefined(e) { + return null == 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$2 = function isString(e) { + return getConstructor$1(e) === String; + }, + isBoolean$1 = function isBoolean(e) { + return getConstructor$1(e) === Boolean; + }, + isFunction$1 = function isFunction(e) { + return getConstructor$1(e) === Function; + }, + isArray$3 = function isArray(e) { + return Array.isArray(e); + }, + isNodeList$1 = function isNodeList(e) { + return instanceOf$1(e, NodeList); + }, + isElement$2 = function isElement(e) { + return instanceOf$1(e, Element); + }, + isEvent$2 = function isEvent(e) { + return instanceOf$1(e, Event); + }, + isEmpty$1 = function isEmpty(e) { + 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$3, + number: isNumber$1, + string: isString$2, + boolean: isBoolean$1, + function: isFunction$1, + array: isArray$3, + nodeList: isNodeList$1, + element: isElement$2, + event: isEvent$2, + empty: isEmpty$1 + }; + function getDecimalPlaces(e) { + var t = "".concat(e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/); + return t ? Math.max(0, (t[1] ? t[1].length : 0) - (t[2] ? +t[2] : 0)) : 0; + } - if (this.config.addCSS) { - // TODO: Restore original values on destroy - this.element.style.userSelect = 'none'; - this.element.style.webKitUserSelect = 'none'; - this.element.style.touchAction = 'manipulation'; - } + function round(e, t) { + if (1 > t) { + var n = getDecimalPlaces(t); + return parseFloat(e.toFixed(n)); + } + + return Math.round(e / t) * t; + } + + var RangeTouch = function () { + function e(t, n) { + _classCallCheck$2(this, e), is$1.element(t) ? this.element = t : is$1.string(t) && (this.element = document.querySelector(t)), is$1.element(this.element) && is$1.empty(this.element.rangeTouch) && (this.config = _objectSpread2$1({}, defaults$1, {}, n), this.init()); + } - this.listeners(true); - this.element.rangeTouch = this; + return _createClass$2(e, [{ + key: "init", + value: function value() { + e.enabled && (this.config.addCSS && (this.element.style.userSelect = "none", this.element.style.webKitUserSelect = "none", this.element.style.touchAction = "manipulation"), this.listeners(!0), this.element.rangeTouch = this); } }, { key: "destroy", - value: function destroy() { - // Bail if not a touch enabled device - if (!RangeTouch.enabled) { - return; - } - - this.listeners(false); - this.element.rangeTouch = null; + value: function value() { + e.enabled && (this.config.addCSS && (this.element.style.userSelect = "", this.element.style.webKitUserSelect = "", this.element.style.touchAction = ""), this.listeners(!1), this.element.rangeTouch = null); } }, { key: "listeners", - value: function listeners(toggle) { - var _this = this; - - var method = toggle ? 'addEventListener' : 'removeEventListener'; // Listen for events - - ['touchstart', 'touchmove', 'touchend'].forEach(function (type) { - _this.element[method](type, function (event) { - return _this.set(event); - }, false); + value: function value(e) { + var t = this, + n = e ? "addEventListener" : "removeEventListener"; + ["touchstart", "touchmove", "touchend"].forEach(function (e) { + t.element[n](e, function (e) { + return t.set(e); + }, !1); }); } - /** - * Get the value based on touch position - * @param {Event} event - */ - }, { key: "get", - value: function get(event) { - if (!RangeTouch.enabled || !is$1.event(event)) { - return null; - } - - var input = event.target; - var touch = event.changedTouches[0]; - var min = parseFloat(input.getAttribute('min')) || 0; - var max = parseFloat(input.getAttribute('max')) || 100; - var step = parseFloat(input.getAttribute('step')) || 1; - var delta = max - min; // Calculate percentage - - var percent; - var clientRect = input.getBoundingClientRect(); - var thumbWidth = 100 / clientRect.width * (this.config.thumbWidth / 2) / 100; // Determine left percentage - - percent = 100 / clientRect.width * (touch.clientX - clientRect.left); // Don't allow outside bounds - - if (percent < 0) { - percent = 0; - } else if (percent > 100) { - percent = 100; - } // Factor in the thumb offset - - - if (percent < 50) { - percent -= (100 - percent * 2) * thumbWidth; - } else if (percent > 50) { - percent += (percent - 50) * 2 * thumbWidth; - } // Find the closest step to the mouse position - - - return min + round(delta * (percent / 100), step); + value: function value(t) { + if (!e.enabled || !is$1.event(t)) return null; + var n, + r = t.target, + i = t.changedTouches[0], + o = parseFloat(r.getAttribute("min")) || 0, + s = parseFloat(r.getAttribute("max")) || 100, + u = parseFloat(r.getAttribute("step")) || 1, + c = r.getBoundingClientRect(), + a = 100 / c.width * (this.config.thumbWidth / 2) / 100; + return 0 > (n = 100 / c.width * (i.clientX - c.left)) ? n = 0 : 100 < n && (n = 100), 50 > n ? n -= (100 - 2 * n) * a : 50 < n && (n += 2 * (n - 50) * a), o + round(n / 100 * (s - o), u); } - /** - * Update range value based on position - * @param {Event} event - */ - }, { key: "set", - value: function set(event) { - if (!RangeTouch.enabled || !is$1.event(event) || event.target.disabled) { - return; - } // Prevent text highlight on iOS - - - event.preventDefault(); // Set value - - event.target.value = this.get(event); // Trigger event - - trigger(event.target, event.type === 'touchend' ? 'change' : 'input'); + value: function value(t) { + e.enabled && is$1.event(t) && !t.target.disabled && (t.preventDefault(), t.target.value = this.get(t), trigger(t.target, "touchend" === t.type ? "change" : "input")); } }], [{ key: "setup", + value: function value(t) { + var n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {}, + r = null; + if (is$1.empty(t) || is$1.string(t) ? r = Array.from(document.querySelectorAll(is$1.string(t) ? t : 'input[type="range"]')) : is$1.element(t) ? r = [t] : is$1.nodeList(t) ? r = Array.from(t) : is$1.array(t) && (r = t.filter(is$1.element)), is$1.empty(r)) return null; - /** - * Setup multiple instances - * @param {String|Element|NodeList|Array} target - * @param {Object} options - */ - value: function setup(target) { - var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var targets = null; - - if (is$1.empty(target) || is$1.string(target)) { - targets = Array.from(document.querySelectorAll(is$1.string(target) ? target : 'input[type="range"]')); - } else if (is$1.element(target)) { - targets = [target]; - } else if (is$1.nodeList(target)) { - targets = Array.from(target); - } else if (is$1.array(target)) { - targets = target.filter(is$1.element); - } - - if (is$1.empty(targets)) { - return null; - } - - var config = Object.assign({}, defaults$1, options); - - if (is$1.string(target) && config.watch) { - // Create an observer instance - var observer = new MutationObserver(function (mutations) { - Array.from(mutations).forEach(function (mutation) { - Array.from(mutation.addedNodes).forEach(function (node) { - if (!is$1.element(node) || !matches$1(node, target)) { - return; - } // eslint-disable-next-line no-unused-vars - + var i = _objectSpread2$1({}, defaults$1, {}, n); - var range = new RangeTouch(node, config); + if (is$1.string(t) && i.watch) { + var o = new MutationObserver(function (n) { + Array.from(n).forEach(function (n) { + Array.from(n.addedNodes).forEach(function (n) { + is$1.element(n) && matches$1(n, t) && new e(n, i); }); }); - }); // Pass in the target node, as well as the observer options - - observer.observe(document.body, { - childList: true, - subtree: true + }); + o.observe(document.body, { + childList: !0, + subtree: !0 }); } - return targets.map(function (t) { - return new RangeTouch(t, options); + return r.map(function (t) { + return new e(t, n); }); } }, { key: "enabled", get: function get() { - return 'ontouchstart' in document.documentElement; + return "ontouchstart" in document.documentElement; } - }]); - - return RangeTouch; + }]), e; }(); var nativePromiseConstructor$1 = global_1$1.Promise; @@ -16398,7 +19598,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; @@ -16447,9 +19647,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) { @@ -16465,7 +19665,13 @@ typeof navigator === "object" && (function () { defer$1 = functionBindContext$1(port$1.postMessage, port$1, 1); // Browsers with postMessage, skip WebWorkers // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' - } else if (global_1$1.addEventListener && typeof postMessage == 'function' && !global_1$1.importScripts && !fails$1(post$1)) { + } else if ( + global_1$1.addEventListener && + typeof postMessage == 'function' && + !global_1$1.importScripts && + !fails$1(post$1) && + location$1.protocol !== 'file:' + ) { defer$1 = post$1; global_1$1.addEventListener('message', listener$1, false); // IE8- @@ -16495,9 +19701,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; @@ -16508,7 +19714,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; @@ -16526,7 +19732,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) { @@ -16579,17 +19785,17 @@ typeof navigator === "object" && (function () { }; // 25.4.1.5 NewPromiseCapability(C) - var f$d = function (C) { + var f$f = function (C) { return new PromiseCapability$1(C); }; var newPromiseCapability$2 = { - f: f$d + f: f$f }; 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); @@ -16624,17 +19830,17 @@ typeof navigator === "object" && (function () { var SPECIES$c = wellKnownSymbol$1('species'); var PROMISE$1 = 'Promise'; - var getInternalState$7 = internalState$1.get; - var setInternalState$d = internalState$1.set; + var getInternalState$8 = internalState$1.get; + 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'; @@ -16645,7 +19851,7 @@ typeof navigator === "object" && (function () { var UNHANDLED$1 = 2; var Internal$1, OwnPromiseCapability$1, PromiseWrapper$1, nativeThen$1; - var FORCED$9 = 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 @@ -16669,14 +19875,14 @@ typeof navigator === "object" && (function () { return !(promise.then(function () { /* empty */ }) instanceof FakePromise); }); - var INCORRECT_ITERATION$3 = FORCED$9 || !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) { @@ -16712,7 +19918,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); @@ -16748,7 +19954,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 @@ -16765,7 +19971,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); }); }; @@ -16791,7 +19997,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 }; @@ -16815,13 +20021,13 @@ typeof navigator === "object" && (function () { }; // constructor polyfill - if (FORCED$9) { + if (FORCED$b) { // 25.4.3.1 Promise(executor) PromiseConstructor$1 = function Promise(executor) { anInstance$1(this, PromiseConstructor$1, PROMISE$1); aFunction$3(executor); Internal$1.call(this); - var state = getInternalState$7(this); + var state = getInternalState$8(this); try { executor(bind$1(internalResolve$1, this, state), bind$1(internalReject$1, this, state)); } catch (error) { @@ -16830,7 +20036,7 @@ typeof navigator === "object" && (function () { }; // eslint-disable-next-line no-unused-vars Internal$1 = function Promise(executor) { - setInternalState$d(this, { + setInternalState$f(this, { type: PROMISE$1, done: false, notified: false, @@ -16849,7 +20055,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); @@ -16863,7 +20069,7 @@ typeof navigator === "object" && (function () { }); OwnPromiseCapability$1 = function () { var promise = new Internal$1(); - var state = getInternalState$7(promise); + var state = getInternalState$8(promise); this.promise = promise; this.resolve = bind$1(internalResolve$1, promise, state); this.reject = bind$1(internalReject$1, promise, state); @@ -16896,7 +20102,7 @@ typeof navigator === "object" && (function () { } } - _export$1({ global: true, wrap: true, forced: FORCED$9 }, { + _export$1({ global: true, wrap: true, forced: FORCED$b }, { Promise: PromiseConstructor$1 }); @@ -16906,7 +20112,7 @@ typeof navigator === "object" && (function () { PromiseWrapper$1 = getBuiltIn$1(PROMISE$1); // statics - _export$1({ target: PROMISE$1, stat: true, forced: FORCED$9 }, { + _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) { @@ -16916,7 +20122,7 @@ typeof navigator === "object" && (function () { } }); - _export$1({ target: PROMISE$1, stat: true, forced: FORCED$9 }, { + _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) { @@ -17017,7 +20223,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; }; @@ -17025,7 +20231,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; }; @@ -17033,11 +20239,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); }; @@ -17049,7 +20255,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); }; @@ -17057,7 +20263,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); }; @@ -17070,15 +20276,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); + 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) { @@ -17088,7 +20294,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 @@ -17108,17 +20314,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, @@ -17205,7 +20411,7 @@ typeof navigator === "object" && (function () { right: createMethod$b(true) }; - var $reduce$2 = arrayReduce$1.left; + var $reduce$1 = arrayReduce$1.left; @@ -17216,7 +20422,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); } }); @@ -17261,7 +20467,7 @@ typeof navigator === "object" && (function () { return extend$1.apply(void 0, [target].concat(sources)); } - function wrap$2(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). @@ -17466,12 +20672,33 @@ typeof navigator === "object" && (function () { } // Element matches selector function matches$2(element, selector) { + var _Element = Element, + prototype = _Element.prototype; function match() { return Array.from(document.querySelectorAll(selector)).includes(this); } - var method = match; + var method = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match; + return method.call(element, selector); + } // Closest ancestor element matching selector (also tests element itself) + + function closest(element, selector) { + var _Element2 = Element, + prototype = _Element2.prototype; // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill + + function closestElement() { + var el = this; + + do { + if (matches$2.matches(el, selector)) return el; + el = el.parentElement || el.parentNode; + } while (el !== null && el.nodeType === 1); + + return null; + } + + var method = prototype.closest || closestElement; return method.call(element, selector); } // Find all elements @@ -17743,6 +20970,19 @@ typeof navigator === "object" && (function () { }).then(function () {}); } + /** + * Silence a Promise-like object. + * This is useful for avoiding non-harmful, but potentially confusing "uncaught + * play promise" rejection error messages. + * @param {Object} value An object that may or may not be `Promise`-like. + */ + + function silencePromise(value) { + if (is$2.promise(value)) { + value.then(null, function () {}); + } + } + function validateRatio(input) { if (!is$2.array(input) && (!is$2.string(input) || !input.includes(':'))) { return false; @@ -17811,8 +21051,8 @@ typeof navigator === "object" && (function () { var padding = 100 / w * h; wrapper.style.paddingBottom = "".concat(padding, "%"); // For Vimeo we have an extra <div> to hide the standard controls and UI - if (this.isVimeo && this.supported.ui) { - var height = 240; + if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) { + var height = 100 / this.media.offsetWidth * parseInt(window.getComputedStyle(this.media).paddingBottom, 10); var offset = (height - padding) / (height / 50); this.media.style.transform = "translateY(-".concat(offset, "%)"); } else if (this.isHTML5) { @@ -17918,7 +21158,7 @@ typeof navigator === "object" && (function () { player.currentTime = currentTime; // Resume playing if (!paused) { - player.play(); + silencePromise(player.play()); } }); // Load new source @@ -17965,7 +21205,7 @@ typeof navigator === "object" && (function () { }); } // Get the closest value in an array - function closest(array, value) { + function closest$1(array, value) { if (!is$2.array(array) || !array.length) { return null; } @@ -17993,12 +21233,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; } @@ -18013,14 +21253,14 @@ typeof navigator === "object" && (function () { } }); - var defineProperty$e = objectDefineProperty$1.f; + var defineProperty$f = objectDefineProperty$1.f; var getOwnPropertyNames$4 = objectGetOwnPropertyNames$1.f; - var setInternalState$e = internalState$1.set; + var setInternalState$g = internalState$1.set; @@ -18035,7 +21275,7 @@ typeof navigator === "object" && (function () { var UNSUPPORTED_Y$5 = regexpStickyHelpers$1.UNSUPPORTED_Y; - var FORCED$a = 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'; @@ -18043,7 +21283,7 @@ typeof navigator === "object" && (function () { // `RegExp` constructor // https://tc39.github.io/ecma262/#sec-regexp-constructor - if (FORCED$a) { + if (FORCED$c) { var RegExpWrapper$1 = function RegExp(pattern, flags) { var thisIsRegExp = this instanceof RegExpWrapper$1; var patternIsRegExp = isRegexp$1(pattern); @@ -18072,12 +21312,12 @@ typeof navigator === "object" && (function () { RegExpWrapper$1 ); - if (UNSUPPORTED_Y$5 && sticky) setInternalState$e(result, { sticky: sticky }); + if (UNSUPPORTED_Y$5 && sticky) setInternalState$g(result, { sticky: sticky }); return result; }; var proxy$1 = function (key) { - key in RegExpWrapper$1 || defineProperty$e(RegExpWrapper$1, key, { + key in RegExpWrapper$1 || defineProperty$f(RegExpWrapper$1, key, { configurable: true, get: function () { return NativeRegExp$1[key]; }, set: function (it) { NativeRegExp$1[key] = it; } @@ -18120,19 +21360,19 @@ typeof navigator === "object" && (function () { return (current / max * 100).toFixed(2); } // Replace all occurances of a string in a string - function replaceAll() { + var replaceAll = function replaceAll() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g, '\\$1'), 'g'), replace.toString()); - } // Convert to title case + }; // Convert to title case - function toTitleCase() { + var toTitleCase = function toTitleCase() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; return input.toString().replace(/\w\S*/g, function (text) { return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase(); }); - } // Convert string to pascalCase + }; // Convert string to pascalCase function toPascalCase() { var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; @@ -18211,9 +21451,7 @@ typeof navigator === "object" && (function () { } }; - var Storage$1 = - /*#__PURE__*/ - function () { + var Storage$1 = /*#__PURE__*/function () { function Storage(player) { _classCallCheck(this, Storage); @@ -18504,7 +21742,7 @@ typeof navigator === "object" && (function () { var icon = document.createElementNS(namespace, 'svg'); setAttributes$1(icon, extend$1(attributes, { - role: 'presentation', + 'aria-hidden': 'true', focusable: 'false' })); // Create the <use> to reference sprite @@ -19241,39 +22479,39 @@ typeof navigator === "object" && (function () { // Set the looping options /* setLoopMenu() { - // Menu required - if (!is.element(this.elements.settings.panels.loop)) { - return; - } - const options = ['start', 'end', 'all', 'reset']; - const list = this.elements.settings.panels.loop.querySelector('[role="menu"]'); - // Show the pane and tab - toggleHidden(this.elements.settings.buttons.loop, false); - toggleHidden(this.elements.settings.panels.loop, false); - // Toggle the pane and tab - const toggle = !is.empty(this.loop.options); - controls.toggleMenuButton.call(this, 'loop', toggle); - // Empty the menu - emptyElement(list); - options.forEach(option => { - const item = createElement('li'); - const button = createElement( - 'button', - extend(getAttributesFromSelector(this.config.selectors.buttons.loop), { - type: 'button', - class: this.config.classNames.control, - 'data-plyr-loop-action': option, - }), - i18n.get(option, this.config) - ); - if (['start', 'end'].includes(option)) { - const badge = controls.createBadge.call(this, '00:00'); - button.appendChild(badge); - } - item.appendChild(button); - list.appendChild(item); - }); - }, */ + // Menu required + if (!is.element(this.elements.settings.panels.loop)) { + return; + } + const options = ['start', 'end', 'all', 'reset']; + const list = this.elements.settings.panels.loop.querySelector('[role="menu"]'); + // Show the pane and tab + toggleHidden(this.elements.settings.buttons.loop, false); + toggleHidden(this.elements.settings.panels.loop, false); + // Toggle the pane and tab + const toggle = !is.empty(this.loop.options); + controls.toggleMenuButton.call(this, 'loop', toggle); + // Empty the menu + emptyElement(list); + options.forEach(option => { + const item = createElement('li'); + const button = createElement( + 'button', + extend(getAttributesFromSelector(this.config.selectors.buttons.loop), { + type: 'button', + class: this.config.classNames.control, + 'data-plyr-loop-action': option, + }), + i18n.get(option, this.config) + ); + if (['start', 'end'].includes(option)) { + const badge = controls.createBadge.call(this, '00:00'); + button.appendChild(badge); + } + item.appendChild(button); + list.appendChild(item); + }); + }, */ // Get current selected caption language // TODO: rework this to user the getter in the API? // Set a list of available captions languages @@ -19936,7 +23174,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; @@ -19999,7 +23237,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) { @@ -20075,9 +23313,15 @@ typeof navigator === "object" && (function () { meta.set(track, { default: track.mode === 'showing' }); // Turn off native caption rendering to avoid double captions + // Note: mode='hidden' forces a track to download. To ensure every track + // isn't downloaded at once, only 'showing' tracks should be reassigned // eslint-disable-next-line no-param-reassign - track.mode = 'hidden'; // Add event listener for cue changes + if (track.mode === 'showing') { + // eslint-disable-next-line no-param-reassign + track.mode = 'hidden'; + } // Add event listener for cue changes + on.call(_this, track, 'cuechange', function () { return captions.updateCues.call(_this); @@ -20094,13 +23338,15 @@ typeof navigator === "object" && (function () { toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$2.empty(tracks)); // Update available languages in list - if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) { + if (is$2.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) { controls.setCaptionsMenu.call(this); } }, // Toggle captions display // Used internally for the toggleCaptions method, with the passive option forced to false toggle: function toggle(input) { + var _this2 = this; + var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; // If there's no full support @@ -20147,7 +23393,15 @@ typeof navigator === "object" && (function () { controls.updateSetting.call(this, 'captions'); // Trigger event (not used internally) triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled'); - } + } // Wait for the call stack to clear before setting mode='hidden' + // on the active track - forcing the browser to download it + + + setTimeout(function () { + if (active && _this2.captions.toggled) { + _this2.captions.currentTrackNode.mode = 'hidden'; + } + }); }, // Set captions by track index // Used internally for the currentTrack setter with the passive option forced to false @@ -20228,7 +23482,7 @@ typeof navigator === "object" && (function () { // If update is false it will also ignore tracks without metadata // This is used to "freeze" the language options when captions.update is false getTracks: function getTracks() { - var _this2 = this; + var _this3 = this; var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; // Handle media or textTracks missing or null @@ -20236,20 +23490,20 @@ typeof navigator === "object" && (function () { // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata) return tracks.filter(function (track) { - return !_this2.isHTML5 || update || _this2.captions.meta.has(track); + return !_this3.isHTML5 || update || _this3.captions.meta.has(track); }).filter(function (track) { return ['captions', 'subtitles'].includes(track.kind); }); }, // Match tracks based on languages and get the first findTrack: function findTrack(languages) { - var _this3 = this; + var _this4 = this; var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var tracks = captions.getTracks.call(this); var sortIsDefault = function sortIsDefault(track) { - return Number((_this3.captions.meta.get(track) || {}).default); + return Number((_this4.captions.meta.get(track) || {}).default); }; var sorted = Array.from(tracks).sort(function (a, b) { @@ -20430,6 +23684,9 @@ typeof navigator === "object" && (function () { fallback: true, // Fallback using full viewport/window iosNative: false // Use the native fullscreen in iOS (disables custom controls) + // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode + // Non-ancestors of the player element will be ignored + // container: null, // defaults to the player element }, // Local storage @@ -20667,16 +23924,16 @@ typeof navigator === "object" && (function () { title: false, speed: true, transparent: false, - // These settings require a pro or premium account to work - sidedock: false, - controls: false, + // Whether the owner of the video has a Pro or Business account + // (which allows us to properly hide controls without CSS hacks, etc) + premium: false, // Custom settings from Plyr referrerPolicy: null // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy }, // YouTube plugin youtube: { - noCookie: false, + noCookie: true, // Whether to use an alternative version of YouTube without cookies rel: 0, // No related vids @@ -20733,9 +23990,7 @@ typeof navigator === "object" && (function () { // ========================================================================== var noop$1 = function noop() {}; - var Console$1 = - /*#__PURE__*/ - function () { + var Console$1 = /*#__PURE__*/function () { function Console() { var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; @@ -20771,9 +24026,7 @@ typeof navigator === "object" && (function () { return Console; }(); - var Fullscreen = - /*#__PURE__*/ - function () { + var Fullscreen = /*#__PURE__*/function () { function Fullscreen(player) { var _this = this; @@ -20790,7 +24043,10 @@ typeof navigator === "object" && (function () { y: 0 }; // Force the use of 'full window/browser' rather than fullscreen - this.forceFallback = player.config.fullscreen.fallback === 'force'; // Register event listeners + this.forceFallback = player.config.fullscreen.fallback === 'force'; // Get the fullscreen element + // Checks container is an ancestor, defaults to null + + this.player.elements.fullscreen = player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container); // Register event listeners // Handle event (incase user presses escape etc) on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : "".concat(this.prefix, "fullscreenchange"), function () { @@ -20963,7 +24219,7 @@ typeof navigator === "object" && (function () { if (browser.isIos && this.player.config.fullscreen.iosNative) { this.target.webkitExitFullscreen(); - this.player.play(); + silencePromise(this.player.play()); } else if (!Fullscreen.native || this.forceFallback) { this.toggleFallback(false); } else if (!this.prefix) { @@ -21010,13 +24266,13 @@ typeof navigator === "object" && (function () { } var element = !this.prefix ? document.fullscreenElement : document["".concat(this.prefix).concat(this.property, "Element")]; - return element === this.target; + return element && element.shadowRoot ? element === this.target.getRootNode().host : element === this.target; } // Get target element }, { key: "target", get: function get() { - return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container; + return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.fullscreen || this.player.elements.container; } }], [{ key: "native", @@ -21225,12 +24481,7 @@ typeof navigator === "object" && (function () { } // Set property synchronously to respect the call order - this.media.setAttribute('poster', poster); // HTML5 uses native poster attribute - - if (this.isHTML5) { - return Promise.resolve(poster); - } // Wait until ui is ready - + this.media.setAttribute('data-poster', poster); // Wait until ui is ready return ready.call(this) // Load image .then(function () { @@ -21306,12 +24557,30 @@ typeof navigator === "object" && (function () { this.toggleControls(Boolean(force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek)); } + }, + // Migrate any custom properties from the media to the parent + migrateStyles: function migrateStyles() { + var _this5 = this; + + // Loop through values (as they are the keys when the object is spread 🤔) + Object.values(_objectSpread2({}, this.media.style)) // We're only fussed about Plyr specific properties + .filter(function (key) { + return key.startsWith('--plyr'); + }).forEach(function (key) { + // Set on the container + _this5.elements.container.style.setProperty(key, _this5.media.style.getPropertyValue(key)); // Clean up from media element + + + _this5.media.style.removeProperty(key); + }); // Remove attribute if empty + + if (is$2.empty(this.media.style)) { + this.media.removeAttribute('style'); + } } }; - var Listeners = - /*#__PURE__*/ - function () { + var Listeners = /*#__PURE__*/function () { function Listeners(player) { _classCallCheck(this, Listeners); @@ -21402,7 +24671,7 @@ typeof navigator === "object" && (function () { case 75: // Space and K key if (!repeat) { - player.togglePlay(); + silencePromise(player.togglePlay()); } break; @@ -21516,15 +24785,17 @@ typeof navigator === "object" && (function () { removeCurrent(); // Delay the adding of classname until the focus has changed // This event fires before the focusin event - this.focusTimer = setTimeout(function () { - var focused = document.activeElement; // Ignore if current focus element isn't inside the player + if (event.type !== 'focusout') { + this.focusTimer = setTimeout(function () { + var focused = document.activeElement; // Ignore if current focus element isn't inside the player - if (!elements.container.contains(focused)) { - return; - } + if (!elements.container.contains(focused)) { + return; + } - toggleClass(document.activeElement, player.config.classNames.tabFocus, true); - }, 10); + toggleClass(document.activeElement, player.config.classNames.tabFocus, true); + }, 10); + } } // Global window & document listeners }, { @@ -21542,7 +24813,7 @@ typeof navigator === "object" && (function () { once.call(player, document.body, 'touchstart', this.firstTouch); // Tab focus detection - toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true); + toggleListener.call(player, document.body, 'keydown focus blur focusout', this.setTabFocus, toggle, false, true); } // Container listeners }, { @@ -21585,7 +24856,7 @@ typeof navigator === "object" && (function () { }); // Set a gutter for Vimeo var setGutter = function setGutter(ratio, padding, toggle) { - if (!player.isVimeo) { + if (!player.isVimeo || player.config.vimeo.premium) { return; } @@ -21642,7 +24913,7 @@ typeof navigator === "object" && (function () { ratio = _setPlayerSize.ratio; // Set Vimeo gutter - setGutter(ratio, padding, isEnter); // If not using native fullscreen, we need to check for resizes of viewport + setGutter(ratio, padding, isEnter); // If not using native browser fullscreen API, we need to check for resizes of viewport if (!usingNative) { if (isEnter) { @@ -21720,9 +24991,13 @@ typeof navigator === "object" && (function () { if (player.ended) { _this.proxy(event, player.restart, 'restart'); - _this.proxy(event, player.play, 'play'); + _this.proxy(event, function () { + silencePromise(player.play()); + }, 'play'); } else { - _this.proxy(event, player.togglePlay, 'play'); + _this.proxy(event, function () { + silencePromise(player.togglePlay()); + }, 'play'); } }); } // Disable right click @@ -21820,7 +25095,9 @@ typeof navigator === "object" && (function () { if (elements.buttons.play) { Array.from(elements.buttons.play).forEach(function (button) { - _this3.bind(button, 'click', player.togglePlay, 'play'); + _this3.bind(button, 'click', function () { + silencePromise(player.togglePlay()); + }, 'play'); }); } // Pause @@ -21917,7 +25194,7 @@ typeof navigator === "object" && (function () { if (play && done) { seek.removeAttribute(attribute); - player.play(); + silencePromise(player.play()); } else if (!done && player.playing) { seek.setAttribute(attribute, ''); player.pause(); @@ -22015,7 +25292,18 @@ typeof navigator === "object" && (function () { this.bind(elements.controls, 'mouseenter mouseleave', function (event) { elements.controls.hover = !player.touch && event.type === 'mouseenter'; - }); // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting) + }); // Also update controls.hover state for any non-player children of fullscreen element (as above) + + if (elements.fullscreen) { + Array.from(elements.fullscreen.children).filter(function (c) { + return !c.contains(elements.container); + }).forEach(function (child) { + _this3.bind(child, 'mouseenter mouseleave', function (event) { + elements.controls.hover = !player.touch && event.type === 'mouseenter'; + }); + }); + } // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting) + this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) { elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type); @@ -22484,15 +25772,28 @@ typeof navigator === "object" && (function () { var _this = this; var player = this; - var config = player.config.vimeo; // Get Vimeo params for the iframe + var config = player.config.vimeo; + + var premium = config.premium, + referrerPolicy = config.referrerPolicy, + frameParams = _objectWithoutProperties(config, ["premium", "referrerPolicy"]); // If the owner has a pro or premium account then we can hide controls etc + + + if (premium) { + Object.assign(frameParams, { + controls: false, + sidedock: false + }); + } // Get Vimeo params for the iframe - var params = buildUrlParams(extend$1({}, { + + var params = buildUrlParams(_objectSpread2({ loop: player.config.loop.active, autoplay: player.autoplay, muted: player.muted, gesture: 'media', playsinline: !this.config.fullscreen.iosNative - }, config)); // Get the source URL or ID + }, frameParams)); // Get the source URL or ID var source = player.media.getAttribute('src'); // Get from <div> if needed @@ -22506,22 +25807,27 @@ typeof navigator === "object" && (function () { var src = format(player.config.urls.vimeo.iframe, id, params); iframe.setAttribute('src', src); iframe.setAttribute('allowfullscreen', ''); - iframe.setAttribute('allowtransparency', ''); - iframe.setAttribute('allow', 'autoplay'); // Set the referrer policy if required + iframe.setAttribute('allow', 'autoplay,fullscreen,picture-in-picture'); // Set the referrer policy if required - if (!is$2.empty(config.referrerPolicy)) { - iframe.setAttribute('referrerPolicy', config.referrerPolicy); - } // Get poster, if already set + if (!is$2.empty(referrerPolicy)) { + iframe.setAttribute('referrerPolicy', referrerPolicy); + } // Inject the package - var poster = player.poster; // Inject the package + var poster = player.poster; + + if (premium) { + iframe.setAttribute('data-poster', poster); + player.media = replaceElement(iframe, player.media); + } else { + var wrapper = createElement$1('div', { + class: player.config.classNames.embedContainer, + 'data-poster': poster + }); + wrapper.appendChild(iframe); + player.media = replaceElement(wrapper, player.media); + } // Get poster image - var wrapper = createElement$1('div', { - poster: poster, - class: player.config.classNames.embedContainer - }); - wrapper.appendChild(iframe); - player.media = replaceElement(wrapper, player.media); // Get poster image fetch(format(player.config.urls.vimeo.api, id), 'json').then(function (response) { if (is$2.empty(response)) { @@ -22605,6 +25911,9 @@ typeof navigator === "object" && (function () { player.embed.setPlaybackRate(input).then(function () { speed = input; triggerEvent.call(player, player.media, 'ratechange'); + }).catch(function () { + // Cannot set Playback Rate, Video is probably not on Pro account + player.options.speed = [1]; }); } }); // Volume @@ -22889,7 +26198,7 @@ typeof navigator === "object" && (function () { var container = createElement$1('div', { id: id, - poster: poster + 'data-poster': poster }); player.media = replaceElement(container, player.media); // Id to poster wrapper @@ -23207,14 +26516,12 @@ typeof navigator === "object" && (function () { class: this.config.classNames.video }); // Wrap the video in a container - wrap$2(this.media, this.elements.wrapper); // Faux poster container + wrap$4(this.media, this.elements.wrapper); // Poster image container - if (this.isEmbed) { - this.elements.poster = createElement$1('div', { - class: this.config.classNames.poster - }); - this.elements.wrapper.appendChild(this.elements.poster); - } + this.elements.poster = createElement$1('div', { + class: this.config.classNames.poster + }); + this.elements.wrapper.appendChild(this.elements.poster); } if (this.isHTML5) { @@ -23241,9 +26548,7 @@ typeof navigator === "object" && (function () { instance.elements.container.remove(); }; - var Ads = - /*#__PURE__*/ - function () { + var Ads = /*#__PURE__*/function () { /** * Ads constructor. * @param {Object} player @@ -23343,6 +26648,8 @@ typeof navigator === "object" && (function () { * mobile devices, this initialization is done as the result of a user action. */ value: function setupIMA() { + var _this4 = this; + // Create the container for our advertisements this.elements.container = createElement$1('div', { class: this.player.config.classNames.ads @@ -23355,7 +26662,16 @@ typeof navigator === "object" && (function () { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads - this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media); // Request video ads to be pre-loaded + this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media); // Create ads loader + + this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events + + this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) { + return _this4.onAdsManagerLoaded(event); + }, false); + this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) { + return _this4.onAdError(error); + }, false); // Request video ads to be pre-loaded this.requestAds(); } @@ -23366,21 +26682,10 @@ typeof navigator === "object" && (function () { }, { key: "requestAds", value: function requestAds() { - var _this4 = this; - var container = this.player.elements.container; try { - // Create ads loader - this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events - - this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) { - return _this4.onAdsManagerLoaded(event); - }, false); - this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) { - return _this4.onAdError(error); - }, false); // Request video ads - + // Request video ads var request = new google.ima.AdsRequest(); request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK // to select the correct creative if multiple are returned @@ -23559,7 +26864,13 @@ typeof navigator === "object" && (function () { // }; // TODO: So there is still this thing where a video should only be allowed to start // playing when the IMA SDK is ready or has failed - this.loadAds(); + if (this.player.ended) { + this.loadAds(); + } else { + // The SDK won't allow new ads to be called without receiving a contentComplete() + this.loader.contentComplete(); + } + break; case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED: @@ -23695,7 +27006,7 @@ typeof navigator === "object" && (function () { this.playing = false; // Play video - this.player.media.play(); + silencePromise(this.player.media.play()); } /** * Pause our video @@ -23752,7 +27063,9 @@ typeof navigator === "object" && (function () { _this11.on('loaded', resolve); _this11.player.debug.log(_this11.manager); - }); // Now request some new advertisements + }); // Now that the manager has been destroyed set it to also be un-initialized + + _this11.initialized = false; // Now request some new advertisements _this11.requestAds(); }).catch(function () {}); @@ -23894,11 +27207,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$b = 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$b ? 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); @@ -23986,9 +27299,7 @@ typeof navigator === "object" && (function () { return result; }; - var PreviewThumbnails = - /*#__PURE__*/ - function () { + var PreviewThumbnails = /*#__PURE__*/function () { /** * PreviewThumbnails constructor. * @param {Plyr} player @@ -24049,15 +27360,10 @@ typeof navigator === "object" && (function () { if (is$2.empty(src)) { throw new Error('Missing previewThumbnails.src config attribute'); - } // If string, convert into single-element list - + } // Resolve promise - var urls = is$2.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails - var promises = urls.map(function (u) { - return _this2.getThumbnail(u); - }); - Promise.all(promises).then(function () { + var sortAndResolve = function sortAndResolve() { // Sort smallest to biggest (e.g., [120p, 480p, 1080p]) _this2.thumbnails.sort(function (x, y) { return x.height - y.height; @@ -24066,7 +27372,25 @@ typeof navigator === "object" && (function () { _this2.player.debug.log('Preview thumbnails', _this2.thumbnails); resolve(); - }); + }; // Via callback() + + + if (is$2.function(src)) { + src(function (thumbnails) { + _this2.thumbnails = thumbnails; + sortAndResolve(); + }); + } // VTT urls + else { + // If string, convert into single-element list + var urls = is$2.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails + + var promises = urls.map(function (u) { + return _this2.getThumbnail(u); + }); // Resolve + + Promise.all(promises).then(sortAndResolve); + } }); } // Process individual VTT file @@ -24817,9 +28141,7 @@ typeof navigator === "object" && (function () { // const globals = new WeakMap(); // Plyr instance - var Plyr = - /*#__PURE__*/ - function () { + var Plyr = /*#__PURE__*/function () { function Plyr(target, options) { var _this = this; @@ -24856,6 +28178,7 @@ typeof navigator === "object" && (function () { this.elements = { container: null, + fullscreen: null, captions: null, buttons: {}, display: {}, @@ -24932,7 +28255,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; @@ -25029,9 +28352,11 @@ typeof navigator === "object" && (function () { this.elements.container = createElement$1('div', { tabindex: 0 }); - wrap$2(this.media, this.elements.container); - } // Add style hook + wrap$4(this.media, this.elements.container); + } // Migrate custom properties from media to container (so they work 😉) + + ui.migrateStyles.call(this); // Add style hook ui.addStyleHook.call(this); // Setup media @@ -25041,9 +28366,11 @@ typeof navigator === "object" && (function () { on.call(this, this.elements.container, this.config.events.join(' '), function (event) { _this.debug.log("event: ".concat(event.type)); }); - } // Setup interface - // If embed but not fully supported, build interface now to avoid flash of controls + } // Setup fullscreen + + this.fullscreen = new Fullscreen(this); // Setup interface + // If embed but not fully supported, build interface now to avoid flash of controls if (this.isHTML5 || this.isEmbed && !this.supported.ui) { ui.build.call(this); @@ -25052,9 +28379,7 @@ typeof navigator === "object" && (function () { this.listeners.container(); // Global listeners - this.listeners.global(); // Setup fullscreen - - this.fullscreen = new Fullscreen(this); // Setup ads if provided + this.listeners.global(); // Setup ads if provided if (this.config.ads.enabled) { this.ads = new Ads(this); @@ -25063,7 +28388,7 @@ typeof navigator === "object" && (function () { if (this.isHTML5 && this.config.autoplay) { setTimeout(function () { - return _this.play(); + return silencePromise(_this.play()); }, 10); } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek @@ -25100,7 +28425,7 @@ typeof navigator === "object" && (function () { this.ads.managerPromise.then(function () { return _this2.ads.play(); }).catch(function () { - return _this2.media.play(); + return silencePromise(_this2.media.play()); }); } // Return the promise (for HTML5) @@ -25753,7 +29078,7 @@ typeof navigator === "object" && (function () { var updateStorage = true; if (!options.includes(quality)) { - var value = closest(options, quality); + var value = closest$1(options, quality); this.debug.warn("Unsupported quality option: ".concat(quality, ", using ").concat(value, " instead")); quality = value; // Don't update storage if quality is not supported @@ -25792,41 +29117,41 @@ typeof navigator === "object" && (function () { this.media.loop = toggle; // Set default to be a true toggle /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle'; - switch (type) { - case 'start': - if (this.config.loop.end && this.config.loop.end <= this.currentTime) { - this.config.loop.end = null; - } - this.config.loop.start = this.currentTime; - // this.config.loop.indicator.start = this.elements.display.played.value; - break; - case 'end': - if (this.config.loop.start >= this.currentTime) { - return this; - } - this.config.loop.end = this.currentTime; - // this.config.loop.indicator.end = this.elements.display.played.value; - break; - case 'all': - this.config.loop.start = 0; - this.config.loop.end = this.duration - 2; - this.config.loop.indicator.start = 0; - this.config.loop.indicator.end = 100; - break; - case 'toggle': - if (this.config.loop.active) { - this.config.loop.start = 0; - this.config.loop.end = null; - } else { + switch (type) { + case 'start': + if (this.config.loop.end && this.config.loop.end <= this.currentTime) { + this.config.loop.end = null; + } + this.config.loop.start = this.currentTime; + // this.config.loop.indicator.start = this.elements.display.played.value; + break; + case 'end': + if (this.config.loop.start >= this.currentTime) { + return this; + } + this.config.loop.end = this.currentTime; + // this.config.loop.indicator.end = this.elements.display.played.value; + break; + case 'all': this.config.loop.start = 0; this.config.loop.end = this.duration - 2; - } - break; - default: - this.config.loop.start = 0; - this.config.loop.end = null; - break; - } */ + this.config.loop.indicator.start = 0; + this.config.loop.indicator.end = 100; + break; + case 'toggle': + if (this.config.loop.active) { + this.config.loop.start = 0; + this.config.loop.end = null; + } else { + this.config.loop.start = 0; + this.config.loop.end = this.duration - 2; + } + break; + default: + this.config.loop.start = 0; + this.config.loop.end = null; + break; + } */ } /** * Get current loop state @@ -25898,7 +29223,7 @@ typeof navigator === "object" && (function () { return null; } - return this.media.getAttribute('poster'); + return this.media.getAttribute('poster') || this.media.getAttribute('data-poster'); } /** * Get the current aspect ratio in use @@ -26115,7 +29440,10 @@ typeof navigator === "object" && (function () { label: 'French', srclang: 'fr', src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt' - }] + }], + previewThumbnails: { + src: ['https://cdn.plyr.io/static/demo/thumbs/100p.vtt', 'https://cdn.plyr.io/static/demo/thumbs/240p.vtt'] + } }, audio: { type: 'audio', @@ -26152,132 +29480,131 @@ typeof navigator === "object" && (function () { }; (function () { - var host = window.location.host; - var env = { - prod: host === 'plyr.io', - dev: host === 'dev.plyr.io' - }; + var production = 'plyr.io'; // Sentry for demo site (https://plyr.io) only + + 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)); + }) + }); + } + document.addEventListener('DOMContentLoaded', function () { - singleton.context(function () { - var selector = '#player'; // Setup share buttons + 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: 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 + 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 + 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; + 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 + 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 + 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 + 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 + 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 + player.source = sources[type]; // Set the current type for next time - currentType = type; - render(type); - } // Bind to each button + 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 + Array.from(buttons).forEach(function (button) { + button.addEventListener('click', function () { + var type = button.getAttribute('data-source'); + setSource(type); - window.addEventListener('popstate', function (event) { - if (event.state && Object.keys(event.state).includes('type')) { - setSource(event.state.type); + if (historySupport) { + window.history.pushState({ + type: type + }, '', "#".concat(type)); } - }); // If there's no current type set, assume video + }); + }); // List for backwards/forwards - if (hasCurrentType) { - currentType = 'video'; - } // Replace current history state + 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 - }, '', hasCurrentType ? '' : "#".concat(currentType)); - } // If it's not video, load the source + 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); - }); - }); // Raven / Sentry - // For demo site (https://plyr.io) only + if (currentType !== 'video') { + setSource(currentType, true); + } - if (env.prod) { - singleton.config('https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555').install(); - } + render(currentType); + }); })(); }()); |