logrocket
Version:
JavaScript SDK for [LogRocket](https://logrocket.com/)
1,162 lines (1,072 loc) • 158 kB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define([], factory);
else {
var a = factory();
for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
}
})(this, function() {
return /******/ (function() { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ "./packages/@logrocket/console/src/index.js":
/*!**************************************************!*\
!*** ./packages/@logrocket/console/src/index.js ***!
\**************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
var _registerConsole = _interopRequireDefault(__webpack_require__(/*! ./registerConsole */ "./packages/@logrocket/console/src/registerConsole.js"));
var _default = _registerConsole.default;
exports["default"] = _default;
/***/ }),
/***/ "./packages/@logrocket/console/src/registerConsole.js":
/*!************************************************************!*\
!*** ./packages/@logrocket/console/src/registerConsole.js ***!
\************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = registerConsole;
var _typeof2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js"));
var _enhanceFunc = _interopRequireDefault(__webpack_require__(/*! @logrocket/utils/src/enhanceFunc */ "./packages/@logrocket/utils/src/enhanceFunc.ts"));
var _exceptions = __webpack_require__(/*! @logrocket/exceptions */ "./packages/@logrocket/exceptions/src/index.js");
// eslint-disable-line no-restricted-imports
function registerConsole(logger) {
var unsubFunctions = [];
var methods = ['log', 'warn', 'info', 'error', 'debug'];
methods.forEach(function (method) {
unsubFunctions.push((0, _enhanceFunc.default)(console, method, function () {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
logger.addEvent('lr.core.LogEvent', function () {
var consoleOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var isEnabled = consoleOptions.isEnabled;
if ((0, _typeof2.default)(isEnabled) === 'object' && isEnabled[method] === false || isEnabled === false) {
return null;
}
if (method === 'error' && consoleOptions.shouldAggregateConsoleErrors) {
// some customers have loggers that add the log level as the first arg
if (!!args && args.length >= 2 && args[0] === 'ERROR') {
var secondArg = '';
try {
secondArg = " ".concat(args[1]);
} catch (_unused) {} // eslint-disable-line no-empty
_exceptions.Capture.captureMessage(logger, "".concat(args[0]).concat(secondArg), args, {}, true);
} else {
_exceptions.Capture.captureMessage(logger, args[0], args, {}, true);
}
}
return {
logLevel: method.toUpperCase(),
args: args
};
});
}));
});
return function () {
unsubFunctions.forEach(function (unsubFunction) {
return unsubFunction();
});
};
}
/***/ }),
/***/ "./packages/@logrocket/exceptions/src/Capture.js":
/*!*******************************************************!*\
!*** ./packages/@logrocket/exceptions/src/Capture.js ***!
\*******************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.captureMessage = captureMessage;
exports.captureException = captureException;
var _scrubException = __webpack_require__(/*! @logrocket/utils/src/scrubException */ "./packages/@logrocket/utils/src/scrubException.ts");
var _TraceKit = _interopRequireDefault(__webpack_require__(/*! @logrocket/utils/src/TraceKit */ "./packages/@logrocket/utils/src/TraceKit.js"));
var _stackTraceFromError = _interopRequireDefault(__webpack_require__(/*! ./stackTraceFromError */ "./packages/@logrocket/exceptions/src/stackTraceFromError.js"));
// eslint-disable-line no-restricted-imports
// eslint-disable-line no-restricted-imports
function captureMessage(logger, message, messageArgs) {
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
var isConsole = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
var data = {
exceptionType: isConsole ? 'CONSOLE' : 'MESSAGE',
message: message,
messageArgs: messageArgs,
browserHref: window.location ? window.location.href : ''
};
(0, _scrubException.scrubException)(data, options);
logger.addEvent('lr.core.Exception', function () {
return data;
});
}
function captureException(logger, exception) {
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var preppedTrace = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
var exceptionType = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'WINDOW';
var trace = preppedTrace || _TraceKit.default.computeStackTrace(exception);
var data = {
exceptionType: exceptionType,
errorType: trace.name,
message: trace.message,
browserHref: window.location ? window.location.href : ''
};
(0, _scrubException.scrubException)(data, options);
var addEventOptions = {
_stackTrace: (0, _stackTraceFromError.default)(trace)
};
logger.addEvent('lr.core.Exception', function () {
return data;
}, addEventOptions);
}
/***/ }),
/***/ "./packages/@logrocket/exceptions/src/index.js":
/*!*****************************************************!*\
!*** ./packages/@logrocket/exceptions/src/index.js ***!
\*****************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js");
var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
Object.defineProperty(exports, "registerExceptions", ({
enumerable: true,
get: function get() {
return _registerExceptions.default;
}
}));
exports.Capture = void 0;
var _registerExceptions = _interopRequireDefault(__webpack_require__(/*! ./registerExceptions */ "./packages/@logrocket/exceptions/src/registerExceptions.js"));
var Capture = _interopRequireWildcard(__webpack_require__(/*! ./Capture */ "./packages/@logrocket/exceptions/src/Capture.js"));
exports.Capture = Capture;
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
/***/ }),
/***/ "./packages/@logrocket/exceptions/src/raven/raven.js":
/*!***********************************************************!*\
!*** ./packages/@logrocket/exceptions/src/raven/raven.js ***!
\***********************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js"));
var _createClass2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js"));
var _TraceKit = _interopRequireDefault(__webpack_require__(/*! @logrocket/utils/src/TraceKit */ "./packages/@logrocket/utils/src/TraceKit.js"));
/* eslint-disable */
/*
Some contents of this file were originaly from raven-js, BSD-2 Clause
Copyright (c) 2018 Sentry (https://sentry.io) and individual contributors.
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
var objectPrototype = Object.prototype;
function isUndefined(what) {
return what === void 0;
}
function isFunction(what) {
return typeof what === 'function';
}
function each(obj, callback) {
var i, j;
if (isUndefined(obj.length)) {
for (i in obj) {
if (hasKey(obj, i)) {
callback.call(null, i, obj[i]);
}
}
} else {
j = obj.length;
if (j) {
for (i = 0; i < j; i++) {
callback.call(null, i, obj[i]);
}
}
}
}
/**
* hasKey, a better form of hasOwnProperty
* Example: hasKey(MainHostObject, property) === true/false
*
* @param {Object} host object to check property
* @param {string} key to check
*/
function hasKey(object, key) {
return objectPrototype.hasOwnProperty.call(object, key);
}
/**
* Polyfill a method
* @param obj object e.g. `document`
* @param name method name present on object e.g. `addEventListener`
* @param replacement replacement function
* @param track {optional} record instrumentation to an array
*/
function fill(obj, name, replacement, track) {
var orig = obj[name];
obj[name] = replacement(orig);
if (track) {
track.push([obj, name, orig]);
}
}
var _window = typeof window !== 'undefined' ? window : typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof self !== 'undefined' ? self : {};
var _document = _window.document;
var Handler = /*#__PURE__*/function () {
function Handler(_ref) {
var captureException = _ref.captureException;
(0, _classCallCheck2.default)(this, Handler);
this._errorHandler = this._errorHandler.bind(this);
this._ignoreOnError = 0;
this._wrappedBuiltIns = [];
this.captureException = captureException;
_TraceKit.default.report.subscribe(this._errorHandler);
this._instrumentTryCatch();
}
(0, _createClass2.default)(Handler, [{
key: "uninstall",
value: function uninstall() {
_TraceKit.default.report.unsubscribe(this._errorHandler);
// restore any wrapped builtins
var builtin;
while (this._wrappedBuiltIns.length) {
builtin = this._wrappedBuiltIns.shift();
var obj = builtin[0],
name = builtin[1],
orig = builtin[2];
obj[name] = orig;
}
}
}, {
key: "_errorHandler",
value: function _errorHandler(report) {
if (!this._ignoreOnError) {
this.captureException(report);
}
}
}, {
key: "_ignoreNextOnError",
value: function _ignoreNextOnError() {
var _this = this;
this._ignoreOnError += 1;
setTimeout(function () {
// onerror should trigger before setTimeout
_this._ignoreOnError -= 1;
});
}
/*
* Wrap code within a context so Handler can capture errors
* reliably across domains that is executed immediately.
*
* @param {object} options A specific set of options for this context [optional]
* @param {function} func The callback to be immediately executed within the context
* @param {array} args An array of arguments to be called with the callback [optional]
*/
}, {
key: "context",
value: function context(options, func, args) {
if (isFunction(options)) {
args = func || [];
func = options;
options = undefined;
}
return this.wrap(options, func).apply(this, args);
}
}, {
key: "wrap",
value:
/*
* Wrap code within a context and returns back a new function to be executed
*
* @param {object} options A specific set of options for this context [optional]
* @param {function} func The function to be wrapped in a new context
* @param {function} func A function to call before the try/catch wrapper [optional, private]
* @return {function} The newly wrapped functions with a context
*/
function wrap(options, func, _before) {
var self = this;
// 1 argument has been passed, and it's not a function
// so just return it
if (isUndefined(func) && !isFunction(options)) {
return options;
}
// options is optional
if (isFunction(options)) {
func = options;
options = undefined;
}
// At this point, we've passed along 2 arguments, and the second one
// is not a function either, so we'll just return the second argument.
if (!isFunction(func)) {
return func;
}
// We don't wanna wrap it twice!
try {
if (func.__lr__) {
return func;
}
// If this has already been wrapped in the past, return that
if (func.__lr_wrapper__) {
return func.__lr_wrapper__;
}
// If func is not extensible, return the function as-is to prevent TypeErrors
// when trying to add new props & to assure immutable funcs aren't changed
if (!Object.isExtensible(func)) {
return func;
}
} catch (e) {
// Just accessing custom props in some Selenium environments
// can cause a "Permission denied" exception (see lr-js#495).
// Bail on wrapping and return the function as-is (defers to window.onerror).
return func;
}
function wrapped() {
var args = [],
i = arguments.length,
deep = !options || options && options.deep !== false;
if (_before && isFunction(_before)) {
_before.apply(this, arguments);
}
// Recursively wrap all of a function's arguments that are
// functions themselves.
while (i--) {
args[i] = deep ? self.wrap(options, arguments[i]) : arguments[i];
}
try {
// Attempt to invoke user-land function. This is part of the LogRocket SDK.
// If you're seeing this frame in a stack trace, it means that LogRocket caught
// an unhandled error thrown by your application code, reported it, then bubbled
// it up. This is expected behavior and is not a bug with LogRocket.
return func.apply(this, args);
} catch (e) {
self._ignoreNextOnError();
self.captureException(_TraceKit.default.computeStackTrace(e), options);
throw e;
}
}
// copy over properties of the old function
for (var property in func) {
if (hasKey(func, property)) {
wrapped[property] = func[property];
}
}
wrapped.prototype = func.prototype;
func.__lr_wrapper__ = wrapped;
// Signal that this function has been wrapped already
// for both debugging and to prevent it to being wrapped twice
wrapped.__lr__ = true;
wrapped.__inner__ = func;
return wrapped;
}
}, {
key: "_instrumentTryCatch",
value:
/**
* Install any queued plugins
*/
function _instrumentTryCatch() {
var self = this;
var wrappedBuiltIns = self._wrappedBuiltIns;
function wrapTimeFn(orig) {
return function (fn, t) {
// preserve arity
// Make a copy of the arguments to prevent deoptimization
// https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments
var args = new Array(arguments.length);
for (var i = 0; i < args.length; ++i) {
args[i] = arguments[i];
}
var originalCallback = args[0];
if (isFunction(originalCallback)) {
args[0] = self.wrap(originalCallback);
}
// IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it
// also supports only two arguments and doesn't care what this is, so we
// can just call the original function directly.
if (orig.apply) {
return orig.apply(this, args);
} else {
return orig(args[0], args[1]);
}
};
}
function wrapEventTarget(global) {
var proto = _window[global] && _window[global].prototype;
if (proto && proto.hasOwnProperty && proto.hasOwnProperty('addEventListener')) {
fill(proto, 'addEventListener', function (orig) {
return function (evtName, fn, capture, secure) {
// preserve arity
try {
if (fn && fn.handleEvent) {
fn.handleEvent = self.wrap(fn.handleEvent);
}
} catch (err) {
// can sometimes get 'Permission denied to access property "handle Event'
}
// More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs`
// so that we don't have more than one wrapper function
var before;
return orig.call(this, evtName, self.wrap(fn, undefined, before), capture, secure);
};
}, wrappedBuiltIns);
fill(proto, 'removeEventListener', function (orig) {
return function (evt, fn, capture, secure) {
/**
* There are 3 scenararios to consider when removing an event listener
*
* 1. 'addEventListener' was called when the LR SDK was uninitialized.
* In this case, the event handler has not been wrapped, so this behaves
* as a passthrough and just removes the original handler.
*
* 2. 'addEventListener' was called while the LR SDK was initialized, which means
* our wrapped 'addEventListener' was called. In this case, the tracked event handler
* is also wrapped, so we need to remove that wrapped version of the handler.
*
* 3. 'addEventListener' was called both before and after the LR SDK was initialized
* for the same event handler. In this case, we have to remove both of them.
* If we'd remove only the wrapped one, the initial handler would stick around forever.
*/
try {
var wrappedFn = fn === null || fn === void 0 ? void 0 : fn.__lr_wrapper__;
if (wrappedFn) {
orig.call(this, evt, wrappedFn, capture, secure);
}
} catch (e) {
// ignore, accessing __lr_wrapper__ will throw in some Selenium environments
}
return orig.call(this, evt, fn, capture, secure);
};
},
// undefined is provided here to skip tracking for uninstall.
// Once our removeEventListener is installed, it can't be uninstalled.
// We always need to support removing logrocket wrapped event handlers (event
// handlers added when logrocket was installed) even after SDK shutdown.
undefined);
}
}
fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns);
fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns);
if (_window.requestAnimationFrame) {
fill(_window, 'requestAnimationFrame', function (orig) {
return function (cb) {
return orig(self.wrap(cb));
};
}, wrappedBuiltIns);
}
// event targets borrowed from bugsnag-js:
// https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666
var eventTargets = ['EventTarget', 'Window', 'Node', 'ApplicationCache', 'AudioTrackList', 'ChannelMergerNode', 'CryptoOperation', 'EventSource', 'FileReader', 'HTMLUnknownElement', 'IDBDatabase', 'IDBRequest', 'IDBTransaction', 'KeyOperation', 'MediaController', 'MessagePort', 'ModalWindow', 'Notification', 'SVGElementInstance', 'Screen', 'TextTrack', 'TextTrackCue', 'TextTrackList', 'WebSocket', 'WebSocketWorker', 'Worker', 'XMLHttpRequest', 'XMLHttpRequestEventTarget', 'XMLHttpRequestUpload'];
for (var i = 0; i < eventTargets.length; i++) {
wrapEventTarget(eventTargets[i]);
}
var $ = _window.jQuery || _window.$;
if ($ && $.fn && $.fn.ready) {
fill($.fn, 'ready', function (orig) {
return function (fn) {
return orig.call(this, self.wrap(fn));
};
}, wrappedBuiltIns);
}
}
}]);
return Handler;
}();
exports["default"] = Handler;
;
/***/ }),
/***/ "./packages/@logrocket/exceptions/src/registerExceptions.js":
/*!******************************************************************!*\
!*** ./packages/@logrocket/exceptions/src/registerExceptions.js ***!
\******************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js");
var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = registerCore;
var _raven = _interopRequireDefault(__webpack_require__(/*! ./raven/raven */ "./packages/@logrocket/exceptions/src/raven/raven.js"));
var Capture = _interopRequireWildcard(__webpack_require__(/*! ./Capture */ "./packages/@logrocket/exceptions/src/Capture.js"));
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function registerCore(logger) {
var raven = new _raven.default({
captureException: function captureException(errorReport) {
Capture.captureException(logger, null, null, errorReport);
}
});
var rejectionHandler = function rejectionHandler(evt) {
// http://2ality.com/2016/04/unhandled-rejections.html
if (evt.reason instanceof Error) {
Capture.captureException(logger, evt.reason, null, null, 'UNHANDLED_REJECTION');
} else {
logger.addEvent('lr.core.Exception', function () {
return {
exceptionType: 'UNHANDLED_REJECTION',
message: evt.reason || 'Unhandled Promise rejection'
};
});
}
};
window.addEventListener('unhandledrejection', rejectionHandler);
return function () {
window.removeEventListener('unhandledrejection', rejectionHandler);
raven.uninstall();
};
}
/***/ }),
/***/ "./packages/@logrocket/exceptions/src/stackTraceFromError.js":
/*!*******************************************************************!*\
!*** ./packages/@logrocket/exceptions/src/stackTraceFromError.js ***!
\*******************************************************************/
/***/ (function(__unused_webpack_module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = stackTraceFromError;
function stackTraceFromError(errorReport) {
function makeNotNull(val) {
return val === null ? undefined : val;
}
return errorReport.stack ? errorReport.stack.map(function (frame) {
return {
lineNumber: makeNotNull(frame.line),
columnNumber: makeNotNull(frame.column),
fileName: makeNotNull(frame.url),
functionName: makeNotNull(frame.func)
};
}) : undefined;
}
/***/ }),
/***/ "./packages/@logrocket/network/src/fetchIntercept.js":
/*!***********************************************************!*\
!*** ./packages/@logrocket/network/src/fetchIntercept.js ***!
\***********************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "./node_modules/@babel/runtime/helpers/toConsumableArray.js"));
var _registerXHR = __webpack_require__(/*! ./registerXHR */ "./packages/@logrocket/network/src/registerXHR.js");
var interceptors = [];
function makeInterceptor(fetch, fetchId) {
var reversedInterceptors = interceptors.reduce(function (array, interceptor) {
return [interceptor].concat(array);
}, []);
// if a browser supports fetch, it supports promise
// eslint-disable-next-line compat/compat
for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
args[_key - 2] = arguments[_key];
}
var promise = Promise.resolve(args);
// Register request interceptors
reversedInterceptors.forEach(function (_ref) {
var request = _ref.request,
requestError = _ref.requestError;
if (request || requestError) {
promise = promise.then(function (args) {
return request.apply(void 0, [fetchId].concat((0, _toConsumableArray2.default)(args)));
}, function (args) {
return requestError.apply(void 0, [fetchId].concat((0, _toConsumableArray2.default)(args)));
});
}
});
promise = promise.then(function (args) {
(0, _registerXHR.setActive)(false);
var res;
var err;
try {
res = fetch.apply(void 0, (0, _toConsumableArray2.default)(args));
} catch (_err) {
err = _err;
}
(0, _registerXHR.setActive)(true);
if (err) {
throw err;
}
return res;
});
reversedInterceptors.forEach(function (_ref2) {
var response = _ref2.response,
responseError = _ref2.responseError;
if (response || responseError) {
promise = promise.then(function (res) {
return response(fetchId, res);
}, function (err) {
return responseError && responseError(fetchId, err);
});
}
});
return promise;
}
function attach(env) {
if (!env.fetch || !env.Promise) {
// Make sure fetch is available in the given environment. If it's not, then
// default to using XHR intercept.
return;
}
var isPolyfill = env.fetch.polyfill;
// eslint-disable-next-line no-param-reassign
env.fetch = function (fetch) {
var fetchId = 0;
return function () {
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
return makeInterceptor.apply(void 0, [fetch, fetchId++].concat(args));
};
}(env.fetch);
// Forward the polyfill properly from fetch (set by github/whatwg-fetch).
if (isPolyfill) {
// eslint-disable-next-line no-param-reassign
env.fetch.polyfill = isPolyfill;
}
}
// TODO: React Native
// attach(global);
var didAttach = false;
var _default = {
register: function register(interceptor) {
if (!didAttach) {
didAttach = true;
attach(window);
}
interceptors.push(interceptor);
return function () {
var index = interceptors.indexOf(interceptor);
if (index >= 0) {
interceptors.splice(index, 1);
}
};
},
clear: function clear() {
interceptors = [];
}
};
exports["default"] = _default;
/***/ }),
/***/ "./packages/@logrocket/network/src/index.js":
/*!**************************************************!*\
!*** ./packages/@logrocket/network/src/index.js ***!
\**************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = registerNetwork;
var _defineProperty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/defineProperty.js"));
var _typeof2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js"));
var _registerFetch = _interopRequireDefault(__webpack_require__(/*! ./registerFetch */ "./packages/@logrocket/network/src/registerFetch.js"));
var _registerIonic = __webpack_require__(/*! ./registerIonic */ "./packages/@logrocket/network/src/registerIonic.ts");
var _registerNetworkInformation = _interopRequireDefault(__webpack_require__(/*! ./registerNetworkInformation */ "./packages/@logrocket/network/src/registerNetworkInformation.js"));
var _registerXHR = _interopRequireDefault(__webpack_require__(/*! ./registerXHR */ "./packages/@logrocket/network/src/registerXHR.js"));
var _mapValues = _interopRequireDefault(__webpack_require__(/*! @logrocket/utils/src/mapValues */ "./packages/@logrocket/utils/src/mapValues.js"));
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
// eslint-disable-line no-restricted-imports
function registerNetwork(logger) {
var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
isReactNative: false,
isDisabled: false
};
if ((config === null || config === void 0 ? void 0 : config.isDisabled) === true) {
return function () {};
}
var isReactNative = config.isReactNative,
shouldAugmentNPS = config.shouldAugmentNPS,
shouldParseXHRBlob = config.shouldParseXHRBlob;
var ignoredNetwork = {};
// truncate if > 4MB in size
var truncate = function truncate(data) {
var limit = 1024 * 1000 * 4;
var str = data;
if ((0, _typeof2.default)(data) === 'object' && data != null) {
var proto = Object.getPrototypeOf(data);
if (proto === Object.prototype || proto === null) {
// plain object - jsonify for the size check
str = JSON.stringify(data);
}
}
if (str && str.length && str.length > limit && typeof str === 'string') {
var beginning = str.substring(0, 1000);
return "".concat(beginning, " ... LogRocket truncating to first 1000 characters.\n Keep data under 4MB to prevent truncation. https://docs.logrocket.com/reference/network");
}
return data;
};
var addRequest = function addRequest(reqId, request) {
var method = request.method;
logger.addEvent('lr.network.RequestEvent', function () {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref$isEnabled = _ref.isEnabled,
isEnabled = _ref$isEnabled === void 0 ? true : _ref$isEnabled,
_ref$requestSanitizer = _ref.requestSanitizer,
requestSanitizer = _ref$requestSanitizer === void 0 ? function (f) {
return f;
} : _ref$requestSanitizer;
if (!isEnabled) {
return null;
}
var sanitized = null;
try {
// only try catch user defined functions
sanitized = requestSanitizer(_objectSpread(_objectSpread({}, request), {}, {
reqId: reqId
}));
} catch (err) {
console.error(err);
}
if (sanitized) {
var url = sanitized.url;
if (typeof document !== 'undefined' && typeof document.createElement === 'function') {
// Writing and then reading from an a tag turns a relative
// url into an absolute one.
var a = document.createElement('a');
a.href = sanitized.url;
url = a.href;
}
return {
reqId: reqId,
// default
url: url,
// sanitized
headers: (0, _mapValues.default)(sanitized.headers, function (headerValue) {
// sanitized
return "".concat(headerValue);
}),
body: truncate(sanitized.body),
// sanitized
method: method,
// default
referrer: sanitized.referrer || undefined,
// sanitized
mode: sanitized.mode || undefined,
// sanitized
credentials: sanitized.credentials || undefined // sanitized
};
}
ignoredNetwork[reqId] = true;
return null;
});
};
var addResponse = function addResponse(reqId, response) {
var method = response.method,
status = response.status,
responseType = response.responseType;
logger.addEvent('lr.network.ResponseEvent', function () {
var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref2$isEnabled = _ref2.isEnabled,
isEnabled = _ref2$isEnabled === void 0 ? true : _ref2$isEnabled,
_ref2$responseSanitiz = _ref2.responseSanitizer,
responseSanitizer = _ref2$responseSanitiz === void 0 ? function (f) {
return f;
} : _ref2$responseSanitiz;
if (!isEnabled) {
return null;
} else if (ignoredNetwork[reqId]) {
delete ignoredNetwork[reqId];
return null;
}
var sanitized = null;
try {
// only try catch user defined functions
sanitized = responseSanitizer(_objectSpread(_objectSpread({}, response), {}, {
reqId: reqId
}));
} catch (err) {
console.error(err);
// fall through to redacted log
}
if (sanitized) {
return {
reqId: reqId,
// default
responseType: responseType,
status: sanitized.status,
// sanitized
headers: (0, _mapValues.default)(sanitized.headers, function (headerValue) {
// sanitized
return "".concat(headerValue);
}),
body: truncate(sanitized.body),
// sanitized
method: method // default
};
}
return {
reqId: reqId,
// default
responseType: responseType,
status: status,
// default
headers: {},
// redacted
body: null,
// redacted
method: method // default
};
});
};
var isIgnored = function isIgnored(reqId) {
return logger.isDisabled || ignoredNetwork[reqId] === true;
};
var unsubFetch = (0, _registerFetch.default)({
addRequest: addRequest,
addResponse: addResponse,
isIgnored: isIgnored
});
var unsubXHR = (0, _registerXHR.default)({
addRequest: addRequest,
addResponse: addResponse,
isIgnored: isIgnored,
logger: logger,
shouldAugmentNPS: shouldAugmentNPS,
shouldParseXHRBlob: shouldParseXHRBlob
});
var unsubIonic = (0, _registerIonic.registerIonic)({
addRequest: addRequest,
addResponse: addResponse,
isIgnored: isIgnored
});
var unsubNetworkInformation = isReactNative ? function () {} : (0, _registerNetworkInformation.default)(logger);
return function () {
unsubNetworkInformation();
unsubFetch();
unsubXHR();
unsubIonic();
};
}
/***/ }),
/***/ "./packages/@logrocket/network/src/registerFetch.js":
/*!**********************************************************!*\
!*** ./packages/@logrocket/network/src/registerFetch.js ***!
\**********************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = registerFetch;
var _defineProperty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/defineProperty.js"));
var _mapValues = _interopRequireDefault(__webpack_require__(/*! @logrocket/utils/src/mapValues */ "./packages/@logrocket/utils/src/mapValues.js"));
var _fetchIntercept = _interopRequireDefault(__webpack_require__(/*! ./fetchIntercept */ "./packages/@logrocket/network/src/fetchIntercept.js"));
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
function makeObjectFromHeaders(headers) {
// If using real fetch, we must stringify the Headers object.
if (headers == null || typeof headers.forEach !== 'function') {
return headers;
}
var result = {};
headers.forEach(function (value, key) {
if (result[key]) {
result[key] = "".concat(result[key], ",").concat(value);
} else {
result[key] = "".concat(value);
}
});
return result;
}
// XHR specification is unclear of what types to allow in value so using toString method for now
var stringifyHeaders = function stringifyHeaders(headers) {
return (0, _mapValues.default)(makeObjectFromHeaders(headers), function (value) {
return "".concat(value);
});
};
function pluckFetchFields() {
var arg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return {
url: arg.url,
headers: stringifyHeaders(arg.headers),
method: arg.method && arg.method.toUpperCase(),
referrer: arg.referrer || undefined,
mode: arg.mode || undefined,
credentials: arg.credentials || undefined
};
}
function registerFetch(_ref) {
var addRequest = _ref.addRequest,
addResponse = _ref.addResponse,
isIgnored = _ref.isIgnored;
var LOGROCKET_FETCH_LABEL = 'fetch-';
var fetchMethodMap = {};
var unregister = _fetchIntercept.default.register({
request: function request(fetchId) {
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
var p;
if (typeof Request !== 'undefined' && args[0] instanceof Request) {
var clonedText;
// Request.clone() and Request.text() may throw in Safari (e.g., when
// request body contains FormData)
try {
clonedText = args[0].clone().text();
} catch (err) {
// if a browser supports fetch, it supports promise
// eslint-disable-next-line compat/compat
clonedText = Promise.resolve("LogRocket fetch error: ".concat(err.message));
}
p = clonedText.then(function (body) {
return _objectSpread(_objectSpread({}, pluckFetchFields(args[0])), {}, {
body: body
});
}, function (err) {
return _objectSpread(_objectSpread({}, pluckFetchFields(args[0])), {}, {
body: "LogRocket fetch error: ".concat(err.message)
});
});
} else {
// if a browser supports fetch, it supports promise
// eslint-disable-next-line compat/compat
p = Promise.resolve(_objectSpread(_objectSpread({}, pluckFetchFields(args[1])), {}, {
url: "".concat(args[0]),
body: (args[1] || {}).body
}));
}
return p.then(function (req) {
fetchMethodMap[fetchId] = req.method;
addRequest("".concat(LOGROCKET_FETCH_LABEL).concat(fetchId), req);
return args;
});
},
requestError: function requestError(fetchId, error) {
// if a browser supports fetch, it supports promise
// eslint-disable-next-line compat/compat
return Promise.reject(error);
},
response: function response(fetchId, _response) {
var responseClone;
var responseTextPromise;
if (isIgnored("".concat(LOGROCKET_FETCH_LABEL).concat(fetchId))) {
// Don't even try to read ignored requests
return _response;
}
// event-streams are meant to remain open and be consumed over time by the sender. Attempting to capture the body
// of these requests will cause us to "stall" here, and prevents the users of our SDK from using event-streams
// unless they have explicitly ignored the request.
if (_response.headers.get('content-type') === 'text/event-stream') {
// eslint-disable-next-line compat/compat
responseTextPromise = Promise.resolve('LogRocket skipped consuming an event-stream body.');
} else {
try {
// TODO: enhance function on original response and future clones for:
// text(), json(), blob(), formdata(), arraybuffer()
responseClone = _response.clone();
} catch (err) {
// safari has a bug where cloning can fail
var responseHash = {
url: _response.url,
responseType: _response.type.toUpperCase(),
status: _response.status,
headers: stringifyHeaders(_response.headers),
body: "LogRocket fetch error: ".concat(err.message),
method: fetchMethodMap[fetchId]
};
delete fetchMethodMap[fetchId];
addResponse("".concat(LOGROCKET_FETCH_LABEL).concat(fetchId), responseHash);
return _response;
}
try {
if (window.TextDecoder && responseClone.body) {
// use a reader to manually read the response body rather than calling response.text()
// response.text() was timing out for some responses, in some cases because Apollo sends
// an abort signal or because the stream wasn't getting terminated cleanly
// using a reader allows us to capture what we can from response bodies before the
// response receives an abort signal
var reader = responseClone.body.getReader();
// response bodies always decode with UTF-8
// https://developer.mozilla.org/en-US/docs/Web/API/Response/text
var utf8Decoder = new window.TextDecoder('utf-8');
var bodyContents = '';
responseTextPromise = reader.read().then(function readResponseBody(_ref2) {
var done = _ref2.done,
value = _ref2.value;
if (done) {
return bodyContents;
}
var chunk = value ? utf8Decoder.decode(value, {
stream: true
}) : '';
bodyContents += chunk;
return reader.read().then(readResponseBody);
});
} else {
// TextDecoder doesn't have support across all browsers that LR supports, so if there's
// no TextDecoder, fall back to the old approach
responseTextPromise = responseClone.text();
}
} catch (error) {
// eslint-disable-next-line compat/compat
responseTextPromise = Promise.resolve("LogRocket error reading body: ".concat(error.message));
}
}
responseTextPromise.catch(function (error) {
// don't drop request & log to console when the request is aborted,
// as it may have already completed
// https://github.com/LogRocket/logrocket/issues/34
if (error.name === 'AbortError' && error instanceof DOMException) {
return;
}
return "LogRocket error reading body: ".concat(error.message);
}).then(function (data) {
var responseHash = {
url: _response.url,
responseType: _response.type.toUpperCase(),
status: _response.status,
headers: stringifyHeaders(_response.headers),
body: data,
method: fetchMethodMap[fetchId]
};
delete fetchMethodMap[fetchId];
addResponse("".concat(LOGROCKET_FETCH_LABEL).concat(fetchId), responseHash);
});
return _response;
},
responseError: function responseError(fetchId, error) {
var response = {
url: undefined,
status: 0,
headers: {},
body: "".concat(error)
};
addResponse("".concat(LOGROCKET_FETCH_LABEL).concat(fetchId), response);
// if a browser supports fetch, it supports promise
// eslint-disable-next-line compat/compat
return Promise.reject(error);
}
});
return unregister;
}
/***/ }),
/***/ "./packages/@logrocket/network/src/registerIonic.ts":
/*!**********************************************************!*\
!*** ./packages/@logrocket/network/src/registerIonic.ts ***!
\**********************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequ