(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([[888],{ /***/ 5659: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "Gd": function() { return /* binding */ getCurrentHub; }, /* harmony export */ "cu": function() { return /* binding */ getMainCarrier; } /* harmony export */ }); /* unused harmony exports API_VERSION, Hub, getHubFromCarrier, makeMain, setHubOnCarrier */ /* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2844); /* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1170); /* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(2343); /* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(2991); /* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(2448); /* harmony import */ var _scope_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(350); /* harmony import */ var _session_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(9015); /** * API compatibility version of this hub. * * WARNING: This number should only be increased when the global interface * changes and new methods are introduced. * * @hidden */ var API_VERSION = 4; /** * Default maximum number of breadcrumbs added to an event. Can be overwritten * with {@link Options.maxBreadcrumbs}. */ var DEFAULT_BREADCRUMBS = 100; /** * A layer in the process stack. * @hidden */ /** * @inheritDoc */ class Hub { /** Is a {@link Layer}[] containing the client and scope */ __init() {this._stack = [{}];} /** Contains the last event id of a captured event. */ /** * 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. */ constructor(client, scope = new _scope_js__WEBPACK_IMPORTED_MODULE_0__/* .Scope */ .s(), _version = API_VERSION) {;this._version = _version;Hub.prototype.__init.call(this); this.getStackTop().scope = scope; if (client) { this.bindClient(client); } } /** * @inheritDoc */ isOlderThan(version) { return this._version < version; } /** * @inheritDoc */ bindClient(client) { var top = this.getStackTop(); top.client = client; if (client && client.setupIntegrations) { client.setupIntegrations(); } } /** * @inheritDoc */ pushScope() { // We want to clone the content of prev scope var scope = _scope_js__WEBPACK_IMPORTED_MODULE_0__/* .Scope.clone */ .s.clone(this.getScope()); this.getStack().push({ client: this.getClient(), scope, }); return scope; } /** * @inheritDoc */ popScope() { if (this.getStack().length <= 1) return false; return !!this.getStack().pop(); } /** * @inheritDoc */ withScope(callback) { var scope = this.pushScope(); try { callback(scope); } finally { this.popScope(); } } /** * @inheritDoc */ getClient() { return this.getStackTop().client ; } /** Returns the scope of the top stack. */ getScope() { return this.getStackTop().scope; } /** Returns the scope stack for domains or the process. */ getStack() { return this._stack; } /** Returns the topmost scope layer in the order domain > local > process. */ getStackTop() { return this._stack[this._stack.length - 1]; } /** * @inheritDoc */ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types captureException(exception, hint) { var eventId = (this._lastEventId = hint && hint.event_id ? hint.event_id : (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_1__/* .uuid4 */ .DM)()); var syntheticException = new Error('Sentry syntheticException'); this._withClient((client, scope) => { client.captureException( exception, { originalException: exception, syntheticException, ...hint, event_id: eventId, }, scope, ); }); return eventId; } /** * @inheritDoc */ captureMessage( message, // eslint-disable-next-line deprecation/deprecation level, hint, ) { var eventId = (this._lastEventId = hint && hint.event_id ? hint.event_id : (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_1__/* .uuid4 */ .DM)()); var syntheticException = new Error(message); this._withClient((client, scope) => { client.captureMessage( message, level, { originalException: message, syntheticException, ...hint, event_id: eventId, }, scope, ); }); return eventId; } /** * @inheritDoc */ captureEvent(event, hint) { var eventId = hint && hint.event_id ? hint.event_id : (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_1__/* .uuid4 */ .DM)(); if (event.type !== 'transaction') { this._lastEventId = eventId; } this._withClient((client, scope) => { client.captureEvent(event, { ...hint, event_id: eventId }, scope); }); return eventId; } /** * @inheritDoc */ lastEventId() { return this._lastEventId; } /** * @inheritDoc */ addBreadcrumb(breadcrumb, hint) { const { scope, client } = this.getStackTop(); if (!scope || !client) return; // eslint-disable-next-line @typescript-eslint/unbound-method const { beforeBreadcrumb = null, maxBreadcrumbs = DEFAULT_BREADCRUMBS } = (client.getOptions && client.getOptions()) || {}; if (maxBreadcrumbs <= 0) return; var timestamp = (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_2__/* .dateTimestampInSeconds */ .yW)(); var mergedBreadcrumb = { timestamp, ...breadcrumb }; var finalBreadcrumb = beforeBreadcrumb ? ((0,_sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .consoleSandbox */ .Cf)(() => beforeBreadcrumb(mergedBreadcrumb, hint)) ) : mergedBreadcrumb; if (finalBreadcrumb === null) return; scope.addBreadcrumb(finalBreadcrumb, maxBreadcrumbs); } /** * @inheritDoc */ setUser(user) { var scope = this.getScope(); if (scope) scope.setUser(user); } /** * @inheritDoc */ setTags(tags) { var scope = this.getScope(); if (scope) scope.setTags(tags); } /** * @inheritDoc */ setExtras(extras) { var scope = this.getScope(); if (scope) scope.setExtras(extras); } /** * @inheritDoc */ setTag(key, value) { var scope = this.getScope(); if (scope) scope.setTag(key, value); } /** * @inheritDoc */ setExtra(key, extra) { var scope = this.getScope(); if (scope) scope.setExtra(key, extra); } /** * @inheritDoc */ // eslint-disable-next-line @typescript-eslint/no-explicit-any setContext(name, context) { var scope = this.getScope(); if (scope) scope.setContext(name, context); } /** * @inheritDoc */ configureScope(callback) { const { scope, client } = this.getStackTop(); if (scope && client) { callback(scope); } } /** * @inheritDoc */ run(callback) { var oldHub = makeMain(this); try { callback(this); } finally { makeMain(oldHub); } } /** * @inheritDoc */ getIntegration(integration) { var client = this.getClient(); if (!client) return null; try { return client.getIntegration(integration); } catch (_oO) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.warn */ .kg.warn(`Cannot retrieve integration ${integration.id} from the current Hub`); return null; } } /** * @inheritDoc */ startTransaction(context, customSamplingContext) { return this._callExtensionMethod('startTransaction', context, customSamplingContext); } /** * @inheritDoc */ traceHeaders() { return this._callExtensionMethod('traceHeaders'); } /** * @inheritDoc */ captureSession(endSession = false) { // both send the update and pull the session from the scope if (endSession) { return this.endSession(); } // only send the update this._sendSessionUpdate(); } /** * @inheritDoc */ endSession() { var layer = this.getStackTop(); var scope = layer && layer.scope; var session = scope && scope.getSession(); if (session) { (0,_session_js__WEBPACK_IMPORTED_MODULE_4__/* .closeSession */ .RJ)(session); } this._sendSessionUpdate(); // the session is over; take it off of the scope if (scope) { scope.setSession(); } } /** * @inheritDoc */ startSession(context) { const { scope, client } = this.getStackTop(); const { release, environment } = (client && client.getOptions()) || {}; // Will fetch userAgent if called from browser sdk var global = (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_5__/* .getGlobalObject */ .R)(); const { userAgent } = global.navigator || {}; var session = (0,_session_js__WEBPACK_IMPORTED_MODULE_4__/* .makeSession */ .Hv)({ release, environment, ...(scope && { user: scope.getUser() }), ...(userAgent && { userAgent }), ...context, }); if (scope) { // End existing session if there's one var currentSession = scope.getSession && scope.getSession(); if (currentSession && currentSession.status === 'ok') { (0,_session_js__WEBPACK_IMPORTED_MODULE_4__/* .updateSession */ .CT)(currentSession, { status: 'exited' }); } this.endSession(); // Afterwards we set the new session on the scope scope.setSession(session); } return session; } /** * Returns if default PII should be sent to Sentry and propagated in ourgoing requests * when Tracing is used. */ shouldSendDefaultPii() { var client = this.getClient(); var options = client && client.getOptions(); return Boolean(options && options.sendDefaultPii); } /** * Sends the current Session on the scope */ _sendSessionUpdate() { const { scope, client } = this.getStackTop(); if (!scope) return; var session = scope.getSession(); if (session) { if (client && client.captureSession) { client.captureSession(session); } } } /** * 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. */ _withClient(callback) { const { scope, client } = this.getStackTop(); if (client) { callback(client, scope); } } /** * Calls global extension method and binding current instance to the function call */ // @ts-ignore Function lacks ending return statement and return type does not include 'undefined'. ts(2366) // eslint-disable-next-line @typescript-eslint/no-explicit-any _callExtensionMethod(method, ...args) { var carrier = getMainCarrier(); var sentry = carrier.__SENTRY__; if (sentry && sentry.extensions && typeof sentry.extensions[method] === 'function') { return sentry.extensions[method].apply(this, args); } (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.warn */ .kg.warn(`Extension method ${method} couldn't be found, doing nothing.`); } } /** * Returns the global shim registry. * * FIXME: This function is problematic, because despite always returning a valid Carrier, * it has an optional `__SENTRY__` property, which then in turn requires us to always perform an unnecessary check * at the call-site. We always access the carrier through this function, so we can guarantee that `__SENTRY__` is there. **/ function getMainCarrier() { var carrier = (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_5__/* .getGlobalObject */ .R)(); carrier.__SENTRY__ = carrier.__SENTRY__ || { extensions: {}, hub: undefined, }; return carrier; } /** * Replaces the current main hub with the passed one on the global object * * @returns The old replaced hub */ function makeMain(hub) { var registry = getMainCarrier(); var oldHub = getHubFromCarrier(registry); setHubOnCarrier(registry, hub); return oldHub; } /** * Returns the default hub instance. * * If a hub is already registered in the global carrier but this module * contains a more recent version, it replaces the registered version. * Otherwise, the currently registered hub will be returned. */ function getCurrentHub() { // Get main carrier (global for every environment) var registry = getMainCarrier(); // If there's no hub, or its an old API, assign a new one if (!hasHubOnCarrier(registry) || getHubFromCarrier(registry).isOlderThan(API_VERSION)) { setHubOnCarrier(registry, new Hub()); } // Prefer domains over global if they are there (applicable only to Node environment) if ((0,_sentry_utils__WEBPACK_IMPORTED_MODULE_6__/* .isNodeEnv */ .KV)()) { return getHubFromActiveDomain(registry); } // Return hub that lives on a global object return getHubFromCarrier(registry); } /** * Try to read the hub from an active domain, and fallback to the registry if one doesn't exist * @returns discovered hub */ function getHubFromActiveDomain(registry) { try { var sentry = getMainCarrier().__SENTRY__; var activeDomain = sentry && sentry.extensions && sentry.extensions.domain && sentry.extensions.domain.active; // If there's no active domain, just return global hub if (!activeDomain) { return getHubFromCarrier(registry); } // If there's no hub on current domain, or it's an old API, assign a new one if (!hasHubOnCarrier(activeDomain) || getHubFromCarrier(activeDomain).isOlderThan(API_VERSION)) { var registryHubTopStack = getHubFromCarrier(registry).getStackTop(); setHubOnCarrier(activeDomain, new Hub(registryHubTopStack.client, _scope_js__WEBPACK_IMPORTED_MODULE_0__/* .Scope.clone */ .s.clone(registryHubTopStack.scope))); } // Return hub that lives on a domain return getHubFromCarrier(activeDomain); } catch (_Oo) { // Return hub that lives on a global object return getHubFromCarrier(registry); } } /** * This will tell whether a carrier has a hub on it or not * @param carrier object */ function hasHubOnCarrier(carrier) { return !!(carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub); } /** * This will create a new {@link Hub} and add to the passed object on * __SENTRY__.hub. * @param carrier object * @hidden */ function getHubFromCarrier(carrier) { return (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_5__/* .getGlobalSingleton */ .Y)('hub', () => new Hub(), carrier); } /** * This will set passed {@link Hub} on the passed object's __SENTRY__.hub attribute * @param carrier object * @param hub Hub * @returns A boolean indicating success or failure */ function setHubOnCarrier(carrier, hub) { if (!carrier) return false; var __SENTRY__ = (carrier.__SENTRY__ = carrier.__SENTRY__ || {}); __SENTRY__.hub = hub; return true; } //# sourceMappingURL=hub.js.map /***/ }), /***/ 350: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "c": function() { return /* binding */ addGlobalEventProcessor; }, /* harmony export */ "s": function() { return /* binding */ Scope; } /* harmony export */ }); /* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7597); /* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1170); /* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6893); /* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(2343); /* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(2844); /* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(2991); /* harmony import */ var _session_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9015); /** * Default value for maximum number of breadcrumbs added to an event. */ var DEFAULT_MAX_BREADCRUMBS = 100; /** * Holds additional event information. {@link Scope.applyToEvent} will be * called by the client before an event will be sent. */ class Scope { /** Flag if notifying is happening. */ /** Callback for client to receive scope changes. */ /** Callback list that will be called after {@link applyToEvent}. */ /** Array of breadcrumbs. */ /** User */ /** Tags */ /** Extra */ /** Contexts */ /** Attachments */ /** * A place to stash data which is needed at some point in the SDK's event processing pipeline but which shouldn't get * sent to Sentry */ /** Fingerprint */ /** Severity */ // eslint-disable-next-line deprecation/deprecation /** Transaction Name */ /** Span */ /** Session */ /** Request Mode Session Status */ constructor() { this._notifyingListeners = false; this._scopeListeners = []; this._eventProcessors = []; this._breadcrumbs = []; this._attachments = []; this._user = {}; this._tags = {}; this._extra = {}; this._contexts = {}; this._sdkProcessingMetadata = {}; } /** * Inherit values from the parent scope. * @param scope to clone. */ static clone(scope) { var newScope = new Scope(); if (scope) { newScope._breadcrumbs = [...scope._breadcrumbs]; newScope._tags = { ...scope._tags }; newScope._extra = { ...scope._extra }; newScope._contexts = { ...scope._contexts }; newScope._user = scope._user; newScope._level = scope._level; newScope._span = scope._span; newScope._session = scope._session; newScope._transactionName = scope._transactionName; newScope._fingerprint = scope._fingerprint; newScope._eventProcessors = [...scope._eventProcessors]; newScope._requestSession = scope._requestSession; newScope._attachments = [...scope._attachments]; } return newScope; } /** * Add internal on change listener. Used for sub SDKs that need to store the scope. * @hidden */ addScopeListener(callback) { this._scopeListeners.push(callback); } /** * @inheritDoc */ addEventProcessor(callback) { this._eventProcessors.push(callback); return this; } /** * @inheritDoc */ setUser(user) { this._user = user || {}; if (this._session) { (0,_session_js__WEBPACK_IMPORTED_MODULE_0__/* .updateSession */ .CT)(this._session, { user }); } this._notifyScopeListeners(); return this; } /** * @inheritDoc */ getUser() { return this._user; } /** * @inheritDoc */ getRequestSession() { return this._requestSession; } /** * @inheritDoc */ setRequestSession(requestSession) { this._requestSession = requestSession; return this; } /** * @inheritDoc */ setTags(tags) { this._tags = { ...this._tags, ...tags, }; this._notifyScopeListeners(); return this; } /** * @inheritDoc */ setTag(key, value) { this._tags = { ...this._tags, [key]: value }; this._notifyScopeListeners(); return this; } /** * @inheritDoc */ setExtras(extras) { this._extra = { ...this._extra, ...extras, }; this._notifyScopeListeners(); return this; } /** * @inheritDoc */ setExtra(key, extra) { this._extra = { ...this._extra, [key]: extra }; this._notifyScopeListeners(); return this; } /** * @inheritDoc */ setFingerprint(fingerprint) { this._fingerprint = fingerprint; this._notifyScopeListeners(); return this; } /** * @inheritDoc */ setLevel( // eslint-disable-next-line deprecation/deprecation level, ) { this._level = level; this._notifyScopeListeners(); return this; } /** * @inheritDoc */ setTransactionName(name) { this._transactionName = name; this._notifyScopeListeners(); return this; } /** * @inheritDoc */ setContext(key, context) { if (context === null) { // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete this._contexts[key]; } else { this._contexts = { ...this._contexts, [key]: context }; } this._notifyScopeListeners(); return this; } /** * @inheritDoc */ setSpan(span) { this._span = span; this._notifyScopeListeners(); return this; } /** * @inheritDoc */ getSpan() { return this._span; } /** * @inheritDoc */ getTransaction() { // Often, this span (if it exists at all) will be a transaction, but it's not guaranteed to be. Regardless, it will // have a pointer to the currently-active transaction. var span = this.getSpan(); return span && span.transaction; } /** * @inheritDoc */ setSession(session) { if (!session) { delete this._session; } else { this._session = session; } this._notifyScopeListeners(); return this; } /** * @inheritDoc */ getSession() { return this._session; } /** * @inheritDoc */ update(captureContext) { if (!captureContext) { return this; } if (typeof captureContext === 'function') { var updatedScope = (captureContext )(this); return updatedScope instanceof Scope ? updatedScope : this; } if (captureContext instanceof Scope) { this._tags = { ...this._tags, ...captureContext._tags }; this._extra = { ...this._extra, ...captureContext._extra }; this._contexts = { ...this._contexts, ...captureContext._contexts }; if (captureContext._user && Object.keys(captureContext._user).length) { this._user = captureContext._user; } if (captureContext._level) { this._level = captureContext._level; } if (captureContext._fingerprint) { this._fingerprint = captureContext._fingerprint; } if (captureContext._requestSession) { this._requestSession = captureContext._requestSession; } } else if ((0,_sentry_utils__WEBPACK_IMPORTED_MODULE_1__/* .isPlainObject */ .PO)(captureContext)) { // eslint-disable-next-line no-param-reassign captureContext = captureContext ; this._tags = { ...this._tags, ...captureContext.tags }; this._extra = { ...this._extra, ...captureContext.extra }; this._contexts = { ...this._contexts, ...captureContext.contexts }; if (captureContext.user) { this._user = captureContext.user; } if (captureContext.level) { this._level = captureContext.level; } if (captureContext.fingerprint) { this._fingerprint = captureContext.fingerprint; } if (captureContext.requestSession) { this._requestSession = captureContext.requestSession; } } return this; } /** * @inheritDoc */ clear() { this._breadcrumbs = []; this._tags = {}; this._extra = {}; this._user = {}; this._contexts = {}; this._level = undefined; this._transactionName = undefined; this._fingerprint = undefined; this._requestSession = undefined; this._span = undefined; this._session = undefined; this._notifyScopeListeners(); this._attachments = []; return this; } /** * @inheritDoc */ addBreadcrumb(breadcrumb, maxBreadcrumbs) { var maxCrumbs = typeof maxBreadcrumbs === 'number' ? maxBreadcrumbs : DEFAULT_MAX_BREADCRUMBS; // No data has been changed, so don't notify scope listeners if (maxCrumbs <= 0) { return this; } var mergedBreadcrumb = { timestamp: (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_2__/* .dateTimestampInSeconds */ .yW)(), ...breadcrumb, }; this._breadcrumbs = [...this._breadcrumbs, mergedBreadcrumb].slice(-maxCrumbs); this._notifyScopeListeners(); return this; } /** * @inheritDoc */ clearBreadcrumbs() { this._breadcrumbs = []; this._notifyScopeListeners(); return this; } /** * @inheritDoc */ addAttachment(attachment) { this._attachments.push(attachment); return this; } /** * @inheritDoc */ getAttachments() { return this._attachments; } /** * @inheritDoc */ clearAttachments() { this._attachments = []; return this; } /** * Applies data from the scope to the event and runs all event processors on it. * * @param event Event * @param hint Object containing additional information about the original exception, for use by the event processors. * @hidden */ applyToEvent(event, hint = {}) { if (this._extra && Object.keys(this._extra).length) { event.extra = { ...this._extra, ...event.extra }; } if (this._tags && Object.keys(this._tags).length) { event.tags = { ...this._tags, ...event.tags }; } if (this._user && Object.keys(this._user).length) { event.user = { ...this._user, ...event.user }; } if (this._contexts && Object.keys(this._contexts).length) { event.contexts = { ...this._contexts, ...event.contexts }; } if (this._level) { event.level = this._level; } if (this._transactionName) { event.transaction = this._transactionName; } // We want to set the trace context for normal events only if there isn't already // a trace context on the event. There is a product feature in place where we link // errors with transaction and it relies on that. if (this._span) { event.contexts = { trace: this._span.getTraceContext(), ...event.contexts }; var transactionName = this._span.transaction && this._span.transaction.name; if (transactionName) { event.tags = { transaction: transactionName, ...event.tags }; } } this._applyFingerprint(event); event.breadcrumbs = [...(event.breadcrumbs || []), ...this._breadcrumbs]; event.breadcrumbs = event.breadcrumbs.length > 0 ? event.breadcrumbs : undefined; event.sdkProcessingMetadata = { ...event.sdkProcessingMetadata, ...this._sdkProcessingMetadata }; return this._notifyEventProcessors([...getGlobalEventProcessors(), ...this._eventProcessors], event, hint); } /** * Add data which will be accessible during event processing but won't get sent to Sentry */ setSDKProcessingMetadata(newData) { this._sdkProcessingMetadata = { ...this._sdkProcessingMetadata, ...newData }; return this; } /** * This will be called after {@link applyToEvent} is finished. */ _notifyEventProcessors( processors, event, hint, index = 0, ) { return new _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .SyncPromise */ .cW((resolve, reject) => { var processor = processors[index]; if (event === null || typeof processor !== 'function') { resolve(event); } else { var result = processor({ ...event }, hint) ; (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && processor.id && result === null && _sentry_utils__WEBPACK_IMPORTED_MODULE_4__/* .logger.log */ .kg.log(`Event processor "${processor.id}" dropped event`); if ((0,_sentry_utils__WEBPACK_IMPORTED_MODULE_1__/* .isThenable */ .J8)(result)) { void result .then(final => this._notifyEventProcessors(processors, final, hint, index + 1).then(resolve)) .then(null, reject); } else { void this._notifyEventProcessors(processors, result, hint, index + 1) .then(resolve) .then(null, reject); } } }); } /** * This will be called on every set call. */ _notifyScopeListeners() { // We need this check for this._notifyingListeners to be able to work on scope during updates // If this check is not here we'll produce endless recursion when something is done with the scope // during the callback. if (!this._notifyingListeners) { this._notifyingListeners = true; this._scopeListeners.forEach(callback => { callback(this); }); this._notifyingListeners = false; } } /** * 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 */ _applyFingerprint(event) { // Make sure it's an array first and we actually have something in place event.fingerprint = event.fingerprint ? (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_5__/* .arrayify */ .lE)(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; } } } /** * Returns the global event processors. */ function getGlobalEventProcessors() { return (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_6__/* .getGlobalSingleton */ .Y)('globalEventProcessors', () => []); } /** * Add a EventProcessor to be kept globally. * @param callback EventProcessor to add */ function addGlobalEventProcessor(callback) { getGlobalEventProcessors().push(callback); } //# sourceMappingURL=scope.js.map /***/ }), /***/ 9015: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "CT": function() { return /* binding */ updateSession; }, /* harmony export */ "Hv": function() { return /* binding */ makeSession; }, /* harmony export */ "RJ": function() { return /* binding */ closeSession; } /* harmony export */ }); /* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1170); /* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2844); /* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(535); /** * Creates a new `Session` object by setting certain default parameters. If optional @param context * is passed, the passed properties are applied to the session object. * * @param context (optional) additional properties to be applied to the returned session object * * @returns a new `Session` object */ function makeSession(context) { // Both timestamp and started are in seconds since the UNIX epoch. var startingTime = (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_0__/* .timestampInSeconds */ .ph)(); var session = { sid: (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_1__/* .uuid4 */ .DM)(), init: true, timestamp: startingTime, started: startingTime, duration: 0, status: 'ok', errors: 0, ignoreDuration: false, toJSON: () => sessionToJSON(session), }; if (context) { updateSession(session, context); } return session; } /** * Updates a session object with the properties passed in the context. * * Note that this function mutates the passed object and returns void. * (Had to do this instead of returning a new and updated session because closing and sending a session * makes an update to the session after it was passed to the sending logic. * @see BaseClient.captureSession ) * * @param session the `Session` to update * @param context the `SessionContext` holding the properties that should be updated in @param session */ // eslint-disable-next-line complexity function updateSession(session, context = {}) { if (context.user) { if (!session.ipAddress && context.user.ip_address) { session.ipAddress = context.user.ip_address; } if (!session.did && !context.did) { session.did = context.user.id || context.user.email || context.user.username; } } session.timestamp = context.timestamp || (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_0__/* .timestampInSeconds */ .ph)(); if (context.ignoreDuration) { session.ignoreDuration = context.ignoreDuration; } if (context.sid) { // Good enough uuid validation. — Kamil session.sid = context.sid.length === 32 ? context.sid : (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_1__/* .uuid4 */ .DM)(); } if (context.init !== undefined) { session.init = context.init; } if (!session.did && context.did) { session.did = `${context.did}`; } if (typeof context.started === 'number') { session.started = context.started; } if (session.ignoreDuration) { session.duration = undefined; } else if (typeof context.duration === 'number') { session.duration = context.duration; } else { var duration = session.timestamp - session.started; session.duration = duration >= 0 ? duration : 0; } if (context.release) { session.release = context.release; } if (context.environment) { session.environment = context.environment; } if (!session.ipAddress && context.ipAddress) { session.ipAddress = context.ipAddress; } if (!session.userAgent && context.userAgent) { session.userAgent = context.userAgent; } if (typeof context.errors === 'number') { session.errors = context.errors; } if (context.status) { session.status = context.status; } } /** * Closes a session by setting its status and updating the session object with it. * Internally calls `updateSession` to update the passed session object. * * Note that this function mutates the passed session (@see updateSession for explanation). * * @param session the `Session` object to be closed * @param status the `SessionStatus` with which the session was closed. If you don't pass a status, * this function will keep the previously set status, unless it was `'ok'` in which case * it is changed to `'exited'`. */ function closeSession(session, status) { let context = {}; if (status) { context = { status }; } else if (session.status === 'ok') { context = { status: 'exited' }; } updateSession(session, context); } /** * Serializes a passed session object to a JSON object with a slightly different structure. * This is necessary because the Sentry backend requires a slightly different schema of a session * than the one the JS SDKs use internally. * * @param session the session to be converted * * @returns a JSON object of the passed session */ function sessionToJSON(session) { return (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_2__/* .dropUndefinedKeys */ .Jr)({ sid: `${session.sid}`, init: session.init, // Make sure that sec is converted to ms for date constructor started: new Date(session.started * 1000).toISOString(), timestamp: new Date(session.timestamp * 1000).toISOString(), status: session.status, errors: session.errors, did: typeof session.did === 'number' || typeof session.did === 'string' ? `${session.did}` : undefined, duration: session.duration, attrs: { release: session.release, environment: session.environment, ip_address: session.ipAddress, user_agent: session.userAgent, }, }); } //# sourceMappingURL=session.js.map /***/ }), /***/ 2758: /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; // EXPORTS __webpack_require__.d(__webpack_exports__, { "ro": function() { return /* binding */ addExtensionMethods; }, "lb": function() { return /* binding */ startIdleTransaction; } }); // UNUSED EXPORTS: _addTracingExtensions // EXTERNAL MODULE: ./node_modules/@sentry/core/esm/hub.js var hub = __webpack_require__(5659); // EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/logger.js var logger = __webpack_require__(2343); // EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/is.js var is = __webpack_require__(7597); // EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/node.js + 1 modules var node = __webpack_require__(2448); // EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/instrument.js var instrument = __webpack_require__(9732); // EXTERNAL MODULE: ./node_modules/@sentry/tracing/esm/utils.js var utils = __webpack_require__(3233); ;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/errors.js /** * Configures global error listeners */ function registerErrorInstrumentation() { (0,instrument/* addInstrumentationHandler */.o)('error', errorCallback); (0,instrument/* addInstrumentationHandler */.o)('unhandledrejection', errorCallback); } /** * If an error or unhandled promise occurs, we mark the active transaction as failed */ function errorCallback() { var activeTransaction = (0,utils/* getActiveTransaction */.x1)(); if (activeTransaction) { var status = 'internal_error'; (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger/* logger.log */.kg.log(`[Tracing] Transaction: ${status} -> Global error occured`); activeTransaction.setStatus(status); } } //# sourceMappingURL=errors.js.map // EXTERNAL MODULE: ./node_modules/@sentry/tracing/esm/idletransaction.js var idletransaction = __webpack_require__(6458); // EXTERNAL MODULE: ./node_modules/@sentry/tracing/esm/transaction.js var esm_transaction = __webpack_require__(3391); ;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/hubextensions.js /* module decorator */ module = __webpack_require__.hmd(module); /** Returns all trace headers that are currently on the top scope. */ function traceHeaders() { var scope = this.getScope(); if (scope) { var span = scope.getSpan(); if (span) { return { 'sentry-trace': span.toTraceparent(), }; } } return {}; } /** * Makes a sampling decision for the given transaction and stores it on the transaction. * * Called every time a transaction is created. Only transactions which emerge with a `sampled` value of `true` will be * sent to Sentry. * * @param transaction: The transaction needing a sampling decision * @param options: The current client's options, so we can access `tracesSampleRate` and/or `tracesSampler` * @param samplingContext: Default and user-provided data which may be used to help make the decision * * @returns The given transaction with its `sampled` value set */ function sample( transaction, options, samplingContext, ) { // nothing to do if tracing is not enabled if (!(0,utils/* hasTracingEnabled */.zu)(options)) { transaction.sampled = false; return transaction; } // if the user has forced a sampling decision by passing a `sampled` value in their transaction context, go with that if (transaction.sampled !== undefined) { transaction.setMetadata({ sampleRate: Number(transaction.sampled), }); return transaction; } // we would have bailed already if neither `tracesSampler` nor `tracesSampleRate` were defined, so one of these should // work; prefer the hook if so let sampleRate; if (typeof options.tracesSampler === 'function') { sampleRate = options.tracesSampler(samplingContext); transaction.setMetadata({ sampleRate: Number(sampleRate), }); } else if (samplingContext.parentSampled !== undefined) { sampleRate = samplingContext.parentSampled; } else { sampleRate = options.tracesSampleRate; transaction.setMetadata({ sampleRate: Number(sampleRate), }); } // Since this is coming from the user (or from a function provided by the user), who knows what we might get. (The // only valid values are booleans or numbers between 0 and 1.) if (!isValidSampleRate(sampleRate)) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger/* logger.warn */.kg.warn('[Tracing] Discarding transaction because of invalid sample rate.'); transaction.sampled = false; return transaction; } // if the function returned 0 (or false), or if `tracesSampleRate` is 0, it's a sign the transaction should be dropped if (!sampleRate) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger/* logger.log */.kg.log( `[Tracing] Discarding transaction because ${ typeof options.tracesSampler === 'function' ? 'tracesSampler returned 0 or false' : 'a negative sampling decision was inherited or tracesSampleRate is set to 0' }`, ); transaction.sampled = false; return transaction; } // Now we roll the dice. Math.random is inclusive of 0, but not of 1, so strict < is safe here. In case sampleRate is // a boolean, the < comparison will cause it to be automatically cast to 1 if it's true and 0 if it's false. transaction.sampled = Math.random() < (sampleRate ); // if we're not going to keep it, we're done if (!transaction.sampled) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger/* logger.log */.kg.log( `[Tracing] Discarding transaction because it's not included in the random sample (sampling rate = ${Number( sampleRate, )})`, ); return transaction; } (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger/* logger.log */.kg.log(`[Tracing] starting ${transaction.op} transaction - ${transaction.name}`); return transaction; } /** * Checks the given sample rate to make sure it is valid type and value (a boolean, or a number between 0 and 1). */ function isValidSampleRate(rate) { // we need to check NaN explicitly because it's of type 'number' and therefore wouldn't get caught by this typecheck // eslint-disable-next-line @typescript-eslint/no-explicit-any if ((0,is/* isNaN */.i2)(rate) || !(typeof rate === 'number' || typeof rate === 'boolean')) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger/* logger.warn */.kg.warn( `[Tracing] Given sample rate is invalid. Sample rate must be a boolean or a number between 0 and 1. Got ${JSON.stringify( rate, )} of type ${JSON.stringify(typeof rate)}.`, ); return false; } // in case sampleRate is a boolean, it will get automatically cast to 1 if it's true and 0 if it's false if (rate < 0 || rate > 1) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger/* logger.warn */.kg.warn(`[Tracing] Given sample rate is invalid. Sample rate must be between 0 and 1. Got ${rate}.`); return false; } return true; } /** * Creates a new transaction and adds a sampling decision if it doesn't yet have one. * * The Hub.startTransaction method delegates to this method to do its work, passing the Hub instance in as `this`, as if * it had been called on the hub directly. Exists as a separate function so that it can be injected into the class as an * "extension method." * * @param this: The Hub starting the transaction * @param transactionContext: Data used to configure the transaction * @param CustomSamplingContext: Optional data to be provided to the `tracesSampler` function (if any) * * @returns The new transaction * * @see {@link Hub.startTransaction} */ function _startTransaction( transactionContext, customSamplingContext, ) { var client = this.getClient(); var options = (client && client.getOptions()) || {}; let transaction = new esm_transaction/* Transaction */.Y(transactionContext, this); transaction = sample(transaction, options, { parentSampled: transactionContext.parentSampled, transactionContext, ...customSamplingContext, }); if (transaction.sampled) { transaction.initSpanRecorder(options._experiments && (options._experiments.maxSpans )); } return transaction; } /** * Create new idle transaction. */ function startIdleTransaction( hub, transactionContext, idleTimeout, finalTimeout, onScope, customSamplingContext, heartbeatInterval, ) { var client = hub.getClient(); var options = (client && client.getOptions()) || {}; let transaction = new idletransaction/* IdleTransaction */.io(transactionContext, hub, idleTimeout, finalTimeout, heartbeatInterval, onScope); transaction = sample(transaction, options, { parentSampled: transactionContext.parentSampled, transactionContext, ...customSamplingContext, }); if (transaction.sampled) { transaction.initSpanRecorder(options._experiments && (options._experiments.maxSpans )); } return transaction; } /** * @private */ function _addTracingExtensions() { var carrier = (0,hub/* getMainCarrier */.cu)(); if (!carrier.__SENTRY__) { return; } carrier.__SENTRY__.extensions = carrier.__SENTRY__.extensions || {}; if (!carrier.__SENTRY__.extensions.startTransaction) { carrier.__SENTRY__.extensions.startTransaction = _startTransaction; } if (!carrier.__SENTRY__.extensions.traceHeaders) { carrier.__SENTRY__.extensions.traceHeaders = traceHeaders; } } /** * @private */ function _autoloadDatabaseIntegrations() { var carrier = (0,hub/* getMainCarrier */.cu)(); if (!carrier.__SENTRY__) { return; } var packageToIntegrationMapping = { mongodb() { var integration = (0,node/* dynamicRequire */.l$)(module, './integrations/node/mongo') ; return new integration.Mongo(); }, mongoose() { var integration = (0,node/* dynamicRequire */.l$)(module, './integrations/node/mongo') ; return new integration.Mongo({ mongoose: true }); }, mysql() { var integration = (0,node/* dynamicRequire */.l$)(module, './integrations/node/mysql') ; return new integration.Mysql(); }, pg() { var integration = (0,node/* dynamicRequire */.l$)(module, './integrations/node/postgres') ; return new integration.Postgres(); }, }; var mappedPackages = Object.keys(packageToIntegrationMapping) .filter(moduleName => !!(0,node/* loadModule */.$y)(moduleName)) .map(pkg => { try { return packageToIntegrationMapping[pkg](); } catch (e) { return undefined; } }) .filter(p => p) ; if (mappedPackages.length > 0) { carrier.__SENTRY__.integrations = [...(carrier.__SENTRY__.integrations || []), ...mappedPackages]; } } /** * This patches the global object and injects the Tracing extensions methods */ function addExtensionMethods() { _addTracingExtensions(); // Detect and automatically load specified integrations. if ((0,node/* isNodeEnv */.KV)()) { _autoloadDatabaseIntegrations(); } // If an error happens globally, we should make sure transaction status is set to error. registerErrorInstrumentation(); } //# sourceMappingURL=hubextensions.js.map /***/ }), /***/ 6458: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "hd": function() { return /* binding */ DEFAULT_HEARTBEAT_INTERVAL; }, /* harmony export */ "io": function() { return /* binding */ IdleTransaction; }, /* harmony export */ "mg": function() { return /* binding */ DEFAULT_FINAL_TIMEOUT; }, /* harmony export */ "nT": function() { return /* binding */ DEFAULT_IDLE_TIMEOUT; } /* harmony export */ }); /* unused harmony export IdleTransactionSpanRecorder */ /* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1170); /* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(2343); /* harmony import */ var _span_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5334); /* harmony import */ var _transaction_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3391); var DEFAULT_IDLE_TIMEOUT = 1000; var DEFAULT_FINAL_TIMEOUT = 30000; var DEFAULT_HEARTBEAT_INTERVAL = 5000; /** * @inheritDoc */ class IdleTransactionSpanRecorder extends _span_js__WEBPACK_IMPORTED_MODULE_0__/* .SpanRecorder */ .gB { constructor( _pushActivity, _popActivity, transactionSpanId, maxlen, ) { super(maxlen);this._pushActivity = _pushActivity;this._popActivity = _popActivity;this.transactionSpanId = transactionSpanId;; } /** * @inheritDoc */ add(span) { // We should make sure we do not push and pop activities for // the transaction that this span recorder belongs to. if (span.spanId !== this.transactionSpanId) { // We patch span.finish() to pop an activity after setting an endTimestamp. span.finish = (endTimestamp) => { span.endTimestamp = typeof endTimestamp === 'number' ? endTimestamp : (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_1__/* .timestampWithMs */ ._I)(); this._popActivity(span.spanId); }; // We should only push new activities if the span does not have an end timestamp. if (span.endTimestamp === undefined) { this._pushActivity(span.spanId); } } super.add(span); } } /** * An IdleTransaction is a transaction that automatically finishes. It does this by tracking child spans as activities. * You can have multiple IdleTransactions active, but if the `onScope` option is specified, the idle transaction will * put itself on the scope on creation. */ class IdleTransaction extends _transaction_js__WEBPACK_IMPORTED_MODULE_2__/* .Transaction */ .Y { // Activities store a list of active spans __init() {this.activities = {};} // Track state of activities in previous heartbeat // Amount of times heartbeat has counted. Will cause transaction to finish after 3 beats. __init2() {this._heartbeatCounter = 0;} // We should not use heartbeat if we finished a transaction __init3() {this._finished = false;} __init4() {this._beforeFinishCallbacks = [];} /** * Timer that tracks Transaction idleTimeout */ constructor( transactionContext, _idleHub, /** * The time to wait in ms until the idle transaction will be finished. This timer is started each time * there are no active spans on this transaction. */ _idleTimeout = DEFAULT_IDLE_TIMEOUT, /** * The final value in ms that a transaction cannot exceed */ _finalTimeout = DEFAULT_FINAL_TIMEOUT, _heartbeatInterval = DEFAULT_HEARTBEAT_INTERVAL, // Whether or not the transaction should put itself on the scope when it starts and pop itself off when it ends _onScope = false, ) { super(transactionContext, _idleHub);this._idleHub = _idleHub;this._idleTimeout = _idleTimeout;this._finalTimeout = _finalTimeout;this._heartbeatInterval = _heartbeatInterval;this._onScope = _onScope;IdleTransaction.prototype.__init.call(this);IdleTransaction.prototype.__init2.call(this);IdleTransaction.prototype.__init3.call(this);IdleTransaction.prototype.__init4.call(this);; if (_onScope) { // There should only be one active transaction on the scope clearActiveTransaction(_idleHub); // We set the transaction here on the scope so error events pick up the trace // context and attach it to the error. (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .kg.log(`Setting idle transaction on scope. Span ID: ${this.spanId}`); _idleHub.configureScope(scope => scope.setSpan(this)); } this._startIdleTimeout(); setTimeout(() => { if (!this._finished) { this.setStatus('deadline_exceeded'); this.finish(); } }, this._finalTimeout); } /** {@inheritDoc} */ finish(endTimestamp = (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_1__/* .timestampWithMs */ ._I)()) { this._finished = true; this.activities = {}; if (this.spanRecorder) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .kg.log('[Tracing] finishing IdleTransaction', new Date(endTimestamp * 1000).toISOString(), this.op); for (var callback of this._beforeFinishCallbacks) { callback(this, endTimestamp); } this.spanRecorder.spans = this.spanRecorder.spans.filter((span) => { // If we are dealing with the transaction itself, we just return it if (span.spanId === this.spanId) { return true; } // We cancel all pending spans with status "cancelled" to indicate the idle transaction was finished early if (!span.endTimestamp) { span.endTimestamp = endTimestamp; span.setStatus('cancelled'); (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .kg.log('[Tracing] cancelling span since transaction ended early', JSON.stringify(span, undefined, 2)); } var keepSpan = span.startTimestamp < endTimestamp; if (!keepSpan) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .kg.log( '[Tracing] discarding Span since it happened after Transaction was finished', JSON.stringify(span, undefined, 2), ); } return keepSpan; }); (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .kg.log('[Tracing] flushing IdleTransaction'); } else { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .kg.log('[Tracing] No active IdleTransaction'); } // if `this._onScope` is `true`, the transaction put itself on the scope when it started if (this._onScope) { clearActiveTransaction(this._idleHub); } return super.finish(endTimestamp); } /** * Register a callback function that gets excecuted before the transaction finishes. * Useful for cleanup or if you want to add any additional spans based on current context. * * This is exposed because users have no other way of running something before an idle transaction * finishes. */ registerBeforeFinishCallback(callback) { this._beforeFinishCallbacks.push(callback); } /** * @inheritDoc */ initSpanRecorder(maxlen) { if (!this.spanRecorder) { var pushActivity = (id) => { if (this._finished) { return; } this._pushActivity(id); }; var popActivity = (id) => { if (this._finished) { return; } this._popActivity(id); }; this.spanRecorder = new IdleTransactionSpanRecorder(pushActivity, popActivity, this.spanId, maxlen); // Start heartbeat so that transactions do not run forever. (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .kg.log('Starting heartbeat'); this._pingHeartbeat(); } this.spanRecorder.add(this); } /** * Cancels the existing idletimeout, if there is one */ _cancelIdleTimeout() { if (this._idleTimeoutID) { clearTimeout(this._idleTimeoutID); this._idleTimeoutID = undefined; } } /** * Creates an idletimeout */ _startIdleTimeout(endTimestamp) { this._cancelIdleTimeout(); this._idleTimeoutID = setTimeout(() => { if (!this._finished && Object.keys(this.activities).length === 0) { this.finish(endTimestamp); } }, this._idleTimeout); } /** * Start tracking a specific activity. * @param spanId The span id that represents the activity */ _pushActivity(spanId) { this._cancelIdleTimeout(); (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .kg.log(`[Tracing] pushActivity: ${spanId}`); this.activities[spanId] = true; (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .kg.log('[Tracing] new activities count', Object.keys(this.activities).length); } /** * Remove an activity from usage * @param spanId The span id that represents the activity */ _popActivity(spanId) { if (this.activities[spanId]) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .kg.log(`[Tracing] popActivity ${spanId}`); // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete this.activities[spanId]; (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .kg.log('[Tracing] new activities count', Object.keys(this.activities).length); } if (Object.keys(this.activities).length === 0) { // We need to add the timeout here to have the real endtimestamp of the transaction // Remember timestampWithMs is in seconds, timeout is in ms var endTimestamp = (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_1__/* .timestampWithMs */ ._I)() + this._idleTimeout / 1000; this._startIdleTimeout(endTimestamp); } } /** * Checks when entries of this.activities are not changing for 3 beats. * If this occurs we finish the transaction. */ _beat() { // We should not be running heartbeat if the idle transaction is finished. if (this._finished) { return; } var heartbeatString = Object.keys(this.activities).join(''); if (heartbeatString === this._prevHeartbeatString) { this._heartbeatCounter += 1; } else { this._heartbeatCounter = 1; } this._prevHeartbeatString = heartbeatString; if (this._heartbeatCounter >= 3) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .kg.log('[Tracing] Transaction finished because of no change for 3 heart beats'); this.setStatus('deadline_exceeded'); this.finish(); } else { this._pingHeartbeat(); } } /** * Pings the heartbeat */ _pingHeartbeat() { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .kg.log(`pinging Heartbeat -> current counter: ${this._heartbeatCounter}`); setTimeout(() => { this._beat(); }, this._heartbeatInterval); } } /** * Reset transaction on scope to `undefined` */ function clearActiveTransaction(hub) { var scope = hub.getScope(); if (scope) { var transaction = scope.getTransaction(); if (transaction) { scope.setSpan(undefined); } } } //# sourceMappingURL=idletransaction.js.map /***/ }), /***/ 5334: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "Dr": function() { return /* binding */ Span; }, /* harmony export */ "gB": function() { return /* binding */ SpanRecorder; } /* harmony export */ }); /* unused harmony export spanStatusfromHttpCode */ /* harmony import */ var _sentry_utils_esm_buildPolyfills__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(5375); /* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2844); /* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1170); /* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(2343); /* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(535); /** * Keeps track of finished spans for a given transaction * @internal * @hideconstructor * @hidden */ class SpanRecorder { __init() {this.spans = [];} constructor(maxlen = 1000) {;SpanRecorder.prototype.__init.call(this); this._maxlen = maxlen; } /** * This is just so that we don't run out of memory while recording a lot * of spans. At some point we just stop and flush out the start of the * trace tree (i.e.the first n spans with the smallest * start_timestamp). */ add(span) { if (this.spans.length > this._maxlen) { span.spanRecorder = undefined; } else { this.spans.push(span); } } } /** * Span contains all data about a span */ class Span { /** * @inheritDoc */ __init2() {this.traceId = (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_0__/* .uuid4 */ .DM)();} /** * @inheritDoc */ __init3() {this.spanId = (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_0__/* .uuid4 */ .DM)().substring(16);} /** * @inheritDoc */ /** * Internal keeper of the status */ /** * @inheritDoc */ /** * Timestamp in seconds when the span was created. */ __init4() {this.startTimestamp = (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_1__/* .timestampWithMs */ ._I)();} /** * Timestamp in seconds when the span ended. */ /** * @inheritDoc */ /** * @inheritDoc */ /** * @inheritDoc */ __init5() {this.tags = {};} /** * @inheritDoc */ // eslint-disable-next-line @typescript-eslint/no-explicit-any __init6() {this.data = {};} /** * List of spans that were finalized */ /** * @inheritDoc */ /** * You should never call the constructor manually, always use `Sentry.startTransaction()` * or call `startChild()` on an existing span. * @internal * @hideconstructor * @hidden */ constructor(spanContext) {;Span.prototype.__init2.call(this);Span.prototype.__init3.call(this);Span.prototype.__init4.call(this);Span.prototype.__init5.call(this);Span.prototype.__init6.call(this); if (!spanContext) { return this; } if (spanContext.traceId) { this.traceId = spanContext.traceId; } if (spanContext.spanId) { this.spanId = spanContext.spanId; } if (spanContext.parentSpanId) { this.parentSpanId = spanContext.parentSpanId; } // We want to include booleans as well here if ('sampled' in spanContext) { this.sampled = spanContext.sampled; } if (spanContext.op) { this.op = spanContext.op; } if (spanContext.description) { this.description = spanContext.description; } if (spanContext.data) { this.data = spanContext.data; } if (spanContext.tags) { this.tags = spanContext.tags; } if (spanContext.status) { this.status = spanContext.status; } if (spanContext.startTimestamp) { this.startTimestamp = spanContext.startTimestamp; } if (spanContext.endTimestamp) { this.endTimestamp = spanContext.endTimestamp; } } /** * @inheritDoc */ startChild( spanContext, ) { var childSpan = new Span({ ...spanContext, parentSpanId: this.spanId, sampled: this.sampled, traceId: this.traceId, }); childSpan.spanRecorder = this.spanRecorder; if (childSpan.spanRecorder) { childSpan.spanRecorder.add(childSpan); } childSpan.transaction = this.transaction; if ((typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && childSpan.transaction) { var opStr = (spanContext && spanContext.op) || '< unknown op >'; var nameStr = childSpan.transaction.name || '< unknown name >'; var idStr = childSpan.transaction.spanId; var logMessage = `[Tracing] Starting '${opStr}' span on transaction '${nameStr}' (${idStr}).`; childSpan.transaction.metadata.spanMetadata[childSpan.spanId] = { logMessage }; _sentry_utils__WEBPACK_IMPORTED_MODULE_2__/* .logger.log */ .kg.log(logMessage); } return childSpan; } /** * @inheritDoc */ setTag(key, value) { this.tags = { ...this.tags, [key]: value }; return this; } /** * @inheritDoc */ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types setData(key, value) { this.data = { ...this.data, [key]: value }; return this; } /** * @inheritDoc */ setStatus(value) { this.status = value; return this; } /** * @inheritDoc */ setHttpStatus(httpStatus) { this.setTag('http.status_code', String(httpStatus)); var spanStatus = spanStatusfromHttpCode(httpStatus); if (spanStatus !== 'unknown_error') { this.setStatus(spanStatus); } return this; } /** * @inheritDoc */ isSuccess() { return this.status === 'ok'; } /** * @inheritDoc */ finish(endTimestamp) { if ( (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && // Don't call this for transactions this.transaction && this.transaction.spanId !== this.spanId ) { const { logMessage } = this.transaction.metadata.spanMetadata[this.spanId]; if (logMessage) { _sentry_utils__WEBPACK_IMPORTED_MODULE_2__/* .logger.log */ .kg.log((logMessage ).replace('Starting', 'Finishing')); } } this.endTimestamp = typeof endTimestamp === 'number' ? endTimestamp : (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_1__/* .timestampWithMs */ ._I)(); } /** * @inheritDoc */ toTraceparent() { let sampledString = ''; if (this.sampled !== undefined) { sampledString = this.sampled ? '-1' : '-0'; } return `${this.traceId}-${this.spanId}${sampledString}`; } /** * @inheritDoc */ toContext() { return (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .dropUndefinedKeys */ .Jr)({ data: this.data, description: this.description, endTimestamp: this.endTimestamp, op: this.op, parentSpanId: this.parentSpanId, sampled: this.sampled, spanId: this.spanId, startTimestamp: this.startTimestamp, status: this.status, tags: this.tags, traceId: this.traceId, }); } /** * @inheritDoc */ updateWithContext(spanContext) { this.data = (0,_sentry_utils_esm_buildPolyfills__WEBPACK_IMPORTED_MODULE_4__/* ._nullishCoalesce */ .h)(spanContext.data, () => ( {})); this.description = spanContext.description; this.endTimestamp = spanContext.endTimestamp; this.op = spanContext.op; this.parentSpanId = spanContext.parentSpanId; this.sampled = spanContext.sampled; this.spanId = (0,_sentry_utils_esm_buildPolyfills__WEBPACK_IMPORTED_MODULE_4__/* ._nullishCoalesce */ .h)(spanContext.spanId, () => ( this.spanId)); this.startTimestamp = (0,_sentry_utils_esm_buildPolyfills__WEBPACK_IMPORTED_MODULE_4__/* ._nullishCoalesce */ .h)(spanContext.startTimestamp, () => ( this.startTimestamp)); this.status = spanContext.status; this.tags = (0,_sentry_utils_esm_buildPolyfills__WEBPACK_IMPORTED_MODULE_4__/* ._nullishCoalesce */ .h)(spanContext.tags, () => ( {})); this.traceId = (0,_sentry_utils_esm_buildPolyfills__WEBPACK_IMPORTED_MODULE_4__/* ._nullishCoalesce */ .h)(spanContext.traceId, () => ( this.traceId)); return this; } /** * @inheritDoc */ getTraceContext() { return (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .dropUndefinedKeys */ .Jr)({ data: Object.keys(this.data).length > 0 ? this.data : undefined, description: this.description, op: this.op, parent_span_id: this.parentSpanId, span_id: this.spanId, status: this.status, tags: Object.keys(this.tags).length > 0 ? this.tags : undefined, trace_id: this.traceId, }); } /** * @inheritDoc */ toJSON() { return (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .dropUndefinedKeys */ .Jr)({ data: Object.keys(this.data).length > 0 ? this.data : undefined, description: this.description, op: this.op, parent_span_id: this.parentSpanId, span_id: this.spanId, start_timestamp: this.startTimestamp, status: this.status, tags: Object.keys(this.tags).length > 0 ? this.tags : undefined, timestamp: this.endTimestamp, trace_id: this.traceId, }); } } /** * Converts a HTTP status code into a {@link SpanStatusType}. * * @param httpStatus The HTTP response status code. * @returns The span status or unknown_error. */ function spanStatusfromHttpCode(httpStatus) { if (httpStatus < 400 && httpStatus >= 100) { return 'ok'; } if (httpStatus >= 400 && httpStatus < 500) { switch (httpStatus) { case 401: return 'unauthenticated'; case 403: return 'permission_denied'; case 404: return 'not_found'; case 409: return 'already_exists'; case 413: return 'failed_precondition'; case 429: return 'resource_exhausted'; default: return 'invalid_argument'; } } if (httpStatus >= 500 && httpStatus < 600) { switch (httpStatus) { case 501: return 'unimplemented'; case 503: return 'unavailable'; case 504: return 'deadline_exceeded'; default: return 'internal_error'; } } return 'unknown_error'; } //# sourceMappingURL=span.js.map /***/ }), /***/ 3391: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "Y": function() { return /* binding */ Transaction; } /* harmony export */ }); /* harmony import */ var _sentry_utils_esm_buildPolyfills__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(5375); /* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5659); /* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1170); /* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(2343); /* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(535); /* harmony import */ var _span_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5334); /** JSDoc */ class Transaction extends _span_js__WEBPACK_IMPORTED_MODULE_0__/* .Span */ .Dr { /** * The reference to the current hub. */ __init() {this._measurements = {};} __init2() {this._frozenDynamicSamplingContext = undefined;} /** * This constructor should never be called manually. Those instrumenting tracing should use * `Sentry.startTransaction()`, and internal methods should use `hub.startTransaction()`. * @internal * @hideconstructor * @hidden */ constructor(transactionContext, hub) { super(transactionContext);Transaction.prototype.__init.call(this);Transaction.prototype.__init2.call(this);; this._hub = hub || (0,_sentry_core__WEBPACK_IMPORTED_MODULE_1__/* .getCurrentHub */ .Gd)(); this._name = transactionContext.name || ''; this.metadata = { source: 'custom', ...transactionContext.metadata, spanMetadata: {}, changes: [], propagations: 0, }; this._trimEnd = transactionContext.trimEnd; // this is because transactions are also spans, and spans have a transaction pointer this.transaction = this; // If Dynamic Sampling Context is provided during the creation of the transaction, we freeze it as it usually means // there is incoming Dynamic Sampling Context. (Either through an incoming request, a baggage meta-tag, or other means) var incomingDynamicSamplingContext = this.metadata.dynamicSamplingContext; if (incomingDynamicSamplingContext) { // We shallow copy this in case anything writes to the original reference of the passed in `dynamicSamplingContext` this._frozenDynamicSamplingContext = { ...incomingDynamicSamplingContext }; } } /** Getter for `name` property */ get name() { return this._name; } /** Setter for `name` property, which also sets `source` as custom */ set name(newName) { this.setName(newName); } /** * JSDoc */ setName(name, source = 'custom') { // `source` could change without the name changing if we discover that an unparameterized route is actually // parameterized by virtue of having no parameters in its path if (name !== this.name || source !== this.metadata.source) { this.metadata.changes.push({ // log previous source source: this.metadata.source, timestamp: (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_2__/* .timestampInSeconds */ .ph)(), propagations: this.metadata.propagations, }); } this._name = name; this.metadata.source = source; } /** * Attaches SpanRecorder to the span itself * @param maxlen maximum number of spans that can be recorded */ initSpanRecorder(maxlen = 1000) { if (!this.spanRecorder) { this.spanRecorder = new _span_js__WEBPACK_IMPORTED_MODULE_0__/* .SpanRecorder */ .gB(maxlen); } this.spanRecorder.add(this); } /** * @inheritDoc */ setMeasurement(name, value, unit = '') { this._measurements[name] = { value, unit }; } /** * @inheritDoc */ setMetadata(newMetadata) { this.metadata = { ...this.metadata, ...newMetadata }; } /** * @inheritDoc */ finish(endTimestamp) { // This transaction is already finished, so we should not flush it again. if (this.endTimestamp !== undefined) { return undefined; } if (!this.name) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.warn */ .kg.warn('Transaction has no name, falling back to ``.'); this.name = ''; } // just sets the end timestamp super.finish(endTimestamp); if (this.sampled !== true) { // At this point if `sampled !== true` we want to discard the transaction. (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .kg.log('[Tracing] Discarding transaction because its trace was not chosen to be sampled.'); var client = this._hub.getClient(); if (client) { client.recordDroppedEvent('sample_rate', 'transaction'); } return undefined; } var finishedSpans = this.spanRecorder ? this.spanRecorder.spans.filter(s => s !== this && s.endTimestamp) : []; if (this._trimEnd && finishedSpans.length > 0) { this.endTimestamp = finishedSpans.reduce((prev, current) => { if (prev.endTimestamp && current.endTimestamp) { return prev.endTimestamp > current.endTimestamp ? prev : current; } return prev; }).endTimestamp; } var metadata = this.metadata; var transaction = { contexts: { trace: this.getTraceContext(), }, spans: finishedSpans, start_timestamp: this.startTimestamp, tags: this.tags, timestamp: this.endTimestamp, transaction: this.name, type: 'transaction', sdkProcessingMetadata: { ...metadata, dynamicSamplingContext: this.getDynamicSamplingContext(), }, ...(metadata.source && { transaction_info: { source: metadata.source, changes: metadata.changes, propagations: metadata.propagations, }, }), }; var hasMeasurements = Object.keys(this._measurements).length > 0; if (hasMeasurements) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .kg.log( '[Measurements] Adding measurements to transaction', JSON.stringify(this._measurements, undefined, 2), ); transaction.measurements = this._measurements; } (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && _sentry_utils__WEBPACK_IMPORTED_MODULE_3__/* .logger.log */ .kg.log(`[Tracing] Finishing ${this.op} transaction: ${this.name}.`); return this._hub.captureEvent(transaction); } /** * @inheritDoc */ toContext() { var spanContext = super.toContext(); return (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_4__/* .dropUndefinedKeys */ .Jr)({ ...spanContext, name: this.name, trimEnd: this._trimEnd, }); } /** * @inheritDoc */ updateWithContext(transactionContext) { super.updateWithContext(transactionContext); this.name = (0,_sentry_utils_esm_buildPolyfills__WEBPACK_IMPORTED_MODULE_5__/* ._nullishCoalesce */ .h)(transactionContext.name, () => ( '')); this._trimEnd = transactionContext.trimEnd; return this; } /** * @inheritdoc * * @experimental */ getDynamicSamplingContext() { if (this._frozenDynamicSamplingContext) { return this._frozenDynamicSamplingContext; } var hub = this._hub || (0,_sentry_core__WEBPACK_IMPORTED_MODULE_1__/* .getCurrentHub */ .Gd)(); var client = hub && hub.getClient(); if (!client) return {}; const { environment, release } = client.getOptions() || {}; const { publicKey: public_key } = client.getDsn() || {}; var maybeSampleRate = this.metadata.sampleRate; var sample_rate = maybeSampleRate !== undefined ? maybeSampleRate.toString() : undefined; var scope = hub.getScope(); const { segment: user_segment } = (scope && scope.getUser()) || {}; var source = this.metadata.source; // We don't want to have a transaction name in the DSC if the source is "url" because URLs might contain PII var transaction = source && source !== 'url' ? this.name : undefined; var dsc = (0,_sentry_utils__WEBPACK_IMPORTED_MODULE_4__/* .dropUndefinedKeys */ .Jr)({ environment, release, transaction, user_segment, public_key, trace_id: this.traceId, sample_rate, }); // Uncomment if we want to make DSC immutable // this._frozenDynamicSamplingContext = dsc; return dsc; } } //# sourceMappingURL=transaction.js.map /***/ }), /***/ 3233: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "XL": function() { return /* binding */ msToSec; }, /* harmony export */ "x1": function() { return /* binding */ getActiveTransaction; }, /* harmony export */ "zu": function() { return /* binding */ hasTracingEnabled; } /* harmony export */ }); /* unused harmony export secToMs */ /* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5659); /** * Determines if tracing is currently enabled. * * Tracing is enabled when at least one of `tracesSampleRate` and `tracesSampler` is defined in the SDK config. */ function hasTracingEnabled( maybeOptions, ) { var client = (0,_sentry_core__WEBPACK_IMPORTED_MODULE_0__/* .getCurrentHub */ .Gd)().getClient(); var options = maybeOptions || (client && client.getOptions()); return !!options && ('tracesSampleRate' in options || 'tracesSampler' in options); } /** Grabs active transaction off scope, if any */ function getActiveTransaction(maybeHub) { var hub = maybeHub || (0,_sentry_core__WEBPACK_IMPORTED_MODULE_0__/* .getCurrentHub */ .Gd)(); var scope = hub.getScope(); return scope && (scope.getTransaction() ); } /** * Converts from milliseconds to seconds * @param time time in ms */ function msToSec(time) { return time / 1000; } /** * Converts from seconds to milliseconds * @param time time in seconds */ function secToMs(time) { return time * 1000; } //# sourceMappingURL=utils.js.map /***/ }), /***/ 8464: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "Rt": function() { return /* binding */ htmlTreeAsString; }, /* harmony export */ "l4": function() { return /* binding */ getLocationHref; }, /* harmony export */ "qT": function() { return /* binding */ getDomElement; } /* harmony export */ }); /* harmony import */ var _global_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2991); /* harmony import */ var _is_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7597); /** * 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 htmlTreeAsString(elem, keyAttrs) { // 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 { let currentElem = elem ; var MAX_TRAVERSE_HEIGHT = 5; var MAX_OUTPUT_LEN = 80; var out = []; let height = 0; let len = 0; var separator = ' > '; var sepLength = separator.length; let nextStr; // eslint-disable-next-line no-plusplus while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) { nextStr = _htmlElementAsString(currentElem, keyAttrs); // 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 ''; } } /** * Returns a simple, query-selector representation of a DOM element * e.g. [HTMLElement] => input#foo.btn[name=baz] * @returns generated DOM path */ function _htmlElementAsString(el, keyAttrs) { var elem = el ; var out = []; let className; let classes; let key; let attr; let i; if (!elem || !elem.tagName) { return ''; } out.push(elem.tagName.toLowerCase()); // Pairs of attribute keys defined in `serializeAttribute` and their values on element. var keyAttrPairs = keyAttrs && keyAttrs.length ? keyAttrs.filter(keyAttr => elem.getAttribute(keyAttr)).map(keyAttr => [keyAttr, elem.getAttribute(keyAttr)]) : null; if (keyAttrPairs && keyAttrPairs.length) { keyAttrPairs.forEach(keyAttrPair => { out.push(`[${keyAttrPair[0]}="${keyAttrPair[1]}"]`); }); } else { if (elem.id) { out.push(`#${elem.id}`); } // eslint-disable-next-line prefer-const className = elem.className; if (className && (0,_is_js__WEBPACK_IMPORTED_MODULE_0__/* .isString */ .HD)(className)) { classes = className.split(/\s+/); for (i = 0; i < classes.length; i++) { out.push(`.${classes[i]}`); } } } var allowedAttrs = ['type', 'name', 'title', 'alt']; for (i = 0; i < allowedAttrs.length; i++) { key = allowedAttrs[i]; attr = elem.getAttribute(key); if (attr) { out.push(`[${key}="${attr}"]`); } } return out.join(''); } /** * A safe form of location.href */ function getLocationHref() { var global = (0,_global_js__WEBPACK_IMPORTED_MODULE_1__/* .getGlobalObject */ .R)(); try { return global.document.location.href; } catch (oO) { return ''; } } /** * Gets a DOM element by using document.querySelector. * * This wrapper will first check for the existance of the function before * actually calling it so that we don't have to take care of this check, * every time we want to access the DOM. * * Reason: DOM/querySelector is not available in all environments. * * We have to cast to any because utils can be consumed by a variety of environments, * and we don't want to break TS users. If you know what element will be selected by * `document.querySelector`, specify it as part of the generic call. For example, * `var element = getDomElement('selector');` * * @param selector the selector string passed on to document.querySelector */ // eslint-disable-next-line @typescript-eslint/no-explicit-any function getDomElement(selector) { var global = (0,_global_js__WEBPACK_IMPORTED_MODULE_1__/* .getGlobalObject */ .R)(); if (global.document && global.document.querySelector) { return global.document.querySelector(selector) ; } return null; } //# sourceMappingURL=browser.js.map /***/ }), /***/ 5375: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "h": function() { return /* binding */ _nullishCoalesce; } /* harmony export */ }); /** * Polyfill for the nullish coalescing operator (`??`). * * Note that the RHS is wrapped in a function so that if it's a computed value, that evaluation won't happen unless the * LHS evaluates to a nullish value, to mimic the operator's short-circuiting behavior. * * Adapted from Sucrase (https://github.com/alangpierce/sucrase) * * @param lhs The value of the expression to the left of the `??` * @param rhsFn A function returning the value of the expression to the right of the `??` * @returns The LHS value, unless it's `null` or `undefined`, in which case, the RHS value */ function _nullishCoalesce(lhs, rhsFn) { // by checking for loose equality to `null`, we catch both `null` and `undefined` return lhs != null ? lhs : rhsFn(); } // Sucrase version: // function _nullishCoalesce(lhs, rhsFn) { // if (lhs != null) { // return lhs; // } else { // return rhsFn(); // } // } //# sourceMappingURL=_nullishCoalesce.js.map /***/ }), /***/ 2991: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "R": function() { return /* binding */ getGlobalObject; }, /* harmony export */ "Y": function() { return /* binding */ getGlobalSingleton; } /* harmony export */ }); /** Internal */ // The code below for 'isGlobalObj' and 'GLOBAL' was copied from core-js before modification // https://github.com/zloirock/core-js/blob/1b944df55282cdc99c90db5f49eb0b6eda2cc0a3/packages/core-js/internals/global.js // core-js has the following licence: // // Copyright (c) 2014-2022 Denis Pushkarev // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. /** Returns 'obj' if it's the global object, otherwise returns undefined */ function isGlobalObj(obj) { return obj && obj.Math == Math ? obj : undefined; } var GLOBAL = (typeof globalThis == 'object' && isGlobalObj(globalThis)) || // eslint-disable-next-line no-restricted-globals (typeof window == 'object' && isGlobalObj(window)) || (typeof self == 'object' && isGlobalObj(self)) || (typeof __webpack_require__.g == 'object' && isGlobalObj(__webpack_require__.g)) || (function () { return this; })() || {}; /** * Safely get global scope object * * @returns Global scope object */ function getGlobalObject() { return GLOBAL ; } /** * Returns a global singleton contained in the global `__SENTRY__` object. * * If the singleton doesn't already exist in `__SENTRY__`, it will be created using the given factory * function and added to the `__SENTRY__` object. * * @param name name of the global singleton on __SENTRY__ * @param creator creator Factory function to create the singleton if it doesn't already exist on `__SENTRY__` * @param obj (Optional) The global object on which to look for `__SENTRY__`, if not `getGlobalObject`'s return value * @returns the singleton */ function getGlobalSingleton(name, creator, obj) { var global = (obj || GLOBAL) ; var __SENTRY__ = (global.__SENTRY__ = global.__SENTRY__ || {}); var singleton = __SENTRY__[name] || (__SENTRY__[name] = creator()); return singleton; } //# sourceMappingURL=global.js.map /***/ }), /***/ 9732: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "o": function() { return /* binding */ addInstrumentationHandler; } /* harmony export */ }); /* harmony import */ var _global_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2991); /* harmony import */ var _is_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(7597); /* harmony import */ var _logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2343); /* harmony import */ var _object_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(535); /* harmony import */ var _stacktrace_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(360); /* harmony import */ var _supports_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(8823); var global = (0,_global_js__WEBPACK_IMPORTED_MODULE_0__/* .getGlobalObject */ .R)(); /** * Instrument native APIs to call handlers that can be used to create breadcrumbs, APM spans etc. * - Console API * - Fetch API * - XHR API * - History API * - DOM API (click/typing) * - Error API * - UnhandledRejection API */ var handlers = {}; var instrumented = {}; /** Instruments given API */ function instrument(type) { if (instrumented[type]) { return; } instrumented[type] = true; switch (type) { case 'console': instrumentConsole(); break; case 'dom': instrumentDOM(); break; case 'xhr': instrumentXHR(); break; case 'fetch': instrumentFetch(); break; case 'history': instrumentHistory(); break; case 'error': instrumentError(); break; case 'unhandledrejection': instrumentUnhandledRejection(); break; default: (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && _logger_js__WEBPACK_IMPORTED_MODULE_1__/* .logger.warn */ .kg.warn('unknown instrumentation type:', type); return; } } /** * Add handler that will be called when given type of instrumentation triggers. * Use at your own risk, this might break without changelog notice, only used internally. * @hidden */ function addInstrumentationHandler(type, callback) { handlers[type] = handlers[type] || []; (handlers[type] ).push(callback); instrument(type); } /** JSDoc */ function triggerHandlers(type, data) { if (!type || !handlers[type]) { return; } for (var handler of handlers[type] || []) { try { handler(data); } catch (e) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && _logger_js__WEBPACK_IMPORTED_MODULE_1__/* .logger.error */ .kg.error( `Error while triggering instrumentation handler.\nType: ${type}\nName: ${(0,_stacktrace_js__WEBPACK_IMPORTED_MODULE_2__/* .getFunctionName */ .$P)(handler)}\nError:`, e, ); } } } /** JSDoc */ function instrumentConsole() { if (!('console' in global)) { return; } _logger_js__WEBPACK_IMPORTED_MODULE_1__/* .CONSOLE_LEVELS.forEach */ .RU.forEach(function (level) { if (!(level in global.console)) { return; } (0,_object_js__WEBPACK_IMPORTED_MODULE_3__/* .fill */ .hl)(global.console, level, function (originalConsoleMethod) { return function (...args) { triggerHandlers('console', { args, level }); // this fails for some browsers. :( if (originalConsoleMethod) { originalConsoleMethod.apply(global.console, args); } }; }); }); } /** JSDoc */ function instrumentFetch() { if (!(0,_supports_js__WEBPACK_IMPORTED_MODULE_4__/* .supportsNativeFetch */ .t$)()) { return; } (0,_object_js__WEBPACK_IMPORTED_MODULE_3__/* .fill */ .hl)(global, 'fetch', function (originalFetch) { return function (...args) { var handlerData = { args, fetchData: { method: getFetchMethod(args), url: getFetchUrl(args), }, startTimestamp: Date.now(), }; triggerHandlers('fetch', { ...handlerData, }); // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access return originalFetch.apply(global, args).then( (response) => { triggerHandlers('fetch', { ...handlerData, endTimestamp: Date.now(), response, }); return response; }, (error) => { triggerHandlers('fetch', { ...handlerData, endTimestamp: Date.now(), error, }); // 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. throw error; }, ); }; }); } /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /** Extract `method` from fetch call arguments */ function getFetchMethod(fetchArgs = []) { if ('Request' in global && (0,_is_js__WEBPACK_IMPORTED_MODULE_5__/* .isInstanceOf */ .V9)(fetchArgs[0], Request) && fetchArgs[0].method) { return String(fetchArgs[0].method).toUpperCase(); } if (fetchArgs[1] && fetchArgs[1].method) { return String(fetchArgs[1].method).toUpperCase(); } return 'GET'; } /** Extract `url` from fetch call arguments */ function getFetchUrl(fetchArgs = []) { if (typeof fetchArgs[0] === 'string') { return fetchArgs[0]; } if ('Request' in global && (0,_is_js__WEBPACK_IMPORTED_MODULE_5__/* .isInstanceOf */ .V9)(fetchArgs[0], Request)) { return fetchArgs[0].url; } return String(fetchArgs[0]); } /* eslint-enable @typescript-eslint/no-unsafe-member-access */ /** JSDoc */ function instrumentXHR() { if (!('XMLHttpRequest' in global)) { return; } var xhrproto = XMLHttpRequest.prototype; (0,_object_js__WEBPACK_IMPORTED_MODULE_3__/* .fill */ .hl)(xhrproto, 'open', function (originalOpen) { return function ( ...args) { // eslint-disable-next-line @typescript-eslint/no-this-alias var xhr = this; var url = args[1]; var xhrInfo = (xhr.__sentry_xhr__ = { // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access method: (0,_is_js__WEBPACK_IMPORTED_MODULE_5__/* .isString */ .HD)(args[0]) ? args[0].toUpperCase() : args[0], url: args[1], }); // if Sentry key appears in URL, don't capture it as a request // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access if ((0,_is_js__WEBPACK_IMPORTED_MODULE_5__/* .isString */ .HD)(url) && xhrInfo.method === 'POST' && url.match(/sentry_key/)) { xhr.__sentry_own_request__ = true; } var onreadystatechangeHandler = function () { if (xhr.readyState === 4) { try { // touching statusCode in some platforms throws // an exception xhrInfo.status_code = xhr.status; } catch (e) { /* do nothing */ } triggerHandlers('xhr', { args, endTimestamp: Date.now(), startTimestamp: Date.now(), xhr, }); } }; if ('onreadystatechange' in xhr && typeof xhr.onreadystatechange === 'function') { (0,_object_js__WEBPACK_IMPORTED_MODULE_3__/* .fill */ .hl)(xhr, 'onreadystatechange', function (original) { return function (...readyStateArgs) { onreadystatechangeHandler(); return original.apply(xhr, readyStateArgs); }; }); } else { xhr.addEventListener('readystatechange', onreadystatechangeHandler); } return originalOpen.apply(xhr, args); }; }); (0,_object_js__WEBPACK_IMPORTED_MODULE_3__/* .fill */ .hl)(xhrproto, 'send', function (originalSend) { return function ( ...args) { if (this.__sentry_xhr__ && args[0] !== undefined) { this.__sentry_xhr__.body = args[0]; } triggerHandlers('xhr', { args, startTimestamp: Date.now(), xhr: this, }); return originalSend.apply(this, args); }; }); } let lastHref; /** JSDoc */ function instrumentHistory() { if (!(0,_supports_js__WEBPACK_IMPORTED_MODULE_4__/* .supportsHistory */ .Bf)()) { return; } var oldOnPopState = global.onpopstate; global.onpopstate = function ( ...args) { var to = global.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, to, }); if (oldOnPopState) { // Apparently this can throw in Firefox when incorrectly implemented plugin is installed. // https://github.com/getsentry/sentry-javascript/issues/3344 // https://github.com/bugsnag/bugsnag-js/issues/469 try { return oldOnPopState.apply(this, args); } catch (_oO) { // no-empty } } }; /** @hidden */ function historyReplacementFunction(originalHistoryFunction) { return function ( ...args) { var url = args.length > 2 ? args[2] : undefined; if (url) { // coerce to string (this is what pushState does) var from = lastHref; var to = String(url); // keep track of the current URL state, as we always receive only the updated state lastHref = to; triggerHandlers('history', { from, to, }); } return originalHistoryFunction.apply(this, args); }; } (0,_object_js__WEBPACK_IMPORTED_MODULE_3__/* .fill */ .hl)(global.history, 'pushState', historyReplacementFunction); (0,_object_js__WEBPACK_IMPORTED_MODULE_3__/* .fill */ .hl)(global.history, 'replaceState', historyReplacementFunction); } var debounceDuration = 1000; let debounceTimerID; let lastCapturedEvent; /** * Decide whether the current event should finish the debounce of previously captured one. * @param previous previously captured event * @param current event to be captured */ function shouldShortcircuitPreviousDebounce(previous, current) { // If there was no previous event, it should always be swapped for the new one. if (!previous) { return true; } // If both events have different type, then user definitely performed two separate actions. e.g. click + keypress. if (previous.type !== current.type) { return true; } try { // If both events have the same type, it's still possible that actions were performed on different targets. // e.g. 2 clicks on different buttons. if (previous.target !== current.target) { return true; } } catch (e) { // just accessing `target` property can throw an exception in some rare circumstances // see: https://github.com/getsentry/sentry-javascript/issues/838 } // If both events have the same type _and_ same `target` (an element which triggered an event, _not necessarily_ // to which an event listener was attached), we treat them as the same action, as we want to capture // only one breadcrumb. e.g. multiple clicks on the same button, or typing inside a user input box. return false; } /** * Decide whether an event should be captured. * @param event event to be captured */ function shouldSkipDOMEvent(event) { // We are only interested in filtering `keypress` events for now. if (event.type !== 'keypress') { return false; } try { var target = event.target ; if (!target || !target.tagName) { return true; } // Only consider keypress events on actual input elements. This will disregard keypresses targeting body // e.g.tabbing through elements, hotkeys, etc. if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) { return false; } } catch (e) { // just accessing `target` property can throw an exception in some rare circumstances // see: https://github.com/getsentry/sentry-javascript/issues/838 } return true; } /** * Wraps addEventListener to capture UI breadcrumbs * @param handler function that will be triggered * @param globalListener indicates whether event was captured by the global event listener * @returns wrapped breadcrumb events handler * @hidden */ function makeDOMEventHandler(handler, globalListener = false) { return (event) => { // 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 that event. if (!event || lastCapturedEvent === event) { return; } // We always want to skip _some_ events. if (shouldSkipDOMEvent(event)) { return; } var name = event.type === 'keypress' ? 'input' : event.type; // If there is no debounce timer, it means that we can safely capture the new event and store it for future comparisons. if (debounceTimerID === undefined) { handler({ event: event, name, global: globalListener, }); lastCapturedEvent = event; } // If there is a debounce awaiting, see if the new event is different enough to treat it as a unique one. // If that's the case, emit the previous event and store locally the newly-captured DOM event. else if (shouldShortcircuitPreviousDebounce(lastCapturedEvent, event)) { handler({ event: event, name, global: globalListener, }); lastCapturedEvent = event; } // Start a new debounce timer that will prevent us from capturing multiple events that should be grouped together. clearTimeout(debounceTimerID); debounceTimerID = global.setTimeout(() => { debounceTimerID = undefined; }, debounceDuration); }; } /** JSDoc */ function instrumentDOM() { if (!('document' in global)) { return; } // Make it so that any click or keypress that is unhandled / bubbled up all the way to the document triggers our dom // handlers. (Normally we have only one, which captures a breadcrumb for each click or keypress.) Do this before // we instrument `addEventListener` so that we don't end up attaching this handler twice. var triggerDOMHandler = triggerHandlers.bind(null, 'dom'); var globalDOMEventHandler = makeDOMEventHandler(triggerDOMHandler, true); global.document.addEventListener('click', globalDOMEventHandler, false); global.document.addEventListener('keypress', globalDOMEventHandler, false); // After hooking into click and keypress events bubbled up to `document`, we also hook into user-handled // clicks & keypresses, by adding an event listener of our own to any element to which they add a listener. That // way, whenever one of their handlers is triggered, ours will be, too. (This is needed because their handler // could potentially prevent the event from bubbling up to our global listeners. This way, our handler are still // guaranteed to fire at least once.) ['EventTarget', 'Node'].forEach((target) => { // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access var proto = (global )[target] && (global )[target].prototype; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, no-prototype-builtins if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) { return; } (0,_object_js__WEBPACK_IMPORTED_MODULE_3__/* .fill */ .hl)(proto, 'addEventListener', function (originalAddEventListener) { return function ( type, listener, options, ) { if (type === 'click' || type == 'keypress') { try { var el = this ; var handlers = (el.__sentry_instrumentation_handlers__ = el.__sentry_instrumentation_handlers__ || {}); var handlerForType = (handlers[type] = handlers[type] || { refCount: 0 }); if (!handlerForType.handler) { var handler = makeDOMEventHandler(triggerDOMHandler); handlerForType.handler = handler; originalAddEventListener.call(this, type, handler, options); } handlerForType.refCount += 1; } catch (e) { // Accessing dom properties is always fragile. // Also allows us to skip `addEventListenrs` calls with no proper `this` context. } } return originalAddEventListener.call(this, type, listener, options); }; }); (0,_object_js__WEBPACK_IMPORTED_MODULE_3__/* .fill */ .hl)( proto, 'removeEventListener', function (originalRemoveEventListener) { return function ( type, listener, options, ) { if (type === 'click' || type == 'keypress') { try { var el = this ; var handlers = el.__sentry_instrumentation_handlers__ || {}; var handlerForType = handlers[type]; if (handlerForType) { handlerForType.refCount -= 1; // If there are no longer any custom handlers of the current type on this element, we can remove ours, too. if (handlerForType.refCount <= 0) { originalRemoveEventListener.call(this, type, handlerForType.handler, options); handlerForType.handler = undefined; delete handlers[type]; // eslint-disable-line @typescript-eslint/no-dynamic-delete } // If there are no longer any custom handlers of any type on this element, cleanup everything. if (Object.keys(handlers).length === 0) { delete el.__sentry_instrumentation_handlers__; } } } catch (e) { // Accessing dom properties is always fragile. // Also allows us to skip `addEventListenrs` calls with no proper `this` context. } } return originalRemoveEventListener.call(this, type, listener, options); }; }, ); }); } let _oldOnErrorHandler = null; /** JSDoc */ function instrumentError() { _oldOnErrorHandler = global.onerror; global.onerror = function (msg, url, line, column, error) { triggerHandlers('error', { column, error, line, msg, url, }); if (_oldOnErrorHandler) { // eslint-disable-next-line prefer-rest-params return _oldOnErrorHandler.apply(this, arguments); } return false; }; } let _oldOnUnhandledRejectionHandler = null; /** JSDoc */ function instrumentUnhandledRejection() { _oldOnUnhandledRejectionHandler = global.onunhandledrejection; global.onunhandledrejection = function (e) { triggerHandlers('unhandledrejection', e); if (_oldOnUnhandledRejectionHandler) { // eslint-disable-next-line prefer-rest-params return _oldOnUnhandledRejectionHandler.apply(this, arguments); } return true; }; } //# sourceMappingURL=instrument.js.map /***/ }), /***/ 7597: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "Cy": function() { return /* binding */ isSyntheticEvent; }, /* harmony export */ "HD": function() { return /* binding */ isString; }, /* harmony export */ "J8": function() { return /* binding */ isThenable; }, /* harmony export */ "Kj": function() { return /* binding */ isRegExp; }, /* harmony export */ "PO": function() { return /* binding */ isPlainObject; }, /* harmony export */ "TX": function() { return /* binding */ isDOMError; }, /* harmony export */ "V9": function() { return /* binding */ isInstanceOf; }, /* harmony export */ "VW": function() { return /* binding */ isErrorEvent; }, /* harmony export */ "VZ": function() { return /* binding */ isError; }, /* harmony export */ "cO": function() { return /* binding */ isEvent; }, /* harmony export */ "fm": function() { return /* binding */ isDOMException; }, /* harmony export */ "i2": function() { return /* binding */ isNaN; }, /* harmony export */ "kK": function() { return /* binding */ isElement; }, /* harmony export */ "pt": function() { return /* binding */ isPrimitive; } /* harmony export */ }); // eslint-disable-next-line @typescript-eslint/unbound-method var objectToString = Object.prototype.toString; /** * 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 (objectToString.call(wat)) { case '[object Error]': case '[object Exception]': case '[object DOMException]': return true; default: return isInstanceOf(wat, Error); } } /** * Checks whether given value is an instance of the given built-in class. * * @param wat The value to be checked * @param className * @returns A boolean representing the result. */ function isBuiltin(wat, className) { return objectToString.call(wat) === `[object ${className}]`; } /** * Checks whether given value's type is ErrorEvent * {@link isErrorEvent}. * * @param wat A value to be checked. * @returns A boolean representing the result. */ function isErrorEvent(wat) { return isBuiltin(wat, 'ErrorEvent'); } /** * Checks whether given value's type is DOMError * {@link isDOMError}. * * @param wat A value to be checked. * @returns A boolean representing the result. */ function isDOMError(wat) { return isBuiltin(wat, 'DOMError'); } /** * Checks whether given value's type is DOMException * {@link isDOMException}. * * @param wat A value to be checked. * @returns A boolean representing the result. */ function isDOMException(wat) { return isBuiltin(wat, 'DOMException'); } /** * Checks whether given value's type is a string * {@link isString}. * * @param wat A value to be checked. * @returns A boolean representing the result. */ function isString(wat) { return isBuiltin(wat, 'String'); } /** * Checks whether given value is a primitive (undefined, null, number, boolean, string, bigint, symbol) * {@link isPrimitive}. * * @param wat A value to be checked. * @returns A boolean representing the result. */ function isPrimitive(wat) { return wat === null || (typeof wat !== 'object' && typeof wat !== 'function'); } /** * Checks whether given value's type is an object literal * {@link isPlainObject}. * * @param wat A value to be checked. * @returns A boolean representing the result. */ function isPlainObject(wat) { return isBuiltin(wat, 'Object'); } /** * Checks whether given value's type is an Event instance * {@link isEvent}. * * @param wat A value to be checked. * @returns A boolean representing the result. */ function isEvent(wat) { return typeof Event !== 'undefined' && isInstanceOf(wat, Event); } /** * Checks whether given value's type is an Element instance * {@link isElement}. * * @param wat A value to be checked. * @returns A boolean representing the result. */ function isElement(wat) { return typeof Element !== 'undefined' && isInstanceOf(wat, Element); } /** * Checks whether given value's type is an regexp * {@link isRegExp}. * * @param wat A value to be checked. * @returns A boolean representing the result. */ function isRegExp(wat) { return isBuiltin(wat, 'RegExp'); } /** * Checks whether given value has a then function. * @param wat A value to be checked. */ function isThenable(wat) { // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access return Boolean(wat && wat.then && typeof wat.then === 'function'); } /** * 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) { return isPlainObject(wat) && 'nativeEvent' in wat && 'preventDefault' in wat && 'stopPropagation' in wat; } /** * Checks whether given value is NaN * {@link isNaN}. * * @param wat A value to be checked. * @returns A boolean representing the result. */ function isNaN(wat) { return typeof wat === 'number' && wat !== 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 { return wat instanceof base; } catch (_e) { return false; } } //# sourceMappingURL=is.js.map /***/ }), /***/ 2343: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "Cf": function() { return /* binding */ consoleSandbox; }, /* harmony export */ "RU": function() { return /* binding */ CONSOLE_LEVELS; }, /* harmony export */ "kg": function() { return /* binding */ logger; } /* harmony export */ }); /* harmony import */ var _global_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2991); // TODO: Implement different loggers for different environments var global = (0,_global_js__WEBPACK_IMPORTED_MODULE_0__/* .getGlobalObject */ .R)(); /** Prefix for logging strings */ var PREFIX = 'Sentry Logger '; var CONSOLE_LEVELS = ['debug', 'info', 'warn', 'error', 'log', 'assert', 'trace'] ; /** * Temporarily disable sentry console instrumentations. * * @param callback The function to run against the original `console` messages * @returns The results of the callback */ function consoleSandbox(callback) { var global = (0,_global_js__WEBPACK_IMPORTED_MODULE_0__/* .getGlobalObject */ .R)(); if (!('console' in global)) { return callback(); } var originalConsole = global.console ; var wrappedLevels = {}; // Restore all wrapped console methods CONSOLE_LEVELS.forEach(level => { // TODO(v7): Remove this check as it's only needed for Node 6 var originalWrappedFunc = originalConsole[level] && (originalConsole[level] ).__sentry_original__; if (level in global.console && originalWrappedFunc) { wrappedLevels[level] = originalConsole[level] ; originalConsole[level] = originalWrappedFunc ; } }); try { return callback(); } finally { // Revert restoration to wrapped state Object.keys(wrappedLevels).forEach(level => { originalConsole[level] = wrappedLevels[level ]; }); } } function makeLogger() { let enabled = false; var logger = { enable: () => { enabled = true; }, disable: () => { enabled = false; }, }; if ((typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__)) { CONSOLE_LEVELS.forEach(name => { // eslint-disable-next-line @typescript-eslint/no-explicit-any logger[name] = (...args) => { if (enabled) { consoleSandbox(() => { global.console[name](`${PREFIX}[${name}]:`, ...args); }); } }; }); } else { CONSOLE_LEVELS.forEach(name => { logger[name] = () => undefined; }); } return logger ; } // Ensure we only have a single logger instance, even if multiple versions of @sentry/utils are being used let logger; if ((typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__)) { logger = (0,_global_js__WEBPACK_IMPORTED_MODULE_0__/* .getGlobalSingleton */ .Y)('logger', makeLogger); } else { logger = makeLogger(); } //# sourceMappingURL=logger.js.map /***/ }), /***/ 2844: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "DM": function() { return /* binding */ uuid4; }, /* harmony export */ "Db": function() { return /* binding */ addExceptionTypeValue; }, /* harmony export */ "EG": function() { return /* binding */ addExceptionMechanism; }, /* harmony export */ "YO": function() { return /* binding */ checkOrSetAlreadyCaught; }, /* harmony export */ "jH": function() { return /* binding */ getEventDescription; }, /* harmony export */ "lE": function() { return /* binding */ arrayify; } /* harmony export */ }); /* unused harmony exports addContextToFrame, parseSemver */ /* harmony import */ var _global_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2991); /* harmony import */ var _object_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(535); /** * Extended Window interface that allows for Crypto API usage in IE browsers */ /** * UUID4 generator * * @returns string Generated UUID4. */ function uuid4() { var global = (0,_global_js__WEBPACK_IMPORTED_MODULE_0__/* .getGlobalObject */ .R)() ; var crypto = (global.crypto || global.msCrypto) ; if (crypto && crypto.randomUUID) { return crypto.randomUUID().replace(/-/g, ''); } var getRandomByte = crypto && crypto.getRandomValues ? () => crypto.getRandomValues(new Uint8Array(1))[0] : () => Math.random() * 16; // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523 // Concatenating the following numbers as strings results in '10000000100040008000100000000000' return (([1e7] ) + 1e3 + 4e3 + 8e3 + 1e11).replace(/[018]/g, c => // eslint-disable-next-line no-bitwise ((c ) ^ ((getRandomByte() & 15) >> ((c ) / 4))).toString(16), ); } function getFirstException(event) { return event.exception && event.exception.values ? event.exception.values[0] : undefined; } /** * Extracts either message or type+value from an event that can be used for user-facing logs * @returns event's description */ function getEventDescription(event) { const { message, event_id: eventId } = event; if (message) { return message; } var firstException = getFirstException(event); if (firstException) { if (firstException.type && firstException.value) { return `${firstException.type}: ${firstException.value}`; } return firstException.type || firstException.value || eventId || ''; } return eventId || ''; } /** * Adds exception values, type and value to an synthetic Exception. * @param event The event to modify. * @param value Value of the exception. * @param type Type of the exception. * @hidden */ function addExceptionTypeValue(event, value, type) { var exception = (event.exception = event.exception || {}); var values = (exception.values = exception.values || []); var firstException = (values[0] = values[0] || {}); if (!firstException.value) { firstException.value = value || ''; } if (!firstException.type) { firstException.type = type || 'Error'; } } /** * Adds exception mechanism data to a given event. Uses defaults if the second parameter is not passed. * * @param event The event to modify. * @param newMechanism Mechanism data to add to the event. * @hidden */ function addExceptionMechanism(event, newMechanism) { var firstException = getFirstException(event); if (!firstException) { return; } var defaultMechanism = { type: 'generic', handled: true }; var currentMechanism = firstException.mechanism; firstException.mechanism = { ...defaultMechanism, ...currentMechanism, ...newMechanism }; if (newMechanism && 'data' in newMechanism) { var mergedData = { ...(currentMechanism && currentMechanism.data), ...newMechanism.data }; firstException.mechanism.data = mergedData; } } // https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string var SEMVER_REGEXP = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/; /** * Represents Semantic Versioning object */ /** * Parses input into a SemVer interface * @param input string representation of a semver version */ function parseSemver(input) { var match = input.match(SEMVER_REGEXP) || []; var major = parseInt(match[1], 10); var minor = parseInt(match[2], 10); var patch = parseInt(match[3], 10); return { buildmetadata: match[5], major: isNaN(major) ? undefined : major, minor: isNaN(minor) ? undefined : minor, patch: isNaN(patch) ? undefined : patch, prerelease: match[4], }; } /** * This function adds context (pre/post/line) lines to the provided frame * * @param lines string[] containing all lines * @param frame StackFrame that will be mutated * @param linesOfContext number of context lines we want to add pre/post */ function addContextToFrame(lines, frame, linesOfContext = 5) { var lineno = frame.lineno || 0; var maxLines = lines.length; var sourceLine = Math.max(Math.min(maxLines, lineno - 1), 0); frame.pre_context = lines .slice(Math.max(0, sourceLine - linesOfContext), sourceLine) .map((line) => snipLine(line, 0)); frame.context_line = snipLine(lines[Math.min(maxLines - 1, sourceLine)], frame.colno || 0); frame.post_context = lines .slice(Math.min(sourceLine + 1, maxLines), sourceLine + 1 + linesOfContext) .map((line) => snipLine(line, 0)); } /** * Checks whether or not we've already captured the given exception (note: not an identical exception - the very object * in question), and marks it captured if not. * * This is useful because it's possible for an error to get captured by more than one mechanism. After we intercept and * record an error, we rethrow it (assuming we've intercepted it before it's reached the top-level global handlers), so * that we don't interfere with whatever effects the error might have had were the SDK not there. At that point, because * the error has been rethrown, it's possible for it to bubble up to some other code we've instrumented. If it's not * caught after that, it will bubble all the way up to the global handlers (which of course we also instrument). This * function helps us ensure that even if we encounter the same error more than once, we only record it the first time we * see it. * * Note: It will ignore primitives (always return `false` and not mark them as seen), as properties can't be set on * them. {@link: Object.objectify} can be used on exceptions to convert any that are primitives into their equivalent * object wrapper forms so that this check will always work. However, because we need to flag the exact object which * will get rethrown, and because that rethrowing happens outside of the event processing pipeline, the objectification * must be done before the exception captured. * * @param A thrown exception to check or flag as having been seen * @returns `true` if the exception has already been captured, `false` if not (with the side effect of marking it seen) */ function checkOrSetAlreadyCaught(exception) { // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access if (exception && (exception ).__sentry_captured__) { return true; } try { // set it this way rather than by assignment so that it's not ennumerable and therefore isn't recorded by the // `ExtraErrorData` integration (0,_object_js__WEBPACK_IMPORTED_MODULE_1__/* .addNonEnumerableProperty */ .xp)(exception , '__sentry_captured__', true); } catch (err) { // `exception` is a primitive, so we can't mark it seen } return false; } /** * Checks whether the given input is already an array, and if it isn't, wraps it in one. * * @param maybeArray Input to turn into an array, if necessary * @returns The input, if already an array, or an array with the input as the only element, if not */ function arrayify(maybeArray) { return Array.isArray(maybeArray) ? maybeArray : [maybeArray]; } //# sourceMappingURL=misc.js.map /***/ }), /***/ 2448: /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; // EXPORTS __webpack_require__.d(__webpack_exports__, { "l$": function() { return /* binding */ dynamicRequire; }, "KV": function() { return /* binding */ isNodeEnv; }, "$y": function() { return /* binding */ loadModule; } }); ;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/env.js /* * This module exists for optimizations in the build process through rollup and terser. We define some global * constants, which can be overridden during build. By guarding certain pieces of code with functions that return these * constants, we can control whether or not they appear in the final bundle. (Any code guarded by a false condition will * never run, and will hence be dropped during treeshaking.) The two primary uses for this are stripping out calls to * `logger` and preventing node-related code from appearing in browser bundles. * * Attention: * This file should not be used to define constants/flags that are intended to be used for tree-shaking conducted by * users. These fags should live in their respective packages, as we identified user tooling (specifically webpack) * having issues tree-shaking these constants across package boundaries. * An example for this is the __SENTRY_DEBUG__ constant. It is declared in each package individually because we want * users to be able to shake away expressions that it guards. */ /** * Figures out if we're building a browser bundle. * * @returns true if this is a browser bundle build. */ function isBrowserBundle() { return typeof __SENTRY_BROWSER_BUNDLE__ !== 'undefined' && !!__SENTRY_BROWSER_BUNDLE__; } //# sourceMappingURL=env.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/node.js /* module decorator */ module = __webpack_require__.hmd(module); /* provided dependency */ var process = __webpack_require__(3454); /** * NOTE: In order to avoid circular dependencies, if you add a function to this module and it needs to print something, * you must either a) use `console.log` rather than the logger, or b) put your function elsewhere. */ /** * Checks whether we're in the Node.js or Browser environment * * @returns Answer to given question */ function isNodeEnv() { // explicitly check for browser bundles as those can be optimized statically // by terser/rollup. return ( !isBrowserBundle() && Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]' ); } /** * Requires a module which is protected against bundler minification. * * @param request The module path to resolve */ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any function dynamicRequire(mod, request) { // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access return mod.require(request); } /** * Helper for dynamically loading module that should work with linked dependencies. * The problem is that we _should_ be using `require(require.resolve(moduleName, { paths: [cwd()] }))` * However it's _not possible_ to do that with Webpack, as it has to know all the dependencies during * build time. `require.resolve` is also not available in any other way, so we cannot create, * a fake helper like we do with `dynamicRequire`. * * We always prefer to use local package, thus the value is not returned early from each `try/catch` block. * That is to mimic the behavior of `require.resolve` exactly. * * @param moduleName module name to require * @returns possibly required module */ function loadModule(moduleName) { let mod; try { mod = dynamicRequire(module, moduleName); } catch (e) { // no-empty } try { const { cwd } = dynamicRequire(module, 'process'); mod = dynamicRequire(module, `${cwd()}/node_modules/${moduleName}`) ; } catch (e) { // no-empty } return mod; } //# sourceMappingURL=node.js.map /***/ }), /***/ 535: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "$Q": function() { return /* binding */ markFunctionWrapped; }, /* harmony export */ "HK": function() { return /* binding */ getOriginalFunction; }, /* harmony export */ "Jr": function() { return /* binding */ dropUndefinedKeys; }, /* harmony export */ "Sh": function() { return /* binding */ convertToPlainObject; }, /* harmony export */ "_j": function() { return /* binding */ urlEncode; }, /* harmony export */ "hl": function() { return /* binding */ fill; }, /* harmony export */ "xp": function() { return /* binding */ addNonEnumerableProperty; }, /* harmony export */ "zf": function() { return /* binding */ extractExceptionKeysForMessage; } /* harmony export */ }); /* unused harmony export objectify */ /* harmony import */ var _browser_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8464); /* harmony import */ var _is_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7597); /* harmony import */ var _string_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7321); /** * Replace a method in an object with a wrapped version of itself. * * @param source An object that contains a method to be wrapped. * @param name The name of the method to be wrapped. * @param replacementFactory A higher-order function that takes the original version of the given method and returns a * wrapped version. Note: The function returned by `replacementFactory` needs to be a non-arrow function, in order to * preserve the correct value of `this`, and the original method must be called using `origMethod.call(this, )` or `origMethod.apply(this, [])` (rather than being called directly), again to preserve `this`. * @returns void */ function fill(source, name, replacementFactory) { if (!(name in source)) { return; } var original = source[name] ; var wrapped = replacementFactory(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" if (typeof wrapped === 'function') { try { markFunctionWrapped(wrapped, 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; } /** * Defines a non-enumerable property on the given object. * * @param obj The object on which to set the property * @param name The name of the property to be set * @param value The value to which to set the property */ function addNonEnumerableProperty(obj, name, value) { Object.defineProperty(obj, name, { // enumerable: false, // the default, so we can save on bundle size by not explicitly setting it value: value, writable: true, configurable: true, }); } /** * Remembers the original function on the wrapped function and * patches up the prototype. * * @param wrapped the wrapper function * @param original the original function that gets wrapped */ function markFunctionWrapped(wrapped, original) { var proto = original.prototype || {}; wrapped.prototype = original.prototype = proto; addNonEnumerableProperty(wrapped, '__sentry_original__', original); } /** * This extracts the original function if available. See * `markFunctionWrapped` for more information. * * @param func the function to unwrap * @returns the unwrapped version of the function if available. */ function getOriginalFunction(func) { return func.__sentry_original__; } /** * Encodes given object into url-friendly format * * @param object An object that contains serializable values * @returns string Encoded */ function urlEncode(object) { return Object.keys(object) .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(object[key])}`) .join('&'); } /** * Transforms any `Error` or `Event` into a plain object with all of their enumerable properties, and some of their * non-enumerable properties attached. * * @param value Initial source that we have to transform in order for it to be usable by the serializer * @returns An Event or Error turned into an object - or the value argurment itself, when value is neither an Event nor * an Error. */ function convertToPlainObject( value, ) { if ((0,_is_js__WEBPACK_IMPORTED_MODULE_0__/* .isError */ .VZ)(value)) { return { message: value.message, name: value.name, stack: value.stack, ...getOwnProperties(value), }; } else if ((0,_is_js__WEBPACK_IMPORTED_MODULE_0__/* .isEvent */ .cO)(value)) { var newObj = { type: value.type, target: serializeEventTarget(value.target), currentTarget: serializeEventTarget(value.currentTarget), ...getOwnProperties(value), }; if (typeof CustomEvent !== 'undefined' && (0,_is_js__WEBPACK_IMPORTED_MODULE_0__/* .isInstanceOf */ .V9)(value, CustomEvent)) { newObj.detail = value.detail; } return newObj; } else { return value; } } /** Creates a string representation of the target of an `Event` object */ function serializeEventTarget(target) { try { return (0,_is_js__WEBPACK_IMPORTED_MODULE_0__/* .isElement */ .kK)(target) ? (0,_browser_js__WEBPACK_IMPORTED_MODULE_1__/* .htmlTreeAsString */ .Rt)(target) : Object.prototype.toString.call(target); } catch (_oO) { return ''; } } /** Filters out all but an object's own properties */ function getOwnProperties(obj) { if (typeof obj === 'object' && obj !== null) { var extractedProps = {}; for (var property in obj) { if (Object.prototype.hasOwnProperty.call(obj, property)) { extractedProps[property] = (obj )[property]; } } return extractedProps; } else { return {}; } } /** * 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 = 40) { var keys = Object.keys(convertToPlainObject(exception)); keys.sort(); if (!keys.length) { return '[object has no keys]'; } if (keys[0].length >= maxLength) { return (0,_string_js__WEBPACK_IMPORTED_MODULE_2__/* .truncate */ .$G)(keys[0], maxLength); } for (let includedKeys = keys.length; includedKeys > 0; includedKeys--) { var serialized = keys.slice(0, includedKeys).join(', '); if (serialized.length > maxLength) { continue; } if (includedKeys === keys.length) { return serialized; } return (0,_string_js__WEBPACK_IMPORTED_MODULE_2__/* .truncate */ .$G)(serialized, maxLength); } return ''; } /** * Given any object, return a new object having removed all fields whose value was `undefined`. * Works recursively on objects and arrays. * * Attention: This function keeps circular references in the returned object. */ function dropUndefinedKeys(inputValue) { // This map keeps track of what already visited nodes map to. // Our Set - based memoBuilder doesn't work here because we want to the output object to have the same circular // references as the input object. var memoizationMap = new Map(); // This function just proxies `_dropUndefinedKeys` to keep the `memoBuilder` out of this function's API return _dropUndefinedKeys(inputValue, memoizationMap); } function _dropUndefinedKeys(inputValue, memoizationMap) { if ((0,_is_js__WEBPACK_IMPORTED_MODULE_0__/* .isPlainObject */ .PO)(inputValue)) { // If this node has already been visited due to a circular reference, return the object it was mapped to in the new object var memoVal = memoizationMap.get(inputValue); if (memoVal !== undefined) { return memoVal ; } var returnValue = {}; // Store the mapping of this value in case we visit it again, in case of circular data memoizationMap.set(inputValue, returnValue); for (var key of Object.keys(inputValue)) { if (typeof inputValue[key] !== 'undefined') { returnValue[key] = _dropUndefinedKeys(inputValue[key], memoizationMap); } } return returnValue ; } if (Array.isArray(inputValue)) { // If this node has already been visited due to a circular reference, return the array it was mapped to in the new object var memoVal = memoizationMap.get(inputValue); if (memoVal !== undefined) { return memoVal ; } var returnValue = []; // Store the mapping of this value in case we visit it again, in case of circular data memoizationMap.set(inputValue, returnValue); inputValue.forEach((item) => { returnValue.push(_dropUndefinedKeys(item, memoizationMap)); }); return returnValue ; } return inputValue; } /** * Ensure that something is an object. * * Turns `undefined` and `null` into `String`s and all other primitives into instances of their respective wrapper * classes (String, Boolean, Number, etc.). Acts as the identity function on non-primitives. * * @param wat The subject of the objectification * @returns A version of `wat` which can safely be used with `Object` class methods */ function objectify(wat) { let objectified; switch (true) { case wat === undefined || wat === null: objectified = new String(wat); break; // Though symbols and bigints do have wrapper classes (`Symbol` and `BigInt`, respectively), for whatever reason // those classes don't have constructors which can be used with the `new` keyword. We therefore need to cast each as // an object in order to wrap it. case typeof wat === 'symbol' || typeof wat === 'bigint': objectified = Object(wat); break; // this will catch the remaining primitives: `String`, `Number`, and `Boolean` case isPrimitive(wat): // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access objectified = new (wat ).constructor(wat); break; // by process of elimination, at this point we know that `wat` must already be an object default: objectified = wat; break; } return objectified; } //# sourceMappingURL=object.js.map /***/ }), /***/ 360: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "$P": function() { return /* binding */ getFunctionName; }, /* harmony export */ "Sq": function() { return /* binding */ stackParserFromStackParserOptions; }, /* harmony export */ "pE": function() { return /* binding */ createStackParser; } /* harmony export */ }); /* unused harmony exports nodeStackLineParser, stripSentryFramesAndReverse */ var STACKTRACE_LIMIT = 50; /** * Creates a stack parser with the supplied line parsers * * StackFrames are returned in the correct order for Sentry Exception * frames and with Sentry SDK internal frames removed from the top and bottom * */ function createStackParser(...parsers) { var sortedParsers = parsers.sort((a, b) => a[0] - b[0]).map(p => p[1]); return (stack, skipFirst = 0) => { var frames = []; for (var line of stack.split('\n').slice(skipFirst)) { // https://github.com/getsentry/sentry-javascript/issues/5459 // Remove webpack (error: *) wrappers var cleanedLine = line.replace(/\(error: (.*)\)/, '$1'); for (var parser of sortedParsers) { var frame = parser(cleanedLine); if (frame) { frames.push(frame); break; } } } return stripSentryFramesAndReverse(frames); }; } /** * Gets a stack parser implementation from Options.stackParser * @see Options * * If options contains an array of line parsers, it is converted into a parser */ function stackParserFromStackParserOptions(stackParser) { if (Array.isArray(stackParser)) { return createStackParser(...stackParser); } return stackParser; } /** * @hidden */ function stripSentryFramesAndReverse(stack) { if (!stack.length) { return []; } let localStack = stack; var firstFrameFunction = localStack[0].function || ''; var lastFrameFunction = localStack[localStack.length - 1].function || ''; // If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call) if (firstFrameFunction.indexOf('captureMessage') !== -1 || firstFrameFunction.indexOf('captureException') !== -1) { localStack = localStack.slice(1); } // If stack ends with one of our internal API calls, remove it (ends, meaning it's the bottom of the stack - aka top-most call) if (lastFrameFunction.indexOf('sentryWrapped') !== -1) { localStack = localStack.slice(0, -1); } // The frame where the crash happened, should be the last entry in the array return localStack .slice(0, STACKTRACE_LIMIT) .map(frame => ({ ...frame, filename: frame.filename || localStack[0].filename, function: frame.function || '?', })) .reverse(); } var defaultFunctionName = ''; /** * Safely extract function name from itself */ function getFunctionName(fn) { try { if (!fn || typeof fn !== 'function') { return defaultFunctionName; } return fn.name || defaultFunctionName; } catch (e) { // Just accessing custom props in some Selenium environments // can cause a "Permission denied" exception (see raven-js#495). return defaultFunctionName; } } // eslint-disable-next-line complexity function node(getModule) { var FILENAME_MATCH = /^\s*[-]{4,}$/; var FULL_MATCH = /at (?:async )?(?:(.+?)\s+\()?(?:(.+):(\d+):(\d+)?|([^)]+))\)?/; // eslint-disable-next-line complexity return (line) => { if (line.match(FILENAME_MATCH)) { return { filename: line, }; } var lineMatch = line.match(FULL_MATCH); if (!lineMatch) { return undefined; } let object; let method; let functionName; let typeName; let methodName; if (lineMatch[1]) { functionName = lineMatch[1]; let methodStart = functionName.lastIndexOf('.'); if (functionName[methodStart - 1] === '.') { // eslint-disable-next-line no-plusplus methodStart--; } if (methodStart > 0) { object = functionName.substr(0, methodStart); method = functionName.substr(methodStart + 1); var objectEnd = object.indexOf('.Module'); if (objectEnd > 0) { functionName = functionName.substr(objectEnd + 1); object = object.substr(0, objectEnd); } } typeName = undefined; } if (method) { typeName = object; methodName = method; } if (method === '') { methodName = undefined; functionName = undefined; } if (functionName === undefined) { methodName = methodName || ''; functionName = typeName ? `${typeName}.${methodName}` : methodName; } var filename = _optionalChain([lineMatch, 'access', _ => _[2], 'optionalAccess', _2 => _2.startsWith, 'call', _3 => _3('file://')]) ? lineMatch[2].substr(7) : lineMatch[2]; var isNative = lineMatch[5] === 'native'; var isInternal = isNative || (filename && !filename.startsWith('/') && !filename.startsWith('.') && filename.indexOf(':\\') !== 1); // in_app is all that's not an internal Node function or a module within node_modules // note that isNative appears to return true even for node core libraries // see https://github.com/getsentry/raven-node/issues/176 var in_app = !isInternal && filename !== undefined && !filename.includes('node_modules/'); return { filename, module: _optionalChain([getModule, 'optionalCall', _4 => _4(filename)]), function: functionName, lineno: parseInt(lineMatch[3], 10) || undefined, colno: parseInt(lineMatch[4], 10) || undefined, in_app, }; }; } /** * Node.js stack line parser * * This is in @sentry/utils so it can be used from the Electron SDK in the browser for when `nodeIntegration == true`. * This allows it to be used without referencing or importing any node specific code which causes bundlers to complain */ function nodeStackLineParser(getModule) { return [90, node(getModule)]; } //# sourceMappingURL=stacktrace.js.map /***/ }), /***/ 7321: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "$G": function() { return /* binding */ truncate; }, /* harmony export */ "nK": function() { return /* binding */ safeJoin; }, /* harmony export */ "zC": function() { return /* binding */ isMatchingPattern; } /* harmony export */ }); /* unused harmony exports escapeStringForRegex, snipLine */ /* harmony import */ var _is_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7597); /** * 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 (0 = unlimited) * @returns string Encoded */ function truncate(str, max = 0) { if (typeof str !== 'string' || max === 0) { return str; } return str.length <= max ? str : `${str.substr(0, max)}...`; } /** * This is basically just `trim_line` from * https://github.com/getsentry/sentry/blob/master/src/sentry/lang/javascript/processor.py#L67 * * @param str An object that contains serializable values * @param max Maximum number of characters in truncated string * @returns string Encoded */ function snipLine(line, colno) { let newLine = line; var lineLength = newLine.length; if (lineLength <= 150) { return newLine; } if (colno > lineLength) { // eslint-disable-next-line no-param-reassign colno = lineLength; } let start = Math.max(colno - 60, 0); if (start < 5) { start = 0; } let end = Math.min(start + 140, lineLength); if (end > lineLength - 5) { end = lineLength; } if (end === lineLength) { start = Math.max(end - 140, 0); } newLine = newLine.slice(start, end); if (start > 0) { newLine = `'{snip} ${newLine}`; } if (end < lineLength) { newLine += ' {snip}'; } return newLine; } /** * 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 */ // eslint-disable-next-line @typescript-eslint/no-explicit-any function safeJoin(input, delimiter) { if (!Array.isArray(input)) { return ''; } var output = []; // eslint-disable-next-line @typescript-eslint/prefer-for-of for (let i = 0; i < input.length; i++) { var value = input[i]; try { output.push(String(value)); } catch (e) { output.push('[value cannot be serialized]'); } } return output.join(delimiter); } /** * Checks if the value matches a regex or includes the string * @param value The string value to be checked against * @param pattern Either a regex or a string that must be contained in value */ function isMatchingPattern(value, pattern) { if (!(0,_is_js__WEBPACK_IMPORTED_MODULE_0__/* .isString */ .HD)(value)) { return false; } if ((0,_is_js__WEBPACK_IMPORTED_MODULE_0__/* .isRegExp */ .Kj)(pattern)) { return pattern.test(value); } if (typeof pattern === 'string') { return value.indexOf(pattern) !== -1; } return false; } /** * Given a string, escape characters which have meaning in the regex grammar, such that the result is safe to feed to * `new RegExp()`. * * Based on https://github.com/sindresorhus/escape-string-regexp. Vendored to a) reduce the size by skipping the runtime * type-checking, and b) ensure it gets down-compiled for old versions of Node (the published package only supports Node * 12+). * * @param regexString The string to escape * @returns An version of the string with all special regex characters escaped */ function escapeStringForRegex(regexString) { // escape the hyphen separately so we can also replace it with a unicode literal hyphen, to avoid the problems // discussed in https://github.com/sindresorhus/escape-string-regexp/issues/20. return regexString.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&').replace(/-/g, '\\x2d'); } //# sourceMappingURL=string.js.map /***/ }), /***/ 8823: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "Ak": function() { return /* binding */ supportsFetch; }, /* harmony export */ "Bf": function() { return /* binding */ supportsHistory; }, /* harmony export */ "Du": function() { return /* binding */ isNativeFetch; }, /* harmony export */ "t$": function() { return /* binding */ supportsNativeFetch; } /* harmony export */ }); /* unused harmony exports supportsDOMError, supportsDOMException, supportsErrorEvent, supportsReferrerPolicy, supportsReportingObserver */ /* harmony import */ var _global_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2991); /* harmony import */ var _logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2343); /** * Tells whether current environment supports ErrorEvent objects * {@link supportsErrorEvent}. * * @returns Answer to the given question. */ function supportsErrorEvent() { try { new ErrorEvent(''); return true; } catch (e) { return false; } } /** * Tells whether current environment supports DOMError objects * {@link supportsDOMError}. * * @returns Answer to the given question. */ function supportsDOMError() { try { // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError': // 1 argument required, but only 0 present. // @ts-ignore It really needs 1 argument, not 0. new DOMError(''); return true; } catch (e) { return false; } } /** * Tells whether current environment supports DOMException objects * {@link supportsDOMException}. * * @returns Answer to the given question. */ function supportsDOMException() { try { new DOMException(''); return true; } catch (e) { return false; } } /** * Tells whether current environment supports Fetch API * {@link supportsFetch}. * * @returns Answer to the given question. */ function supportsFetch() { if (!('fetch' in (0,_global_js__WEBPACK_IMPORTED_MODULE_0__/* .getGlobalObject */ .R)())) { return false; } try { new Headers(); new Request('http://www.example.com'); new Response(); return true; } catch (e) { return false; } } /** * isNativeFetch checks if the given function is a native implementation of fetch() */ // eslint-disable-next-line @typescript-eslint/ban-types function isNativeFetch(func) { return func && /^function fetch\(\)\s+\{\s+\[native code\]\s+\}$/.test(func.toString()); } /** * Tells whether current environment supports Fetch API natively * {@link supportsNativeFetch}. * * @returns true if `window.fetch` is natively implemented, false otherwise */ function supportsNativeFetch() { if (!supportsFetch()) { return false; } var global = (0,_global_js__WEBPACK_IMPORTED_MODULE_0__/* .getGlobalObject */ .R)(); // Fast path to avoid DOM I/O // eslint-disable-next-line @typescript-eslint/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 let result = false; var doc = global.document; // eslint-disable-next-line deprecation/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) { // eslint-disable-next-line @typescript-eslint/unbound-method result = isNativeFetch(sandbox.contentWindow.fetch); } doc.head.removeChild(sandbox); } catch (err) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && _logger_js__WEBPACK_IMPORTED_MODULE_1__/* .logger.warn */ .kg.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err); } } return result; } /** * Tells whether current environment supports ReportingObserver API * {@link supportsReportingObserver}. * * @returns Answer to the given question. */ function supportsReportingObserver() { return 'ReportingObserver' in getGlobalObject(); } /** * 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' // (see https://caniuse.com/#feat=referrer-policy), // it doesn't. And it throws an exception instead of ignoring this parameter... // REF: https://github.com/getsentry/raven-js/issues/1233 if (!supportsFetch()) { return false; } try { new Request('_', { referrerPolicy: 'origin' , }); return true; } catch (e) { return false; } } /** * Tells whether current environment supports History API * {@link supportsHistory}. * * @returns Answer to the given question. */ function supportsHistory() { // NOTE: in Chrome App environment, touching history.pushState, *even inside // a try/catch block*, will cause Chrome to output an error to console.error // borrowed from: https://github.com/angular/angular.js/pull/13945/files var global = (0,_global_js__WEBPACK_IMPORTED_MODULE_0__/* .getGlobalObject */ .R)(); /* eslint-disable @typescript-eslint/no-unsafe-member-access */ // eslint-disable-next-line @typescript-eslint/no-explicit-any var chrome = (global ).chrome; var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime; /* eslint-enable @typescript-eslint/no-unsafe-member-access */ var hasHistoryApi = 'history' in global && !!global.history.pushState && !!global.history.replaceState; return !isChromePackagedApp && hasHistoryApi; } //# sourceMappingURL=supports.js.map /***/ }), /***/ 6893: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "$2": function() { return /* binding */ rejectedSyncPromise; }, /* harmony export */ "WD": function() { return /* binding */ resolvedSyncPromise; }, /* harmony export */ "cW": function() { return /* binding */ SyncPromise; } /* harmony export */ }); /* harmony import */ var _is_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7597); /* eslint-disable @typescript-eslint/explicit-function-return-type */ /** SyncPromise internal states */ var States; (function (States) { /** Pending */ var PENDING = 0; States[States["PENDING"] = PENDING] = "PENDING"; /** Resolved / OK */ var RESOLVED = 1; States[States["RESOLVED"] = RESOLVED] = "RESOLVED"; /** Rejected / Error */ var REJECTED = 2; States[States["REJECTED"] = REJECTED] = "REJECTED"; })(States || (States = {})); // Overloads so we can call resolvedSyncPromise without arguments and generic argument /** * Creates a resolved sync promise. * * @param value the value to resolve the promise with * @returns the resolved sync promise */ function resolvedSyncPromise(value) { return new SyncPromise(resolve => { resolve(value); }); } /** * Creates a rejected sync promise. * * @param value the value to reject the promise with * @returns the rejected sync promise */ function rejectedSyncPromise(reason) { return new SyncPromise((_, reject) => { reject(reason); }); } /** * Thenable class that behaves like a Promise and follows it's interface * but is not async internally */ class SyncPromise { __init() {this._state = States.PENDING;} __init2() {this._handlers = [];} constructor( executor, ) {;SyncPromise.prototype.__init.call(this);SyncPromise.prototype.__init2.call(this);SyncPromise.prototype.__init3.call(this);SyncPromise.prototype.__init4.call(this);SyncPromise.prototype.__init5.call(this);SyncPromise.prototype.__init6.call(this); try { executor(this._resolve, this._reject); } catch (e) { this._reject(e); } } /** JSDoc */ then( onfulfilled, onrejected, ) { return new SyncPromise((resolve, reject) => { this._handlers.push([ false, result => { if (!onfulfilled) { // TODO: ¯\_(ツ)_/¯ // TODO: FIXME resolve(result ); } else { try { resolve(onfulfilled(result)); } catch (e) { reject(e); } } }, reason => { if (!onrejected) { reject(reason); } else { try { resolve(onrejected(reason)); } catch (e) { reject(e); } } }, ]); this._executeHandlers(); }); } /** JSDoc */ catch( onrejected, ) { return this.then(val => val, onrejected); } /** JSDoc */ finally(onfinally) { return new SyncPromise((resolve, reject) => { let val; let isRejected; return this.then( value => { isRejected = false; val = value; if (onfinally) { onfinally(); } }, reason => { isRejected = true; val = reason; if (onfinally) { onfinally(); } }, ).then(() => { if (isRejected) { reject(val); return; } resolve(val ); }); }); } /** JSDoc */ __init3() {this._resolve = (value) => { this._setResult(States.RESOLVED, value); };} /** JSDoc */ __init4() {this._reject = (reason) => { this._setResult(States.REJECTED, reason); };} /** JSDoc */ __init5() {this._setResult = (state, value) => { if (this._state !== States.PENDING) { return; } if ((0,_is_js__WEBPACK_IMPORTED_MODULE_0__/* .isThenable */ .J8)(value)) { void (value ).then(this._resolve, this._reject); return; } this._state = state; this._value = value; this._executeHandlers(); };} /** JSDoc */ __init6() {this._executeHandlers = () => { if (this._state === States.PENDING) { return; } var cachedHandlers = this._handlers.slice(); this._handlers = []; cachedHandlers.forEach(handler => { if (handler[0]) { return; } if (this._state === States.RESOLVED) { // eslint-disable-next-line @typescript-eslint/no-floating-promises handler[1](this._value ); } if (this._state === States.REJECTED) { handler[2](this._value); } handler[0] = true; }); };} } //# sourceMappingURL=syncpromise.js.map /***/ }), /***/ 1170: /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "Z1": function() { return /* binding */ browserPerformanceTimeOrigin; }, /* harmony export */ "_I": function() { return /* binding */ timestampWithMs; }, /* harmony export */ "ph": function() { return /* binding */ timestampInSeconds; }, /* harmony export */ "yW": function() { return /* binding */ dateTimestampInSeconds; } /* harmony export */ }); /* unused harmony exports _browserPerformanceTimeOriginMode, usingPerformanceAPI */ /* harmony import */ var _global_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2991); /* harmony import */ var _node_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2448); /* module decorator */ module = __webpack_require__.hmd(module); /** * An object that can return the current timestamp in seconds since the UNIX epoch. */ /** * A TimestampSource implementation for environments that do not support the Performance Web API natively. * * Note that this TimestampSource does not use a monotonic clock. A call to `nowSeconds` may return a timestamp earlier * than a previously returned value. We do not try to emulate a monotonic behavior in order to facilitate debugging. It * is more obvious to explain "why does my span have negative duration" than "why my spans have zero duration". */ var dateTimestampSource = { nowSeconds: () => Date.now() / 1000, }; /** * A partial definition of the [Performance Web API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Performance} * for accessing a high-resolution monotonic clock. */ /** * Returns a wrapper around the native Performance API browser implementation, or undefined for browsers that do not * support the API. * * Wrapping the native API works around differences in behavior from different browsers. */ function getBrowserPerformance() { const { performance } = (0,_global_js__WEBPACK_IMPORTED_MODULE_0__/* .getGlobalObject */ .R)(); if (!performance || !performance.now) { return undefined; } // Replace performance.timeOrigin with our own timeOrigin based on Date.now(). // // This is a partial workaround for browsers reporting performance.timeOrigin such that performance.timeOrigin + // performance.now() gives a date arbitrarily in the past. // // Additionally, computing timeOrigin in this way fills the gap for browsers where performance.timeOrigin is // undefined. // // The assumption that performance.timeOrigin + performance.now() ~= Date.now() is flawed, but we depend on it to // interact with data coming out of performance entries. // // Note that despite recommendations against it in the spec, browsers implement the Performance API with a clock that // might stop when the computer is asleep (and perhaps under other circumstances). Such behavior causes // performance.timeOrigin + performance.now() to have an arbitrary skew over Date.now(). In laptop computers, we have // observed skews that can be as long as days, weeks or months. // // See https://github.com/getsentry/sentry-javascript/issues/2590. // // BUG: despite our best intentions, this workaround has its limitations. It mostly addresses timings of pageload // transactions, but ignores the skew built up over time that can aversely affect timestamps of navigation // transactions of long-lived web pages. var timeOrigin = Date.now() - performance.now(); return { now: () => performance.now(), timeOrigin, }; } /** * Returns the native Performance API implementation from Node.js. Returns undefined in old Node.js versions that don't * implement the API. */ function getNodePerformance() { try { var perfHooks = (0,_node_js__WEBPACK_IMPORTED_MODULE_1__/* .dynamicRequire */ .l$)(module, 'perf_hooks') ; return perfHooks.performance; } catch (_) { return undefined; } } /** * The Performance API implementation for the current platform, if available. */ var platformPerformance = (0,_node_js__WEBPACK_IMPORTED_MODULE_1__/* .isNodeEnv */ .KV)() ? getNodePerformance() : getBrowserPerformance(); var timestampSource = platformPerformance === undefined ? dateTimestampSource : { nowSeconds: () => (platformPerformance.timeOrigin + platformPerformance.now()) / 1000, }; /** * Returns a timestamp in seconds since the UNIX epoch using the Date API. */ var dateTimestampInSeconds = dateTimestampSource.nowSeconds.bind(dateTimestampSource); /** * Returns a timestamp in seconds since the UNIX epoch using either the Performance or Date APIs, depending on the * availability of the Performance API. * * See `usingPerformanceAPI` to test whether the Performance API is used. * * BUG: Note that because of how browsers implement the Performance API, the clock might stop when the computer is * asleep. This creates a skew between `dateTimestampInSeconds` and `timestampInSeconds`. The * skew can grow to arbitrary amounts like days, weeks or months. * See https://github.com/getsentry/sentry-javascript/issues/2590. */ var timestampInSeconds = timestampSource.nowSeconds.bind(timestampSource); // Re-exported with an old name for backwards-compatibility. var timestampWithMs = timestampInSeconds; /** * A boolean that is true when timestampInSeconds uses the Performance API to produce monotonic timestamps. */ var usingPerformanceAPI = platformPerformance !== undefined; /** * Internal helper to store what is the source of browserPerformanceTimeOrigin below. For debugging only. */ let _browserPerformanceTimeOriginMode; /** * The number of milliseconds since the UNIX epoch. This value is only usable in a browser, and only when the * performance API is available. */ var browserPerformanceTimeOrigin = (() => { // Unfortunately browsers may report an inaccurate time origin data, through either performance.timeOrigin or // performance.timing.navigationStart, which results in poor results in performance data. We only treat time origin // data as reliable if they are within a reasonable threshold of the current time. const { performance } = (0,_global_js__WEBPACK_IMPORTED_MODULE_0__/* .getGlobalObject */ .R)(); if (!performance || !performance.now) { _browserPerformanceTimeOriginMode = 'none'; return undefined; } var threshold = 3600 * 1000; var performanceNow = performance.now(); var dateNow = Date.now(); // if timeOrigin isn't available set delta to threshold so it isn't used var timeOriginDelta = performance.timeOrigin ? Math.abs(performance.timeOrigin + performanceNow - dateNow) : threshold; var timeOriginIsReliable = timeOriginDelta < threshold; // 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. // Also 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 an initial time provided by the browser, fallback to the current time from the // Date API. // eslint-disable-next-line deprecation/deprecation var navigationStart = performance.timing && performance.timing.navigationStart; var hasNavigationStart = typeof navigationStart === 'number'; // if navigationStart isn't available set delta to threshold so it isn't used var navigationStartDelta = hasNavigationStart ? Math.abs(navigationStart + performanceNow - dateNow) : threshold; var navigationStartIsReliable = navigationStartDelta < threshold; if (timeOriginIsReliable || navigationStartIsReliable) { // Use the more reliable time origin if (timeOriginDelta <= navigationStartDelta) { _browserPerformanceTimeOriginMode = 'timeOrigin'; return performance.timeOrigin; } else { _browserPerformanceTimeOriginMode = 'navigationStart'; return navigationStart; } } // Either both timeOrigin and navigationStart are skewed or neither is available, fallback to Date. _browserPerformanceTimeOriginMode = 'dateNow'; return dateNow; })(); //# sourceMappingURL=time.js.map /***/ }), /***/ 3454: /***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; var ref, ref1; module.exports = ((ref = __webpack_require__.g.process) == null ? void 0 : ref.env) && typeof ((ref1 = __webpack_require__.g.process) == null ? void 0 : ref1.env) === "object" ? __webpack_require__.g.process : __webpack_require__(7663); //# sourceMappingURL=process.js.map /***/ }), /***/ 6840: /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { (window.__NEXT_P = window.__NEXT_P || []).push([ "/_app", function () { return __webpack_require__(1087); } ]); if(false) {} /***/ }), /***/ 1045: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { var __webpack_unused_export__; /* provided dependency */ var process = __webpack_require__(3454); var React = __webpack_require__(7294); function _interopDefaultLegacy(e) { return e && typeof e === "object" && "default" in e ? e : { "default": e }; } var React__default = /*#__PURE__*/ _interopDefaultLegacy(React); /* Based on Glamor's sheet https://github.com/threepointone/glamor/blob/667b480d31b3721a905021b26e1290ce92ca2879/src/sheet.js */ function _defineProperties(target, props) { for(var i = 0; i < props.length; i++){ var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var isProd = typeof process !== "undefined" && process.env && "production" === "production"; var isString = function isString(o) { return Object.prototype.toString.call(o) === "[object String]"; }; var StyleSheet = /*#__PURE__*/ function() { var StyleSheet = function StyleSheet(param) { var ref = param === void 0 ? {} : param, _name = ref.name, name = _name === void 0 ? "stylesheet" : _name, _optimizeForSpeed = ref.optimizeForSpeed, optimizeForSpeed = _optimizeForSpeed === void 0 ? isProd : _optimizeForSpeed; invariant$1(isString(name), "`name` must be a string"); this._name = name; this._deletedRulePlaceholder = "#" + name + "-deleted-rule____{}"; invariant$1(typeof optimizeForSpeed === "boolean", "`optimizeForSpeed` must be a boolean"); this._optimizeForSpeed = optimizeForSpeed; this._serverSheet = undefined; this._tags = []; this._injected = false; this._rulesCount = 0; var node = true && document.querySelector('meta[property="csp-nonce"]'); this._nonce = node ? node.getAttribute("content") : null; }; var _proto = StyleSheet.prototype; _proto.setOptimizeForSpeed = function setOptimizeForSpeed(bool) { invariant$1(typeof bool === "boolean", "`setOptimizeForSpeed` accepts a boolean"); invariant$1(this._rulesCount === 0, "optimizeForSpeed cannot be when rules have already been inserted"); this.flush(); this._optimizeForSpeed = bool; this.inject(); }; _proto.isOptimizeForSpeed = function isOptimizeForSpeed() { return this._optimizeForSpeed; }; _proto.inject = function inject() { var _this = this; invariant$1(!this._injected, "sheet already injected"); this._injected = true; if ( true && this._optimizeForSpeed) { this._tags[0] = this.makeStyleTag(this._name); this._optimizeForSpeed = "insertRule" in this.getSheet(); if (!this._optimizeForSpeed) { if (!isProd) { console.warn("StyleSheet: optimizeForSpeed mode not supported falling back to standard mode."); } this.flush(); this._injected = true; } return; } this._serverSheet = { cssRules: [], insertRule: function insertRule(rule, index) { if (typeof index === "number") { _this._serverSheet.cssRules[index] = { cssText: rule }; } else { _this._serverSheet.cssRules.push({ cssText: rule }); } return index; }, deleteRule: function deleteRule(index) { _this._serverSheet.cssRules[index] = null; } }; }; _proto.getSheetForTag = function getSheetForTag(tag) { if (tag.sheet) { return tag.sheet; } // this weirdness brought to you by firefox for(var i = 0; i < document.styleSheets.length; i++){ if (document.styleSheets[i].ownerNode === tag) { return document.styleSheets[i]; } } }; _proto.getSheet = function getSheet() { return this.getSheetForTag(this._tags[this._tags.length - 1]); }; _proto.insertRule = function insertRule(rule, index) { invariant$1(isString(rule), "`insertRule` accepts only strings"); if (false) {} if (this._optimizeForSpeed) { var sheet = this.getSheet(); if (typeof index !== "number") { index = sheet.cssRules.length; } // this weirdness for perf, and chrome's weird bug // https://stackoverflow.com/questions/20007992/chrome-suddenly-stopped-accepting-insertrule try { sheet.insertRule(rule, index); } catch (error) { if (!isProd) { console.warn("StyleSheet: illegal rule: \n\n" + rule + "\n\nSee https://stackoverflow.com/q/20007992 for more info"); } return -1; } } else { var insertionPoint = this._tags[index]; this._tags.push(this.makeStyleTag(this._name, rule, insertionPoint)); } return this._rulesCount++; }; _proto.replaceRule = function replaceRule(index, rule) { if (this._optimizeForSpeed || "object" === "undefined") { var sheet = true ? this.getSheet() : 0; if (!rule.trim()) { rule = this._deletedRulePlaceholder; } if (!sheet.cssRules[index]) { // @TBD Should we throw an error? return index; } sheet.deleteRule(index); try { sheet.insertRule(rule, index); } catch (error) { if (!isProd) { console.warn("StyleSheet: illegal rule: \n\n" + rule + "\n\nSee https://stackoverflow.com/q/20007992 for more info"); } // In order to preserve the indices we insert a deleteRulePlaceholder sheet.insertRule(this._deletedRulePlaceholder, index); } } else { var tag = this._tags[index]; invariant$1(tag, "old rule at index `" + index + "` not found"); tag.textContent = rule; } return index; }; _proto.deleteRule = function deleteRule(index) { if (false) {} if (this._optimizeForSpeed) { this.replaceRule(index, ""); } else { var tag = this._tags[index]; invariant$1(tag, "rule at index `" + index + "` not found"); tag.parentNode.removeChild(tag); this._tags[index] = null; } }; _proto.flush = function flush() { this._injected = false; this._rulesCount = 0; if (true) { this._tags.forEach(function(tag) { return tag && tag.parentNode.removeChild(tag); }); this._tags = []; } else {} }; _proto.cssRules = function cssRules() { var _this = this; if (false) {} return this._tags.reduce(function(rules, tag) { if (tag) { rules = rules.concat(Array.prototype.map.call(_this.getSheetForTag(tag).cssRules, function(rule) { return rule.cssText === _this._deletedRulePlaceholder ? null : rule; })); } else { rules.push(null); } return rules; }, []); }; _proto.makeStyleTag = function makeStyleTag(name, cssString, relativeToTag) { if (cssString) { invariant$1(isString(cssString), "makeStyleTag accepts only strings as second parameter"); } var tag = document.createElement("style"); if (this._nonce) tag.setAttribute("nonce", this._nonce); tag.type = "text/css"; tag.setAttribute("data-" + name, ""); if (cssString) { tag.appendChild(document.createTextNode(cssString)); } var head = document.head || document.getElementsByTagName("head")[0]; if (relativeToTag) { head.insertBefore(tag, relativeToTag); } else { head.appendChild(tag); } return tag; }; _createClass(StyleSheet, [ { key: "length", get: function get() { return this._rulesCount; } } ]); return StyleSheet; }(); function invariant$1(condition, message) { if (!condition) { throw new Error("StyleSheet: " + message + "."); } } function hash(str) { var _$hash = 5381, i = str.length; while(i){ _$hash = _$hash * 33 ^ str.charCodeAt(--i); } /* JavaScript does bitwise operations (like XOR, above) on 32-bit signed * integers. Since we want the results to be always positive, convert the * signed int to an unsigned by doing an unsigned bitshift. */ return _$hash >>> 0; } var stringHash = hash; var sanitize = function sanitize(rule) { return rule.replace(/\/style/gi, "\\/style"); }; var cache = {}; /** * computeId * * Compute and memoize a jsx id from a basedId and optionally props. */ function computeId(baseId, props) { if (!props) { return "jsx-" + baseId; } var propsToString = String(props); var key = baseId + propsToString; if (!cache[key]) { cache[key] = "jsx-" + stringHash(baseId + "-" + propsToString); } return cache[key]; } /** * computeSelector * * Compute and memoize dynamic selectors. */ function computeSelector(id, css) { var selectoPlaceholderRegexp = /__jsx-style-dynamic-selector/g; // Sanitize SSR-ed CSS. // Client side code doesn't need to be sanitized since we use // document.createTextNode (dev) and the CSSOM api sheet.insertRule (prod). if (false) {} var idcss = id + css; if (!cache[idcss]) { cache[idcss] = css.replace(selectoPlaceholderRegexp, id); } return cache[idcss]; } function mapRulesToStyle(cssRules, options) { if (options === void 0) options = {}; return cssRules.map(function(args) { var id = args[0]; var css = args[1]; return /*#__PURE__*/ React__default["default"].createElement("style", { id: "__" + id, // Avoid warnings upon render with a key key: "__" + id, nonce: options.nonce ? options.nonce : undefined, dangerouslySetInnerHTML: { __html: css } }); }); } var StyleSheetRegistry = /*#__PURE__*/ function() { var StyleSheetRegistry = function StyleSheetRegistry(param) { var ref = param === void 0 ? {} : param, _styleSheet = ref.styleSheet, styleSheet = _styleSheet === void 0 ? null : _styleSheet, _optimizeForSpeed = ref.optimizeForSpeed, optimizeForSpeed = _optimizeForSpeed === void 0 ? false : _optimizeForSpeed; this._sheet = styleSheet || new StyleSheet({ name: "styled-jsx", optimizeForSpeed: optimizeForSpeed }); this._sheet.inject(); if (styleSheet && typeof optimizeForSpeed === "boolean") { this._sheet.setOptimizeForSpeed(optimizeForSpeed); this._optimizeForSpeed = this._sheet.isOptimizeForSpeed(); } this._fromServer = undefined; this._indices = {}; this._instancesCounts = {}; }; var _proto = StyleSheetRegistry.prototype; _proto.add = function add(props) { var _this = this; if (undefined === this._optimizeForSpeed) { this._optimizeForSpeed = Array.isArray(props.children); this._sheet.setOptimizeForSpeed(this._optimizeForSpeed); this._optimizeForSpeed = this._sheet.isOptimizeForSpeed(); } if ( true && !this._fromServer) { this._fromServer = this.selectFromServer(); this._instancesCounts = Object.keys(this._fromServer).reduce(function(acc, tagName) { acc[tagName] = 0; return acc; }, {}); } var ref = this.getIdAndRules(props), styleId = ref.styleId, rules = ref.rules; // Deduping: just increase the instances count. if (styleId in this._instancesCounts) { this._instancesCounts[styleId] += 1; return; } var indices = rules.map(function(rule) { return _this._sheet.insertRule(rule); }) // Filter out invalid rules .filter(function(index) { return index !== -1; }); this._indices[styleId] = indices; this._instancesCounts[styleId] = 1; }; _proto.remove = function remove(props) { var _this = this; var styleId = this.getIdAndRules(props).styleId; invariant(styleId in this._instancesCounts, "styleId: `" + styleId + "` not found"); this._instancesCounts[styleId] -= 1; if (this._instancesCounts[styleId] < 1) { var tagFromServer = this._fromServer && this._fromServer[styleId]; if (tagFromServer) { tagFromServer.parentNode.removeChild(tagFromServer); delete this._fromServer[styleId]; } else { this._indices[styleId].forEach(function(index) { return _this._sheet.deleteRule(index); }); delete this._indices[styleId]; } delete this._instancesCounts[styleId]; } }; _proto.update = function update(props, nextProps) { this.add(nextProps); this.remove(props); }; _proto.flush = function flush() { this._sheet.flush(); this._sheet.inject(); this._fromServer = undefined; this._indices = {}; this._instancesCounts = {}; }; _proto.cssRules = function cssRules() { var _this = this; var fromServer = this._fromServer ? Object.keys(this._fromServer).map(function(styleId) { return [ styleId, _this._fromServer[styleId] ]; }) : []; var cssRules1 = this._sheet.cssRules(); return fromServer.concat(Object.keys(this._indices).map(function(styleId) { return [ styleId, _this._indices[styleId].map(function(index) { return cssRules1[index].cssText; }).join(_this._optimizeForSpeed ? "" : "\n") ]; }) // filter out empty rules .filter(function(rule) { return Boolean(rule[1]); })); }; _proto.styles = function styles(options) { return mapRulesToStyle(this.cssRules(), options); }; _proto.getIdAndRules = function getIdAndRules(props) { var css = props.children, dynamic = props.dynamic, id = props.id; if (dynamic) { var styleId = computeId(id, dynamic); return { styleId: styleId, rules: Array.isArray(css) ? css.map(function(rule) { return computeSelector(styleId, rule); }) : [ computeSelector(styleId, css) ] }; } return { styleId: computeId(id), rules: Array.isArray(css) ? css : [ css ] }; }; /** * selectFromServer * * Collects style tags from the document with id __jsx-XXX */ _proto.selectFromServer = function selectFromServer() { var elements = Array.prototype.slice.call(document.querySelectorAll('[id^="__jsx-"]')); return elements.reduce(function(acc, element) { var id = element.id.slice(2); acc[id] = element; return acc; }, {}); }; return StyleSheetRegistry; }(); function invariant(condition, message) { if (!condition) { throw new Error("StyleSheetRegistry: " + message + "."); } } var StyleSheetContext = /*#__PURE__*/ React.createContext(null); StyleSheetContext.displayName = "StyleSheetContext"; function createStyleRegistry() { return new StyleSheetRegistry(); } function StyleRegistry(param) { var configuredRegistry = param.registry, children = param.children; var rootRegistry = React.useContext(StyleSheetContext); var ref = React.useState(function() { return rootRegistry || configuredRegistry || createStyleRegistry(); }), registry = ref[0]; return /*#__PURE__*/ React__default["default"].createElement(StyleSheetContext.Provider, { value: registry }, children); } function useStyleRegistry() { return React.useContext(StyleSheetContext); } // Opt-into the new `useInsertionEffect` API in React 18, fallback to `useLayoutEffect`. // https://github.com/reactwg/react-18/discussions/110 var useInsertionEffect = React__default["default"].useInsertionEffect || React__default["default"].useLayoutEffect; var defaultRegistry = true ? createStyleRegistry() : 0; function JSXStyle(props) { var registry = defaultRegistry ? defaultRegistry : useStyleRegistry(); // If `registry` does not exist, we do nothing here. if (!registry) { return null; } if (false) {} useInsertionEffect(function() { registry.add(props); return function() { registry.remove(props); }; // props.children can be string[], will be striped since id is identical }, [ props.id, String(props.dynamic) ]); return null; } JSXStyle.dynamic = function(info) { return info.map(function(tagInfo) { var baseId = tagInfo[0]; var props = tagInfo[1]; return computeId(baseId, props); }).join(" "); }; __webpack_unused_export__ = StyleRegistry; __webpack_unused_export__ = createStyleRegistry; exports.style = JSXStyle; __webpack_unused_export__ = useStyleRegistry; /***/ }), /***/ 357: /***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; module.exports = __webpack_require__(1045).style; /***/ }), /***/ 1278: /***/ (function(__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) { "use strict"; ;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/version.js var SDK_VERSION = '7.15.0'; //# sourceMappingURL=version.js.map // EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/logger.js var esm_logger = __webpack_require__(2343); // EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/misc.js var misc = __webpack_require__(2844); // EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/string.js var string = __webpack_require__(7321); ;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/integrations/inboundfilters.js // "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. var DEFAULT_IGNORE_ERRORS = [/^Script error\.?$/, /^Javascript error: Script error\.? on line 0$/]; /** Options for the InboundFilters integration */ /** Inbound filters configurable by the user */ class InboundFilters { /** * @inheritDoc */ static __initStatic() {this.id = 'InboundFilters';} /** * @inheritDoc */ __init() {this.name = InboundFilters.id;} constructor( _options = {}) {;this._options = _options;InboundFilters.prototype.__init.call(this);} /** * @inheritDoc */ setupOnce(addGlobalEventProcessor, getCurrentHub) { var eventProcess = (event) => { var hub = getCurrentHub(); if (hub) { var self = hub.getIntegration(InboundFilters); if (self) { var client = hub.getClient(); var clientOptions = client ? client.getOptions() : {}; var options = _mergeOptions(self._options, clientOptions); return _shouldDropEvent(event, options) ? null : event; } } return event; }; eventProcess.id = this.name; addGlobalEventProcessor(eventProcess); } } InboundFilters.__initStatic(); /** JSDoc */ function _mergeOptions( internalOptions = {}, clientOptions = {}, ) { return { allowUrls: [...(internalOptions.allowUrls || []), ...(clientOptions.allowUrls || [])], denyUrls: [...(internalOptions.denyUrls || []), ...(clientOptions.denyUrls || [])], ignoreErrors: [ ...(internalOptions.ignoreErrors || []), ...(clientOptions.ignoreErrors || []), ...DEFAULT_IGNORE_ERRORS, ], ignoreInternal: internalOptions.ignoreInternal !== undefined ? internalOptions.ignoreInternal : true, }; } /** JSDoc */ function _shouldDropEvent(event, options) { if (options.ignoreInternal && _isSentryError(event)) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.warn */.kg.warn(`Event dropped due to being internal Sentry Error.\nEvent: ${(0,misc/* getEventDescription */.jH)(event)}`); return true; } if (_isIgnoredError(event, options.ignoreErrors)) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.warn */.kg.warn( `Event dropped due to being matched by \`ignoreErrors\` option.\nEvent: ${(0,misc/* getEventDescription */.jH)(event)}`, ); return true; } if (_isDeniedUrl(event, options.denyUrls)) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.warn */.kg.warn( `Event dropped due to being matched by \`denyUrls\` option.\nEvent: ${(0,misc/* getEventDescription */.jH)( event, )}.\nUrl: ${_getEventFilterUrl(event)}`, ); return true; } if (!_isAllowedUrl(event, options.allowUrls)) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.warn */.kg.warn( `Event dropped due to not being matched by \`allowUrls\` option.\nEvent: ${(0,misc/* getEventDescription */.jH)( event, )}.\nUrl: ${_getEventFilterUrl(event)}`, ); return true; } return false; } function _isIgnoredError(event, ignoreErrors) { if (!ignoreErrors || !ignoreErrors.length) { return false; } return _getPossibleEventMessages(event).some(message => ignoreErrors.some(pattern => (0,string/* isMatchingPattern */.zC)(message, pattern)), ); } function _isDeniedUrl(event, denyUrls) { // TODO: Use Glob instead? if (!denyUrls || !denyUrls.length) { return false; } var url = _getEventFilterUrl(event); return !url ? false : denyUrls.some(pattern => (0,string/* isMatchingPattern */.zC)(url, pattern)); } function _isAllowedUrl(event, allowUrls) { // TODO: Use Glob instead? if (!allowUrls || !allowUrls.length) { return true; } var url = _getEventFilterUrl(event); return !url ? true : allowUrls.some(pattern => (0,string/* isMatchingPattern */.zC)(url, pattern)); } function _getPossibleEventMessages(event) { if (event.message) { return [event.message]; } if (event.exception) { try { const { type = '', value = '' } = (event.exception.values && event.exception.values[0]) || {}; return [`${value}`, `${type}: ${value}`]; } catch (oO) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.error */.kg.error(`Cannot extract message for event ${(0,misc/* getEventDescription */.jH)(event)}`); return []; } } return []; } function _isSentryError(event) { try { // @ts-ignore can't be a sentry error if undefined // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access return event.exception.values[0].type === 'SentryError'; } catch (e) { // ignore } return false; } function _getLastValidUrl(frames = []) { for (let i = frames.length - 1; i >= 0; i--) { var frame = frames[i]; if (frame && frame.filename !== '' && frame.filename !== '[native code]') { return frame.filename || null; } } return null; } function _getEventFilterUrl(event) { try { let frames; try { // @ts-ignore we only care about frames if the whole thing here is defined frames = event.exception.values[0].stacktrace.frames; } catch (e) { // ignore } return frames ? _getLastValidUrl(frames) : null; } catch (oO) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.error */.kg.error(`Cannot extract url for event ${(0,misc/* getEventDescription */.jH)(event)}`); return null; } } //# sourceMappingURL=inboundfilters.js.map // EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/object.js var object = __webpack_require__(535); ;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/integrations/functiontostring.js let originalFunctionToString; /** Patch toString calls to return proper name for wrapped functions */ class FunctionToString {constructor() { FunctionToString.prototype.__init.call(this); } /** * @inheritDoc */ static __initStatic() {this.id = 'FunctionToString';} /** * @inheritDoc */ __init() {this.name = FunctionToString.id;} /** * @inheritDoc */ setupOnce() { // eslint-disable-next-line @typescript-eslint/unbound-method originalFunctionToString = Function.prototype.toString; // eslint-disable-next-line @typescript-eslint/no-explicit-any Function.prototype.toString = function ( ...args) { var context = (0,object/* getOriginalFunction */.HK)(this) || this; return originalFunctionToString.apply(context, args); }; } } FunctionToString.__initStatic(); //# sourceMappingURL=functiontostring.js.map // EXTERNAL MODULE: ./node_modules/@sentry/core/esm/hub.js var esm_hub = __webpack_require__(5659); // EXTERNAL MODULE: ./node_modules/@sentry/core/esm/scope.js var esm_scope = __webpack_require__(350); ;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/integration.js var installedIntegrations = []; /** Map of integrations assigned to a client */ /** * Remove duplicates from the given array, preferring the last instance of any duplicate. Not guaranteed to * preseve the order of integrations in the array. * * @private */ function filterDuplicates(integrations) { var integrationsByName = {}; integrations.forEach(currentInstance => { const { name } = currentInstance; var existingInstance = integrationsByName[name]; // We want integrations later in the array to overwrite earlier ones of the same type, except that we never want a // default instance to overwrite an existing user instance if (existingInstance && !existingInstance.isDefaultInstance && currentInstance.isDefaultInstance) { return; } integrationsByName[name] = currentInstance; }); return Object.values(integrationsByName); } /** Gets integrations to install */ function getIntegrationsToSetup(options) { var defaultIntegrations = options.defaultIntegrations || []; var userIntegrations = options.integrations; // We flag default instances, so that later we can tell them apart from any user-created instances of the same class defaultIntegrations.forEach(integration => { integration.isDefaultInstance = true; }); let integrations; if (Array.isArray(userIntegrations)) { integrations = [...defaultIntegrations, ...userIntegrations]; } else if (typeof userIntegrations === 'function') { integrations = (0,misc/* arrayify */.lE)(userIntegrations(defaultIntegrations)); } else { integrations = defaultIntegrations; } var finalIntegrations = filterDuplicates(integrations); // The `Debug` integration prints copies of the `event` and `hint` which will be passed to `beforeSend`. It therefore // has to run after all other integrations, so that the changes of all event processors will be reflected in the // printed values. For lack of a more elegant way to guarantee that, we therefore locate it and, assuming it exists, // pop it out of its current spot and shove it onto the end of the array. var debugIndex = finalIntegrations.findIndex(integration => integration.name === 'Debug'); if (debugIndex !== -1) { const [debugInstance] = finalIntegrations.splice(debugIndex, 1); finalIntegrations.push(debugInstance); } return finalIntegrations; } /** * 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(integrations) { var integrationIndex = {}; integrations.forEach(integration => { integrationIndex[integration.name] = integration; if (installedIntegrations.indexOf(integration.name) === -1) { integration.setupOnce(esm_scope/* addGlobalEventProcessor */.c, esm_hub/* getCurrentHub */.Gd); installedIntegrations.push(integration.name); (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.log */.kg.log(`Integration installed: ${integration.name}`); } }); return integrationIndex; } //# sourceMappingURL=integration.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/sdk.js /** A class object that can instantiate Client objects. */ /** * 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 instantiate. * @param options Options to pass to the client. */ function initAndBind( clientClass, options, ) { if (options.debug === true) { if ((typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__)) { esm_logger/* logger.enable */.kg.enable(); } else { // use `console.warn` rather than `logger.warn` since by non-debug bundles have all `logger.x` statements stripped // eslint-disable-next-line no-console console.warn('[Sentry] Cannot initialize SDK with `debug` option using a non-debug bundle.'); } } var hub = (0,esm_hub/* getCurrentHub */.Gd)(); var scope = hub.getScope(); if (scope) { scope.update(options.initialScope); } var client = new clientClass(options); hub.bindClient(client); } //# sourceMappingURL=sdk.js.map // EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/global.js var esm_global = __webpack_require__(2991); // EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/stacktrace.js var stacktrace = __webpack_require__(360); // EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/supports.js var supports = __webpack_require__(8823); // EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/instrument.js var instrument = __webpack_require__(9732); ;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/error.js /** An error emitted by Sentry SDKs and related utilities. */ class SentryError extends Error { /** Display name of this error instance. */ constructor( message, logLevel = 'warn') { super(message);this.message = message;; this.name = new.target.prototype.constructor.name; // This sets the prototype to be `Error`, not `SentryError`. It's unclear why we do this, but commenting this line // out causes various (seemingly totally unrelated) playwright tests consistently time out. FYI, this makes // instances of `SentryError` fail `obj instanceof SentryError` checks. Object.setPrototypeOf(this, new.target.prototype); this.logLevel = logLevel; } } //# sourceMappingURL=error.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/dsn.js /** Regular expression used to parse a Dsn. */ var DSN_REGEX = /^(?:(\w+):)\/\/(?:(\w+)(?::(\w+)?)?@)([\w.-]+)(?::(\d+))?\/(.+)/; function isValidProtocol(protocol) { return protocol === 'http' || protocol === 'https'; } /** * 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 dsn_dsnToString(dsn, withPassword = false) { const { host, path, pass, port, projectId, protocol, publicKey } = dsn; return ( `${protocol}://${publicKey}${withPassword && pass ? `:${pass}` : ''}` + `@${host}${port ? `:${port}` : ''}/${path ? `${path}/` : path}${projectId}` ); } /** * Parses a Dsn from a given string. * * @param str A Dsn as string * @returns Dsn as DsnComponents */ function dsnFromString(str) { var match = DSN_REGEX.exec(str); if (!match) { throw new SentryError(`Invalid Sentry Dsn: ${str}`); } const [protocol, publicKey, pass = '', host, port = '', lastPath] = match.slice(1); let path = ''; let projectId = lastPath; var split = projectId.split('/'); if (split.length > 1) { path = split.slice(0, -1).join('/'); projectId = split.pop() ; } if (projectId) { var projectMatch = projectId.match(/^\d+/); if (projectMatch) { projectId = projectMatch[0]; } } return dsnFromComponents({ host, pass, path, projectId, port, protocol: protocol , publicKey }); } function dsnFromComponents(components) { return { protocol: components.protocol, publicKey: components.publicKey || '', pass: components.pass || '', host: components.host, port: components.port || '', path: components.path || '', projectId: components.projectId, }; } function validateDsn(dsn) { if (!(typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__)) { return; } const { port, projectId, protocol } = dsn; var requiredComponents = ['protocol', 'publicKey', 'host', 'projectId']; requiredComponents.forEach(component => { if (!dsn[component]) { throw new SentryError(`Invalid Sentry Dsn: ${component} missing`); } }); if (!projectId.match(/^\d+$/)) { throw new SentryError(`Invalid Sentry Dsn: Invalid projectId ${projectId}`); } if (!isValidProtocol(protocol)) { throw new SentryError(`Invalid Sentry Dsn: Invalid protocol ${protocol}`); } if (port && isNaN(parseInt(port, 10))) { throw new SentryError(`Invalid Sentry Dsn: Invalid port ${port}`); } return true; } /** The Sentry Dsn, identifying a Sentry instance and project. */ function dsn_makeDsn(from) { var components = typeof from === 'string' ? dsnFromString(from) : dsnFromComponents(from); validateDsn(components); return components; } //# sourceMappingURL=dsn.js.map // EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/is.js var is = __webpack_require__(7597); // EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/syncpromise.js var syncpromise = __webpack_require__(6893); ;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/memo.js /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-explicit-any */ /** * Helper to decycle json objects */ function memoBuilder() { var hasWeakSet = typeof WeakSet === 'function'; var inner = hasWeakSet ? new WeakSet() : []; function memoize(obj) { if (hasWeakSet) { if (inner.has(obj)) { return true; } inner.add(obj); return false; } // eslint-disable-next-line @typescript-eslint/prefer-for-of for (let i = 0; i < inner.length; i++) { var value = inner[i]; if (value === obj) { return true; } } inner.push(obj); return false; } function unmemoize(obj) { if (hasWeakSet) { inner.delete(obj); } else { for (let i = 0; i < inner.length; i++) { if (inner[i] === obj) { inner.splice(i, 1); break; } } } } return [memoize, unmemoize]; } //# sourceMappingURL=memo.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/normalize.js /** * Recursively normalizes the given object. * * - Creates a copy to prevent original input mutation * - Skips non-enumerable properties * - When stringifying, calls `toJSON` if implemented * - Removes circular references * - Translates non-serializable values (`undefined`/`NaN`/functions) to serializable format * - Translates known global objects/classes to a string representations * - Takes care of `Error` object serialization * - Optionally limits depth of final output * - Optionally limits number of properties/elements included in any single object/array * * @param input The object to be normalized. * @param depth The max depth to which to normalize the object. (Anything deeper stringified whole.) * @param maxProperties The max number of elements or properties to be included in any single array or * object in the normallized output. * @returns A normalized version of the object, or `"**non-serializable**"` if any errors are thrown during normalization. */ // eslint-disable-next-line @typescript-eslint/no-explicit-any function normalize(input, depth = +Infinity, maxProperties = +Infinity) { try { // since we're at the outermost level, we don't provide a key return visit('', input, depth, maxProperties); } catch (err) { return { ERROR: `**non-serializable** (${err})` }; } } /** JSDoc */ function normalizeToSize( // eslint-disable-next-line @typescript-eslint/no-explicit-any object, // Default Node.js REPL depth depth = 3, // 100kB, as 200kB is max payload size, so half sounds reasonable maxSize = 100 * 1024, ) { var normalized = normalize(object, depth); if (jsonSize(normalized) > maxSize) { return normalizeToSize(object, depth - 1, maxSize); } return normalized ; } /** * Visits a node to perform normalization on it * * @param key The key corresponding to the given node * @param value The node to be visited * @param depth Optional number indicating the maximum recursion depth * @param maxProperties Optional maximum number of properties/elements included in any single object/array * @param memo Optional Memo class handling decycling */ function visit( key, value, depth = +Infinity, maxProperties = +Infinity, memo = memoBuilder(), ) { const [memoize, unmemoize] = memo; // Get the simple cases out of the way first if (value === null || (['number', 'boolean', 'string'].includes(typeof value) && !(0,is/* isNaN */.i2)(value))) { return value ; } var stringified = stringifyValue(key, value); // Anything we could potentially dig into more (objects or arrays) will have come back as `"[object XXXX]"`. // Everything else will have already been serialized, so if we don't see that pattern, we're done. if (!stringified.startsWith('[object ')) { return stringified; } // From here on, we can assert that `value` is either an object or an array. // Do not normalize objects that we know have already been normalized. As a general rule, the // "__sentry_skip_normalization__" property should only be used sparingly and only should only be set on objects that // have already been normalized. if ((value )['__sentry_skip_normalization__']) { return value ; } // We're also done if we've reached the max depth if (depth === 0) { // At this point we know `serialized` is a string of the form `"[object XXXX]"`. Clean it up so it's just `"[XXXX]"`. return stringified.replace('object ', ''); } // If we've already visited this branch, bail out, as it's circular reference. If not, note that we're seeing it now. if (memoize(value)) { return '[Circular ~]'; } // If the value has a `toJSON` method, we call it to extract more information var valueWithToJSON = value ; if (valueWithToJSON && typeof valueWithToJSON.toJSON === 'function') { try { var jsonValue = valueWithToJSON.toJSON(); // We need to normalize the return value of `.toJSON()` in case it has circular references return visit('', jsonValue, depth - 1, maxProperties, memo); } catch (err) { // pass (The built-in `toJSON` failed, but we can still try to do it ourselves) } } // At this point we know we either have an object or an array, we haven't seen it before, and we're going to recurse // because we haven't yet reached the max depth. Create an accumulator to hold the results of visiting each // property/entry, and keep track of the number of items we add to it. var normalized = (Array.isArray(value) ? [] : {}) ; let numAdded = 0; // Before we begin, convert`Error` and`Event` instances into plain objects, since some of each of their relevant // properties are non-enumerable and otherwise would get missed. var visitable = (0,object/* convertToPlainObject */.Sh)(value ); for (var visitKey in visitable) { // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration. if (!Object.prototype.hasOwnProperty.call(visitable, visitKey)) { continue; } if (numAdded >= maxProperties) { normalized[visitKey] = '[MaxProperties ~]'; break; } // Recursively visit all the child nodes var visitValue = visitable[visitKey]; normalized[visitKey] = visit(visitKey, visitValue, depth - 1, maxProperties, memo); numAdded += 1; } // Once we've visited all the branches, remove the parent from memo storage unmemoize(value); // Return accumulated values return normalized; } /** * Stringify the given value. Handles various known special values and types. * * Not meant to be used on simple primitives which already have a string representation, as it will, for example, turn * the number 1231 into "[Object Number]", nor on `null`, as it will throw. * * @param value The value to stringify * @returns A stringified representation of the given value */ function stringifyValue( key, // this type is a tiny bit of a cheat, since this function does handle NaN (which is technically a number), but for // our internal use, it'll do value, ) { try { if (key === 'domain' && value && typeof value === 'object' && (value )._events) { return '[Domain]'; } if (key === 'domainEmitter') { return '[DomainEmitter]'; } // It's safe to use `global`, `window`, and `document` here in this manner, as we are asserting using `typeof` first // which won't throw if they are not present. if (typeof __webpack_require__.g !== 'undefined' && value === __webpack_require__.g) { return '[Global]'; } // eslint-disable-next-line no-restricted-globals if (typeof window !== 'undefined' && value === window) { return '[Window]'; } // eslint-disable-next-line no-restricted-globals if (typeof document !== 'undefined' && value === document) { return '[Document]'; } // React's SyntheticEvent thingy if ((0,is/* isSyntheticEvent */.Cy)(value)) { return '[SyntheticEvent]'; } if (typeof value === 'number' && value !== value) { return '[NaN]'; } // this catches `undefined` (but not `null`, which is a primitive and can be serialized on its own) if (value === void 0) { return '[undefined]'; } if (typeof value === 'function') { return `[Function: ${(0,stacktrace/* getFunctionName */.$P)(value)}]`; } if (typeof value === 'symbol') { return `[${String(value)}]`; } // stringified BigInts are indistinguishable from regular numbers, so we need to label them to avoid confusion if (typeof value === 'bigint') { return `[BigInt: ${String(value)}]`; } // Now that we've knocked out all the special cases and the primitives, all we have left are objects. Simply casting // them to strings means that instances of classes which haven't defined their `toStringTag` will just come out as // `"[object Object]"`. If we instead look at the constructor's name (which is the same as the name of the class), // we can make sure that only plain objects come out that way. return `[object ${(Object.getPrototypeOf(value) ).constructor.name}]`; } catch (err) { return `**non-serializable** (${err})`; } } /** Calculates bytes size of input string */ function utf8Length(value) { // eslint-disable-next-line no-bitwise return ~-encodeURI(value).split(/%..|./).length; } /** Calculates bytes size of input object */ // eslint-disable-next-line @typescript-eslint/no-explicit-any function jsonSize(value) { return utf8Length(JSON.stringify(value)); } //# sourceMappingURL=normalize.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/envelope.js /** * Creates an envelope. * Make sure to always explicitly provide the generic to this function * so that the envelope types resolve correctly. */ function createEnvelope(headers, items = []) { return [headers, items] ; } /** * Add an item to an envelope. * Make sure to always explicitly provide the generic to this function * so that the envelope types resolve correctly. */ function addItemToEnvelope(envelope, newItem) { const [headers, items] = envelope; return [headers, [...items, newItem]] ; } /** * Convenience function to loop through the items and item types of an envelope. * (This function was mostly created because working with envelope types is painful at the moment) */ function forEachEnvelopeItem( envelope, callback, ) { var envelopeItems = envelope[1]; envelopeItems.forEach((envelopeItem) => { var envelopeItemType = envelopeItem[0].type; callback(envelopeItem, envelopeItemType); }); } function encodeUTF8(input, textEncoder) { var utf8 = textEncoder || new TextEncoder(); return utf8.encode(input); } /** * Serializes an envelope. */ function serializeEnvelope(envelope, textEncoder) { const [envHeaders, items] = envelope; // Initially we construct our envelope as a string and only convert to binary chunks if we encounter binary data let parts = JSON.stringify(envHeaders); function append(next) { if (typeof parts === 'string') { parts = typeof next === 'string' ? parts + next : [encodeUTF8(parts, textEncoder), next]; } else { parts.push(typeof next === 'string' ? encodeUTF8(next, textEncoder) : next); } } for (var item of items) { const [itemHeaders, payload] = item; append(`\n${JSON.stringify(itemHeaders)}\n`); if (typeof payload === 'string' || payload instanceof Uint8Array) { append(payload); } else { let stringifiedPayload; try { stringifiedPayload = JSON.stringify(payload); } catch (e) { // In case, despite all our efforts to keep `payload` circular-dependency-free, `JSON.strinify()` still // fails, we try again after normalizing it again with infinite normalization depth. This of course has a // performance impact but in this case a performance hit is better than throwing. stringifiedPayload = JSON.stringify(normalize(payload)); } append(stringifiedPayload); } } return typeof parts === 'string' ? parts : concatBuffers(parts); } function concatBuffers(buffers) { var totalLength = buffers.reduce((acc, buf) => acc + buf.length, 0); var merged = new Uint8Array(totalLength); let offset = 0; for (var buffer of buffers) { merged.set(buffer, offset); offset += buffer.length; } return merged; } /** * Creates attachment envelope items */ function createAttachmentEnvelopeItem( attachment, textEncoder, ) { var buffer = typeof attachment.data === 'string' ? encodeUTF8(attachment.data, textEncoder) : attachment.data; return [ (0,object/* dropUndefinedKeys */.Jr)({ type: 'attachment', length: buffer.length, filename: attachment.filename, content_type: attachment.contentType, attachment_type: attachment.attachmentType, }), buffer, ]; } var ITEM_TYPE_TO_DATA_CATEGORY_MAP = { session: 'session', sessions: 'session', attachment: 'attachment', transaction: 'transaction', event: 'error', client_report: 'internal', user_report: 'default', }; /** * Maps the type of an envelope item to a data category. */ function envelopeItemTypeToDataCategory(type) { return ITEM_TYPE_TO_DATA_CATEGORY_MAP[type]; } //# sourceMappingURL=envelope.js.map // EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/time.js var time = __webpack_require__(1170); ;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/api.js var SENTRY_API_VERSION = '7'; /** Returns the prefix to construct Sentry ingestion API endpoints. */ function getBaseApiEndpoint(dsn) { var protocol = dsn.protocol ? `${dsn.protocol}:` : ''; var port = dsn.port ? `:${dsn.port}` : ''; return `${protocol}//${dsn.host}${port}${dsn.path ? `/${dsn.path}` : ''}/api/`; } /** Returns the ingest API endpoint for target. */ function _getIngestEndpoint(dsn) { return `${getBaseApiEndpoint(dsn)}${dsn.projectId}/envelope/`; } /** Returns a URL-encoded string with auth config suitable for a query string. */ function _encodedAuth(dsn, sdkInfo) { return (0,object/* urlEncode */._j)({ // We send only the minimum set of required information. See // https://github.com/getsentry/sentry-javascript/issues/2572. sentry_key: dsn.publicKey, sentry_version: SENTRY_API_VERSION, ...(sdkInfo && { sentry_client: `${sdkInfo.name}/${sdkInfo.version}` }), }); } /** * Returns the envelope endpoint URL with auth in the query string. * * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests. */ function getEnvelopeEndpointWithUrlEncodedAuth( dsn, // TODO (v8): Remove `tunnelOrOptions` in favor of `options`, and use the substitute code below // options: ClientOptions = {} as ClientOptions, tunnelOrOptions = {} , ) { // TODO (v8): Use this code instead // const { tunnel, _metadata = {} } = options; // return tunnel ? tunnel : `${_getIngestEndpoint(dsn)}?${_encodedAuth(dsn, _metadata.sdk)}`; var tunnel = typeof tunnelOrOptions === 'string' ? tunnelOrOptions : tunnelOrOptions.tunnel; var sdkInfo = typeof tunnelOrOptions === 'string' || !tunnelOrOptions._metadata ? undefined : tunnelOrOptions._metadata.sdk; return tunnel ? tunnel : `${_getIngestEndpoint(dsn)}?${_encodedAuth(dsn, sdkInfo)}`; } /** Returns the url to the report dialog endpoint. */ function api_getReportDialogEndpoint( dsnLike, dialogOptions , ) { var dsn = makeDsn(dsnLike); var endpoint = `${getBaseApiEndpoint(dsn)}embed/error-page/`; let encodedOptions = `dsn=${dsnToString(dsn)}`; for (var key in dialogOptions) { if (key === 'dsn') { continue; } if (key === 'user') { var user = dialogOptions.user; if (!user) { continue; } if (user.name) { encodedOptions += `&name=${encodeURIComponent(user.name)}`; } if (user.email) { encodedOptions += `&email=${encodeURIComponent(user.email)}`; } } else { encodedOptions += `&${encodeURIComponent(key)}=${encodeURIComponent(dialogOptions[key] )}`; } } return `${endpoint}?${encodedOptions}`; } //# sourceMappingURL=api.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/envelope.js /** Extract sdk info from from the API metadata */ function getSdkMetadataForEnvelopeHeader(metadata) { if (!metadata || !metadata.sdk) { return; } const { name, version } = metadata.sdk; return { name, version }; } /** * Apply SdkInfo (name, version, packages, integrations) to the corresponding event key. * Merge with existing data if any. **/ function enhanceEventWithSdkInfo(event, sdkInfo) { if (!sdkInfo) { return event; } event.sdk = event.sdk || {}; event.sdk.name = event.sdk.name || sdkInfo.name; event.sdk.version = event.sdk.version || sdkInfo.version; event.sdk.integrations = [...(event.sdk.integrations || []), ...(sdkInfo.integrations || [])]; event.sdk.packages = [...(event.sdk.packages || []), ...(sdkInfo.packages || [])]; return event; } /** Creates an envelope from a Session */ function createSessionEnvelope( session, dsn, metadata, tunnel, ) { var sdkInfo = getSdkMetadataForEnvelopeHeader(metadata); var envelopeHeaders = { sent_at: new Date().toISOString(), ...(sdkInfo && { sdk: sdkInfo }), ...(!!tunnel && { dsn: dsn_dsnToString(dsn) }), }; var envelopeItem = 'aggregates' in session ? [{ type: 'sessions' }, session] : [{ type: 'session' }, session]; return createEnvelope(envelopeHeaders, [envelopeItem]); } /** * Create an Envelope from an event. */ function createEventEnvelope( event, dsn, metadata, tunnel, ) { var sdkInfo = getSdkMetadataForEnvelopeHeader(metadata); var eventType = event.type || 'event'; enhanceEventWithSdkInfo(event, metadata && metadata.sdk); var envelopeHeaders = createEventEnvelopeHeaders(event, sdkInfo, tunnel, dsn); // Prevent this data (which, if it exists, was used in earlier steps in the processing pipeline) from being sent to // sentry. (Note: Our use of this property comes and goes with whatever we might be debugging, whatever hacks we may // have temporarily added, etc. Even if we don't happen to be using it at some point in the future, let's not get rid // of this `delete`, lest we miss putting it back in the next time the property is in use.) delete event.sdkProcessingMetadata; var eventItem = [{ type: eventType }, event]; return createEnvelope(envelopeHeaders, [eventItem]); } function createEventEnvelopeHeaders( event, sdkInfo, tunnel, dsn, ) { var dynamicSamplingContext = event.sdkProcessingMetadata && event.sdkProcessingMetadata.dynamicSamplingContext; return { event_id: event.event_id , sent_at: new Date().toISOString(), ...(sdkInfo && { sdk: sdkInfo }), ...(!!tunnel && { dsn: dsn_dsnToString(dsn) }), ...(event.type === 'transaction' && dynamicSamplingContext && { trace: (0,object/* dropUndefinedKeys */.Jr)({ ...dynamicSamplingContext }), }), }; } //# sourceMappingURL=envelope.js.map // EXTERNAL MODULE: ./node_modules/@sentry/core/esm/session.js var esm_session = __webpack_require__(9015); ;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/baseclient.js var ALREADY_SEEN_ERROR = "Not capturing exception because it's already been captured."; /** * Base implementation for all JavaScript SDK clients. * * Call the constructor with the corresponding options * specific to the client subclass. To access these options later, use * {@link Client.getOptions}. * * 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, it is passed through * {@link BaseClient._prepareEvent} to add SDK information and scope data * (breadcrumbs and context). To add more custom information, override this * method and extend the resulting prepared event. * * To issue automatically created events (e.g. via instrumentation), use * {@link Client.captureEvent}. It will prepare the event and pass it through * the callback lifecycle. To issue auto-breadcrumbs, use * {@link Client.addBreadcrumb}. * * @example * class NodeClient extends BaseClient { * public constructor(options: NodeOptions) { * super(options); * } * * // ... * } */ class BaseClient { /** Options passed to the SDK. */ /** The client Dsn, if specified in options. Without this Dsn, the SDK will be disabled. */ /** Array of set up integrations. */ __init() {this._integrations = {};} /** Indicates whether this client's integrations have been set up. */ __init2() {this._integrationsInitialized = false;} /** Number of calls being processed */ __init3() {this._numProcessing = 0;} /** Holds flushable */ __init4() {this._outcomes = {};} /** * Initializes this client instance. * * @param options Options for the client. */ constructor(options) {;BaseClient.prototype.__init.call(this);BaseClient.prototype.__init2.call(this);BaseClient.prototype.__init3.call(this);BaseClient.prototype.__init4.call(this); this._options = options; if (options.dsn) { this._dsn = dsn_makeDsn(options.dsn); var url = getEnvelopeEndpointWithUrlEncodedAuth(this._dsn, options); this._transport = options.transport({ recordDroppedEvent: this.recordDroppedEvent.bind(this), ...options.transportOptions, url, }); } else { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.warn */.kg.warn('No DSN provided, client will not do anything.'); } } /** * @inheritDoc */ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types captureException(exception, hint, scope) { // ensure we haven't captured this very object before if ((0,misc/* checkOrSetAlreadyCaught */.YO)(exception)) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.log */.kg.log(ALREADY_SEEN_ERROR); return; } let eventId = hint && hint.event_id; this._process( this.eventFromException(exception, hint) .then(event => this._captureEvent(event, hint, scope)) .then(result => { eventId = result; }), ); return eventId; } /** * @inheritDoc */ captureMessage( message, // eslint-disable-next-line deprecation/deprecation level, hint, scope, ) { let eventId = hint && hint.event_id; var promisedEvent = (0,is/* isPrimitive */.pt)(message) ? this.eventFromMessage(String(message), level, hint) : this.eventFromException(message, hint); this._process( promisedEvent .then(event => this._captureEvent(event, hint, scope)) .then(result => { eventId = result; }), ); return eventId; } /** * @inheritDoc */ captureEvent(event, hint, scope) { // ensure we haven't captured this very object before if (hint && hint.originalException && (0,misc/* checkOrSetAlreadyCaught */.YO)(hint.originalException)) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.log */.kg.log(ALREADY_SEEN_ERROR); return; } let eventId = hint && hint.event_id; this._process( this._captureEvent(event, hint, scope).then(result => { eventId = result; }), ); return eventId; } /** * @inheritDoc */ captureSession(session) { if (!this._isEnabled()) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.warn */.kg.warn('SDK not enabled, will not capture session.'); return; } if (!(typeof session.release === 'string')) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.warn */.kg.warn('Discarded session because of missing or non-string release'); } else { this.sendSession(session); // After sending, we set init false to indicate it's not the first occurrence (0,esm_session/* updateSession */.CT)(session, { init: false }); } } /** * @inheritDoc */ getDsn() { return this._dsn; } /** * @inheritDoc */ getOptions() { return this._options; } /** * @inheritDoc */ getTransport() { return this._transport; } /** * @inheritDoc */ flush(timeout) { var transport = this._transport; if (transport) { return this._isClientDoneProcessing(timeout).then(clientFinished => { return transport.flush(timeout).then(transportFlushed => clientFinished && transportFlushed); }); } else { return (0,syncpromise/* resolvedSyncPromise */.WD)(true); } } /** * @inheritDoc */ close(timeout) { return this.flush(timeout).then(result => { this.getOptions().enabled = false; return result; }); } /** * Sets up the integrations */ setupIntegrations() { if (this._isEnabled() && !this._integrationsInitialized) { this._integrations = setupIntegrations(this._options.integrations); this._integrationsInitialized = true; } } /** * Gets an installed integration by its `id`. * * @returns The installed integration or `undefined` if no integration with that `id` was installed. */ getIntegrationById(integrationId) { return this._integrations[integrationId]; } /** * @inheritDoc */ getIntegration(integration) { try { return (this._integrations[integration.id] ) || null; } catch (_oO) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.warn */.kg.warn(`Cannot retrieve integration ${integration.id} from the current Client`); return null; } } /** * @inheritDoc */ sendEvent(event, hint = {}) { if (this._dsn) { let env = createEventEnvelope(event, this._dsn, this._options._metadata, this._options.tunnel); for (var attachment of hint.attachments || []) { env = addItemToEnvelope( env, createAttachmentEnvelopeItem( attachment, this._options.transportOptions && this._options.transportOptions.textEncoder, ), ); } this._sendEnvelope(env); } } /** * @inheritDoc */ sendSession(session) { if (this._dsn) { var env = createSessionEnvelope(session, this._dsn, this._options._metadata, this._options.tunnel); this._sendEnvelope(env); } } /** * @inheritDoc */ recordDroppedEvent(reason, category) { if (this._options.sendClientReports) { // We want to track each category (error, transaction, session) separately // but still keep the distinction between different type of outcomes. // We could use nested maps, but it's much easier to read and type this way. // A correct type for map-based implementation if we want to go that route // would be `Partial>>>` // With typescript 4.1 we could even use template literal types var key = `${reason}:${category}`; (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.log */.kg.log(`Adding outcome: "${key}"`); // The following works because undefined + 1 === NaN and NaN is falsy this._outcomes[key] = this._outcomes[key] + 1 || 1; } } /** Updates existing session based on the provided event */ _updateSessionFromEvent(session, event) { let crashed = false; let errored = false; var exceptions = event.exception && event.exception.values; if (exceptions) { errored = true; for (var ex of exceptions) { var mechanism = ex.mechanism; if (mechanism && mechanism.handled === false) { crashed = true; break; } } } // A session is updated and that session update is sent in only one of the two following scenarios: // 1. Session with non terminal status and 0 errors + an error occurred -> Will set error count to 1 and send update // 2. Session with non terminal status and 1 error + a crash occurred -> Will set status crashed and send update var sessionNonTerminal = session.status === 'ok'; var shouldUpdateAndSend = (sessionNonTerminal && session.errors === 0) || (sessionNonTerminal && crashed); if (shouldUpdateAndSend) { (0,esm_session/* updateSession */.CT)(session, { ...(crashed && { status: 'crashed' }), errors: session.errors || Number(errored || crashed), }); this.captureSession(session); } } /** * Determine if the client is finished processing. Returns a promise because it will wait `timeout` ms before saying * "no" (resolving to `false`) in order to give the client a chance to potentially finish first. * * @param timeout The time, in ms, after which to resolve to `false` if the client is still busy. Passing `0` (or not * passing anything) will make the promise wait as long as it takes for processing to finish before resolving to * `true`. * @returns A promise which will resolve to `true` if processing is already done or finishes before the timeout, and * `false` otherwise */ _isClientDoneProcessing(timeout) { return new syncpromise/* SyncPromise */.cW(resolve => { let ticked = 0; var tick = 1; var interval = setInterval(() => { if (this._numProcessing == 0) { clearInterval(interval); resolve(true); } else { ticked += tick; if (timeout && ticked >= timeout) { clearInterval(interval); resolve(false); } } }, tick); }); } /** Determines whether this SDK is enabled and a valid Dsn is present. */ _isEnabled() { 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 information about the original exception. * @param scope A scope containing event metadata. * @returns A new event with more information. */ _prepareEvent(event, hint, scope) { const { normalizeDepth = 3, normalizeMaxBreadth = 1000 } = this.getOptions(); var prepared = { ...event, event_id: event.event_id || hint.event_id || (0,misc/* uuid4 */.DM)(), timestamp: event.timestamp || (0,time/* dateTimestampInSeconds */.yW)(), }; this._applyClientOptions(prepared); this._applyIntegrationsMetadata(prepared); // If we have scope given to us, use it as the base for further modifications. // This allows us to prevent unnecessary copying of data if `captureContext` is not provided. let finalScope = scope; if (hint.captureContext) { finalScope = esm_scope/* Scope.clone */.s.clone(finalScope).update(hint.captureContext); } // We prepare the result here with a resolved Event. let result = (0,syncpromise/* resolvedSyncPromise */.WD)(prepared); // This should be the last thing called, since we want that // {@link Hub.addEventProcessor} gets the finished prepared event. if (finalScope) { // Collect attachments from the hint and scope var attachments = [...(hint.attachments || []), ...finalScope.getAttachments()]; if (attachments.length) { hint.attachments = attachments; } // In case we have a hub we reassign it. result = finalScope.applyToEvent(prepared, hint); } return result.then(evt => { if (typeof normalizeDepth === 'number' && normalizeDepth > 0) { return this._normalizeEvent(evt, normalizeDepth, normalizeMaxBreadth); } 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 */ _normalizeEvent(event, depth, maxBreadth) { if (!event) { return null; } var normalized = { ...event, ...(event.breadcrumbs && { breadcrumbs: event.breadcrumbs.map(b => ({ ...b, ...(b.data && { data: normalize(b.data, depth, maxBreadth), }), })), }), ...(event.user && { user: normalize(event.user, depth, maxBreadth), }), ...(event.contexts && { contexts: normalize(event.contexts, depth, maxBreadth), }), ...(event.extra && { extra: normalize(event.extra, depth, maxBreadth), }), }; // event.contexts.trace stores information about a Transaction. Similarly, // event.spans[] stores information about child Spans. Given that a // Transaction is conceptually a Span, normalization should apply to both // Transactions and Spans consistently. // For now the decision is to skip normalization of Transactions and Spans, // so this block overwrites the normalized event to add back the original // Transaction information prior to normalization. if (event.contexts && event.contexts.trace && normalized.contexts) { normalized.contexts.trace = event.contexts.trace; // event.contexts.trace.data may contain circular/dangerous data so we need to normalize it if (event.contexts.trace.data) { normalized.contexts.trace.data = normalize(event.contexts.trace.data, depth, maxBreadth); } } // event.spans[].data may contain circular/dangerous data so we need to normalize it if (event.spans) { normalized.spans = event.spans.map(span => { // We cannot use the spread operator here because `toJSON` on `span` is non-enumerable if (span.data) { span.data = normalize(span.data, depth, maxBreadth); } return span; }); } return normalized; } /** * Enhances event using the client configuration. * It takes care of all "static" values like environment, release and `dist`, * as well as truncating overly long values. * @param event event instance to be enhanced */ _applyClientOptions(event) { var options = this.getOptions(); const { environment, release, dist, maxValueLength = 250 } = options; if (!('environment' in event)) { event.environment = 'environment' in options ? environment : 'production'; } if (event.release === undefined && release !== undefined) { event.release = release; } if (event.dist === undefined && dist !== undefined) { event.dist = dist; } if (event.message) { event.message = (0,string/* truncate */.$G)(event.message, maxValueLength); } var exception = event.exception && event.exception.values && event.exception.values[0]; if (exception && exception.value) { exception.value = (0,string/* truncate */.$G)(exception.value, maxValueLength); } var request = event.request; if (request && request.url) { request.url = (0,string/* truncate */.$G)(request.url, maxValueLength); } } /** * This function adds all used integrations to the SDK info in the event. * @param event The event that will be filled with all integrations. */ _applyIntegrationsMetadata(event) { var integrationsArray = Object.keys(this._integrations); if (integrationsArray.length > 0) { event.sdk = event.sdk || {}; event.sdk.integrations = [...(event.sdk.integrations || []), ...integrationsArray]; } } /** * Processes the event and logs an error in case of rejection * @param event * @param hint * @param scope */ _captureEvent(event, hint = {}, scope) { return this._processEvent(event, hint, scope).then( finalEvent => { return finalEvent.event_id; }, reason => { if ((typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__)) { // If something's gone wrong, log the error as a warning. If it's just us having used a `SentryError` for // control flow, log just the message (no stack) as a log-level log. var sentryError = reason ; if (sentryError.logLevel === 'log') { esm_logger/* logger.log */.kg.log(sentryError.message); } else { esm_logger/* logger.warn */.kg.warn(sentryError); } } return undefined; }, ); } /** * 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 information 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. */ _processEvent(event, hint, scope) { const { beforeSend, sampleRate } = this.getOptions(); if (!this._isEnabled()) { return (0,syncpromise/* rejectedSyncPromise */.$2)(new SentryError('SDK not enabled, will not capture event.', 'log')); } var isTransaction = event.type === 'transaction'; // 1.0 === 100% events are sent // 0.0 === 0% events are sent // Sampling for transaction happens somewhere else if (!isTransaction && typeof sampleRate === 'number' && Math.random() > sampleRate) { this.recordDroppedEvent('sample_rate', 'error'); return (0,syncpromise/* rejectedSyncPromise */.$2)( new SentryError( `Discarding event because it's not included in the random sample (sampling rate = ${sampleRate})`, 'log', ), ); } return this._prepareEvent(event, hint, scope) .then(prepared => { if (prepared === null) { this.recordDroppedEvent('event_processor', event.type || 'error'); throw new SentryError('An event processor returned null, will not send event.', 'log'); } var isInternalException = hint.data && (hint.data ).__sentry__ === true; if (isInternalException || isTransaction || !beforeSend) { return prepared; } var beforeSendResult = beforeSend(prepared, hint); return _ensureBeforeSendRv(beforeSendResult); }) .then(processedEvent => { if (processedEvent === null) { this.recordDroppedEvent('before_send', event.type || 'error'); throw new SentryError('`beforeSend` returned `null`, will not send event.', 'log'); } var session = scope && scope.getSession(); if (!isTransaction && session) { this._updateSessionFromEvent(session, processedEvent); } // None of the Sentry built event processor will update transaction name, // so if the transaction name has been changed by an event processor, we know // it has to come from custom event processor added by a user var transactionInfo = processedEvent.transaction_info; if (isTransaction && transactionInfo && processedEvent.transaction !== event.transaction) { var source = 'custom'; processedEvent.transaction_info = { ...transactionInfo, source, changes: [ ...transactionInfo.changes, { source, // use the same timestamp as the processed event. timestamp: processedEvent.timestamp , propagations: transactionInfo.propagations, }, ], }; } this.sendEvent(processedEvent, hint); return processedEvent; }) .then(null, reason => { if (reason instanceof SentryError) { throw reason; } this.captureException(reason, { data: { __sentry__: true, }, originalException: reason , }); throw new SentryError( `Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\nReason: ${reason}`, ); }); } /** * Occupies the client with processing and event */ _process(promise) { this._numProcessing += 1; void promise.then( value => { this._numProcessing -= 1; return value; }, reason => { this._numProcessing -= 1; return reason; }, ); } /** * @inheritdoc */ _sendEnvelope(envelope) { if (this._transport && this._dsn) { this._transport.send(envelope).then(null, reason => { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.error */.kg.error('Error while sending event:', reason); }); } else { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.error */.kg.error('Transport disabled'); } } /** * Clears outcomes on this client and returns them. */ _clearOutcomes() { var outcomes = this._outcomes; this._outcomes = {}; return Object.keys(outcomes).map(key => { const [reason, category] = key.split(':') ; return { reason, category, quantity: outcomes[key], }; }); } /** * @inheritDoc */ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types } /** * Verifies that return value of configured `beforeSend` is of expected type. */ function _ensureBeforeSendRv(rv) { var nullErr = '`beforeSend` method has to return `null` or a valid event.'; if ((0,is/* isThenable */.J8)(rv)) { return rv.then( event => { if (!((0,is/* isPlainObject */.PO)(event) || event === null)) { throw new SentryError(nullErr); } return event; }, e => { throw new SentryError(`beforeSend rejected with ${e}`); }, ); } else if (!((0,is/* isPlainObject */.PO)(rv) || rv === null)) { throw new SentryError(nullErr); } return rv; } //# sourceMappingURL=baseclient.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/clientreport.js /** * Creates client report envelope * @param discarded_events An array of discard events * @param dsn A DSN that can be set on the header. Optional. */ function createClientReportEnvelope( discarded_events, dsn, timestamp, ) { var clientReportItem = [ { type: 'client_report' }, { timestamp: timestamp || (0,time/* dateTimestampInSeconds */.yW)(), discarded_events, }, ]; return createEnvelope(dsn ? { dsn } : {}, [clientReportItem]); } //# sourceMappingURL=clientreport.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/eventbuilder.js /** * This function creates an exception from a JavaScript Error */ function exceptionFromError(stackParser, ex) { // Get the frames first since Opera can lose the stack if we touch anything else first var frames = parseStackFrames(stackParser, ex); var exception = { type: ex && ex.name, value: extractMessage(ex), }; if (frames.length) { exception.stacktrace = { frames }; } if (exception.type === undefined && exception.value === '') { exception.value = 'Unrecoverable error caught'; } return exception; } /** * @hidden */ function eventFromPlainObject( stackParser, exception, syntheticException, isUnhandledRejection, ) { var hub = (0,esm_hub/* getCurrentHub */.Gd)(); var client = hub.getClient(); var normalizeDepth = client && client.getOptions().normalizeDepth; var event = { exception: { values: [ { type: (0,is/* isEvent */.cO)(exception) ? exception.constructor.name : isUnhandledRejection ? 'UnhandledRejection' : 'Error', value: `Non-Error ${ isUnhandledRejection ? 'promise rejection' : 'exception' } captured with keys: ${(0,object/* extractExceptionKeysForMessage */.zf)(exception)}`, }, ], }, extra: { __serialized__: normalizeToSize(exception, normalizeDepth), }, }; if (syntheticException) { var frames = parseStackFrames(stackParser, syntheticException); if (frames.length) { // event.exception.values[0] has been set above (event.exception ).values[0].stacktrace = { frames }; } } return event; } /** * @hidden */ function eventFromError(stackParser, ex) { return { exception: { values: [exceptionFromError(stackParser, ex)], }, }; } /** Parses stack frames from an error */ function parseStackFrames( stackParser, ex, ) { // 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 || ex.stack || ''; var popSize = getPopSize(ex); try { return stackParser(stacktrace, popSize); } catch (e) { // no-empty } return []; } // Based on our own mapping pattern - https://github.com/getsentry/sentry/blob/9f08305e09866c8bd6d0c24f5b0aabdd7dd6c59c/src/sentry/lang/javascript/errormapping.py#L83-L108 var reactMinifiedRegexp = /Minified React error #\d+;/i; function getPopSize(ex) { if (ex) { if (typeof ex.framesToPop === 'number') { return ex.framesToPop; } if (reactMinifiedRegexp.test(ex.message)) { return 1; } } return 0; } /** * There are cases where stacktrace.message is an Event object * https://github.com/getsentry/sentry-javascript/issues/1949 * In this specific case we try to extract stacktrace.message.error.message */ function extractMessage(ex) { var message = ex && ex.message; if (!message) { return 'No error message'; } if (message.error && typeof message.error.message === 'string') { return message.error.message; } return message; } /** * Creates an {@link Event} from all inputs to `captureException` and non-primitive inputs to `captureMessage`. * @hidden */ function eventFromException( stackParser, exception, hint, attachStacktrace, ) { var syntheticException = (hint && hint.syntheticException) || undefined; var event = eventFromUnknownInput(stackParser, exception, syntheticException, attachStacktrace); (0,misc/* addExceptionMechanism */.EG)(event); // defaults to { type: 'generic', handled: true } event.level = 'error'; if (hint && hint.event_id) { event.event_id = hint.event_id; } return (0,syncpromise/* resolvedSyncPromise */.WD)(event); } /** * Builds and Event from a Message * @hidden */ function eventFromMessage( stackParser, message, // eslint-disable-next-line deprecation/deprecation level = 'info', hint, attachStacktrace, ) { var syntheticException = (hint && hint.syntheticException) || undefined; var event = eventFromString(stackParser, message, syntheticException, attachStacktrace); event.level = level; if (hint && hint.event_id) { event.event_id = hint.event_id; } return (0,syncpromise/* resolvedSyncPromise */.WD)(event); } /** * @hidden */ function eventFromUnknownInput( stackParser, exception, syntheticException, attachStacktrace, isUnhandledRejection, ) { let event; if ((0,is/* isErrorEvent */.VW)(exception ) && (exception ).error) { // If it is an ErrorEvent with `error` property, extract it to get actual Error var errorEvent = exception ; return eventFromError(stackParser, errorEvent.error ); } // If it is a `DOMError` (which is a legacy API, but still supported in some browsers) then we just extract the name // and message, as it doesn't provide anything else. According to the spec, all `DOMExceptions` should also be // `Error`s, but that's not the case in IE11, so in that case we treat it the same as we do a `DOMError`. // // https://developer.mozilla.org/en-US/docs/Web/API/DOMError // https://developer.mozilla.org/en-US/docs/Web/API/DOMException // https://webidl.spec.whatwg.org/#es-DOMException-specialness if ((0,is/* isDOMError */.TX)(exception ) || (0,is/* isDOMException */.fm)(exception )) { var domException = exception ; if ('stack' in (exception )) { event = eventFromError(stackParser, exception ); } else { var name = domException.name || ((0,is/* isDOMError */.TX)(domException) ? 'DOMError' : 'DOMException'); var message = domException.message ? `${name}: ${domException.message}` : name; event = eventFromString(stackParser, message, syntheticException, attachStacktrace); (0,misc/* addExceptionTypeValue */.Db)(event, message); } if ('code' in domException) { event.tags = { ...event.tags, 'DOMException.code': `${domException.code}` }; } return event; } if ((0,is/* isError */.VZ)(exception)) { // we have a real Error object, do nothing return eventFromError(stackParser, exception); } if ((0,is/* isPlainObject */.PO)(exception) || (0,is/* isEvent */.cO)(exception)) { // If it's a plain object or an instance of `Event` (the built-in JS kind, not this SDK's `Event` type), serialize // it manually. This will allow us to group events based on top-level keys which is much better than creating a new // group on any key/value change. var objectException = exception ; event = eventFromPlainObject(stackParser, objectException, syntheticException, isUnhandledRejection); (0,misc/* addExceptionMechanism */.EG)(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(stackParser, exception , syntheticException, attachStacktrace); (0,misc/* addExceptionTypeValue */.Db)(event, `${exception}`, undefined); (0,misc/* addExceptionMechanism */.EG)(event, { synthetic: true, }); return event; } /** * @hidden */ function eventFromString( stackParser, input, syntheticException, attachStacktrace, ) { var event = { message: input, }; if (attachStacktrace && syntheticException) { var frames = parseStackFrames(stackParser, syntheticException); if (frames.length) { event.exception = { values: [{ value: input, stacktrace: { frames } }], }; } } return event; } //# sourceMappingURL=eventbuilder.js.map // EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/browser.js var browser = __webpack_require__(8464); ;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/severity.js // Note: Ideally the `SeverityLevel` type would be derived from `validSeverityLevels`, but that would mean either // // a) moving `validSeverityLevels` to `@sentry/types`, // b) moving the`SeverityLevel` type here, or // c) importing `validSeverityLevels` from here into `@sentry/types`. // // Option A would make `@sentry/types` a runtime dependency of `@sentry/utils` (not good), and options B and C would // create a circular dependency between `@sentry/types` and `@sentry/utils` (also not good). So a TODO accompanying the // type, reminding anyone who changes it to change this list also, will have to do. var validSeverityLevels = ['fatal', 'error', 'warning', 'log', 'info', 'debug']; /** * Converts a string-based level into a member of the deprecated {@link Severity} enum. * * @deprecated `severityFromString` is deprecated. Please use `severityLevelFromString` instead. * * @param level String representation of Severity * @returns Severity */ function severityFromString(level) { return severityLevelFromString(level) ; } /** * Converts a string-based level into a `SeverityLevel`, normalizing it along the way. * * @param level String representation of desired `SeverityLevel`. * @returns The `SeverityLevel` corresponding to the given string, or 'log' if the string isn't a valid level. */ function severityLevelFromString(level) { return (level === 'warn' ? 'warning' : validSeverityLevels.includes(level) ? level : 'log') ; } //# sourceMappingURL=severity.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/url.js /** * Parses string form of URL into an object * // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B * // intentionally using regex and not href parsing trick because React Native and other * // environments where DOM might not be available * @returns parsed URL object */ function parseUrl(url) { if (!url) { return {}; } var match = url.match(/^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/); if (!match) { return {}; } // coerce to undefined values to empty string so we don't get 'undefined' var query = match[6] || ''; var fragment = match[8] || ''; return { host: match[4], path: match[5], protocol: match[2], relative: match[5] + query + fragment, // everything minus origin }; } /** * Strip the query string and fragment off of a given URL or path (if present) * * @param urlPath Full URL or path, including possible query string and/or fragment * @returns URL or path without query string or fragment */ function stripUrlQueryAndFragment(urlPath) { // eslint-disable-next-line no-useless-escape return urlPath.split(/[\?#]/, 1)[0]; } /** * Returns number of URL segments of a passed string URL. */ function getNumberOfUrlSegments(url) { // split at '/' or at '\/' to split regex urls correctly return url.split(/\\?\//).filter(s => s.length > 0 && s !== ',').length; } //# sourceMappingURL=url.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/integrations/breadcrumbs.js /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /** JSDoc */ var BREADCRUMB_INTEGRATION_ID = 'Breadcrumbs'; /** * Default Breadcrumbs instrumentations * TODO: Deprecated - with v6, this will be renamed to `Instrument` */ class Breadcrumbs { /** * @inheritDoc */ static __initStatic() {this.id = BREADCRUMB_INTEGRATION_ID;} /** * @inheritDoc */ __init() {this.name = Breadcrumbs.id;} /** * Options of the breadcrumbs integration. */ // This field is public, because we use it in the browser client to check if the `sentry` option is enabled. /** * @inheritDoc */ constructor(options) {;Breadcrumbs.prototype.__init.call(this); this.options = { console: true, dom: true, fetch: true, history: true, sentry: true, xhr: true, ...options, }; } /** * Instrument browser built-ins w/ breadcrumb capturing * - Console API * - DOM API (click/typing) * - XMLHttpRequest API * - Fetch API * - History API */ setupOnce() { if (this.options.console) { (0,instrument/* addInstrumentationHandler */.o)('console', _consoleBreadcrumb); } if (this.options.dom) { (0,instrument/* addInstrumentationHandler */.o)('dom', _domBreadcrumb(this.options.dom)); } if (this.options.xhr) { (0,instrument/* addInstrumentationHandler */.o)('xhr', _xhrBreadcrumb); } if (this.options.fetch) { (0,instrument/* addInstrumentationHandler */.o)('fetch', _fetchBreadcrumb); } if (this.options.history) { (0,instrument/* addInstrumentationHandler */.o)('history', _historyBreadcrumb); } } } Breadcrumbs.__initStatic(); /** * A HOC that creaes a function that creates breadcrumbs from DOM API calls. * This is a HOC so that we get access to dom options in the closure. */ // eslint-disable-next-line @typescript-eslint/no-explicit-any function _domBreadcrumb(dom) { // eslint-disable-next-line @typescript-eslint/no-explicit-any function _innerDomBreadcrumb(handlerData) { let target; let keyAttrs = typeof dom === 'object' ? dom.serializeAttribute : undefined; if (typeof keyAttrs === 'string') { keyAttrs = [keyAttrs]; } // Accessing event.target can throw (see getsentry/raven-js#838, #768) try { target = handlerData.event.target ? (0,browser/* htmlTreeAsString */.Rt)(handlerData.event.target , keyAttrs) : (0,browser/* htmlTreeAsString */.Rt)(handlerData.event , keyAttrs); } catch (e) { target = ''; } if (target.length === 0) { return; } (0,esm_hub/* getCurrentHub */.Gd)().addBreadcrumb( { category: `ui.${handlerData.name}`, message: target, }, { event: handlerData.event, name: handlerData.name, global: handlerData.global, }, ); } return _innerDomBreadcrumb; } /** * Creates breadcrumbs from console API calls */ // eslint-disable-next-line @typescript-eslint/no-explicit-any function _consoleBreadcrumb(handlerData) { var breadcrumb = { category: 'console', data: { arguments: handlerData.args, logger: 'console', }, level: severityLevelFromString(handlerData.level), message: (0,string/* safeJoin */.nK)(handlerData.args, ' '), }; if (handlerData.level === 'assert') { if (handlerData.args[0] === false) { breadcrumb.message = `Assertion failed: ${(0,string/* safeJoin */.nK)(handlerData.args.slice(1), ' ') || 'console.assert'}`; breadcrumb.data.arguments = handlerData.args.slice(1); } else { // Don't capture a breadcrumb for passed assertions return; } } (0,esm_hub/* getCurrentHub */.Gd)().addBreadcrumb(breadcrumb, { input: handlerData.args, level: handlerData.level, }); } /** * Creates breadcrumbs from XHR API calls */ // eslint-disable-next-line @typescript-eslint/no-explicit-any function _xhrBreadcrumb(handlerData) { if (handlerData.endTimestamp) { // We only capture complete, non-sentry requests if (handlerData.xhr.__sentry_own_request__) { return; } const { method, url, status_code, body } = handlerData.xhr.__sentry_xhr__ || {}; (0,esm_hub/* getCurrentHub */.Gd)().addBreadcrumb( { category: 'xhr', data: { method, url, status_code, }, type: 'http', }, { xhr: handlerData.xhr, input: body, }, ); return; } } /** * Creates breadcrumbs from fetch API calls */ // eslint-disable-next-line @typescript-eslint/no-explicit-any function _fetchBreadcrumb(handlerData) { // We only capture complete fetch requests if (!handlerData.endTimestamp) { return; } if (handlerData.fetchData.url.match(/sentry_key/) && handlerData.fetchData.method === 'POST') { // We will not create breadcrumbs for fetch requests that contain `sentry_key` (internal sentry requests) return; } if (handlerData.error) { (0,esm_hub/* getCurrentHub */.Gd)().addBreadcrumb( { category: 'fetch', data: handlerData.fetchData, level: 'error', type: 'http', }, { data: handlerData.error, input: handlerData.args, }, ); } else { (0,esm_hub/* getCurrentHub */.Gd)().addBreadcrumb( { category: 'fetch', data: { ...handlerData.fetchData, status_code: handlerData.response.status, }, type: 'http', }, { input: handlerData.args, response: handlerData.response, }, ); } } /** * Creates breadcrumbs from history API calls */ // eslint-disable-next-line @typescript-eslint/no-explicit-any function _historyBreadcrumb(handlerData) { var global = (0,esm_global/* getGlobalObject */.R)(); let from = handlerData.from; let to = handlerData.to; var parsedLoc = parseUrl(global.location.href); let parsedFrom = parseUrl(from); var parsedTo = parseUrl(to); // Initial pushState doesn't provide `from` information if (!parsedFrom.path) { parsedFrom = parsedLoc; } // Use only the path component of the URL if the URL matches the current // document (almost all the time when using pushState) if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) { to = parsedTo.relative; } if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) { from = parsedFrom.relative; } (0,esm_hub/* getCurrentHub */.Gd)().addBreadcrumb({ category: 'navigation', data: { from, to, }, }); } //# sourceMappingURL=breadcrumbs.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/client.js var globalObject = (0,esm_global/* getGlobalObject */.R)(); /** * The Sentry Browser SDK Client. * * @see BrowserOptions for documentation on configuration options. * @see SentryClient for usage documentation. */ class BrowserClient extends BaseClient { /** * Creates a new Browser SDK instance. * * @param options Configuration options for this SDK. */ constructor(options) { options._metadata = options._metadata || {}; options._metadata.sdk = options._metadata.sdk || { name: 'sentry.javascript.browser', packages: [ { name: 'npm:@sentry/browser', version: SDK_VERSION, }, ], version: SDK_VERSION, }; super(options); if (options.sendClientReports && globalObject.document) { globalObject.document.addEventListener('visibilitychange', () => { if (globalObject.document.visibilityState === 'hidden') { this._flushOutcomes(); } }); } } /** * @inheritDoc */ eventFromException(exception, hint) { return eventFromException(this._options.stackParser, exception, hint, this._options.attachStacktrace); } /** * @inheritDoc */ eventFromMessage( message, // eslint-disable-next-line deprecation/deprecation level = 'info', hint, ) { return eventFromMessage(this._options.stackParser, message, level, hint, this._options.attachStacktrace); } /** * @inheritDoc */ sendEvent(event, hint) { // We only want to add the sentry event breadcrumb when the user has the breadcrumb integration installed and // activated its `sentry` option. // We also do not want to use the `Breadcrumbs` class here directly, because we do not want it to be included in // bundles, if it is not used by the SDK. // This all sadly is a bit ugly, but we currently don't have a "pre-send" hook on the integrations so we do it this // way for now. var breadcrumbIntegration = this.getIntegrationById(BREADCRUMB_INTEGRATION_ID) ; if ( breadcrumbIntegration && // We check for definedness of `options`, even though it is not strictly necessary, because that access to // `.sentry` below does not throw, in case users provided their own integration with id "Breadcrumbs" that does // not have an`options` field breadcrumbIntegration.options && breadcrumbIntegration.options.sentry ) { (0,esm_hub/* getCurrentHub */.Gd)().addBreadcrumb( { category: `sentry.${event.type === 'transaction' ? 'transaction' : 'event'}`, event_id: event.event_id, level: event.level, message: (0,misc/* getEventDescription */.jH)(event), }, { event, }, ); } super.sendEvent(event, hint); } /** * @inheritDoc */ _prepareEvent(event, hint, scope) { event.platform = event.platform || 'javascript'; return super._prepareEvent(event, hint, scope); } /** * Sends client reports as an envelope. */ _flushOutcomes() { var outcomes = this._clearOutcomes(); if (outcomes.length === 0) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.log */.kg.log('No outcomes to send'); return; } if (!this._dsn) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.log */.kg.log('No dsn provided, will not send outcomes'); return; } (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.log */.kg.log('Sending outcomes:', outcomes); var url = getEnvelopeEndpointWithUrlEncodedAuth(this._dsn, this._options); var envelope = createClientReportEnvelope(outcomes, this._options.tunnel && dsn_dsnToString(this._dsn)); try { var global = (0,esm_global/* getGlobalObject */.R)(); var isRealNavigator = Object.prototype.toString.call(global && global.navigator) === '[object Navigator]'; var hasSendBeacon = isRealNavigator && typeof global.navigator.sendBeacon === 'function'; // Make sure beacon is not used if user configures custom transport options if (hasSendBeacon && !this._options.transportOptions) { // Prevent illegal invocations - https://xgwang.me/posts/you-may-not-know-beacon/#it-may-throw-error%2C-be-sure-to-catch var sendBeacon = global.navigator.sendBeacon.bind(global.navigator); sendBeacon(url, serializeEnvelope(envelope)); } else { // If beacon is not supported or if they are using the tunnel option // use our regular transport to send client reports to Sentry. this._sendEnvelope(envelope); } } catch (e) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.error */.kg.error(e); } } } //# sourceMappingURL=client.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/stack-parsers.js // global reference to slice var UNKNOWN_FUNCTION = '?'; var OPERA10_PRIORITY = 10; var OPERA11_PRIORITY = 20; var CHROME_PRIORITY = 30; var WINJS_PRIORITY = 40; var GECKO_PRIORITY = 50; function createFrame(filename, func, lineno, colno) { var frame = { filename, function: func, // All browser frames are considered in_app in_app: true, }; if (lineno !== undefined) { frame.lineno = lineno; } if (colno !== undefined) { frame.colno = colno; } return frame; } // Chromium based browsers: Chrome, Brave, new Opera, new Edge var chromeRegex = /^\s*at (?:(.*\).*?|.*?) ?\((?:address at )?)?((?:file|https?|blob|chrome-extension|address|native|eval|webpack||[-a-z]+:|.*bundle|\/)?.*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i; var chromeEvalRegex = /\((\S*)(?::(\d+))(?::(\d+))\)/; var chrome = line => { var parts = chromeRegex.exec(line); if (parts) { var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line if (isEval) { var subMatch = chromeEvalRegex.exec(parts[2]); if (subMatch) { // 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 } } // Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now // would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable) const [func, filename] = extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2]); return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined); } return; }; var chromeStackLineParser = [CHROME_PRIORITY, chrome]; // gecko regex: `(?:bundle|\d+\.js)`: `bundle` is for react native, `\d+\.js` also but specifically for ram bundles because it // generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js // We need this specific case for now because we want no other regex to match. var geckoREgex = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension|safari-extension|safari-web-extension|capacitor)?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js)|\/[\w\-. /=]+)(?::(\d+))?(?::(\d+))?\s*$/i; var geckoEvalRegex = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i; var gecko = line => { var parts = geckoREgex.exec(line); if (parts) { var isEval = parts[3] && parts[3].indexOf(' > eval') > -1; if (isEval) { var subMatch = geckoEvalRegex.exec(parts[3]); if (subMatch) { // 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 } } let filename = parts[3]; let func = parts[1] || UNKNOWN_FUNCTION; [func, filename] = extractSafariExtensionDetails(func, filename); return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined); } return; }; var geckoStackLineParser = [GECKO_PRIORITY, gecko]; var winjsRegex = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i; var winjs = line => { var parts = winjsRegex.exec(line); return parts ? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined) : undefined; }; var winjsStackLineParser = [WINJS_PRIORITY, winjs]; var opera10Regex = / line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i; var opera10 = line => { var parts = opera10Regex.exec(line); return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined; }; var opera10StackLineParser = [OPERA10_PRIORITY, opera10]; var opera11Regex = / line (\d+), column (\d+)\s*(?:in (?:]+)>|([^)]+))\(.*\))? in (.*):\s*$/i; var opera11 = line => { var parts = opera11Regex.exec(line); return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined; }; var opera11StackLineParser = [OPERA11_PRIORITY, opera11]; var defaultStackLineParsers = [chromeStackLineParser, geckoStackLineParser, winjsStackLineParser]; var defaultStackParser = (0,stacktrace/* createStackParser */.pE)(...defaultStackLineParsers); /** * Safari web extensions, starting version unknown, can produce "frames-only" stacktraces. * What it means, is that instead of format like: * * Error: wat * at function@url:row:col * at function@url:row:col * at function@url:row:col * * it produces something like: * * function@url:row:col * function@url:row:col * function@url:row:col * * Because of that, it won't be captured by `chrome` RegExp and will fall into `Gecko` branch. * This function is extracted so that we can use it in both places without duplicating the logic. * Unfortunately "just" changing RegExp is too complicated now and making it pass all tests * and fix this case seems like an impossible, or at least way too time-consuming task. */ var extractSafariExtensionDetails = (func, filename) => { var isSafariExtension = func.indexOf('safari-extension') !== -1; var isSafariWebExtension = func.indexOf('safari-web-extension') !== -1; return isSafariExtension || isSafariWebExtension ? [ func.indexOf('@') !== -1 ? func.split('@')[0] : UNKNOWN_FUNCTION, isSafariExtension ? `safari-extension:${filename}` : `safari-web-extension:${filename}`, ] : [func, filename]; }; //# sourceMappingURL=stack-parsers.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/exports.js // Note: All functions in this file are typed with a return value of `ReturnType`, // where HUB_FUNCTION is some method on the Hub class. // // This is done to make sure the top level SDK methods stay in sync with the hub methods. // Although every method here has an explicit return type, some of them (that map to void returns) do not // contain `return` keywords. This is done to save on bundle size, as `return` is not minifiable. /** * Captures an exception event and sends it to Sentry. * * @param exception An exception-like object. * @param captureContext Additional scope data to apply to exception event. * @returns The generated eventId. */ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types function captureException(exception, captureContext) { return (0,esm_hub/* getCurrentHub */.Gd)().captureException(exception, { captureContext }); } /** * Captures a message event and sends it to Sentry. * * @param message The message to send to Sentry. * @param Severity Define the level of the message. * @returns The generated eventId. */ function captureMessage( message, // eslint-disable-next-line deprecation/deprecation captureContext, ) { // This is necessary to provide explicit scopes upgrade, without changing the original // arity of the `captureMessage(message, level)` method. var level = typeof captureContext === 'string' ? captureContext : undefined; var context = typeof captureContext !== 'string' ? { captureContext } : undefined; return getCurrentHub().captureMessage(message, level, context); } /** * Captures a manually created event and sends it to Sentry. * * @param event The event to send to Sentry. * @returns The generated eventId. */ function captureEvent(event, hint) { return getCurrentHub().captureEvent(event, hint); } /** * Callback to set context information onto the scope. * @param callback Callback function that receives Scope. */ function configureScope(callback) { (0,esm_hub/* getCurrentHub */.Gd)().configureScope(callback); } /** * Records a new breadcrumb which will be attached to future events. * * Breadcrumbs will be added to subsequent events to provide more context on * user's actions prior to an error or crash. * * @param breadcrumb The breadcrumb to record. */ function addBreadcrumb(breadcrumb) { getCurrentHub().addBreadcrumb(breadcrumb); } /** * Sets context data with the given name. * @param name of the context * @param context Any kind of data. This data will be normalized. */ // eslint-disable-next-line @typescript-eslint/no-explicit-any function setContext(name, context) { getCurrentHub().setContext(name, context); } /** * Set an object that will be merged sent as extra data with the event. * @param extras Extras object to merge into current context. */ function setExtras(extras) { getCurrentHub().setExtras(extras); } /** * Set key:value that will be sent as extra data with the event. * @param key String of extra * @param extra Any kind of data. This data will be normalized. */ function setExtra(key, extra) { getCurrentHub().setExtra(key, extra); } /** * Set an object that will be merged sent as tags data with the event. * @param tags Tags context object to merge into current context. */ function setTags(tags) { getCurrentHub().setTags(tags); } /** * Set key:value that will be sent as tags data with the event. * * Can also be used to unset a tag, by passing `undefined`. * * @param key String key of tag * @param value Value of tag */ function setTag(key, value) { getCurrentHub().setTag(key, value); } /** * Updates user context information for future events. * * @param user User context object to be set in the current context. Pass `null` to unset the user. */ function setUser(user) { getCurrentHub().setUser(user); } /** * Creates a new scope with and executes the given operation within. * The scope is automatically removed once the operation * finishes or throws. * * This is essentially a convenience function for: * * pushScope(); * callback(); * popScope(); * * @param callback that will be enclosed into push/popScope. */ function withScope(callback) { (0,esm_hub/* getCurrentHub */.Gd)().withScope(callback); } /** * Starts a new `Transaction` and returns it. This is the entry point to manual tracing instrumentation. * * A tree structure can be built by adding child spans to the transaction, and child spans to other spans. To start a * new child span within the transaction or any span, call the respective `.startChild()` method. * * Every child span must be finished before the transaction is finished, otherwise the unfinished spans are discarded. * * The transaction must be finished with a call to its `.finish()` method, at which point the transaction with all its * finished child spans will be sent to Sentry. * * NOTE: This function should only be used for *manual* instrumentation. Auto-instrumentation should call * `startTransaction` directly on the hub. * * @param context Properties of the new `Transaction`. * @param customSamplingContext Information given to the transaction sampling function (along with context-dependent * default values). See {@link Options.tracesSampler}. * * @returns The transaction which was just started */ function startTransaction( context, customSamplingContext, ) { return getCurrentHub().startTransaction({ ...context }, customSamplingContext); } //# sourceMappingURL=exports.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/helpers.js let ignoreOnError = 0; /** * @hidden */ function shouldIgnoreOnError() { return ignoreOnError > 0; } /** * @hidden */ function ignoreNextOnError() { // onerror should trigger before setTimeout ignoreOnError += 1; setTimeout(() => { 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. It is generally safe to pass an unbound function, because the returned wrapper always * has a correct `this` context. * @returns The wrapped function. * @hidden */ function wrap( fn, options = {}, before, // eslint-disable-next-line @typescript-eslint/no-explicit-any ) { // for future readers what this does is wrap a function and then create // a bi-directional wrapping between them. // // example: wrapped = wrap(original); // original.__sentry_wrapped__ -> wrapped // wrapped.__sentry_original__ -> original if (typeof fn !== 'function') { return fn; } try { // if we're dealing with a function that was previously wrapped, return // the original wrapper. var wrapper = fn.__sentry_wrapped__; if (wrapper) { return wrapper; } // We don't wanna wrap it twice if ((0,object/* getOriginalFunction */.HK)(fn)) { return fn; } } 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; } /* eslint-disable prefer-rest-params */ // It is important that `sentryWrapped` is not an arrow function to preserve the context of `this` var sentryWrapped = function () { var args = Array.prototype.slice.call(arguments); try { if (before && typeof before === 'function') { before.apply(this, arguments); } // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access var wrappedArguments = args.map((arg) => wrap(arg, options)); // 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); } catch (ex) { ignoreNextOnError(); withScope((scope) => { scope.addEventProcessor((event) => { if (options.mechanism) { (0,misc/* addExceptionTypeValue */.Db)(event, undefined, undefined); (0,misc/* addExceptionMechanism */.EG)(event, options.mechanism); } event.extra = { ...event.extra, arguments: args, }; return event; }); captureException(ex); }); throw ex; } }; /* eslint-enable prefer-rest-params */ // Accessing some objects may throw // ref: https://github.com/getsentry/sentry-javascript/issues/1168 try { for (var property in fn) { if (Object.prototype.hasOwnProperty.call(fn, property)) { sentryWrapped[property] = fn[property]; } } } catch (_oO) {} // eslint-disable-line no-empty // Signal that this function has been wrapped/filled already // for both debugging and to prevent it to being wrapped/filled twice (0,object/* markFunctionWrapped */.$Q)(sentryWrapped, fn); (0,object/* addNonEnumerableProperty */.xp)(fn, '__sentry_wrapped__', sentryWrapped); // Restore original function name (not all browsers allow that) try { var descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name') ; if (descriptor.configurable) { Object.defineProperty(sentryWrapped, 'name', { get() { return fn.name; }, }); } // eslint-disable-next-line no-empty } catch (_oO) {} return sentryWrapped; } /** * All properties the report dialog supports */ //# sourceMappingURL=helpers.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/integrations/trycatch.js var DEFAULT_EVENT_TARGET = [ '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', ]; /** Wrap timer functions and event targets to catch errors and provide better meta data */ class TryCatch { /** * @inheritDoc */ static __initStatic() {this.id = 'TryCatch';} /** * @inheritDoc */ __init() {this.name = TryCatch.id;} /** JSDoc */ /** * @inheritDoc */ constructor(options) {;TryCatch.prototype.__init.call(this); this._options = { XMLHttpRequest: true, eventTarget: true, requestAnimationFrame: true, setInterval: true, setTimeout: true, ...options, }; } /** * Wrap timer functions and event targets to catch errors * and provide better metadata. */ setupOnce() { var global = (0,esm_global/* getGlobalObject */.R)(); if (this._options.setTimeout) { (0,object/* fill */.hl)(global, 'setTimeout', _wrapTimeFunction); } if (this._options.setInterval) { (0,object/* fill */.hl)(global, 'setInterval', _wrapTimeFunction); } if (this._options.requestAnimationFrame) { (0,object/* fill */.hl)(global, 'requestAnimationFrame', _wrapRAF); } if (this._options.XMLHttpRequest && 'XMLHttpRequest' in global) { (0,object/* fill */.hl)(XMLHttpRequest.prototype, 'send', _wrapXHR); } var eventTargetOption = this._options.eventTarget; if (eventTargetOption) { var eventTarget = Array.isArray(eventTargetOption) ? eventTargetOption : DEFAULT_EVENT_TARGET; eventTarget.forEach(_wrapEventTarget); } } } TryCatch.__initStatic(); /** JSDoc */ function _wrapTimeFunction(original) { // eslint-disable-next-line @typescript-eslint/no-explicit-any return function ( ...args) { var originalCallback = args[0]; args[0] = wrap(originalCallback, { mechanism: { data: { function: (0,stacktrace/* getFunctionName */.$P)(original) }, handled: true, type: 'instrument', }, }); return original.apply(this, args); }; } /** JSDoc */ // eslint-disable-next-line @typescript-eslint/no-explicit-any function _wrapRAF(original) { // eslint-disable-next-line @typescript-eslint/no-explicit-any return function ( callback) { // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access return original.apply(this, [ wrap(callback, { mechanism: { data: { function: 'requestAnimationFrame', handler: (0,stacktrace/* getFunctionName */.$P)(original), }, handled: true, type: 'instrument', }, }), ]); }; } /** JSDoc */ function _wrapXHR(originalSend) { // eslint-disable-next-line @typescript-eslint/no-explicit-any return function ( ...args) { // eslint-disable-next-line @typescript-eslint/no-this-alias var xhr = this; var xmlHttpRequestProps = ['onload', 'onerror', 'onprogress', 'onreadystatechange']; xmlHttpRequestProps.forEach(prop => { if (prop in xhr && typeof xhr[prop] === 'function') { // eslint-disable-next-line @typescript-eslint/no-explicit-any (0,object/* fill */.hl)(xhr, prop, function (original) { var wrapOptions = { mechanism: { data: { function: prop, handler: (0,stacktrace/* getFunctionName */.$P)(original), }, handled: true, type: 'instrument', }, }; // If Instrument integration has been called before TryCatch, get the name of original function var originalFunction = (0,object/* getOriginalFunction */.HK)(original); if (originalFunction) { wrapOptions.mechanism.data.handler = (0,stacktrace/* getFunctionName */.$P)(originalFunction); } // Otherwise wrap directly return wrap(original, wrapOptions); }); } }); return originalSend.apply(this, args); }; } /** JSDoc */ function _wrapEventTarget(target) { // eslint-disable-next-line @typescript-eslint/no-explicit-any var global = (0,esm_global/* getGlobalObject */.R)() ; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access var proto = global[target] && global[target].prototype; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, no-prototype-builtins if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) { return; } (0,object/* fill */.hl)(proto, 'addEventListener', function (original) { return function ( // eslint-disable-next-line @typescript-eslint/no-explicit-any eventName, fn, options, ) { try { if (typeof fn.handleEvent === 'function') { // ESlint disable explanation: // First, it is generally safe to call `wrap` with an unbound function. Furthermore, using `.bind()` would // introduce a bug here, because bind returns a new function that doesn't have our // flags(like __sentry_original__) attached. `wrap` checks for those flags to avoid unnecessary wrapping. // Without those flags, every call to addEventListener wraps the function again, causing a memory leak. // eslint-disable-next-line @typescript-eslint/unbound-method fn.handleEvent = wrap(fn.handleEvent, { mechanism: { data: { function: 'handleEvent', handler: (0,stacktrace/* getFunctionName */.$P)(fn), target, }, handled: true, type: 'instrument', }, }); } } catch (err) { // can sometimes get 'Permission denied to access property "handle Event' } return original.apply(this, [ eventName, // eslint-disable-next-line @typescript-eslint/no-explicit-any wrap(fn , { mechanism: { data: { function: 'addEventListener', handler: (0,stacktrace/* getFunctionName */.$P)(fn), target, }, handled: true, type: 'instrument', }, }), options, ]); }; }); (0,object/* fill */.hl)( proto, 'removeEventListener', function ( originalRemoveEventListener, // eslint-disable-next-line @typescript-eslint/no-explicit-any ) { return function ( // eslint-disable-next-line @typescript-eslint/no-explicit-any eventName, fn, options, ) { /** * There are 2 possible scenarios here: * * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function * as a pass-through, and call original `removeEventListener` with it. * * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using * our wrapped version of `addEventListener`, which internally calls `wrap` helper. * This helper "wraps" whole callback inside a try/catch statement, and attached appropriate metadata to it, * in order for us to make a distinction between wrapped/non-wrapped functions possible. * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler. * * When someone adds a handler prior to initialization, and then do it again, but after, * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible * to get rid of the initial handler and it'd stick there forever. */ var wrappedEventHandler = fn ; try { var originalEventHandler = wrappedEventHandler && wrappedEventHandler.__sentry_wrapped__; if (originalEventHandler) { originalRemoveEventListener.call(this, eventName, originalEventHandler, options); } } catch (e) { // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments } return originalRemoveEventListener.call(this, eventName, wrappedEventHandler, options); }; }, ); } //# sourceMappingURL=trycatch.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/integrations/globalhandlers.js /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /** Global handlers */ class GlobalHandlers { /** * @inheritDoc */ static __initStatic() {this.id = 'GlobalHandlers';} /** * @inheritDoc */ __init() {this.name = GlobalHandlers.id;} /** JSDoc */ /** * Stores references functions to installing handlers. Will set to undefined * after they have been run so that they are not used twice. */ __init2() {this._installFunc = { onerror: _installGlobalOnErrorHandler, onunhandledrejection: _installGlobalOnUnhandledRejectionHandler, };} /** JSDoc */ constructor(options) {;GlobalHandlers.prototype.__init.call(this);GlobalHandlers.prototype.__init2.call(this); this._options = { onerror: true, onunhandledrejection: true, ...options, }; } /** * @inheritDoc */ setupOnce() { Error.stackTraceLimit = 50; var options = this._options; // We can disable guard-for-in as we construct the options object above + do checks against // `this._installFunc` for the property. // eslint-disable-next-line guard-for-in for (var key in options) { var installFunc = this._installFunc[key ]; if (installFunc && options[key ]) { globalHandlerLog(key); installFunc(); this._installFunc[key ] = undefined; } } } } GlobalHandlers.__initStatic(); /** JSDoc */ function _installGlobalOnErrorHandler() { (0,instrument/* addInstrumentationHandler */.o)( 'error', // eslint-disable-next-line @typescript-eslint/no-explicit-any (data) => { const [hub, stackParser, attachStacktrace] = getHubAndOptions(); if (!hub.getIntegration(GlobalHandlers)) { return; } const { msg, url, line, column, error } = data; if (shouldIgnoreOnError() || (error && error.__sentry_own_request__)) { return; } var event = error === undefined && (0,is/* isString */.HD)(msg) ? _eventFromIncompleteOnError(msg, url, line, column) : _enhanceEventWithInitialFrame( eventFromUnknownInput(stackParser, error || msg, undefined, attachStacktrace, false), url, line, column, ); event.level = 'error'; addMechanismAndCapture(hub, error, event, 'onerror'); }, ); } /** JSDoc */ function _installGlobalOnUnhandledRejectionHandler() { (0,instrument/* addInstrumentationHandler */.o)( 'unhandledrejection', // eslint-disable-next-line @typescript-eslint/no-explicit-any (e) => { const [hub, stackParser, attachStacktrace] = getHubAndOptions(); if (!hub.getIntegration(GlobalHandlers)) { return; } let error = e; // dig the object of the rejection out of known event types try { // PromiseRejectionEvents store the object of the rejection under 'reason' // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent if ('reason' in e) { error = e.reason; } // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and // https://github.com/getsentry/sentry-javascript/issues/2380 else if ('detail' in e && 'reason' in e.detail) { error = e.detail.reason; } } catch (_oO) { // no-empty } if (shouldIgnoreOnError() || (error && error.__sentry_own_request__)) { return true; } var event = (0,is/* isPrimitive */.pt)(error) ? _eventFromRejectionWithPrimitive(error) : eventFromUnknownInput(stackParser, error, undefined, attachStacktrace, true); event.level = 'error'; addMechanismAndCapture(hub, error, event, 'onunhandledrejection'); return; }, ); } /** * Create an event from a promise rejection where the `reason` is a primitive. * * @param reason: The `reason` property of the promise rejection * @returns An Event object with an appropriate `exception` value */ function _eventFromRejectionWithPrimitive(reason) { return { exception: { values: [ { type: 'UnhandledRejection', // String() is needed because the Primitive type includes symbols (which can't be automatically stringified) value: `Non-Error promise rejection captured with value: ${String(reason)}`, }, ], }, }; } /** * This function creates a stack from an old, error-less onerror handler. */ // eslint-disable-next-line @typescript-eslint/no-explicit-any function _eventFromIncompleteOnError(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 let message = (0,is/* isErrorEvent */.VW)(msg) ? msg.message : msg; let name = 'Error'; var groups = message.match(ERROR_TYPES_RE); if (groups) { name = groups[1]; message = groups[2]; } var event = { exception: { values: [ { type: name, value: message, }, ], }, }; return _enhanceEventWithInitialFrame(event, url, line, column); } /** JSDoc */ // eslint-disable-next-line @typescript-eslint/no-explicit-any function _enhanceEventWithInitialFrame(event, url, line, column) { // event.exception var e = (event.exception = event.exception || {}); // event.exception.values var ev = (e.values = e.values || []); // event.exception.values[0] var ev0 = (ev[0] = ev[0] || {}); // event.exception.values[0].stacktrace var ev0s = (ev0.stacktrace = ev0.stacktrace || {}); // event.exception.values[0].stacktrace.frames var ev0sf = (ev0s.frames = ev0s.frames || []); var colno = isNaN(parseInt(column, 10)) ? undefined : column; var lineno = isNaN(parseInt(line, 10)) ? undefined : line; var filename = (0,is/* isString */.HD)(url) && url.length > 0 ? url : (0,browser/* getLocationHref */.l4)(); // event.exception.values[0].stacktrace.frames if (ev0sf.length === 0) { ev0sf.push({ colno, filename, function: '?', in_app: true, lineno, }); } return event; } function globalHandlerLog(type) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.log */.kg.log(`Global Handler attached: ${type}`); } function addMechanismAndCapture(hub, error, event, type) { (0,misc/* addExceptionMechanism */.EG)(event, { handled: false, type, }); hub.captureEvent(event, { originalException: error, }); } function getHubAndOptions() { var hub = (0,esm_hub/* getCurrentHub */.Gd)(); var client = hub.getClient(); var options = (client && client.getOptions()) || { stackParser: () => [], attachStacktrace: false, }; return [hub, options.stackParser, options.attachStacktrace]; } //# sourceMappingURL=globalhandlers.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/integrations/linkederrors.js var DEFAULT_KEY = 'cause'; var DEFAULT_LIMIT = 5; /** Adds SDK info to an event. */ class LinkedErrors { /** * @inheritDoc */ static __initStatic() {this.id = 'LinkedErrors';} /** * @inheritDoc */ __init() {this.name = LinkedErrors.id;} /** * @inheritDoc */ /** * @inheritDoc */ /** * @inheritDoc */ constructor(options = {}) {;LinkedErrors.prototype.__init.call(this); this._key = options.key || DEFAULT_KEY; this._limit = options.limit || DEFAULT_LIMIT; } /** * @inheritDoc */ setupOnce() { var client = (0,esm_hub/* getCurrentHub */.Gd)().getClient(); if (!client) { return; } (0,esm_scope/* addGlobalEventProcessor */.c)((event, hint) => { var self = (0,esm_hub/* getCurrentHub */.Gd)().getIntegration(LinkedErrors); return self ? _handler(client.getOptions().stackParser, self._key, self._limit, event, hint) : event; }); } } LinkedErrors.__initStatic(); /** * @inheritDoc */ function _handler( parser, key, limit, event, hint, ) { if (!event.exception || !event.exception.values || !hint || !(0,is/* isInstanceOf */.V9)(hint.originalException, Error)) { return event; } var linkedErrors = _walkErrorTree(parser, limit, hint.originalException , key); event.exception.values = [...linkedErrors, ...event.exception.values]; return event; } /** * JSDOC */ function _walkErrorTree( parser, limit, error, key, stack = [], ) { if (!(0,is/* isInstanceOf */.V9)(error[key], Error) || stack.length + 1 >= limit) { return stack; } var exception = exceptionFromError(parser, error[key]); return _walkErrorTree(parser, limit, error[key], key, [exception, ...stack]); } //# sourceMappingURL=linkederrors.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/integrations/dedupe.js /** Deduplication filter */ class Dedupe {constructor() { Dedupe.prototype.__init.call(this); } /** * @inheritDoc */ static __initStatic() {this.id = 'Dedupe';} /** * @inheritDoc */ __init() {this.name = Dedupe.id;} /** * @inheritDoc */ /** * @inheritDoc */ setupOnce(addGlobalEventProcessor, getCurrentHub) { var eventProcessor = currentEvent => { var self = getCurrentHub().getIntegration(Dedupe); if (self) { // Juuust in case something goes wrong try { if (dedupe_shouldDropEvent(currentEvent, self._previousEvent)) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.warn */.kg.warn('Event dropped due to being a duplicate of previously captured event.'); return null; } } catch (_oO) { return (self._previousEvent = currentEvent); } return (self._previousEvent = currentEvent); } return currentEvent; }; eventProcessor.id = this.name; addGlobalEventProcessor(eventProcessor); } } Dedupe.__initStatic(); /** JSDoc */ function dedupe_shouldDropEvent(currentEvent, previousEvent) { if (!previousEvent) { return false; } if (_isSameMessageEvent(currentEvent, previousEvent)) { return true; } if (_isSameExceptionEvent(currentEvent, previousEvent)) { return true; } return false; } /** JSDoc */ function _isSameMessageEvent(currentEvent, previousEvent) { var currentMessage = currentEvent.message; var previousMessage = previousEvent.message; // If neither event has a message property, they were both exceptions, so bail out if (!currentMessage && !previousMessage) { return false; } // If only one event has a stacktrace, but not the other one, they are not the same if ((currentMessage && !previousMessage) || (!currentMessage && previousMessage)) { return false; } if (currentMessage !== previousMessage) { return false; } if (!_isSameFingerprint(currentEvent, previousEvent)) { return false; } if (!_isSameStacktrace(currentEvent, previousEvent)) { return false; } return true; } /** JSDoc */ function _isSameExceptionEvent(currentEvent, previousEvent) { var previousException = _getExceptionFromEvent(previousEvent); var currentException = _getExceptionFromEvent(currentEvent); if (!previousException || !currentException) { return false; } if (previousException.type !== currentException.type || previousException.value !== currentException.value) { return false; } if (!_isSameFingerprint(currentEvent, previousEvent)) { return false; } if (!_isSameStacktrace(currentEvent, previousEvent)) { return false; } return true; } /** JSDoc */ function _isSameStacktrace(currentEvent, previousEvent) { let currentFrames = _getFramesFromEvent(currentEvent); let previousFrames = _getFramesFromEvent(previousEvent); // If neither event has a stacktrace, they are assumed to be the same if (!currentFrames && !previousFrames) { return true; } // If only one event has a stacktrace, but not the other one, they are not the same if ((currentFrames && !previousFrames) || (!currentFrames && previousFrames)) { return false; } currentFrames = currentFrames ; previousFrames = previousFrames ; // If number of frames differ, they are not the same if (previousFrames.length !== currentFrames.length) { return false; } // Otherwise, compare the two for (let i = 0; i < previousFrames.length; i++) { var frameA = previousFrames[i]; var frameB = currentFrames[i]; if ( frameA.filename !== frameB.filename || frameA.lineno !== frameB.lineno || frameA.colno !== frameB.colno || frameA.function !== frameB.function ) { return false; } } return true; } /** JSDoc */ function _isSameFingerprint(currentEvent, previousEvent) { let currentFingerprint = currentEvent.fingerprint; let previousFingerprint = previousEvent.fingerprint; // If neither event has a fingerprint, they are assumed to be the same if (!currentFingerprint && !previousFingerprint) { return true; } // If only one event has a fingerprint, but not the other one, they are not the same if ((currentFingerprint && !previousFingerprint) || (!currentFingerprint && previousFingerprint)) { return false; } currentFingerprint = currentFingerprint ; previousFingerprint = previousFingerprint ; // Otherwise, compare the two try { return !!(currentFingerprint.join('') === previousFingerprint.join('')); } catch (_oO) { return false; } } /** JSDoc */ function _getExceptionFromEvent(event) { return event.exception && event.exception.values && event.exception.values[0]; } /** JSDoc */ function _getFramesFromEvent(event) { var exception = event.exception; if (exception) { try { // @ts-ignore Object could be undefined return exception.values[0].stacktrace.frames; } catch (_oO) { return undefined; } } return undefined; } //# sourceMappingURL=dedupe.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/integrations/httpcontext.js var global = (0,esm_global/* getGlobalObject */.R)(); /** HttpContext integration collects information about HTTP request headers */ class HttpContext {constructor() { HttpContext.prototype.__init.call(this); } /** * @inheritDoc */ static __initStatic() {this.id = 'HttpContext';} /** * @inheritDoc */ __init() {this.name = HttpContext.id;} /** * @inheritDoc */ setupOnce() { (0,esm_scope/* addGlobalEventProcessor */.c)((event) => { if ((0,esm_hub/* getCurrentHub */.Gd)().getIntegration(HttpContext)) { // if none of the information we want exists, don't bother if (!global.navigator && !global.location && !global.document) { return event; } // grab as much info as exists and add it to the event var url = (event.request && event.request.url) || (global.location && global.location.href); const { referrer } = global.document || {}; const { userAgent } = global.navigator || {}; var headers = { ...(event.request && event.request.headers), ...(referrer && { Referer: referrer }), ...(userAgent && { 'User-Agent': userAgent }), }; var request = { ...(url && { url }), headers }; return { ...event, request }; } return event; }); } } HttpContext.__initStatic(); //# sourceMappingURL=httpcontext.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/promisebuffer.js /** * Creates an new PromiseBuffer object with the specified limit * @param limit max number of promises that can be stored in the buffer */ function makePromiseBuffer(limit) { var buffer = []; function isReady() { return limit === undefined || buffer.length < limit; } /** * Remove a promise from the queue. * * @param task Can be any PromiseLike * @returns Removed promise. */ function remove(task) { return buffer.splice(buffer.indexOf(task), 1)[0]; } /** * Add a promise (representing an in-flight action) to the queue, and set it to remove itself on fulfillment. * * @param taskProducer A function producing any PromiseLike; In previous versions this used to be `task: * PromiseLike`, but under that model, Promises were instantly created on the call-site and their executor * functions therefore ran immediately. Thus, even if the buffer was full, the action still happened. By * requiring the promise to be wrapped in a function, we can defer promise creation until after the buffer * limit check. * @returns The original promise. */ function add(taskProducer) { if (!isReady()) { return (0,syncpromise/* rejectedSyncPromise */.$2)(new SentryError('Not adding Promise because buffer limit was reached.')); } // start the task and add its promise to the queue var task = taskProducer(); if (buffer.indexOf(task) === -1) { buffer.push(task); } void task .then(() => remove(task)) // Use `then(null, rejectionHandler)` rather than `catch(rejectionHandler)` so that we can use `PromiseLike` // rather than `Promise`. `PromiseLike` doesn't have a `.catch` method, making its polyfill smaller. (ES5 didn't // have promises, so TS has to polyfill when down-compiling.) .then(null, () => remove(task).then(null, () => { // We have to add another catch here because `remove()` starts a new promise chain. }), ); return task; } /** * Wait for all promises in the queue to resolve or for timeout to expire, whichever comes first. * * @param timeout The time, in ms, after which to resolve to `false` if the queue is still non-empty. Passing `0` (or * not passing anything) will make the promise wait as long as it takes for the queue to drain before resolving to * `true`. * @returns A promise which will resolve to `true` if the queue is already empty or drains before the timeout, and * `false` otherwise */ function drain(timeout) { return new syncpromise/* SyncPromise */.cW((resolve, reject) => { let counter = buffer.length; if (!counter) { return resolve(true); } // wait for `timeout` ms and then resolve to `false` (if not cancelled first) var capturedSetTimeout = setTimeout(() => { if (timeout && timeout > 0) { resolve(false); } }, timeout); // if all promises resolve in time, cancel the timer and resolve to `true` buffer.forEach(item => { void (0,syncpromise/* resolvedSyncPromise */.WD)(item).then(() => { // eslint-disable-next-line no-plusplus if (!--counter) { clearTimeout(capturedSetTimeout); resolve(true); } }, reject); }); }); } return { $: buffer, add, drain, }; } //# sourceMappingURL=promisebuffer.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/ratelimit.js // Intentionally keeping the key broad, as we don't know for sure what rate limit headers get returned from backend var DEFAULT_RETRY_AFTER = 60 * 1000; // 60 seconds /** * Extracts Retry-After value from the request header or returns default value * @param header string representation of 'Retry-After' header * @param now current unix timestamp * */ function parseRetryAfterHeader(header, now = Date.now()) { var headerDelay = parseInt(`${header}`, 10); if (!isNaN(headerDelay)) { return headerDelay * 1000; } var headerDate = Date.parse(`${header}`); if (!isNaN(headerDate)) { return headerDate - now; } return DEFAULT_RETRY_AFTER; } /** * Gets the time that given category is disabled until for rate limiting */ function disabledUntil(limits, category) { return limits[category] || limits.all || 0; } /** * Checks if a category is rate limited */ function isRateLimited(limits, category, now = Date.now()) { return disabledUntil(limits, category) > now; } /** * Update ratelimits from incoming headers. * Returns true if headers contains a non-empty rate limiting header. */ function updateRateLimits( limits, { statusCode, headers }, now = Date.now(), ) { var updatedRateLimits = { ...limits, }; // "The name is case-insensitive." // https://developer.mozilla.org/en-US/docs/Web/API/Headers/get var rateLimitHeader = headers && headers['x-sentry-rate-limits']; var retryAfterHeader = headers && headers['retry-after']; if (rateLimitHeader) { /** * rate limit headers are of the form *
,
,.. * where each
is of the form * : : : * where * is a delay in seconds * is the event type(s) (error, transaction, etc) being rate limited and is of the form * ;;... * is what's being limited (org, project, or key) - ignored by SDK * is an arbitrary string like "org_quota" - ignored by SDK */ for (var limit of rateLimitHeader.trim().split(',')) { const [retryAfter, categories] = limit.split(':', 2); var headerDelay = parseInt(retryAfter, 10); var delay = (!isNaN(headerDelay) ? headerDelay : 60) * 1000; // 60sec default if (!categories) { updatedRateLimits.all = now + delay; } else { for (var category of categories.split(';')) { updatedRateLimits[category] = now + delay; } } } } else if (retryAfterHeader) { updatedRateLimits.all = now + parseRetryAfterHeader(retryAfterHeader, now); } else if (statusCode === 429) { updatedRateLimits.all = now + 60 * 1000; } return updatedRateLimits; } //# sourceMappingURL=ratelimit.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/transports/base.js var DEFAULT_TRANSPORT_BUFFER_SIZE = 30; /** * Creates an instance of a Sentry `Transport` * * @param options * @param makeRequest */ function createTransport( options, makeRequest, buffer = makePromiseBuffer(options.bufferSize || DEFAULT_TRANSPORT_BUFFER_SIZE), ) { let rateLimits = {}; var flush = (timeout) => buffer.drain(timeout); function send(envelope) { var filteredEnvelopeItems = []; // Drop rate limited items from envelope forEachEnvelopeItem(envelope, (item, type) => { var envelopeItemDataCategory = envelopeItemTypeToDataCategory(type); if (isRateLimited(rateLimits, envelopeItemDataCategory)) { options.recordDroppedEvent('ratelimit_backoff', envelopeItemDataCategory); } else { filteredEnvelopeItems.push(item); } }); // Skip sending if envelope is empty after filtering out rate limited events if (filteredEnvelopeItems.length === 0) { return (0,syncpromise/* resolvedSyncPromise */.WD)(); } // eslint-disable-next-line @typescript-eslint/no-explicit-any var filteredEnvelope = createEnvelope(envelope[0], filteredEnvelopeItems ); // Creates client report for each item in an envelope var recordEnvelopeLoss = (reason) => { forEachEnvelopeItem(filteredEnvelope, (_, type) => { options.recordDroppedEvent(reason, envelopeItemTypeToDataCategory(type)); }); }; var requestTask = () => makeRequest({ body: serializeEnvelope(filteredEnvelope, options.textEncoder) }).then( response => { // We don't want to throw on NOK responses, but we want to at least log them if (response.statusCode !== undefined && (response.statusCode < 200 || response.statusCode >= 300)) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.warn */.kg.warn(`Sentry responded with status code ${response.statusCode} to sent event.`); } rateLimits = updateRateLimits(rateLimits, response); }, error => { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.error */.kg.error('Failed while sending event:', error); recordEnvelopeLoss('network_error'); }, ); return buffer.add(requestTask).then( result => result, error => { if (error instanceof SentryError) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.error */.kg.error('Skipped sending event because buffer is full.'); recordEnvelopeLoss('queue_overflow'); return (0,syncpromise/* resolvedSyncPromise */.WD)(); } else { throw error; } }, ); } return { send, flush, }; } //# sourceMappingURL=base.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/transports/utils.js var utils_global = (0,esm_global/* getGlobalObject */.R)(); let cachedFetchImpl; /** * A special usecase for incorrectly wrapped Fetch APIs in conjunction with ad-blockers. * Whenever someone wraps the Fetch API and returns the wrong promise chain, * this chain becomes orphaned and there is no possible way to capture it's rejections * other than allowing it bubble up to this very handler. eg. * * var f = window.fetch; * window.fetch = function () { * var p = f.apply(this, arguments); * * p.then(function() { * console.log('hi.'); * }); * * return p; * } * * `p.then(function () { ... })` is producing a completely separate promise chain, * however, what's returned is `p` - the result of original `fetch` call. * * This mean, that whenever we use the Fetch API to send our own requests, _and_ * some ad-blocker blocks it, this orphaned chain will _always_ reject, * effectively causing another event to be captured. * This makes a whole process become an infinite loop, which we need to somehow * deal with, and break it in one way or another. * * To deal with this issue, we are making sure that we _always_ use the real * browser Fetch API, instead of relying on what `window.fetch` exposes. * The only downside to this would be missing our own requests as breadcrumbs, * but because we are already not doing this, it should be just fine. * * Possible failed fetch error messages per-browser: * * Chrome: Failed to fetch * Edge: Failed to Fetch * Firefox: NetworkError when attempting to fetch resource * Safari: resource blocked by content blocker */ function getNativeFetchImplementation() { if (cachedFetchImpl) { return cachedFetchImpl; } /* eslint-disable @typescript-eslint/unbound-method */ // Fast path to avoid DOM I/O if ((0,supports/* isNativeFetch */.Du)(utils_global.fetch)) { return (cachedFetchImpl = utils_global.fetch.bind(utils_global)); } var document = utils_global.document; let fetchImpl = utils_global.fetch; // eslint-disable-next-line deprecation/deprecation if (document && typeof document.createElement === 'function') { try { var sandbox = document.createElement('iframe'); sandbox.hidden = true; document.head.appendChild(sandbox); var contentWindow = sandbox.contentWindow; if (contentWindow && contentWindow.fetch) { fetchImpl = contentWindow.fetch; } document.head.removeChild(sandbox); } catch (e) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.warn */.kg.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', e); } } return (cachedFetchImpl = fetchImpl.bind(utils_global)); /* eslint-enable @typescript-eslint/unbound-method */ } //# sourceMappingURL=utils.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/transports/fetch.js /** * Creates a Transport that uses the Fetch API to send events to Sentry. */ function makeFetchTransport( options, nativeFetch = getNativeFetchImplementation(), ) { function makeRequest(request) { var requestOptions = { body: request.body, method: 'POST', referrerPolicy: 'origin', headers: options.headers, // Outgoing requests are usually cancelled when navigating to a different page, causing a "TypeError: Failed to // fetch" error and sending a "network_error" client-outcome - in Chrome, the request status shows "(cancelled)". // The `keepalive` flag keeps outgoing requests alive, even when switching pages. We want this since we're // frequently sending events right before the user is switching pages (eg. whenfinishing navigation transactions). // Gotchas: // - `keepalive` isn't supported by Firefox // - As per spec (https://fetch.spec.whatwg.org/#http-network-or-cache-fetch), a request with `keepalive: true` // and a content length of > 64 kibibytes returns a network error. We will therefore only activate the flag when // we're below that limit. keepalive: request.body.length <= 65536, ...options.fetchOptions, }; return nativeFetch(options.url, requestOptions).then(response => ({ statusCode: response.status, headers: { 'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'), 'retry-after': response.headers.get('Retry-After'), }, })); } return createTransport(options, makeRequest); } //# sourceMappingURL=fetch.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/transports/xhr.js /** * The DONE ready state for XmlHttpRequest * * Defining it here as a constant b/c XMLHttpRequest.DONE is not always defined * (e.g. during testing, it is `undefined`) * * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState} */ var XHR_READYSTATE_DONE = 4; /** * Creates a Transport that uses the XMLHttpRequest API to send events to Sentry. */ function makeXHRTransport(options) { function makeRequest(request) { return new syncpromise/* SyncPromise */.cW((resolve, reject) => { var xhr = new XMLHttpRequest(); xhr.onerror = reject; xhr.onreadystatechange = () => { if (xhr.readyState === XHR_READYSTATE_DONE) { resolve({ statusCode: xhr.status, headers: { 'x-sentry-rate-limits': xhr.getResponseHeader('X-Sentry-Rate-Limits'), 'retry-after': xhr.getResponseHeader('Retry-After'), }, }); } }; xhr.open('POST', options.url); for (var header in options.headers) { if (Object.prototype.hasOwnProperty.call(options.headers, header)) { xhr.setRequestHeader(header, options.headers[header]); } } xhr.send(request.body); }); } return createTransport(options, makeRequest); } //# sourceMappingURL=xhr.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/sdk.js var defaultIntegrations = [ new InboundFilters(), new FunctionToString(), new TryCatch(), new Breadcrumbs(), new GlobalHandlers(), new LinkedErrors(), new Dedupe(), new HttpContext(), ]; /** * The Sentry Browser SDK Client. * * To use this SDK, call the {@link init} function as early as possible when * loading the web page. To set context information or send manual events, use * the provided methods. * * @example * * ``` * * import { init } from '@sentry/browser'; * * init({ * dsn: '__DSN__', * // ... * }); * ``` * * @example * ``` * * import { configureScope } from '@sentry/browser'; * configureScope((scope: Scope) => { * scope.setExtra({ battery: 0.7 }); * scope.setTag({ user_mode: 'admin' }); * scope.setUser({ id: '4711' }); * }); * ``` * * @example * ``` * * import { addBreadcrumb } from '@sentry/browser'; * addBreadcrumb({ * message: 'My Breadcrumb', * // ... * }); * ``` * * @example * * ``` * * import * as Sentry from '@sentry/browser'; * Sentry.captureMessage('Hello, world!'); * Sentry.captureException(new Error('Good bye')); * Sentry.captureEvent({ * message: 'Manual', * stacktrace: [ * // ... * ], * }); * ``` * * @see {@link BrowserOptions} for documentation on configuration options. */ function init(options = {}) { if (options.defaultIntegrations === undefined) { options.defaultIntegrations = defaultIntegrations; } if (options.release === undefined) { var window = (0,esm_global/* getGlobalObject */.R)(); // This supports the variable that sentry-webpack-plugin injects if (window.SENTRY_RELEASE && window.SENTRY_RELEASE.id) { options.release = window.SENTRY_RELEASE.id; } } if (options.autoSessionTracking === undefined) { options.autoSessionTracking = true; } if (options.sendClientReports === undefined) { options.sendClientReports = true; } var clientOptions = { ...options, stackParser: (0,stacktrace/* stackParserFromStackParserOptions */.Sq)(options.stackParser || defaultStackParser), integrations: getIntegrationsToSetup(options), transport: options.transport || ((0,supports/* supportsFetch */.Ak)() ? makeFetchTransport : makeXHRTransport), }; initAndBind(BrowserClient, clientOptions); if (options.autoSessionTracking) { startSessionTracking(); } } /** * Present the user with a report dialog. * * @param options Everything is optional, we try to fetch all info need from the global scope. */ function showReportDialog(options = {}, hub = getCurrentHub()) { // doesn't work without a document (React Native) var global = getGlobalObject(); if (!global.document) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.error('Global document not defined in showReportDialog call'); return; } const { client, scope } = hub.getStackTop(); var dsn = options.dsn || (client && client.getDsn()); if (!dsn) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.error('DSN not configured for showReportDialog call'); return; } if (scope) { options.user = { ...scope.getUser(), ...options.user, }; } if (!options.eventId) { options.eventId = hub.lastEventId(); } var script = global.document.createElement('script'); script.async = true; script.src = getReportDialogEndpoint(dsn, options); if (options.onLoad) { // eslint-disable-next-line @typescript-eslint/unbound-method script.onload = options.onLoad; } var injectionPoint = global.document.head || global.document.body; if (injectionPoint) { injectionPoint.appendChild(script); } else { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.error('Not injecting report dialog. No injection point found in HTML'); } } /** * This is the getter for lastEventId. * * @returns The last event id of a captured event. */ function lastEventId() { return getCurrentHub().lastEventId(); } /** * This function is here to be API compatible with the loader. * @hidden */ function forceLoad() { // Noop } /** * This function is here to be API compatible with the loader. * @hidden */ function onLoad(callback) { callback(); } /** * Call `flush()` on the current client, if there is one. See {@link Client.flush}. * * @param timeout Maximum time in ms the client should wait to flush its event queue. Omitting this parameter will cause * the client to wait until all events are sent before resolving the promise. * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it * doesn't (or if there's no client defined). */ function flush(timeout) { var client = getCurrentHub().getClient(); if (client) { return client.flush(timeout); } (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.warn('Cannot flush events. No client defined.'); return resolvedSyncPromise(false); } /** * Call `close()` on the current client, if there is one. See {@link Client.close}. * * @param timeout Maximum time in ms the client should wait to flush its event queue before shutting down. Omitting this * parameter will cause the client to wait until all events are sent before disabling itself. * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it * doesn't (or if there's no client defined). */ function sdk_close(timeout) { var client = getCurrentHub().getClient(); if (client) { return client.close(timeout); } (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.warn('Cannot flush events and disable SDK. No client defined.'); return resolvedSyncPromise(false); } /** * Wrap code within a try/catch block so the SDK is able to capture errors. * * @param fn A function to wrap. * * @returns The result of wrapped function call. */ // eslint-disable-next-line @typescript-eslint/no-explicit-any function sdk_wrap(fn) { return wrap$1(fn)(); } function startSessionOnHub(hub) { hub.startSession({ ignoreDuration: true }); hub.captureSession(); } /** * Enable automatic Session Tracking for the initial page load. */ function startSessionTracking() { var window = (0,esm_global/* getGlobalObject */.R)(); var document = window.document; if (typeof document === 'undefined') { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.warn */.kg.warn('Session tracking in non-browser environment with @sentry/browser is not supported.'); return; } var hub = (0,esm_hub/* getCurrentHub */.Gd)(); // The only way for this to be false is for there to be a version mismatch between @sentry/browser (>= 6.0.0) and // @sentry/hub (< 5.27.0). In the simple case, there won't ever be such a mismatch, because the two packages are // pinned at the same version in package.json, but there are edge cases where it's possible. See // https://github.com/getsentry/sentry-javascript/issues/3207 and // https://github.com/getsentry/sentry-javascript/issues/3234 and // https://github.com/getsentry/sentry-javascript/issues/3278. if (!hub.captureSession) { return; } // The session duration for browser sessions does not track a meaningful // concept that can be used as a metric. // Automatically captured sessions are akin to page views, and thus we // discard their duration. startSessionOnHub(hub); // We want to create a session for every navigation as well (0,instrument/* addInstrumentationHandler */.o)('history', ({ from, to }) => { // Don't create an additional session for the initial route or if the location did not change if (!(from === undefined || from === to)) { startSessionOnHub((0,esm_hub/* getCurrentHub */.Gd)()); } }); } //# sourceMappingURL=sdk.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/react/esm/sdk.js /** * Inits the React SDK */ function sdk_init(options) { options._metadata = options._metadata || {}; options._metadata.sdk = options._metadata.sdk || { name: 'sentry.javascript.react', packages: [ { name: 'npm:@sentry/react', version: SDK_VERSION, }, ], version: SDK_VERSION, }; init(options); } //# sourceMappingURL=sdk.js.map // EXTERNAL MODULE: ./node_modules/@sentry/tracing/esm/hubextensions.js + 1 modules var hubextensions = __webpack_require__(2758); ;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/buildPolyfills/_optionalChain.js /** * Polyfill for the optional chain operator, `?.`, given previous conversion of the expression into an array of values, * descriptors, and functions. * * Adapted from Sucrase (https://github.com/alangpierce/sucrase) * See https://github.com/alangpierce/sucrase/blob/265887868966917f3b924ce38dfad01fbab1329f/src/transformers/OptionalChainingNullishTransformer.ts#L15 * * @param ops Array result of expression conversion * @returns The value of the expression */ function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { var op = ops[i] ; var fn = ops[i + 1] ; i += 2; // by checking for loose equality to `null`, we catch both `null` and `undefined` if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { // really we're meaning to return `undefined` as an actual value here, but it saves bytes not to write it return; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => (value ).call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } // Sucrase version // function _optionalChain(ops) { // let lastAccessLHS = undefined; // let value = ops[0]; // let i = 1; // while (i < ops.length) { // var op = ops[i]; // var fn = ops[i + 1]; // i += 2; // if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { // return undefined; // } // if (op === 'access' || op === 'optionalAccess') { // lastAccessLHS = value; // value = fn(value); // } else if (op === 'call' || op === 'optionalCall') { // value = fn((...args) => value.call(lastAccessLHS, ...args)); // lastAccessLHS = undefined; // } // } // return value; // } //# sourceMappingURL=_optionalChain.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/tracing.js var TRACEPARENT_REGEXP = new RegExp( '^[ \\t]*' + // whitespace '([0-9a-f]{32})?' + // trace_id '-?([0-9a-f]{16})?' + // span_id '-?([01])?' + // sampled '[ \\t]*$', // whitespace ); /** * Extract transaction context data from a `sentry-trace` header. * * @param traceparent Traceparent string * * @returns Object containing data from the header, or undefined if traceparent string is malformed */ function extractTraceparentData(traceparent) { var matches = traceparent.match(TRACEPARENT_REGEXP); if (!traceparent || !matches) { // empty string or no matches is invalid traceparent data return undefined; } let parentSampled; if (matches[3] === '1') { parentSampled = true; } else if (matches[3] === '0') { parentSampled = false; } return { traceId: matches[1], parentSampled, parentSpanId: matches[2], }; } //# sourceMappingURL=tracing.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/baggage.js var BAGGAGE_HEADER_NAME = 'baggage'; var SENTRY_BAGGAGE_KEY_PREFIX = 'sentry-'; var SENTRY_BAGGAGE_KEY_PREFIX_REGEX = /^sentry-/; /** * Max length of a serialized baggage string * * https://www.w3.org/TR/baggage/#limits */ var MAX_BAGGAGE_STRING_LENGTH = 8192; /** * Takes a baggage header and turns it into Dynamic Sampling Context, by extracting all the "sentry-" prefixed values * from it. * * @param baggageHeader A very bread definition of a baggage header as it might appear in various frameworks. * @returns The Dynamic Sampling Context that was found on `baggageHeader`, if there was any, `undefined` otherwise. */ function baggageHeaderToDynamicSamplingContext( // Very liberal definition of what any incoming header might look like baggageHeader, ) { if (!(0,is/* isString */.HD)(baggageHeader) && !Array.isArray(baggageHeader)) { return undefined; } // Intermediary object to store baggage key value pairs of incoming baggage headers on. // It is later used to read Sentry-DSC-values from. let baggageObject = {}; if (Array.isArray(baggageHeader)) { // Combine all baggage headers into one object containing the baggage values so we can later read the Sentry-DSC-values from it baggageObject = baggageHeader.reduce((acc, curr) => { var currBaggageObject = baggageHeaderToObject(curr); return { ...acc, ...currBaggageObject, }; }, {}); } else { // Return undefined if baggage header is an empty string (technically an empty baggage header is not spec conform but // this is how we choose to handle it) if (!baggageHeader) { return undefined; } baggageObject = baggageHeaderToObject(baggageHeader); } // Read all "sentry-" prefixed values out of the baggage object and put it onto a dynamic sampling context object. var dynamicSamplingContext = Object.entries(baggageObject).reduce((acc, [key, value]) => { if (key.match(SENTRY_BAGGAGE_KEY_PREFIX_REGEX)) { var nonPrefixedKey = key.slice(SENTRY_BAGGAGE_KEY_PREFIX.length); acc[nonPrefixedKey] = value; } return acc; }, {}); // Only return a dynamic sampling context object if there are keys in it. // A keyless object means there were no sentry values on the header, which means that there is no DSC. if (Object.keys(dynamicSamplingContext).length > 0) { return dynamicSamplingContext ; } else { return undefined; } } /** * Turns a Dynamic Sampling Object into a baggage header by prefixing all the keys on the object with "sentry-". * * @param dynamicSamplingContext The Dynamic Sampling Context to turn into a header. For convenience and compatibility * with the `getDynamicSamplingContext` method on the Transaction class ,this argument can also be `undefined`. If it is * `undefined` the function will return `undefined`. * @returns a baggage header, created from `dynamicSamplingContext`, or `undefined` either if `dynamicSamplingContext` * was `undefined`, or if `dynamicSamplingContext` didn't contain any values. */ function dynamicSamplingContextToSentryBaggageHeader( // this also takes undefined for convenience and bundle size in other places dynamicSamplingContext, ) { // Prefix all DSC keys with "sentry-" and put them into a new object var sentryPrefixedDSC = Object.entries(dynamicSamplingContext).reduce( (acc, [dscKey, dscValue]) => { if (dscValue) { acc[`${SENTRY_BAGGAGE_KEY_PREFIX}${dscKey}`] = dscValue; } return acc; }, {}, ); return objectToBaggageHeader(sentryPrefixedDSC); } /** * Will parse a baggage header, which is a simple key-value map, into a flat object. * * @param baggageHeader The baggage header to parse. * @returns a flat object containing all the key-value pairs from `baggageHeader`. */ function baggageHeaderToObject(baggageHeader) { return baggageHeader .split(',') .map(baggageEntry => baggageEntry.split('=').map(keyOrValue => decodeURIComponent(keyOrValue.trim()))) .reduce((acc, [key, value]) => { acc[key] = value; return acc; }, {}); } /** * Turns a flat object (key-value pairs) into a baggage header, which is also just key-value pairs. * * @param object The object to turn into a baggage header. * @returns a baggage header string, or `undefined` if the object didn't have any values, since an empty baggage header * is not spec compliant. */ function objectToBaggageHeader(object) { if (Object.keys(object).length === 0) { // An empty baggage header is not spec compliant: We return undefined. return undefined; } return Object.entries(object).reduce((baggageHeader, [objectKey, objectValue], currentIndex) => { var baggageEntry = `${encodeURIComponent(objectKey)}=${encodeURIComponent(objectValue)}`; var newBaggageHeader = currentIndex === 0 ? baggageEntry : `${baggageHeader},${baggageEntry}`; if (newBaggageHeader.length > MAX_BAGGAGE_STRING_LENGTH) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.warn */.kg.warn( `Not adding key: ${objectKey} with val: ${objectValue} to baggage header due to exceeding baggage size limits.`, ); return baggageHeader; } else { return newBaggageHeader; } }, ''); } //# sourceMappingURL=baggage.js.map // EXTERNAL MODULE: ./node_modules/@sentry/tracing/esm/idletransaction.js var idletransaction = __webpack_require__(6458); // EXTERNAL MODULE: ./node_modules/@sentry/tracing/esm/utils.js var utils = __webpack_require__(3233); ;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/backgroundtab.js var backgroundtab_global = (0,esm_global/* getGlobalObject */.R)(); /** * Add a listener that cancels and finishes a transaction when the global * document is hidden. */ function registerBackgroundTabDetection() { if (backgroundtab_global && backgroundtab_global.document) { backgroundtab_global.document.addEventListener('visibilitychange', () => { var activeTransaction = (0,utils/* getActiveTransaction */.x1)() ; if (backgroundtab_global.document.hidden && activeTransaction) { var statusType = 'cancelled'; (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.log */.kg.log( `[Tracing] Transaction: ${statusType} -> since tab moved to the background, op: ${activeTransaction.op}`, ); // We should not set status if it is already set, this prevent important statuses like // error or data loss from being overwritten on transaction. if (!activeTransaction.status) { activeTransaction.setStatus(statusType); } activeTransaction.setTag('visibilitychange', 'document.hidden'); activeTransaction.finish(); } }); } else { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.warn */.kg.warn('[Tracing] Could not set up background tab detection due to lack of global document'); } } //# sourceMappingURL=backgroundtab.js.map // EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/buildPolyfills/_nullishCoalesce.js var _nullishCoalesce = __webpack_require__(5375); ;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/web-vitals/lib/bindReporter.js var bindReporter = ( callback, metric, reportAllChanges, ) => { let prevValue; return (forceReport) => { if (metric.value >= 0) { if (forceReport || reportAllChanges) { metric.delta = metric.value - (prevValue || 0); // Report the metric if there's a non-zero delta or if no previous // value exists (which can happen in the case of the document becoming // hidden when the metric value is 0). // See: https://github.com/GoogleChrome/web-vitals/issues/14 if (metric.delta || prevValue === undefined) { prevValue = metric.value; callback(metric); } } } }; }; //# sourceMappingURL=bindReporter.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/web-vitals/lib/generateUniqueID.js /* * Copyright 2020 Google LLC * * 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 * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Performantly generate a unique, 30-char string by combining a version * number, the current timestamp with a 13-digit number integer. * @return {string} */ var generateUniqueID = () => { return `v2-${Date.now()}-${Math.floor(Math.random() * (9e12 - 1)) + 1e12}`; }; //# sourceMappingURL=generateUniqueID.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/web-vitals/lib/initMetric.js var initMetric = (name, value) => { return { name, value: (0,_nullishCoalesce/* _nullishCoalesce */.h)(value, () => ( -1)), delta: 0, entries: [], id: generateUniqueID(), }; }; //# sourceMappingURL=initMetric.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/web-vitals/lib/observe.js /* * Copyright 2020 Google LLC * * 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 * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Takes a performance entry type and a callback function, and creates a * `PerformanceObserver` instance that will observe the specified entry type * with buffering enabled and call the callback _for each entry_. * * This function also feature-detects entry support and wraps the logic in a * try/catch to avoid errors in unsupporting browsers. */ var observe = (type, callback) => { try { if (PerformanceObserver.supportedEntryTypes.includes(type)) { // More extensive feature detect needed for Firefox due to: // https://github.com/GoogleChrome/web-vitals/issues/142 if (type === 'first-input' && !('PerformanceEventTiming' in self)) { return; } var po = new PerformanceObserver(l => l.getEntries().map(callback)); po.observe({ type, buffered: true }); return po; } } catch (e) { // Do nothing. } return; }; //# sourceMappingURL=observe.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/web-vitals/lib/onHidden.js /* * Copyright 2020 Google LLC * * 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 * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var onHidden = (cb, once) => { var onHiddenOrPageHide = (event) => { if (event.type === 'pagehide' || (0,esm_global/* getGlobalObject */.R)().document.visibilityState === 'hidden') { cb(event); if (once) { removeEventListener('visibilitychange', onHiddenOrPageHide, true); removeEventListener('pagehide', onHiddenOrPageHide, true); } } }; addEventListener('visibilitychange', onHiddenOrPageHide, true); // Some browsers have buggy implementations of visibilitychange, // so we use pagehide in addition, just to be safe. addEventListener('pagehide', onHiddenOrPageHide, true); }; //# sourceMappingURL=onHidden.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/web-vitals/getCLS.js /* * Copyright 2020 Google LLC * * 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 * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // https://wicg.github.io/layout-instability/#sec-layout-shift var getCLS = (onReport, reportAllChanges) => { var metric = initMetric('CLS', 0); let report; let sessionValue = 0; let sessionEntries = []; var entryHandler = (entry) => { // Only count layout shifts without recent user input. // TODO: Figure out why entry can be undefined if (entry && !entry.hadRecentInput) { var firstSessionEntry = sessionEntries[0]; var lastSessionEntry = sessionEntries[sessionEntries.length - 1]; // If the entry occurred less than 1 second after the previous entry and // less than 5 seconds after the first entry in the session, include the // entry in the current session. Otherwise, start a new session. if ( sessionValue && sessionEntries.length !== 0 && entry.startTime - lastSessionEntry.startTime < 1000 && entry.startTime - firstSessionEntry.startTime < 5000 ) { sessionValue += entry.value; sessionEntries.push(entry); } else { sessionValue = entry.value; sessionEntries = [entry]; } // If the current session value is larger than the current CLS value, // update CLS and the entries contributing to it. if (sessionValue > metric.value) { metric.value = sessionValue; metric.entries = sessionEntries; if (report) { report(); } } } }; var po = observe('layout-shift', entryHandler ); if (po) { report = bindReporter(onReport, metric, reportAllChanges); onHidden(() => { po.takeRecords().map(entryHandler ); report(true); }); } }; //# sourceMappingURL=getCLS.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/web-vitals/lib/getVisibilityWatcher.js /* * Copyright 2020 Google LLC * * 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 * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ let firstHiddenTime = -1; var initHiddenTime = () => { return (0,esm_global/* getGlobalObject */.R)().document.visibilityState === 'hidden' ? 0 : Infinity; }; var trackChanges = () => { // Update the time if/when the document becomes hidden. onHidden(({ timeStamp }) => { firstHiddenTime = timeStamp; }, true); }; var getVisibilityWatcher = ( ) => { if (firstHiddenTime < 0) { // If the document is hidden when this code runs, assume it was hidden // since navigation start. This isn't a perfect heuristic, but it's the // best we can do until an API is available to support querying past // visibilityState. firstHiddenTime = initHiddenTime(); trackChanges(); } return { get firstHiddenTime() { return firstHiddenTime; }, }; }; //# sourceMappingURL=getVisibilityWatcher.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/web-vitals/getFID.js /* * Copyright 2020 Google LLC * * 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 * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var getFID = (onReport, reportAllChanges) => { var visibilityWatcher = getVisibilityWatcher(); var metric = initMetric('FID'); let report; var entryHandler = (entry) => { // Only report if the page wasn't hidden prior to the first input. if (report && entry.startTime < visibilityWatcher.firstHiddenTime) { metric.value = entry.processingStart - entry.startTime; metric.entries.push(entry); report(true); } }; var po = observe('first-input', entryHandler ); if (po) { report = bindReporter(onReport, metric, reportAllChanges); onHidden(() => { po.takeRecords().map(entryHandler ); po.disconnect(); }, true); } }; //# sourceMappingURL=getFID.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/web-vitals/getLCP.js /* * Copyright 2020 Google LLC * * 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 * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // https://wicg.github.io/largest-contentful-paint/#sec-largest-contentful-paint-interface var reportedMetricIDs = {}; var getLCP = (onReport, reportAllChanges) => { var visibilityWatcher = getVisibilityWatcher(); var metric = initMetric('LCP'); let report; var entryHandler = (entry) => { // The startTime attribute returns the value of the renderTime if it is not 0, // and the value of the loadTime otherwise. var value = entry.startTime; // If the page was hidden prior to paint time of the entry, // ignore it and mark the metric as final, otherwise add the entry. if (value < visibilityWatcher.firstHiddenTime) { metric.value = value; metric.entries.push(entry); } if (report) { report(); } }; var po = observe('largest-contentful-paint', entryHandler); if (po) { report = bindReporter(onReport, metric, reportAllChanges); var stopListening = () => { if (!reportedMetricIDs[metric.id]) { po.takeRecords().map(entryHandler ); po.disconnect(); reportedMetricIDs[metric.id] = true; report(true); } }; // Stop listening after input. Note: while scrolling is an input that // stop LCP observation, it's unreliable since it can be programmatically // generated. See: https://github.com/GoogleChrome/web-vitals/issues/75 ['keydown', 'click'].forEach(type => { addEventListener(type, stopListening, { once: true, capture: true }); }); onHidden(stopListening, true); } }; //# sourceMappingURL=getLCP.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/metrics/utils.js /** * Checks if a given value is a valid measurement value. */ function isMeasurementValue(value) { return typeof value === 'number' && isFinite(value); } /** * Helper function to start child on transactions. This function will make sure that the transaction will * use the start timestamp of the created child span if it is earlier than the transactions actual * start timestamp. */ function _startChild(transaction, { startTimestamp, ...ctx }) { if (startTimestamp && transaction.startTimestamp > startTimestamp) { transaction.startTimestamp = startTimestamp; } return transaction.startChild({ startTimestamp, ...ctx, }); } //# sourceMappingURL=utils.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/metrics/index.js var metrics_global = (0,esm_global/* getGlobalObject */.R)(); function getBrowserPerformanceAPI() { return metrics_global && metrics_global.addEventListener && metrics_global.performance; } let _performanceCursor = 0; let _measurements = {}; let _lcpEntry; let _clsEntry; /** * Start tracking web vitals */ function startTrackingWebVitals(reportAllChanges = false) { var performance = getBrowserPerformanceAPI(); if (performance && time/* browserPerformanceTimeOrigin */.Z1) { if (performance.mark) { metrics_global.performance.mark('sentry-tracing-init'); } _trackCLS(); _trackLCP(reportAllChanges); _trackFID(); } } /** * Start tracking long tasks. */ function startTrackingLongTasks() { var entryHandler = (entry) => { var transaction = (0,utils/* getActiveTransaction */.x1)() ; if (!transaction) { return; } var startTime = (0,utils/* msToSec */.XL)((time/* browserPerformanceTimeOrigin */.Z1 ) + entry.startTime); var duration = (0,utils/* msToSec */.XL)(entry.duration); transaction.startChild({ description: 'Main UI thread blocked', op: 'ui.long-task', startTimestamp: startTime, endTimestamp: startTime + duration, }); }; observe('longtask', entryHandler); } /** Starts tracking the Cumulative Layout Shift on the current page. */ function _trackCLS() { // See: // https://web.dev/evolving-cls/ // https://web.dev/cls-web-tooling/ getCLS(metric => { var entry = metric.entries.pop(); if (!entry) { return; } (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.log */.kg.log('[Measurements] Adding CLS'); _measurements['cls'] = { value: metric.value, unit: '' }; _clsEntry = entry ; }); } /** Starts tracking the Largest Contentful Paint on the current page. */ function _trackLCP(reportAllChanges) { getLCP(metric => { var entry = metric.entries.pop(); if (!entry) { return; } (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.log */.kg.log('[Measurements] Adding LCP'); _measurements['lcp'] = { value: metric.value, unit: 'millisecond' }; _lcpEntry = entry ; }, reportAllChanges); } /** Starts tracking the First Input Delay on the current page. */ function _trackFID() { getFID(metric => { var entry = metric.entries.pop(); if (!entry) { return; } var timeOrigin = (0,utils/* msToSec */.XL)(time/* browserPerformanceTimeOrigin */.Z1 ); var startTime = (0,utils/* msToSec */.XL)(entry.startTime); (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.log */.kg.log('[Measurements] Adding FID'); _measurements['fid'] = { value: metric.value, unit: 'millisecond' }; _measurements['mark.fid'] = { value: timeOrigin + startTime, unit: 'second' }; }); } /** Add performance related spans to a transaction */ function addPerformanceEntries(transaction) { var performance = getBrowserPerformanceAPI(); if (!performance || !metrics_global.performance.getEntries || !time/* browserPerformanceTimeOrigin */.Z1) { // Gatekeeper if performance API not available return; } (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.log */.kg.log('[Tracing] Adding & adjusting spans using Performance API'); var timeOrigin = (0,utils/* msToSec */.XL)(time/* browserPerformanceTimeOrigin */.Z1); var performanceEntries = performance.getEntries(); let responseStartTimestamp; let requestStartTimestamp; // eslint-disable-next-line @typescript-eslint/no-explicit-any performanceEntries.slice(_performanceCursor).forEach((entry) => { var startTime = (0,utils/* msToSec */.XL)(entry.startTime); var duration = (0,utils/* msToSec */.XL)(entry.duration); if (transaction.op === 'navigation' && timeOrigin + startTime < transaction.startTimestamp) { return; } switch (entry.entryType) { case 'navigation': { _addNavigationSpans(transaction, entry, timeOrigin); responseStartTimestamp = timeOrigin + (0,utils/* msToSec */.XL)(entry.responseStart); requestStartTimestamp = timeOrigin + (0,utils/* msToSec */.XL)(entry.requestStart); break; } case 'mark': case 'paint': case 'measure': { _addMeasureSpans(transaction, entry, startTime, duration, timeOrigin); // capture web vitals var firstHidden = getVisibilityWatcher(); // Only report if the page wasn't hidden prior to the web vital. var shouldRecord = entry.startTime < firstHidden.firstHiddenTime; if (entry.name === 'first-paint' && shouldRecord) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.log */.kg.log('[Measurements] Adding FP'); _measurements['fp'] = { value: entry.startTime, unit: 'millisecond' }; } if (entry.name === 'first-contentful-paint' && shouldRecord) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.log */.kg.log('[Measurements] Adding FCP'); _measurements['fcp'] = { value: entry.startTime, unit: 'millisecond' }; } break; } case 'resource': { var resourceName = (entry.name ).replace(metrics_global.location.origin, ''); _addResourceSpans(transaction, entry, resourceName, startTime, duration, timeOrigin); break; } default: // Ignore other entry types. } }); _performanceCursor = Math.max(performanceEntries.length - 1, 0); _trackNavigator(transaction); // Measurements are only available for pageload transactions if (transaction.op === 'pageload') { // Generate TTFB (Time to First Byte), which measured as the time between the beginning of the transaction and the // start of the response in milliseconds if (typeof responseStartTimestamp === 'number') { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.log */.kg.log('[Measurements] Adding TTFB'); _measurements['ttfb'] = { value: (responseStartTimestamp - transaction.startTimestamp) * 1000, unit: 'millisecond', }; if (typeof requestStartTimestamp === 'number' && requestStartTimestamp <= responseStartTimestamp) { // Capture the time spent making the request and receiving the first byte of the response. // This is the time between the start of the request and the start of the response in milliseconds. _measurements['ttfb.requestTime'] = { value: (responseStartTimestamp - requestStartTimestamp) * 1000, unit: 'millisecond', }; } } ['fcp', 'fp', 'lcp'].forEach(name => { if (!_measurements[name] || timeOrigin >= transaction.startTimestamp) { return; } // The web vitals, fcp, fp, lcp, and ttfb, all measure relative to timeOrigin. // Unfortunately, timeOrigin is not captured within the transaction span data, so these web vitals will need // to be adjusted to be relative to transaction.startTimestamp. var oldValue = _measurements[name].value; var measurementTimestamp = timeOrigin + (0,utils/* msToSec */.XL)(oldValue); // normalizedValue should be in milliseconds var normalizedValue = Math.abs((measurementTimestamp - transaction.startTimestamp) * 1000); var delta = normalizedValue - oldValue; (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.log */.kg.log(`[Measurements] Normalized ${name} from ${oldValue} to ${normalizedValue} (${delta})`); _measurements[name].value = normalizedValue; }); var fidMark = _measurements['mark.fid']; if (fidMark && _measurements['fid']) { // create span for FID _startChild(transaction, { description: 'first input delay', endTimestamp: fidMark.value + (0,utils/* msToSec */.XL)(_measurements['fid'].value), op: 'ui.action', startTimestamp: fidMark.value, }); // Delete mark.fid as we don't want it to be part of final payload delete _measurements['mark.fid']; } // If FCP is not recorded we should not record the cls value // according to the new definition of CLS. if (!('fcp' in _measurements)) { delete _measurements.cls; } Object.keys(_measurements).forEach(measurementName => { transaction.setMeasurement( measurementName, _measurements[measurementName].value, _measurements[measurementName].unit, ); }); _tagMetricInfo(transaction); } _lcpEntry = undefined; _clsEntry = undefined; _measurements = {}; } /** Create measure related spans */ function _addMeasureSpans( transaction, // eslint-disable-next-line @typescript-eslint/no-explicit-any entry, startTime, duration, timeOrigin, ) { var measureStartTimestamp = timeOrigin + startTime; var measureEndTimestamp = measureStartTimestamp + duration; _startChild(transaction, { description: entry.name , endTimestamp: measureEndTimestamp, op: entry.entryType , startTimestamp: measureStartTimestamp, }); return measureStartTimestamp; } /** Instrument navigation entries */ // eslint-disable-next-line @typescript-eslint/no-explicit-any function _addNavigationSpans(transaction, entry, timeOrigin) { ['unloadEvent', 'redirect', 'domContentLoadedEvent', 'loadEvent', 'connect'].forEach(event => { _addPerformanceNavigationTiming(transaction, entry, event, timeOrigin); }); _addPerformanceNavigationTiming(transaction, entry, 'secureConnection', timeOrigin, 'TLS/SSL', 'connectEnd'); _addPerformanceNavigationTiming(transaction, entry, 'fetch', timeOrigin, 'cache', 'domainLookupStart'); _addPerformanceNavigationTiming(transaction, entry, 'domainLookup', timeOrigin, 'DNS'); _addRequest(transaction, entry, timeOrigin); } /** Create performance navigation related spans */ function _addPerformanceNavigationTiming( transaction, // eslint-disable-next-line @typescript-eslint/no-explicit-any entry, event, timeOrigin, description, eventEnd, ) { var end = eventEnd ? (entry[eventEnd] ) : (entry[`${event}End`] ); var start = entry[`${event}Start`] ; if (!start || !end) { return; } _startChild(transaction, { op: 'browser', description: (0,_nullishCoalesce/* _nullishCoalesce */.h)(description, () => ( event)), startTimestamp: timeOrigin + (0,utils/* msToSec */.XL)(start), endTimestamp: timeOrigin + (0,utils/* msToSec */.XL)(end), }); } /** Create request and response related spans */ // eslint-disable-next-line @typescript-eslint/no-explicit-any function _addRequest(transaction, entry, timeOrigin) { _startChild(transaction, { op: 'browser', description: 'request', startTimestamp: timeOrigin + (0,utils/* msToSec */.XL)(entry.requestStart ), endTimestamp: timeOrigin + (0,utils/* msToSec */.XL)(entry.responseEnd ), }); _startChild(transaction, { op: 'browser', description: 'response', startTimestamp: timeOrigin + (0,utils/* msToSec */.XL)(entry.responseStart ), endTimestamp: timeOrigin + (0,utils/* msToSec */.XL)(entry.responseEnd ), }); } /** Create resource-related spans */ function _addResourceSpans( transaction, entry, resourceName, startTime, duration, timeOrigin, ) { // we already instrument based on fetch and xhr, so we don't need to // duplicate spans here. if (entry.initiatorType === 'xmlhttprequest' || entry.initiatorType === 'fetch') { return; } // eslint-disable-next-line @typescript-eslint/no-explicit-any var data = {}; if ('transferSize' in entry) { data['Transfer Size'] = entry.transferSize; } if ('encodedBodySize' in entry) { data['Encoded Body Size'] = entry.encodedBodySize; } if ('decodedBodySize' in entry) { data['Decoded Body Size'] = entry.decodedBodySize; } var startTimestamp = timeOrigin + startTime; var endTimestamp = startTimestamp + duration; _startChild(transaction, { description: resourceName, endTimestamp, op: entry.initiatorType ? `resource.${entry.initiatorType}` : 'resource.other', startTimestamp, data, }); } /** * Capture the information of the user agent. */ function _trackNavigator(transaction) { var navigator = metrics_global.navigator ; if (!navigator) { return; } // track network connectivity var connection = navigator.connection; if (connection) { if (connection.effectiveType) { transaction.setTag('effectiveConnectionType', connection.effectiveType); } if (connection.type) { transaction.setTag('connectionType', connection.type); } if (isMeasurementValue(connection.rtt)) { _measurements['connection.rtt'] = { value: connection.rtt, unit: 'millisecond' }; } } if (isMeasurementValue(navigator.deviceMemory)) { transaction.setTag('deviceMemory', `${navigator.deviceMemory} GB`); } if (isMeasurementValue(navigator.hardwareConcurrency)) { transaction.setTag('hardwareConcurrency', String(navigator.hardwareConcurrency)); } } /** Add LCP / CLS data to transaction to allow debugging */ function _tagMetricInfo(transaction) { if (_lcpEntry) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.log */.kg.log('[Measurements] Adding LCP Data'); // Capture Properties of the LCP element that contributes to the LCP. if (_lcpEntry.element) { transaction.setTag('lcp.element', (0,browser/* htmlTreeAsString */.Rt)(_lcpEntry.element)); } if (_lcpEntry.id) { transaction.setTag('lcp.id', _lcpEntry.id); } if (_lcpEntry.url) { // Trim URL to the first 200 characters. transaction.setTag('lcp.url', _lcpEntry.url.trim().slice(0, 200)); } transaction.setTag('lcp.size', _lcpEntry.size); } // See: https://developer.mozilla.org/en-US/docs/Web/API/LayoutShift if (_clsEntry && _clsEntry.sources) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.log */.kg.log('[Measurements] Adding CLS Data'); _clsEntry.sources.forEach((source, index) => transaction.setTag(`cls.source.${index + 1}`, (0,browser/* htmlTreeAsString */.Rt)(source.node)), ); } } //# sourceMappingURL=index.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/request.js var DEFAULT_TRACING_ORIGINS = ['localhost', /^\//]; /** Options for Request Instrumentation */ var defaultRequestInstrumentationOptions = { traceFetch: true, traceXHR: true, tracingOrigins: DEFAULT_TRACING_ORIGINS, }; /** Registers span creators for xhr and fetch requests */ function instrumentOutgoingRequests(_options) { // eslint-disable-next-line @typescript-eslint/unbound-method const { traceFetch, traceXHR, tracingOrigins, shouldCreateSpanForRequest } = { ...defaultRequestInstrumentationOptions, ..._options, }; // We should cache url -> decision so that we don't have to compute // regexp everytime we create a request. var urlMap = {}; var defaultShouldCreateSpan = (url) => { if (urlMap[url]) { return urlMap[url]; } var origins = tracingOrigins; urlMap[url] = origins.some((origin) => (0,string/* isMatchingPattern */.zC)(url, origin)) && !(0,string/* isMatchingPattern */.zC)(url, 'sentry_key'); return urlMap[url]; }; // We want that our users don't have to re-implement shouldCreateSpanForRequest themselves // That's why we filter out already unwanted Spans from tracingOrigins let shouldCreateSpan = defaultShouldCreateSpan; if (typeof shouldCreateSpanForRequest === 'function') { shouldCreateSpan = (url) => { return defaultShouldCreateSpan(url) && shouldCreateSpanForRequest(url); }; } var spans = {}; if (traceFetch) { (0,instrument/* addInstrumentationHandler */.o)('fetch', (handlerData) => { fetchCallback(handlerData, shouldCreateSpan, spans); }); } if (traceXHR) { (0,instrument/* addInstrumentationHandler */.o)('xhr', (handlerData) => { xhrCallback(handlerData, shouldCreateSpan, spans); }); } } /** * Create and track fetch request spans */ function fetchCallback( handlerData, shouldCreateSpan, spans, ) { if (!(0,utils/* hasTracingEnabled */.zu)() || !(handlerData.fetchData && shouldCreateSpan(handlerData.fetchData.url))) { return; } if (handlerData.endTimestamp) { var spanId = handlerData.fetchData.__span; if (!spanId) return; var span = spans[spanId]; if (span) { if (handlerData.response) { // TODO (kmclb) remove this once types PR goes through // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access span.setHttpStatus(handlerData.response.status); } else if (handlerData.error) { span.setStatus('internal_error'); } span.finish(); // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete spans[spanId]; } return; } var activeTransaction = (0,utils/* getActiveTransaction */.x1)(); if (activeTransaction) { var span = activeTransaction.startChild({ data: { ...handlerData.fetchData, type: 'fetch', }, description: `${handlerData.fetchData.method} ${handlerData.fetchData.url}`, op: 'http.client', }); handlerData.fetchData.__span = span.spanId; spans[span.spanId] = span; var request = handlerData.args[0]; // In case the user hasn't set the second argument of a fetch call we default it to `{}`. handlerData.args[1] = handlerData.args[1] || {}; // eslint-disable-next-line @typescript-eslint/no-explicit-any var options = handlerData.args[1]; options.headers = addTracingHeadersToFetchRequest( request, activeTransaction.getDynamicSamplingContext(), span, options, ); activeTransaction.metadata.propagations += 1; } } function addTracingHeadersToFetchRequest( request, dynamicSamplingContext, span, options , ) { var sentryBaggageHeader = dynamicSamplingContextToSentryBaggageHeader(dynamicSamplingContext); var sentryTraceHeader = span.toTraceparent(); var headers = typeof Request !== 'undefined' && (0,is/* isInstanceOf */.V9)(request, Request) ? (request ).headers : options.headers; if (!headers) { return { 'sentry-trace': sentryTraceHeader, baggage: sentryBaggageHeader }; } else if (typeof Headers !== 'undefined' && (0,is/* isInstanceOf */.V9)(headers, Headers)) { var newHeaders = new Headers(headers ); newHeaders.append('sentry-trace', sentryTraceHeader); if (sentryBaggageHeader) { // If the same header is appended miultiple times the browser will merge the values into a single request header. // Its therefore safe to simply push a "baggage" entry, even though there might already be another baggage header. newHeaders.append(BAGGAGE_HEADER_NAME, sentryBaggageHeader); } return newHeaders ; } else if (Array.isArray(headers)) { var newHeaders = [...headers, ['sentry-trace', sentryTraceHeader]]; if (sentryBaggageHeader) { // If there are multiple entries with the same key, the browser will merge the values into a single request header. // Its therefore safe to simply push a "baggage" entry, even though there might already be another baggage header. newHeaders.push([BAGGAGE_HEADER_NAME, sentryBaggageHeader]); } return newHeaders; } else { var existingBaggageHeader = 'baggage' in headers ? headers.baggage : undefined; var newBaggageHeaders = []; if (Array.isArray(existingBaggageHeader)) { newBaggageHeaders.push(...existingBaggageHeader); } else if (existingBaggageHeader) { newBaggageHeaders.push(existingBaggageHeader); } if (sentryBaggageHeader) { newBaggageHeaders.push(sentryBaggageHeader); } return { ...(headers ), 'sentry-trace': sentryTraceHeader, baggage: newBaggageHeaders.length > 0 ? newBaggageHeaders.join(',') : undefined, }; } } /** * Create and track xhr request spans */ function xhrCallback( handlerData, shouldCreateSpan, spans, ) { if ( !(0,utils/* hasTracingEnabled */.zu)() || (handlerData.xhr && handlerData.xhr.__sentry_own_request__) || !(handlerData.xhr && handlerData.xhr.__sentry_xhr__ && shouldCreateSpan(handlerData.xhr.__sentry_xhr__.url)) ) { return; } var xhr = handlerData.xhr.__sentry_xhr__; // check first if the request has finished and is tracked by an existing span which should now end if (handlerData.endTimestamp) { var spanId = handlerData.xhr.__sentry_xhr_span_id__; if (!spanId) return; var span = spans[spanId]; if (span) { span.setHttpStatus(xhr.status_code); span.finish(); // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete spans[spanId]; } return; } // if not, create a new span to track it var activeTransaction = (0,utils/* getActiveTransaction */.x1)(); if (activeTransaction) { var span = activeTransaction.startChild({ data: { ...xhr.data, type: 'xhr', method: xhr.method, url: xhr.url, }, description: `${xhr.method} ${xhr.url}`, op: 'http.client', }); handlerData.xhr.__sentry_xhr_span_id__ = span.spanId; spans[handlerData.xhr.__sentry_xhr_span_id__] = span; if (handlerData.xhr.setRequestHeader) { try { handlerData.xhr.setRequestHeader('sentry-trace', span.toTraceparent()); var dynamicSamplingContext = activeTransaction.getDynamicSamplingContext(); var sentryBaggageHeader = dynamicSamplingContextToSentryBaggageHeader(dynamicSamplingContext); if (sentryBaggageHeader) { // From MDN: "If this method is called several times with the same header, the values are merged into one single request header." // We can therefore simply set a baggage header without checking what was there before // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/setRequestHeader handlerData.xhr.setRequestHeader(BAGGAGE_HEADER_NAME, sentryBaggageHeader); } activeTransaction.metadata.propagations += 1; } catch (_) { // Error: InvalidStateError: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': The object's state must be OPENED. } } } } //# sourceMappingURL=request.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/router.js var router_global = (0,esm_global/* getGlobalObject */.R)(); /** * Default function implementing pageload and navigation transactions */ function instrumentRoutingWithDefaults( customStartTransaction, startTransactionOnPageLoad = true, startTransactionOnLocationChange = true, ) { if (!router_global || !router_global.location) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.warn */.kg.warn('Could not initialize routing instrumentation due to invalid location'); return; } let startingUrl = router_global.location.href; let activeTransaction; if (startTransactionOnPageLoad) { activeTransaction = customStartTransaction({ name: router_global.location.pathname, op: 'pageload', metadata: { source: 'url' }, }); } if (startTransactionOnLocationChange) { (0,instrument/* addInstrumentationHandler */.o)('history', ({ to, from }) => { /** * This early return is there to account for some cases where a navigation transaction starts right after * long-running pageload. We make sure that if `from` is undefined and a valid `startingURL` exists, we don't * create an uneccessary navigation transaction. * * This was hard to duplicate, but this behavior stopped as soon as this fix was applied. This issue might also * only be caused in certain development environments where the usage of a hot module reloader is causing * errors. */ if (from === undefined && startingUrl && startingUrl.indexOf(to) !== -1) { startingUrl = undefined; return; } if (from !== to) { startingUrl = undefined; if (activeTransaction) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.log */.kg.log(`[Tracing] Finishing current transaction with op: ${activeTransaction.op}`); // If there's an open transaction on the scope, we need to finish it before creating an new one. activeTransaction.finish(); } activeTransaction = customStartTransaction({ name: router_global.location.pathname, op: 'navigation', metadata: { source: 'url' }, }); } }); } } //# sourceMappingURL=router.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/browser/browsertracing.js var BROWSER_TRACING_INTEGRATION_ID = 'BrowserTracing'; /** Options for Browser Tracing integration */ var DEFAULT_BROWSER_TRACING_OPTIONS = { idleTimeout: idletransaction/* DEFAULT_IDLE_TIMEOUT */.nT, finalTimeout: idletransaction/* DEFAULT_FINAL_TIMEOUT */.mg, heartbeatInterval: idletransaction/* DEFAULT_HEARTBEAT_INTERVAL */.hd, markBackgroundTransactions: true, routingInstrumentation: instrumentRoutingWithDefaults, startTransactionOnLocationChange: true, startTransactionOnPageLoad: true, _experiments: { enableLongTask: true }, ...defaultRequestInstrumentationOptions, }; /** * The Browser Tracing integration automatically instruments browser pageload/navigation * actions as transactions, and captures requests, metrics and errors as spans. * * The integration can be configured with a variety of options, and can be extended to use * any routing library. This integration uses {@see IdleTransaction} to create transactions. */ class BrowserTracing { // This class currently doesn't have a static `id` field like the other integration classes, because it prevented // @sentry/tracing from being treeshaken. Tree shakers do not like static fields, because they behave like side effects. // TODO: Come up with a better plan, than using static fields on integration classes, and use that plan on all // integrations. /** Browser Tracing integration options */ /** * @inheritDoc */ __init() {this.name = BROWSER_TRACING_INTEGRATION_ID;} constructor(_options) {;BrowserTracing.prototype.__init.call(this); let tracingOrigins = defaultRequestInstrumentationOptions.tracingOrigins; // NOTE: Logger doesn't work in constructors, as it's initialized after integrations instances if (_options) { if (_options.tracingOrigins && Array.isArray(_options.tracingOrigins)) { tracingOrigins = _options.tracingOrigins; } else { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && (this._emitOptionsWarning = true); } } this.options = { ...DEFAULT_BROWSER_TRACING_OPTIONS, ..._options, tracingOrigins, }; const { _metricOptions } = this.options; startTrackingWebVitals(_metricOptions && _metricOptions._reportAllChanges); if (_optionalChain([this, 'access', _2 => _2.options, 'access', _3 => _3._experiments, 'optionalAccess', _4 => _4.enableLongTask])) { startTrackingLongTasks(); } } /** * @inheritDoc */ setupOnce(_, getCurrentHub) { this._getCurrentHub = getCurrentHub; if (this._emitOptionsWarning) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.warn */.kg.warn( '[Tracing] You need to define `tracingOrigins` in the options. Set an array of urls or patterns to trace.', ); (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.warn */.kg.warn( `[Tracing] We added a reasonable default for you: ${defaultRequestInstrumentationOptions.tracingOrigins}`, ); } // eslint-disable-next-line @typescript-eslint/unbound-method const { routingInstrumentation: instrumentRouting, startTransactionOnLocationChange, startTransactionOnPageLoad, markBackgroundTransactions, traceFetch, traceXHR, tracingOrigins, shouldCreateSpanForRequest, } = this.options; instrumentRouting( (context) => this._createRouteTransaction(context), startTransactionOnPageLoad, startTransactionOnLocationChange, ); if (markBackgroundTransactions) { registerBackgroundTabDetection(); } instrumentOutgoingRequests({ traceFetch, traceXHR, tracingOrigins, shouldCreateSpanForRequest }); } /** Create routing idle transaction. */ _createRouteTransaction(context) { if (!this._getCurrentHub) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.warn */.kg.warn(`[Tracing] Did not create ${context.op} transaction because _getCurrentHub is invalid.`); return undefined; } // eslint-disable-next-line @typescript-eslint/unbound-method const { beforeNavigate, idleTimeout, finalTimeout, heartbeatInterval } = this.options; var isPageloadTransaction = context.op === 'pageload'; var sentryTraceMetaTagValue = isPageloadTransaction ? getMetaContent('sentry-trace') : null; var baggageMetaTagValue = isPageloadTransaction ? getMetaContent('baggage') : null; var traceParentData = sentryTraceMetaTagValue ? extractTraceparentData(sentryTraceMetaTagValue) : undefined; var dynamicSamplingContext = baggageMetaTagValue ? baggageHeaderToDynamicSamplingContext(baggageMetaTagValue) : undefined; var expandedContext = { ...context, ...traceParentData, metadata: { ...context.metadata, dynamicSamplingContext: traceParentData && !dynamicSamplingContext ? {} : dynamicSamplingContext, }, trimEnd: true, }; var modifiedContext = typeof beforeNavigate === 'function' ? beforeNavigate(expandedContext) : expandedContext; // For backwards compatibility reasons, beforeNavigate can return undefined to "drop" the transaction (prevent it // from being sent to Sentry). var finalContext = modifiedContext === undefined ? { ...expandedContext, sampled: false } : modifiedContext; // If `beforeNavigate` set a custom name, record that fact finalContext.metadata = finalContext.name !== expandedContext.name ? { ...finalContext.metadata, source: 'custom' } : finalContext.metadata; if (finalContext.sampled === false) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.log */.kg.log(`[Tracing] Will not send ${finalContext.op} transaction because of beforeNavigate.`); } (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.log */.kg.log(`[Tracing] Starting ${finalContext.op} transaction on scope`); var hub = this._getCurrentHub(); const { location } = (0,esm_global/* getGlobalObject */.R)() ; var idleTransaction = (0,hubextensions/* startIdleTransaction */.lb)( hub, finalContext, idleTimeout, finalTimeout, true, { location }, // for use in the tracesSampler heartbeatInterval, ); idleTransaction.registerBeforeFinishCallback(transaction => { addPerformanceEntries(transaction); transaction.setTag( 'sentry_reportAllChanges', Boolean(this.options._metricOptions && this.options._metricOptions._reportAllChanges), ); }); return idleTransaction ; } } /** Returns the value of a meta tag */ function getMetaContent(metaName) { // Can't specify generic to `getDomElement` because tracing can be used // in a variety of environments, have to disable `no-unsafe-member-access` // as a result. var metaTag = (0,browser/* getDomElement */.qT)(`meta[name=${metaName}]`); // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access return metaTag ? metaTag.getAttribute('content') : null; } //# sourceMappingURL=browsertracing.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/tracing/esm/index.js ; ; // Treeshakable guard to remove all code related to tracing // Guard for tree if (typeof __SENTRY_TRACING__ === 'undefined' || __SENTRY_TRACING__) { // We are patching the global object with our hub extension methods (0,hubextensions/* addExtensionMethods */.ro)(); } //# sourceMappingURL=index.js.map // EXTERNAL MODULE: ./node_modules/next/router.js var router = __webpack_require__(1163); var router_default = /*#__PURE__*/__webpack_require__.n(router); ;// CONCATENATED MODULE: ./node_modules/@sentry/nextjs/esm/performance/client.js var client_global = (0,esm_global/* getGlobalObject */.R) (); /** * Every Next.js page (static and dynamic ones) comes with a script tag with the id "__NEXT_DATA__". This script tag * contains a JSON object with data that was either generated at build time for static pages (`getStaticProps`), or at * runtime with data fetchers like `getServerSideProps.`. * * We can use this information to: * - Always get the parameterized route we're in when loading a page. * - Send trace information (trace-id, baggage) from the server to the client. * * This function extracts this information. */ function extractNextDataTagInformation() { let nextData; // Let's be on the safe side and actually check first if there is really a __NEXT_DATA__ script tag on the page. // Theoretically this should always be the case though. var nextDataTag = client_global.document.getElementById('__NEXT_DATA__'); if (nextDataTag && nextDataTag.innerHTML) { try { nextData = JSON.parse(nextDataTag.innerHTML); } catch (e) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && esm_logger/* logger.warn */.kg.warn('Could not extract __NEXT_DATA__'); } } if (!nextData) { return {}; } var nextDataTagInfo = {}; const { page, query, props } = nextData; // `nextData.page` always contains the parameterized route - except for when an error occurs in a data fetching // function, then it is "/_error", but that isn't a problem since users know which route threw by looking at the // parent transaction // TODO: Actually this is a problem (even though it is not that big), because the DSC and the transaction payload will contain // a different transaction name. Maybe we can fix this. Idea: Also send transaction name via pageProps when available. nextDataTagInfo.route = page; nextDataTagInfo.params = query; if (props && props.pageProps) { if (props.pageProps._sentryBaggage) { nextDataTagInfo.baggage = props.pageProps._sentryBaggage; } if (props.pageProps._sentryTraceData) { nextDataTagInfo.traceParentData = extractTraceparentData(props.pageProps._sentryTraceData); } } return nextDataTagInfo; } var DEFAULT_TAGS = { 'routing.instrumentation': 'next-router', } ; // We keep track of the active transaction so we can finish it when we start a navigation transaction. let activeTransaction = undefined; // We keep track of the previous location name so we can set the `from` field on navigation transactions. // This is either a route or a pathname. let prevLocationName = undefined; var client = (0,esm_hub/* getCurrentHub */.Gd)().getClient(); /** * Creates routing instrumention for Next Router. Only supported for * client side routing. Works for Next >= 10. * * Leverages the SingletonRouter from the `next/router` to * generate pageload/navigation transactions and parameterize * transaction names. */ function nextRouterInstrumentation( startTransactionCb, startTransactionOnPageLoad = true, startTransactionOnLocationChange = true, ) { const { route, traceParentData, baggage, params } = extractNextDataTagInformation(); prevLocationName = route || client_global.location.pathname; if (startTransactionOnPageLoad) { var source = route ? 'route' : 'url'; var dynamicSamplingContext = baggageHeaderToDynamicSamplingContext(baggage); activeTransaction = startTransactionCb({ name: prevLocationName, op: 'pageload', tags: DEFAULT_TAGS, ...(params && client && client.getOptions().sendDefaultPii && { data: params }), ...traceParentData, metadata: { source, dynamicSamplingContext: traceParentData && !dynamicSamplingContext ? {} : dynamicSamplingContext, }, }); } if (startTransactionOnLocationChange) { router_default().events.on('routeChangeStart', (navigationTarget) => { var matchedRoute = getNextRouteFromPathname(stripUrlQueryAndFragment(navigationTarget)); let transactionName; let transactionSource; if (matchedRoute) { transactionName = matchedRoute; transactionSource = 'route'; } else { transactionName = navigationTarget; transactionSource = 'url'; } var tags = { ...DEFAULT_TAGS, from: prevLocationName, }; prevLocationName = transactionName; if (activeTransaction) { activeTransaction.finish(); } var navigationTransaction = startTransactionCb({ name: transactionName, op: 'navigation', tags, metadata: { source: transactionSource }, }); if (navigationTransaction) { // In addition to the navigation transaction we're also starting a span to mark Next.js's `routeChangeStart` // and `routeChangeComplete` events. // We don't want to finish the navigation transaction on `routeChangeComplete`, since users might want to attach // spans to that transaction even after `routeChangeComplete` is fired (eg. HTTP requests in some useEffect // hooks). Instead, we'll simply let the navigation transaction finish itself (it's an `IdleTransaction`). var nextRouteChangeSpan = navigationTransaction.startChild({ op: 'ui.nextjs.route-change', description: 'Next.js Route Change', }); var finishRouteChangeSpan = () => { nextRouteChangeSpan.finish(); router_default().events.off('routeChangeComplete', finishRouteChangeSpan); }; router_default().events.on('routeChangeComplete', finishRouteChangeSpan); } }); } } function getNextRouteFromPathname(pathname) { var pageRoutes = (client_global.__BUILD_MANIFEST || {}).sortedPages; // Page route should in 99.999% of the cases be defined by now but just to be sure we make a check here if (!pageRoutes) { return; } return pageRoutes.find(route => { var routeRegExp = convertNextRouteToRegExp(route); return pathname.match(routeRegExp); }); } /** * Converts a Next.js style route to a regular expression that matches on pathnames (no query params or URL fragments). * * In general this involves replacing any instances of square brackets in a route with a wildcard: * e.g. "/users/[id]/info" becomes /\/users\/([^/]+?)\/info/ * * Some additional edgecases need to be considered: * - All routes have an optional slash at the end, meaning users can navigate to "/users/[id]/info" or * "/users/[id]/info/" - both will be resolved to "/users/[id]/info". * - Non-optional "catchall"s at the end of a route must be considered when matching (e.g. "/users/[...params]"). * - Optional "catchall"s at the end of a route must be considered when matching (e.g. "/users/[[...params]]"). * * @param route A Next.js style route as it is found in `global.__BUILD_MANIFEST.sortedPages` */ function convertNextRouteToRegExp(route) { // We can assume a route is at least "/". var routeParts = route.split('/'); let optionalCatchallWildcardRegex = ''; if (routeParts[routeParts.length - 1].match(/^\[\[\.\.\..+\]\]$/)) { // If last route part has pattern "[[...xyz]]" we pop the latest route part to get rid of the required trailing // slash that would come before it if we didn't pop it. routeParts.pop(); optionalCatchallWildcardRegex = '(?:/(.+?))?'; } var rejoinedRouteParts = routeParts .map( routePart => routePart .replace(/^\[\.\.\..+\]$/, '(.+?)') // Replace catch all wildcard with regex wildcard .replace(/^\[.*\]$/, '([^/]+?)'), // Replace route wildcards with lazy regex wildcards ) .join('/'); return new RegExp( `^${rejoinedRouteParts}${optionalCatchallWildcardRegex}(?:/)?$`, // optional slash at the end ); } //# sourceMappingURL=client.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/nextjs/esm/utils/metadata.js var PACKAGE_NAME_PREFIX = 'npm:@sentry/'; /** * A builder for the SDK metadata in the options for the SDK initialization. * @param options sdk options object that gets mutated * @param names list of package names */ function buildMetadata(options, names) { options._metadata = options._metadata || {}; options._metadata.sdk = options._metadata.sdk || ({ name: 'sentry.javascript.nextjs', packages: names.map(name => ({ name: `${PACKAGE_NAME_PREFIX}${name}`, version: SDK_VERSION, })), version: SDK_VERSION, } ); } //# sourceMappingURL=metadata.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/nextjs/esm/utils/userIntegrations.js /** * Recursively traverses an object to update an existing nested key. * Note: The provided key path must include existing properties, * the function will not create objects while traversing. * * @param obj An object to update * @param value The value to update the nested key with * @param keyPath The path to the key to update ex. fizz.buzz.foo */ // eslint-disable-next-line @typescript-eslint/no-explicit-any function setNestedKey(obj, keyPath, value) { // Ex. foo.bar.zoop will extract foo and bar.zoop var match = keyPath.match(/([a-z_]+)\.(.*)/i); // The match will be null when there's no more recursing to do, i.e., when we've reached the right level of the object if (match === null) { obj[keyPath] = value; } else { // `match[1]` is the initial segment of the path, and `match[2]` is the remainder of the path var innerObj = obj[match[1]]; setNestedKey(innerObj, match[2], value); } } /** * Enforces inclusion of a given integration with specified options in an integration array originally determined by the * user, by either including the given default instance or by patching an existing user instance with the given options. * * Ideally this would happen when integrations are set up, but there isn't currently a mechanism there for merging * options from a default integration instance with those from a user-provided instance of the same integration, only * for allowing the user to override a default instance entirely. (TODO: Fix that.) * * @param defaultIntegrationInstance An instance of the integration with the correct options already set * @param userIntegrations Integrations defined by the user. * @param forcedOptions Options with which to patch an existing user-derived instance on the integration. * @returns A final integrations array. */ function addOrUpdateIntegration( defaultIntegrationInstance, userIntegrations, forcedOptions = {}, ) { return Array.isArray(userIntegrations) ? addOrUpdateIntegrationInArray(defaultIntegrationInstance, userIntegrations, forcedOptions) : addOrUpdateIntegrationInFunction(defaultIntegrationInstance, userIntegrations, forcedOptions); } function addOrUpdateIntegrationInArray( defaultIntegrationInstance, userIntegrations, forcedOptions, ) { var userInstance = userIntegrations.find(integration => integration.name === defaultIntegrationInstance.name); if (userInstance) { for (const [keyPath, value] of Object.entries(forcedOptions)) { setNestedKey(userInstance, keyPath, value); } return userIntegrations; } return [...userIntegrations, defaultIntegrationInstance]; } function addOrUpdateIntegrationInFunction( defaultIntegrationInstance, userIntegrationsFunc, forcedOptions, ) { var wrapper = defaultIntegrations => { var userFinalIntegrations = userIntegrationsFunc(defaultIntegrations); return addOrUpdateIntegrationInArray(defaultIntegrationInstance, userFinalIntegrations, forcedOptions); }; return wrapper; } //# sourceMappingURL=userIntegrations.js.map ;// CONCATENATED MODULE: ./node_modules/@sentry/nextjs/esm/index.client.js // Treeshakable guard to remove all code related to tracing /** Inits the Sentry NextJS SDK on the browser with the React SDK. */ function index_client_init(options) { buildMetadata(options, ['nextjs', 'react']); options.environment = options.environment || "production"; let integrations = options.integrations; // Guard below evaluates to true unless __SENTRY_TRACING__ is text-replaced with "false" if (typeof __SENTRY_TRACING__ === 'undefined' || __SENTRY_TRACING__) { // Only add BrowserTracing if a tracesSampleRate or tracesSampler is set if (options.tracesSampleRate !== undefined || options.tracesSampler !== undefined) { integrations = createClientIntegrations(options.integrations); } } sdk_init({ ...options, integrations, }); configureScope(scope => { scope.setTag('runtime', 'browser'); var filterTransactions = event => event.type === 'transaction' && event.transaction === '/404' ? null : event; filterTransactions.id = 'NextClient404Filter'; scope.addEventProcessor(filterTransactions); }); } function createClientIntegrations(userIntegrations = []) { var defaultBrowserTracingIntegration = new BrowserTracing({ tracingOrigins: [...defaultRequestInstrumentationOptions.tracingOrigins, /^(api\/)/], routingInstrumentation: nextRouterInstrumentation, }); return addOrUpdateIntegration(defaultBrowserTracingIntegration, userIntegrations, { 'options.routingInstrumentation': nextRouterInstrumentation, }); } //# sourceMappingURL=index.client.js.map ;// CONCATENATED MODULE: ./sentry.client.config.js /* provided dependency */ var process = __webpack_require__(3454); // This file configures the initialization of Sentry on the browser. The config you add here will be used whenever a // page is visited. https://docs.sentry.io/platforms/javascript/guides/nextjs/ var SENTRY_DSN = process.env.SENTRY_DSN || process.env.NEXT_PUBLIC_SENTRY_DSN; var IS_LOCAL = ("production" || 0) === "local"; index_client_init({ dsn: SENTRY_DSN || "https://25b6ffda29c949f68e21786fe7aa63b3@o776661.ingest.sentry.io/4504091483766784", enabled: !IS_LOCAL, tracesSampleRate: 1.0 }); /***/ }), /***/ 1087: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; // ESM COMPAT FLAG __webpack_require__.r(__webpack_exports__); // EXPORTS __webpack_require__.d(__webpack_exports__, { "default": function() { return /* binding */ _app; } }); ;// CONCATENATED MODULE: ./node_modules/@swc/helpers/src/_define_property.mjs function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } ;// CONCATENATED MODULE: ./node_modules/@swc/helpers/src/_object_spread.mjs function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } ;// CONCATENATED MODULE: ./node_modules/@swc/helpers/src/_object_spread_props.mjs function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpreadProps(target, source) { source = source != null ? source : {} if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty( target, key, Object.getOwnPropertyDescriptor(source, key) ); }); } return target; } // EXTERNAL MODULE: ./node_modules/react/jsx-runtime.js var jsx_runtime = __webpack_require__(5893); // EXTERNAL MODULE: ./node_modules/styled-jsx/style.js var style = __webpack_require__(357); var style_default = /*#__PURE__*/__webpack_require__.n(style); // EXTERNAL MODULE: ./node_modules/next/head.js var head = __webpack_require__(9008); var head_default = /*#__PURE__*/__webpack_require__.n(head); // EXTERNAL MODULE: ./node_modules/react/index.js var react = __webpack_require__(7294); ;// CONCATENATED MODULE: ./src/pages/_app.tsx var MyApp = function(props) { var Component = props.Component, pageProps = props.pageProps; return /*#__PURE__*/ (0,jsx_runtime.jsxs)(react.Fragment, { children: [ /*#__PURE__*/ (0,jsx_runtime.jsxs)((head_default()), { children: [ /*#__PURE__*/ (0,jsx_runtime.jsx)("title", { className: "jsx-a8178aa022803224", children: "Esports Awards x Verizon | Giveaway" }), /*#__PURE__*/ (0,jsx_runtime.jsx)("meta", { content: "/favicon.ico", property: "og:image", className: "jsx-a8178aa022803224" }, "og:image"), /*#__PURE__*/ (0,jsx_runtime.jsx)("link", { href: "https://fonts.googleapis.com", rel: "preconnect", className: "jsx-a8178aa022803224" }), /*#__PURE__*/ (0,jsx_runtime.jsx)("link", { crossOrigin: "anonymous", href: "https://fonts.gstatic.com", rel: "preconnect", className: "jsx-a8178aa022803224" }), /*#__PURE__*/ (0,jsx_runtime.jsx)("link", { href: "/assets/img/favicon.ico", rel: "icon", className: "jsx-a8178aa022803224" }) ] }), (0,jsx_runtime.jsx)((style_default()), { id: "a8178aa022803224", children: '::-webkit-scrollbar{height:8px;width:8px}::-webkit-scrollbar-track{background-color:#1d1d25;-webkit-border-radius:.5em;-moz-border-radius:.5em;border-radius:.5em;margin:0 4px}::-webkit-scrollbar-thumb{background-color:#adadad;-webkit-border-radius:.5em;-moz-border-radius:.5em;border-radius:.5em;&:hover{background-color:lighten(#adadad,15%)}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-family:inherit;font-size:inherit}body{background-color:#000!important;background-image:url("/assets/bg.jpeg");background-position:center center;background-repeat:repeat;color:#c9c9c9;font-family:"Open Sans",Verdana,Arial,sans-serif!important;font-size:16px;height:100vh;overflow-y:scroll!important;padding:1em;text-align:center}button{background-color:#000;border:1px solid transparent;-webkit-border-radius:.5em;-moz-border-radius:.5em;border-radius:.5em;-webkit-box-shadow:0 0 5px rgba(0,0,0,.85);-moz-box-shadow:0 0 5px rgba(0,0,0,.85);box-shadow:0 0 5px rgba(0,0,0,.85);color:#cacaca;cursor:pointer;font-family:"Montserrat",sans-serif!important;padding:.5em 1.25em;-webkit-transition:all.5s ease-in-out;-moz-transition:all.5s ease-in-out;-o-transition:all.5s ease-in-out;transition:all.5s ease-in-out}button[disabled]{cursor:default;opacity:.75;pointer-events:none}button:hover{color:#fff}button[type="submit"]{background-color:#be8f2d;-webkit-box-shadow:0 1px 3px#be8f2d;-moz-box-shadow:0 1px 3px#be8f2d;box-shadow:0 1px 3px#be8f2d;color:#fff}button[type="submit"]:hover{background-color:#976e1a}button[type="reset"]{background-color:#111}button[type="reset"]:hover{background-color:#222}h1,h2,h3,h4,h5,h6{-webkit-background-clip:text;background-clip:text;background-image:url("/assets/gold-texture.jpg");-webkit-background-size:50px;-moz-background-size:50px;-o-background-size:50px;background-size:50px;color:#d6ab51;font-family:"Montserrat",sans-serif!important;font-weight:normal!important;text-transform:uppercase;-webkit-text-fill-color:transparent}h1{font-size:3em}h2{font-size:2em}#header{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-webkit-justify-content:center;-moz-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:1em}#header>*{margin-bottom:0}#header *:not(:last-child){margin-right:1em}#header>*:nth-child(2){color:#e5b45c;font-size:2em;font-weight:bold;margin-left:20px;margin-right:40px}#header .esports{background-image:url("https://esportsawards.com/wp-content/themes/esports/public/img/logo-esports-lexus-landscape.png");height:100px;width:240px}.message{background-color:lightgray;border:1px solid gray;-webkit-border-radius:.85em;-moz-border-radius:.85em;border-radius:.85em;color:#000;margin:0 auto;margin-top:1em;padding:5px 10px;width:50%}.message.error,.message.success{color:#fff}.message.error{background-color:red;border-color:red}.message.success{background-color:green;border-color:green}' }), /*#__PURE__*/ (0,jsx_runtime.jsx)(Component, _objectSpreadProps(_objectSpread({}, pageProps), { className: "jsx-a8178aa022803224" + " " + (pageProps && pageProps.className != null && pageProps.className || "") })) ] }); }; /* harmony default export */ var _app = (MyApp); /***/ }), /***/ 7663: /***/ (function(module) { var __dirname = "/"; (function(){var e={229:function(e){var t=e.exports={};var r;var n;function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}(function(){try{if(typeof setTimeout==="function"){r=setTimeout}else{r=defaultSetTimout}}catch(e){r=defaultSetTimout}try{if(typeof clearTimeout==="function"){n=clearTimeout}else{n=defaultClearTimeout}}catch(e){n=defaultClearTimeout}})();function runTimeout(e){if(r===setTimeout){return setTimeout(e,0)}if((r===defaultSetTimout||!r)&&setTimeout){r=setTimeout;return setTimeout(e,0)}try{return r(e,0)}catch(t){try{return r.call(null,e,0)}catch(t){return r.call(this,e,0)}}}function runClearTimeout(e){if(n===clearTimeout){return clearTimeout(e)}if((n===defaultClearTimeout||!n)&&clearTimeout){n=clearTimeout;return clearTimeout(e)}try{return n(e)}catch(t){try{return n.call(null,e)}catch(t){return n.call(this,e)}}}var i=[];var o=false;var u;var a=-1;function cleanUpNextTick(){if(!o||!u){return}o=false;if(u.length){i=u.concat(i)}else{a=-1}if(i.length){drainQueue()}}function drainQueue(){if(o){return}var e=runTimeout(cleanUpNextTick);o=true;var t=i.length;while(t){u=i;i=[];while(++a1){for(var r=1;r