{"version":3,"file":"static/js/723.5f6b9237.chunk.js","mappings":"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","sources":["../node_modules/@analytics/google-analytics-v3/lib/analytics-plugin-ga.browser.es.js","../node_modules/@analytics/type-utils/src/index.js","../node_modules/analytics-utils/src/decodeUri.js","../node_modules/analytics-utils/src/paramsGet.js","../node_modules/analytics-utils/src/paramsParse.js","../node_modules/analytics-utils/src/parseReferrer.js","../node_modules/analytics-utils/src/uuid.js","../node_modules/@analytics/global-storage-utils/src/index.js","../node_modules/@analytics/src/vendor/redux/utils/defs.js","../node_modules/@analytics/src/vendor/redux/createStore.js","../node_modules/@analytics/src/vendor/redux/combineReducers.js","../node_modules/@analytics/src/vendor/redux/compose.js","../node_modules/@analytics/src/vendor/redux/applyMiddleware.js","../node_modules/@analytics/src/constants.js","../node_modules/@analytics/src/utils/internalConstants.js","../node_modules/@analytics/src/events.js","../node_modules/@analytics/src/middleware/initialize.js","../node_modules/@analytics/src/modules/user.js","../node_modules/@analytics/src/middleware/identify.js","../node_modules/@analytics/src/utils/callback-stack.js","../node_modules/@analytics/src/utils/waitForReady.js","../node_modules/@analytics/src/utils/heartbeat.js","../node_modules/@analytics/src/middleware/plugins/engine.js","../node_modules/@analytics/src/middleware/plugins/index.js","../node_modules/@analytics/src/utils/filterDisabled.js","../node_modules/@analytics/src/middleware/storage.js","../node_modules/@analytics/src/middleware/dynamic.js","../node_modules/@analytics/src/modules/plugins.js","../node_modules/@analytics/src/utils/serialize.js","../node_modules/@analytics/src/modules/track.js","../node_modules/@analytics/src/modules/queue.js","../node_modules/@analytics/src/modules/page.js","../node_modules/@analytics/src/modules/context.js","../node_modules/@analytics/src/utils/getOSName/browser.js","../node_modules/analytics-utils/src/getBrowserLocale.js","../node_modules/analytics-utils/src/getTimeZone.js","../node_modules/@analytics/src/utils/handleNetworkEvents.js","../node_modules/@analytics/src/utils/debug.js","../node_modules/@analytics/src/utils/ensureArray.js","../node_modules/@analytics/src/utils/enrichMeta.js","../node_modules/@analytics/src/utils/getCallback.js","../node_modules/@analytics/src/utils/timestamp.js","../node_modules/@analytics/src/index.js","../node_modules/@analytics/cookie-utils/src/index.js","../node_modules/@analytics/localstorage-utils/src/index.js","../node_modules/@analytics/session-storage-utils/src/index.js","../node_modules/@analytics/storage-utils/src/utils/parse.js","../node_modules/@analytics/storage-utils/src/index.js","../node_modules/analytics/lib/analytics.browser.es.js","../node_modules/dlv/index.js"],"sourcesContent":["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; }\n\nfunction _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) { _defineProperty(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; }\n\nfunction _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; }\n\n/* global ga */\nvar defaultConfig = {\n /* See description below */\n trackingId: null,\n\n /* See description below */\n debug: false,\n\n /* See description below */\n anonymizeIp: false,\n\n /* See description below */\n customDimensions: {},\n\n /* See description below */\n resetCustomDimensionsOnPage: [],\n\n /* See description below */\n setCustomDimensionsToPage: true\n /* Custom metrics https://bit.ly/3c5de88 */\n // TODO customMetrics: { key: 'metric1' }\n\n /* Content groupings https://bit.ly/39Zt3Me */\n // TODO contentGroupings: { key: 'contentGroup1' }\n\n};\nvar loadedInstances = {};\n/**\n * Google analytics v3 plugin\n * @link https://getanalytics.io/plugins/google-analytics-v3/\n * @link https://analytics.google.com/analytics/web/\n * @link https://developers.google.com/analytics/devguides/collection/analyticsjs\n * @param {object} pluginConfig - Plugin settings\n * @param {string} pluginConfig.trackingId - Google Analytics site tracking Id\n * @param {boolean} [pluginConfig.debug] - Enable Google Analytics debug mode\n * @param {boolean} [pluginConfig.anonymizeIp] - Enable [Anonymizing IP addresses](https://bit.ly/3c660Rd) sent to Google Analytics. [See details below](#anonymize-visitor-ips)\n * @param {object} [pluginConfig.customDimensions] - Map [Custom dimensions](https://bit.ly/3c5de88) to send extra information to Google Analytics. [See details below](#using-ga-custom-dimensions)\n * @param {object} [pluginConfig.resetCustomDimensionsOnPage] - Reset custom dimensions by key on analytics.page() calls. Useful for single page apps.\n * @param {boolean} [pluginConfig.setCustomDimensionsToPage] - Mapped dimensions will be set to the page & sent as properties of all subsequent events on that page. If false, analytics will only pass custom dimensions as part of individual events\n * @param {string} [pluginConfig.instanceName] - Custom tracker name for google analytics. Use this if you need multiple googleAnalytics scripts loaded\n * @param {string} [pluginConfig.customScriptSrc] - Custom URL for google analytics script, if proxying calls\n * @param {object} [pluginConfig.cookieConfig] - Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings)\n * @param {object} [pluginConfig.tasks] - [Set custom google analytic tasks](https://developers.google.com/analytics/devguides/collection/analyticsjs/tasks)\n * @param {string} [pluginConfig.nonce] - Content-Security-Policy nonce value\n * @return {*}\n * @example\n *\n * googleAnalyticsV3({\n * trackingId: 'UA-1234567'\n * })\n */\n\nfunction googleAnalyticsV3() {\n var pluginConfig = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var pageCalledOnce = false; // Allow for multiple google analytics instances\n\n var _getInstanceDetails = getInstanceDetails(pluginConfig),\n instanceName = _getInstanceDetails.instanceName,\n instancePrefix = _getInstanceDetails.instancePrefix;\n\n return {\n name: 'google-analytics-v3',\n config: _objectSpread(_objectSpread({}, defaultConfig), pluginConfig),\n // Load google analytics\n initialize: function initialize(pluginApi) {\n var config = pluginApi.config,\n instance = pluginApi.instance;\n if (!config.trackingId) throw new Error('No GA trackingId defined');\n var customDimensions = config.customDimensions,\n customScriptSrc = config.customScriptSrc,\n nonce = config.nonce; // var to hoist\n\n var scriptSrc = customScriptSrc || 'https://www.google-analytics.com/analytics.js'; // Load google analytics script to page\n\n if (gaNotLoaded(scriptSrc)) {\n /* eslint-disable */\n (function (i, s, o, g, r, a, m) {\n i['GoogleAnalyticsObject'] = r;\n i[r] = i[r] || function () {\n (i[r].q = i[r].q || []).push(arguments);\n }, i[r].l = 1 * new Date();\n a = s.createElement(o), m = s.getElementsByTagName(o)[0];\n a.async = 1;\n a.src = g;\n nonce && a.setAttribute('nonce', nonce);\n m.parentNode.insertBefore(a, m);\n })(window, document, 'script', scriptSrc, 'ga');\n /* eslint-enable */\n\n } // Initialize tracker instance on page\n\n\n if (!loadedInstances[instanceName]) {\n var gaConfig = _objectSpread({\n cookieDomain: config.domain || 'auto',\n siteSpeedSampleRate: config.siteSpeedSampleRate || 1,\n sampleRate: config.sampleRate || 100,\n allowLinker: true\n }, config.cookieConfig);\n\n if (instanceName) {\n gaConfig.name = instanceName;\n }\n\n ga('create', config.trackingId, gaConfig);\n\n if (config.debug) {\n // Disable sends to GA http://bit.ly/2Ro0vTR\n ga(\"\".concat(instancePrefix, \"set\"), 'sendHitTask', null);\n window.ga_debug = {\n trace: true\n };\n }\n\n if (config.anonymizeIp) {\n ga(\"\".concat(instancePrefix, \"set\"), 'anonymizeIp', true);\n }\n\n if (config.tasks) {\n var taskList = ['customTask', 'previewTask', 'checkProtocolTask', 'validationTask', 'checkStorageTask', 'historyImportTask', 'samplerTask', 'buildHitTask', 'sendHitTask', 'timingTask', 'displayFeaturesTask'];\n taskList.forEach(function (taskName) {\n if (config.tasks.hasOwnProperty(taskName)) {\n var task = config.tasks[taskName];\n\n if (typeof task === 'function') {\n ga(config.tasks[taskName]);\n } else if (task === null) {\n ga(\"\".concat(instancePrefix, \"set\"), taskName, task);\n }\n }\n });\n }\n /* set custom dimensions from user traits */\n\n\n var user = instance.user() || {};\n var traits = user.traits || {};\n\n if (Object.keys(traits).length && customDimensions && Object.keys(customDimensions).length) {\n var dimensions = formatObjectIntoDimensions(traits, config);\n ga(\"\".concat(instancePrefix, \"set\"), dimensions);\n }\n\n loadedInstances[instanceName] = true;\n }\n },\n // Google Analytics page view\n page: function page(_ref) {\n var payload = _ref.payload,\n config = _ref.config,\n instance = _ref.instance;\n var properties = payload.properties;\n var resetCustomDimensionsOnPage = config.resetCustomDimensionsOnPage,\n customDimensions = config.customDimensions;\n var campaign = instance.getState('context.campaign');\n if (gaNotLoaded()) return;\n /* If dimensions are specifiied to reset, clear them before page view */\n\n if (resetCustomDimensionsOnPage && resetCustomDimensionsOnPage.length) {\n var resetDimensions = resetCustomDimensionsOnPage.reduce(function (acc, key) {\n if (customDimensions[key]) {\n acc[customDimensions[key]] = null; // { dimension1: null } etc\n }\n\n return acc;\n }, {});\n\n if (Object.keys(resetDimensions).length) {\n // Reset custom dimensions\n ga(\"\".concat(instancePrefix, \"set\"), resetDimensions);\n }\n }\n\n var path = properties.path || document.location.pathname;\n var pageView = {\n page: path,\n title: properties.title,\n location: properties.url\n };\n var pageData = {\n page: path,\n title: properties.title\n }; // allow referrer override if referrer was manually set\n\n if (properties.referrer !== document.referrer) {\n pageData.referrer = properties.referrer;\n }\n\n var campaignData = addCampaignData(campaign);\n var dimensions = setCustomDimensions(properties, config, instancePrefix);\n /* Dimensions will only be included in the event if config.setCustomDimensionsToPage is false */\n\n var finalPayload = _objectSpread(_objectSpread(_objectSpread({}, pageView), campaignData), dimensions);\n\n ga(\"\".concat(instancePrefix, \"set\"), pageData); // Remove location for SPA tracking after initial page view\n\n if (pageCalledOnce) {\n delete finalPayload.location;\n }\n /* send page view to GA */\n\n\n ga(\"\".concat(instancePrefix, \"send\"), 'pageview', finalPayload); // Set after initial page view\n\n pageCalledOnce = true;\n },\n\n /**\n * Google Analytics track event\n * @example\n *\n * analytics.track('playedVideo', {\n * category: 'Videos',\n * label: 'Fall Campaign',\n * value: 42\n * })\n */\n track: function track(_ref2) {\n var payload = _ref2.payload,\n config = _ref2.config,\n instance = _ref2.instance;\n var properties = payload.properties,\n event = payload.event;\n var label = properties.label,\n value = properties.value,\n category = properties.category,\n nonInteraction = properties.nonInteraction;\n var campaign = instance.getState('context.campaign'); // TODO inline this trackEvent\n\n trackEvent({\n hitType: 'event',\n event: event,\n label: label,\n category: category || 'All',\n value: value,\n nonInteraction: nonInteraction,\n campaign: campaign\n }, config, payload);\n },\n identify: function identify(_ref3) {\n var payload = _ref3.payload,\n config = _ref3.config;\n identifyVisitor(payload.userId, payload.traits, config);\n },\n loaded: function loaded() {\n return !!window.gaplugins;\n }\n };\n}\n\nfunction gaNotLoaded(scriptSrc) {\n if (scriptSrc) {\n return !scriptLoaded(scriptSrc);\n }\n\n return typeof ga === 'undefined';\n}\n\nfunction getInstanceDetails(pluginConfig) {\n var instanceName = pluginConfig.instanceName;\n return {\n instancePrefix: instanceName ? \"\".concat(instanceName, \".\") : '',\n instanceName: instanceName\n };\n}\n/**\n * Send event tracking to Google Analytics\n * @param {object} eventData - GA event payload\n * @param {string} [eventData.hitType = 'event'] - hitType https://bit.ly/2Jab9L1 one of 'pageview', 'screenview', 'event', 'transaction', 'item', 'social', 'exception', 'timing'\n * @param {string} [eventData.event] - event Action https://bit.ly/2CUzeoz\n * @param {string} [eventData.label] - event Label http://bit.ly/2oo8eb3\n * @param {string} [eventData.category] - event Category http://bit.ly/2EAy9UP\n * @param {string} [eventData.nonInteraction = false] - nonInteraction https://bit.ly/2CUzeoz\n * @return {object} sent data\n */\n\n\nfunction trackEvent(eventData) {\n var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var payload = arguments.length > 2 ? arguments[2] : undefined;\n if (gaNotLoaded()) return;\n\n var _getInstanceDetails2 = getInstanceDetails(opts),\n instancePrefix = _getInstanceDetails2.instancePrefix;\n\n var data = {\n // hitType https://bit.ly/2Jab9L1 one of 'pageview', 'screenview', 'event', 'transaction', 'item', 'social', 'exception', 'timing'\n hitType: eventData.hitType || 'event',\n // eventAction https://bit.ly/2CUzeoz\n eventAction: eventData.event,\n // eventLabel http://bit.ly/2oo8eb3\n eventLabel: eventData.label,\n // eventCategory http://bit.ly/2EAy9UP\n eventCategory: eventData.category || 'All',\n // nonInteraction https://bit.ly/2CUzeoz\n nonInteraction: eventData.nonInteraction !== undefined ? !!eventData.nonInteraction : false\n };\n\n if (eventData.value) {\n // how much is this action worth?\n data.eventValue = format(eventData.value);\n }\n /* Attach campaign data */\n\n\n var campaignData = addCampaignData(eventData);\n /* Set Dimensions or return them for payload is config.setCustomDimensionsToPage is false */\n\n var dimensions = setCustomDimensions(payload.properties, opts, instancePrefix);\n\n var finalPayload = _objectSpread(_objectSpread(_objectSpread({}, data), campaignData), dimensions);\n /* Send data to Google Analytics */\n\n\n ga(\"\".concat(instancePrefix, \"send\"), 'event', finalPayload);\n return finalPayload;\n}\n/**\n * Add campaign data to GA payload https://bit.ly/34qFCPn\n * @param {Object} [campaignData={}] [description]\n * @param {String} [campaignData.campaignName] - Name of campaign\n * @param {String} [campaignData.campaignSource] - Source of campaign\n * @param {String} [campaignData.campaignMedium] - Medium of campaign\n * @param {String} [campaignData.campaignContent] - Content of campaign\n * @param {String} [campaignData.campaignKeyword] - Keyword of campaign\n */\n\nfunction addCampaignData() {\n var campaignData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var campaign = {};\n var name = campaignData.name,\n source = campaignData.source,\n medium = campaignData.medium,\n content = campaignData.content,\n keyword = campaignData.keyword;\n if (name) campaign.campaignName = name;\n if (source) campaign.campaignSource = source;\n if (medium) campaign.campaignMedium = medium;\n if (content) campaign.campaignContent = content;\n if (keyword) campaign.campaignKeyword = keyword;\n return campaign;\n}\n/* Todo add includeSearch options ¯\\_(ツ)_/¯\nfunction getPagePath(props, opts = {}) {\n if (!props) return\n if (opts.includeSearch && props.search) {\n return `${props.path}${props.search}`\n }\n return props.path\n}\n*/\n// properties, data=opts\n\n\nfunction formatObjectIntoDimensions(properties) {\n var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var customDimensions = opts.customDimensions; // TODO map opts.customMetrics; Object.keys(customMetrics) { key: 'metric1' }\n // TODO map opts.contentGroupings; Object.keys(contentGroupings) { key: 'contentGroup1' }\n\n /* Map values from payload to any defined custom dimensions */\n\n return Object.keys(customDimensions).reduce(function (acc, key) {\n var dimensionKey = customDimensions[key];\n var value = get(properties, key) || properties[key];\n\n if (typeof value === 'boolean') {\n value = value.toString();\n }\n\n if (value || value === 0) {\n acc[dimensionKey] = value;\n return acc;\n }\n\n return acc;\n }, {});\n}\n\nfunction get(obj, key, def, p, undef) {\n key = key.split ? key.split('.') : key;\n\n for (p = 0; p < key.length; p++) {\n obj = obj ? obj[key[p]] : undef;\n }\n\n return obj === undef ? def : obj;\n}\n\nfunction setCustomDimensions() {\n var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var opts = arguments.length > 1 ? arguments[1] : undefined;\n var instancePrefix = arguments.length > 2 ? arguments[2] : undefined;\n var customDimensions = formatObjectIntoDimensions(props, opts);\n\n if (!Object.keys(customDimensions).length) {\n return {};\n } // If setCustomDimensionsToPage false, don't save custom dimensions from event to page\n\n\n if (!opts.setCustomDimensionsToPage) {\n return customDimensions;\n } // Set custom dimensions\n\n\n ga(\"\".concat(instancePrefix, \"set\"), customDimensions);\n return {};\n}\n/**\n * Identify a visitor by Id\n * @param {string} id - unique visitor ID\n */\n\n\nfunction identifyVisitor(id) {\n var traits = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var conf = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n if (gaNotLoaded()) return;\n\n var _getInstanceDetails3 = getInstanceDetails(conf),\n instancePrefix = _getInstanceDetails3.instancePrefix;\n\n if (id) ga(\"\".concat(instancePrefix, \"set\"), 'userId', id);\n\n if (Object.keys(traits).length) {\n var custom = formatObjectIntoDimensions(traits, conf);\n ga(\"\".concat(instancePrefix, \"set\"), custom);\n }\n}\n\nfunction scriptLoaded(scriptSrc) {\n var scripts = document.querySelectorAll('script[src]');\n return !!Object.keys(scripts).filter(function (key) {\n return (scripts[key].src || '') === scriptSrc;\n }).length;\n}\n\nfunction format(value) {\n if (!value || value < 0) return 0;\n return Math.round(value);\n}\n\n/* This module will shake out unused code + work in browser and node 🎉 */\n\nvar index = googleAnalyticsV3 ;\n/* init for CDN usage. globalName.init() */\n\nvar init = googleAnalyticsV3 ;\n/* Standalone API */\n\nvar initialize = undefined ;\nvar page = undefined ;\nvar track = trackEvent ;\nvar identify = identifyVisitor ;\n\nexport { index as default, identify, init, initialize, page, track };\n","\n/*\n Constants for reuse\n*/\n\nexport const FUNCTION = 'function'\nexport const STRING = 'string'\nexport const UNDEFINED = 'undefined'\nexport const BOOLEAN = 'boolean'\nexport const OBJECT = 'object'\nexport const ARRAY = 'array'\nexport const NUMBER = 'number'\nexport const SYMBOL = 'symbol'\nexport const NULL = 'null'\nexport const ERROR = 'error'\nexport const TYPE_ERROR = 'typeError'\nexport const SYNTAX_ERROR = 'syntaxError'\nexport const ASYNC_FUNCTION = 'asyncFunction'\nexport const GENERATOR_FUNCTION = 'generatorFunction'\nexport const ASYNC_GENERATOR_FUNCTION = 'asyncGeneratorFunction'\n\nexport const noOp = () => {}\nexport const ANY = 'any'\nexport const ALL = '*'\nexport const NONE = 'none'\nexport const HIDDEN = 'hidden'\nexport const PREFIX = '__'\n\n/* DOM Constants */\nexport const FORM = 'form'\nexport const INPUT = 'input'\nexport const BUTTON = 'button'\nexport const SELECT = 'select'\nexport const CHANGE = 'change'\nexport const SUBMIT = 'submit'\n\n/* Regex patterns */\nexport const REGEX_ISO = /^\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z)$/\nexport const REGEX_EMAIL = /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/\nexport const REGEX_JSON = /^\\{[\\s\\S]*\\}$|^\\[[\\s\\S]*\\]$/\n\n/* ────────────────────\nEnvironment checks\n─────────────────────── */\n// alt implementations \n// - https://github.com/MikeKovarik/platform-detect\n/** @type {Object} */\nconst PROCESS = typeof process !== UNDEFINED ? process : {}\n\n/** @type {String} */\nexport const ENV = (PROCESS.env && PROCESS.env.NODE_ENV) || ''\n\n/** @type {Boolean} */\nexport const isProd = ENV === 'production'\n\n/** @type {Boolean} */\nexport const isStaging = ENV === 'staging'\n\n/** @type {Boolean} */\nexport const isDev = ENV === 'development'\n\n/** @type {Boolean} */\nexport const isBrowser = typeof document !== UNDEFINED\n/** @type {Boolean} */\nexport const isLocalHost = isBrowser && window.location.hostname === 'localhost'\n\n/** @type {Boolean} */\nexport const isNode = PROCESS.versions != null && PROCESS.versions.node != null\n\n/** @type {Boolean} */\nexport const isDeno = typeof Deno !== UNDEFINED && typeof Deno.core !== UNDEFINED;\n\n/** @type {Boolean} */\nexport const isWebWorker = typeof self === OBJECT && self.constructor && self.constructor.name === 'DedicatedWorkerGlobalScope'\n\n/** @type {Boolean} */\nexport const isJsDom = (isBrowser && window.name === 'nodejs') || (typeof navigator !== UNDEFINED && typeof navigator.userAgent !== UNDEFINED && (navigator.userAgent.includes('Node.js') || navigator.userAgent.includes('jsdom')))\n\n/* ────────────────────\nType checks\n─────────────────────── */\n\nfunction text(method, s) {\n return s.charAt(0)[method]() + s.slice(1)\n}\n\nconst upper = text.bind(null, 'toUpperCase')\nconst lower = text.bind(null, 'toLowerCase')\n\n/**\n * Returns the object type of the given payload\n * @param {*} val\n * @returns {string}\n */\nexport function getTypeName(val) {\n if (isNull(val)) return upper(NULL)\n return (typeof val === OBJECT) ? ctorName(val) : Object.prototype.toString.call(val).slice(8, -1)\n}\n\n/**\n * Returns the object type of the given payload\n * @param {*} val\n * @returns {string}\n */\nexport function getType(val, toLowerCase = true) {\n const type = getTypeName(val)\n // console.log('type', type)\n return (toLowerCase) ? lower(type) : type\n}\n\n// export function getType(val) {\n// if (isNull(val)) return NULL\n// const type = typeof val\n// if (type === OBJECT) return ctorName(val).toLowerCase()\n// return type\n// }\n\nfunction typeOf(kind, val) {\n return typeof val === kind\n}\n\n/** \n * Check if value is function.\n * @param x\n * @return {x is Function}\n */\nexport const isFunction = typeOf.bind(null, FUNCTION)\n\n/** \n * Check if value is string.\n * @param x\n * @return {x is string}\n */\nexport const isString = typeOf.bind(null, STRING)\n\n/** \n * Check if value is undefined.\n * @param x\n * @return {x is undefined}\n */\nexport const isUndefined = typeOf.bind(null, UNDEFINED)\n\n/** \n * Check if value is not undefined.\n * @param x\n * @return {x is undefined}\n */\nexport function isDefined(x) {\n return !isUndefined(x)\n}\n\n/** \n * @param x\n * @return {x is boolean}\n */\nexport const isBoolean = typeOf.bind(null, BOOLEAN)\n\n/** \n * @param x\n * @return {x is symobl}\n */\nexport const isSymbol = typeOf.bind(null, SYMBOL)\n\n/** \n * @param x\n * @return {x is boolean}\n * @example\n * isNull(null)\n * // true\n */\nexport function isNull(x) {\n return x === null\n}\n\n/** \n * Check if value is number.\n * @param n\n * @return {boolean}\n * @example\n * > isNumber(0)\n * true\n * > isNumber(1)\n * true\n * > isNumber(1.1)\n * true\n * > isNumber(0xff)\n * true\n * > isNumber(0644)\n * true\n * > isNumber(6.2e5)\n * true\n * > isNumber(NaN)\n * false\n * > isNumber(Infinity)\n * true\n */\nexport function isNumber(n) {\n return getType(n) === NUMBER && !isNaN(n)\n}\n\nexport function isNumberLike(n) {\n return !isNaN(parseFloat(n))\n}\n\n/** \n * Check if value is ES2015 `class`.\n * @param x\n * @return {x is Class}\n */\nexport function isClass(x) {\n if (isFunction(x)) {\n return /^class /.test(Function.prototype.toString.call(x))\n }\n return false\n}\n\n/** \n * @template T\n * @param x\n * @return {x is Array}\n */\nexport function isArray(x) {\n return getType(x) === ARRAY\n}\n\n/** \n * @param obj\n * @return {obj is Object}\n */\nexport function isObject(obj) {\n if (!isObjectLike(obj)) return false\n\n let proto = obj\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto)\n }\n\n return Object.getPrototypeOf(obj) === proto\n}\n\nexport function isObjectLike(obj) {\n return obj && (typeof obj === OBJECT || obj !== null)\n}\n\n/**\n* Tests if a value is a parseable JSON string.\n* @param {*} x - value to test\n* @returns {boolean} boolean indicating if a value is a parseable JSON string\n* @example\n* isJson('{\"a\":5}') // returns true\n* isJson('[]') // returns true\n* isJson('{a\":5}') // returns false\n*/\nexport function isJson(x) {\n if (!isString(x) || !REGEX_JSON.test(x)) return false\n try {\n JSON.parse(x)\n } catch (e) { \n return false\n }\n return true\n}\n\n/**\n * Is primative scalar value\n * @param x\n * @return {boolean}\n * @example\n isPrimitive(true) => true\n isPrimitive({}) => false\n isPrimitive(0) => true\n isPrimitive('1') => true\n isPrimitive(1.1) => true\n isPrimitive(NaN) => true\n isPrimitive(Infinity) => true\n isPrimitive(function() {}) => false\n isPrimitive(Date), => false\n isPrimitive(null) => true\n isPrimitive(undefined) => true\n */\nexport function isPrimitive(x) {\n if (isNull(x)) return true\n // if (isNaN(x)) return false\n switch (typeof x) {\n case STRING:\n case NUMBER:\n case SYMBOL:\n case UNDEFINED:\n case BOOLEAN:\n return true\n default:\n return false\n }\n}\n\n/**\n* Tests if an object has a specified method name.\n* @param {*} value - value to test\n* @param {*} property - property to test\n* @returns {boolean} boolean indicating if an object has a specified method name\n* @example\n* const obj = {\n* key: myFunc,\n* keyTwo: 'foobar'\n* }\n* isMethod(obj, 'key' ) // returns true\n* isMethod(obj, 'keyTwo' ) // returns false\n* isMethod(obj, 'otherThing' ) // returns false\n*/\nexport function isMethod(value, prop) {\n return isObject(value) && isFunction(value[prop])\n}\n\n/**\n * Returns true if the input is a Promise.\n * @param {*} x - The input to test\n * @returns {boolean}\n */\nexport function isPromise(x) {\n if (!x) return false\n return !!(!isUndefined(Promise) && x instanceof Promise || x.then && isFunction(x.then))\n}\n\n/**\n * Returns true if the input is a generator.\n * @param {*} x - The input to test\n * @returns {boolean}\n */\nexport function isGenerator(x) {\n return isObjectLike(x) && isFunction(x.throw) && isFunction(x.return) && isFunction(x.next)\n}\n\n/** \n * Is generator function\n * @param x\n * @return {boolean}\n * @example\n isGeneratorFunction(() => {}) => false\n isGeneratorFunction(function* () => {}) => true\n isGeneratorFunction(function * () {\n yield 'my-val'\n }))\n */\nexport function isGeneratorFunction(x) {\n return getType(x) === GENERATOR_FUNCTION\n}\n\n/** \n * Is async function\n * @param x\n * @return {boolean}\n * @example\n isAsyncFunction(() => {}) => false\n isAsyncFunction(async () => {}) => true\n */\nexport function isAsyncFunction(x) {\n return getType(x) === ASYNC_FUNCTION\n}\n\n\nexport function ctorName(x) {\n return isFunction(x.constructor) ? x.constructor.name : null\n}\n\n/**\n * Returns true if the input is a Set.\n * @param {*} x - The input to test\n * @returns {boolean}\n */\nexport function isSet(value) {\n return value instanceof Set\n}\n\n/**\n * Returns true if the input is a Map.\n * @param {*} x - The input to test\n * @returns {boolean}\n */\nexport function isMap(value) {\n return value instanceof Map\n}\n\n/**\n * Check if value is regexp\n * @param {*} value - Value to check\n * @return {boolean} \n */\nexport function isRegex(value) {\n return value instanceof RegExp\n}\n\n/**\n * Check if value is Buffer\n * @param {*} value - Value to check\n * @return {boolean} \n */\nexport function isBuffer(val) {\n if (val.constructor && isFunction(val.constructor.isBuffer)) {\n return val.constructor.isBuffer(val)\n }\n return false\n}\n\n/**\n * Check if value is Error\n * @param x - Object to check\n * @return {Boolean} If value is error\n * @example\n * isError(new Error()) // True\n */\nexport function isError(x) {\n return x instanceof Error || (isString(x.message) && x.constructor && isNumber(x.constructor.stackTraceLimit))\n}\n\n/**\n * Check if value error like (i.e has the name and message properties, both of which are strings)\n * @param obj - Object to check\n * @return {Boolean} If object is error-like\n * via https://github.com/Luke-zhang-04/utils/blob/master/src/typeGuards.ts#L62\n * @example\n *\n * ```js\n * isErrorLike(new Error()) // True\n * isErrorLike({name: \"Error!\", message: \"This is an error\", other: 0}) // True\n * isErrorLike({}) // False\n * isErrorLike({name: \"Error\", message: null}) // False\n *\n * // Works as a typguard\n * const something = {name: \"Error\", message: \"This is an error\"} as unknown\n *\n * if (isErrorLike(something)) {\n * console.log(something.name) // No Typescript error\n * }\n * ```\n */\nexport function isErrorLike(obj) {\n return isObjectLike(obj) && isString(obj.message) && isString(obj.name)\n}\n\nfunction errorType(ErrKind, value) {\n if (typeof value !== 'object' || isNull(value)) return false\n // Check for `TypeError` objects from the same realm (same Node.js `vm` or same `Window` object)...\n if (value instanceof ErrKind) return true\n const typeName = getType(new ErrKind(''))\n // All `TypeError` objects are `Error` objects...\n if (isError(value)) {\n while (value) {\n if (getType(value) === typeName) {\n return true\n }\n value = Object.getPrototypeOf(value)\n }\n }\n return false\n}\n\nexport const isTypeError = errorType.bind(null, TypeError)\n\nexport const isSyntaxError = errorType.bind(null, SyntaxError)\n\n/** \n * @param func - function to check if noOp\n * @return {Boolean} - is noOp\n * @examples\n function foo() {}\n isNoOp(foo) // true\n isNoOp(() => { }) // true\n isNoOp(() => { console.log('hi') }) // false\n */\nexport function isNoOp(func) {\n if (!isFunction(func)) return false\n const emptyFunc = /{(\\r|\\n|\\s)*}/gm\n const noOpStr = noOp + ''\n const funcString = (func.toString().match(emptyFunc) || [''])[0].replace(emptyFunc, noOpStr)\n return noOpStr === funcString\n}\n\n/**\n * Check if value is function arguments\n * @param {*} val \n * @returns \n */\nexport function isArguments(val) {\n try {\n if (isNumber(val.length) && isFunction(val.callee)) return true\n } catch (err) {\n if (err.message.indexOf('callee') !== -1) return true\n }\n return false\n}\n\n/**\n * Check if value is truthy\n * @param {*} value \n * @return {Boolean} - is truthy value\n */\nexport function isTruthy(v) {\n if (isString(v) && v.toLowerCase() === 'false') return false\n return !!v\n}\n\n/**\n * Check if value is falsy\n * @param {*} x \n * @return {Boolean} - is falsy value\n * @example\n * isFalsy(false) // returns true\n * isFalsy(null) // returns true\n * isFalsy('') // returns true\n * isFalsy(0) // returns true\n * isFalsy(void 0) // returns true\n * isFalsy(NaN) // returns true\n * isFalsy([]) // returns false\n */\nexport function isFalsy(x) {\n return x ? false : true\n}\n\n// ^ future updates https://github.com/thenativeweb/boolean\n\n/**\n * Check if value is true\n * @param {*} x \n * @return {Boolean} - is true\n */\nexport function isTrue(x) {\n return x === true\n}\n\n/**\n * Check if value is true\n * @param {*} x \n * @return {Boolean} - is true\n */\nexport function isFalse(x) {\n return x === false\n}\n\n/**\n * Check if value is email\n * @param {*} x \n * @return {Boolean} - is email like value\n */\nexport function isEmail(x) {\n if (x.length > 320) return false\n return REGEX_EMAIL.test(x)\n}\n\n/**\n * Check if valie is date\n * @param {*} val \n * @returns {Boolean}\n */\nexport function isDate(x) {\n if (x instanceof Date) return true\n return isFunction(x.toDateString) && isFunction(x.getDate) && isFunction(x.setDate)\n}\n\n/**\n * Check if value is ISO date e.g. '2022-01-02T06:45:28.547Z'\n * @param {*} x\n * @return {Boolean} - is email like value\n */\nexport function isIsoDate(x) {\n return REGEX_ISO.test(x)\n}\n\n/**\n * Is value empty\n * @param {*} x \n * @returns {Boolean}\n * @example\n * isEmpty(null)\n *\n * isEmpty([1, 2, 3])\n * // => false\n *\n * isEmpty('abc')\n * // => false\n *\n * isEmpty({ 'a': 1 })\n * // => false\n */\nexport function isEmpty(x) {\n if (isNull(x)) return true\n if (isArray(x)) return !x.length\n if (isSet(x) || isMap(x)) return !x.size\n if (isObject(x)) return !Object.keys(x).length\n return true\n}\n\n/* ────────────────────\nHTML Element checks\n─────────────────────── */\n\n/** \n * @param obj\n * @return {obj is NodeList}\n */\nexport function isNodeList(obj) {\n return NodeList.prototype.isPrototypeOf(obj)\n}\n\n/**\n * Check if input is DOM element\n * @param {HTMLElement|*} element\n * @return {boolean} \n */\nexport function isElement(element, type) {\n const isEl = element instanceof Element || element instanceof HTMLDocument\n if (!isEl || !type) return isEl\n return isNodeType(element, type)\n}\n\n/**\n * Check if element is specific DOMNode type\n * @param {HTMLElement|*} element\n * @param {String} type\n * @return {boolean}\n */\nexport function isNodeType(element, type = '') {\n return element && element.nodeName === type.toUpperCase()\n}\n\nfunction bindArgs(fn, ...boundArgs) {\n return function(...args) {\n return fn(...args, ...boundArgs)\n }\n}\n\n/**\n * Check if element is form element\n * @param {HTMLElement} element\n * @return {boolean} \n */\nexport const isForm = bindArgs(isElement, FORM)\n\n/**\n * Check if element is button element\n * @param {HTMLElement} element\n * @return {boolean} \n */\nexport const isButton = bindArgs(isElement, BUTTON)\n\n/**\n * Check if element is input element\n * @param {HTMLElement} element\n * @return {boolean} \n */\nexport const isInput = bindArgs(isElement, INPUT)\n\n/**\n * Check if element is select element\n * @param {HTMLElement} element\n * @return {boolean} \n */\nexport const isSelect = bindArgs(isElement, SELECT)\n\n/**\n * Check if DOM element is hidden\n * @param {HTMLElement|null|undefined} element\n * @param {HTMLElement|null|undefined} until\n * @return {boolean}\n */\nexport function isHidden(element, until) {\n if (!element || getComputedStyle(element).visibility === HIDDEN) return true\n\n while (element) {\n if (until != null && element === until) return false\n if (getComputedStyle(element).display === NONE) return true\n element = element.parentElement\n }\n\n return false\n}\n\n/* ────────────────────\nEnsure Values\n─────────────────────── */\n\n/**\n * Ensure value returned is Array\n * @param {*} singleOrArray \n * @returns [*]\n */\nexport function ensureArray(singleOrArray) {\n if (!singleOrArray) return []\n if (isArray(singleOrArray)) return singleOrArray\n return [singleOrArray]\n}\n","/**\n * Decode URI string\n *\n * @param {String} s string to decode\n * @returns {String} decoded string\n * @example\n * decode(\"Bought%20keyword)\n * => \"Bought keyword\"\n */\nexport function decodeUri(s) {\n try {\n return decodeURIComponent(s.replace(/\\+/g, ' '))\n } catch (e) {\n return null\n }\n}\n","import {decodeUri} from './decodeUri'\n\n/**\n * Get a given query parameter value\n * @param {string} param - Key of parameter to find\n * @param {string} url - url to search\n * @return {string} match\n */\nexport function paramsGet(param, url) {\n return decodeUri((RegExp(`${param}=(.+?)(&|$)`).exec(url) || [, ''])[1])\n}\n","import { isBrowser } from '@analytics/type-utils'\nimport { decodeUri } from './decodeUri'\n\n/**\n * Get search string from given url\n * @param {string} [url] - optional url string. If no url, window.location.search will be used\n * @return {string} url search string\n */\nfunction getSearchString(url) {\n if (url) {\n const p = url.match(/\\?(.*)/)\n return (p && p[1]) ? p[1].split('#')[0] : ''\n }\n return isBrowser && window.location.search.substring(1)\n}\n\n/**\n * Parse url parameters into javascript object\n * @param {string} [url] - URI to parse. If no url supplied window.location will be used\n * @return {object} parsed url parameters\n */\nexport function paramsParse(url) {\n return getParamsAsObject(getSearchString(url))\n}\n\n/*\n?first=abc&a[]=123&a[]=false&b[]=str&c[]=3.5&a[]=last\nhttps://random.url.com?Target=Report&Method=getStats&fields%5B%5D=Offer.name&fields%5B%5D=Advertiser.company&fields%5B%5D=Stat.clicks&fields%5B%5D=Stat.conversions&fields%5B%5D=Stat.cpa&fields%5B%5D=Stat.payout&fields%5B%5D=Stat.date&fields%5B%5D=Stat.offer_id&fields%5B%5D=Affiliate.company&groups%5B%5D=Stat.offer_id&groups%5B%5D=Stat.date&filters%5BStat.affiliate_id%5D%5Bconditional%5D=EQUAL_TO&filters%5BStat.affiliate_id%5D%5Bvalues%5D=1831&limit=9999\nhttps://random.url.com?Target=Offer&Method=findAll&filters%5Bhas_goals_enabled%5D%5BTRUE%5D=1&filters%5Bstatus%5D=active&fields%5B%5D=id&fields%5B%5D=name&fields%5B%5D=default_goal_name\nhttp://localhost:3000/?Target=Offer&Method=findAll&filters[has_goals_enabled][TRUE]=1&filters[status]=active&filters[wow]arr[]=yaz&filters[wow]arr[]=naz&fields[]=id&fields[]=name&fields[]=default_goal_name */\n\n\nfunction getParamsAsObject(query) {\n let params = Object.create(null)\n let temp\n const re = /([^&=]+)=?([^&]*)/g\n\n while (temp = re.exec(query)) {\n var k = decodeUri(temp[1])\n var v = decodeUri(temp[2])\n if (!k) continue\n if (k.substring(k.length - 2) === '[]') {\n k = k.substring(0, k.length - 2);\n var arrVal = params[k] || (params[k] = [])\n params[k] = Array.isArray(arrVal) ? arrVal : []\n params[k].push(v)\n } else {\n params[k] = (v === '') ? true : v\n }\n }\n\n for (var prop in params) {\n var arr = prop.split('[')\n if (arr.length > 1) {\n assign(params, arr.map((x) => x.replace(/[?[\\]\\\\ ]/g, '')), params[prop])\n delete params[prop]\n }\n }\n return params\n}\n\nfunction assign(obj, keyPath, value) {\n var lastKeyIndex = keyPath.length - 1\n for (var i = 0; i < lastKeyIndex; ++i) {\n var key = keyPath[i]\n if (key === '__proto__' || key === 'constructor') {\n break;\n }\n if (!(key in obj)) { \n obj[key] = {} \n }\n obj = obj[key]\n }\n obj[keyPath[lastKeyIndex]] = value\n}\n\n\n/*\nhttps://github.com/choojs/nanoquery/blob/791cbdfe49cc380f0b2f93477572128946171b46/browser.js\nvar reg = /([^?=&]+)(=([^&]*))?/g\n\nfunction qs (url) {\n var obj = {}\n url.replace(/^.*\\?/, '').replace(reg, function (a0, a1, a2, a3) {\n var value = decodeURIComponent(a3)\n var key = decodeURIComponent(a1)\n if (obj.hasOwnProperty(key)) {\n if (Array.isArray(obj[key])) obj[key].push(value)\n else obj[key] = [obj[key], value]\n } else {\n obj[key] = value\n }\n })\n return obj\n}\n*/","import { isBrowser } from '@analytics/type-utils'\nimport { paramsParse } from './paramsParse'\nimport { isExternalReferrer } from './isExternalReferrer'\nimport { trimTld, getDomainBase } from './url'\n\nconst googleKey = 'google'\n\n/**\n * @typedef {{\n * campaign: string,\n * referrer?: string,\n * } & DomainObject & Object.} ReferrerObject\n */\n\n/**\n * Checks a given url and parses referrer data\n * @param {String} [referrer] - (optional) referring URL\n * @param {String} [currentUrl] - (optional) the current url\n * @return {ReferrerObject} [description]\n */\nexport function parseReferrer(referrer, currentUrl) {\n if (!isBrowser) return false\n // default referral data\n let refData = {\n 'source': '(direct)',\n 'medium': '(none)',\n 'campaign': '(not set)'\n }\n // Add raw ref url if external\n if (referrer && isExternalReferrer(referrer)) {\n refData.referrer = referrer\n }\n\n const domainInfo = parseDomain(referrer)\n // Read referrer URI and infer source\n if (domainInfo && Object.keys(domainInfo).length) {\n refData = Object.assign({}, refData, domainInfo)\n }\n\n // Read URI params and use set utm params\n const params = paramsParse(currentUrl)\n const paramKeys = Object.keys(params)\n if (!paramKeys.length) {\n return refData\n }\n\n // set campaign params off GA matches\n const gaParams = paramKeys.reduce((acc, key) => {\n // match utm params & dclid (display) & gclid (cpc)\n if (key.match(/^utm_/)) {\n acc[`${key.replace(/^utm_/, '')}`] = params[key]\n }\n // https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters\n // dclid - cpc Cost-Per-Thousand Impressions\n // gclid - cpc Cost per Click\n if (key.match(/^(d|g)clid/)) {\n acc['source'] = googleKey\n acc['medium'] = (params.gclid) ? 'cpc' : 'cpm'\n acc[key] = params[key]\n }\n return acc\n }, {})\n\n return Object.assign({}, refData, gaParams)\n}\n\n/**\n * @typedef {{\n * source: string,\n * medium: string,\n * term?: string\n * }} DomainObject\n */\n\n/**\n * Client side domain parser for determining marketing data.\n * @param {String} referrer - ref url\n * @return {DomainObject | boolean}\n */\nfunction parseDomain(referrer) {\n if (!referrer || !isBrowser) return false\n\n let referringDomain = getDomainBase(referrer)\n const a = document.createElement('a')\n a.href = referrer\n\n // Shim for the billion google search engines\n if (a.hostname.indexOf(googleKey) > -1) {\n referringDomain = googleKey\n }\n\n // If is search engine\n if (searchEngines[referringDomain]) {\n const searchEngine = searchEngines[referringDomain]\n const queryParam = (typeof searchEngine === 'string') ? searchEngine : searchEngine.p\n const termRegex = new RegExp(queryParam + '=.*?([^&#]*|$)', 'gi')\n const term = a.search.match(termRegex)\n\n return {\n source: searchEngine.n || trimTld(referringDomain),\n medium: 'organic',\n term: (term ? term[0].split('=')[1] : '') || '(not provided)'\n }\n }\n\n // Default\n const medium = (!isExternalReferrer(referrer)) ? 'internal' : 'referral'\n return {\n source: a.hostname,\n medium: medium\n }\n}\n\n/**\n * Search engine query string data\n * @type {Object}\n */\nconst Q = 'q'\nconst QUERY = 'query'\nconst searchEngines = {\n 'daum.net': Q,\n 'eniro.se': 'search_word',\n 'naver.com': QUERY,\n 'yahoo.com': 'p',\n 'msn.com': Q,\n 'aol.com': Q,\n 'ask.com': Q,\n 'baidu.com': 'wd',\n 'yandex.com': 'text',\n 'rambler.ru': 'words',\n 'google': Q,\n 'bing.com': {\n 'p': Q,\n 'n': 'live'\n },\n}\n","/* ref: http://bit.ly/2daP79j */\n/**\n * @return {string}\n */\nexport function uuid() {\n var u = '',\n m = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx',\n i = 0,\n rb = Math.random() * 0xffffffff|0;\n\n while (i++<36) {\n var c = m [i-1],\n r = rb&0xf,\n v = c=='x' ? r : (r&0x3|0x8);\n\n u += (c=='-' || c=='4') ? c : v.toString(16);\n rb = i%8==0 ? Math.random() * 0xffffffff|0 : rb>>4\n }\n return u\n}\n","import { OBJECT, PREFIX, UNDEFINED } from '@analytics/type-utils'\n\nexport const GLOBAL = 'global'\n\nexport const KEY = PREFIX + GLOBAL + PREFIX\n\nexport const globalContext = (typeof self === OBJECT && self.self === self && self) || (typeof global === OBJECT && global[GLOBAL] === global && global) || this\n\n/* initialize global object */\nif (!globalContext[KEY]) {\n globalContext[KEY] = {}\n}\n/**\n * Get value from global context\n * @param {string} key - Key of value to get\n * @returns {*} value\n */\nexport function get(key) {\n return globalContext[KEY][key]\n}\n\n/**\n * Set value to global context\n * @param {string} key - Key of value to set\n * @param {*} value \n * @returns value\n */\nexport function set(key, value) {\n return globalContext[KEY][key] = value\n}\n\n/**\n * Remove value to global context\n * @param {string} key - Key of value to remove\n */\nexport function remove(key) {\n delete globalContext[KEY][key]\n}\n\n/**\n * Wrap localStorage & session storage checks\n * @param {string} type - localStorage or sessionStorage\n * @param {string} storageOperation - getItem, setItem, removeItem\n * @param {function} fallbackFunction - fallback function\n */\nexport function wrap(type, operation, fallback) {\n let fn\n try {\n if (hasSupport(type)) {\n const storage = window[type]\n fn = storage[operation].bind(storage)\n }\n } catch(e) {}\n return fn || fallback\n}\n\nconst cache = {}\nexport function hasSupport(type) {\n if (typeof cache[type] !== UNDEFINED) {\n return cache[type]\n }\n try {\n const storage = window[type]\n // test for private safari\n storage.setItem(UNDEFINED, UNDEFINED)\n storage.removeItem(UNDEFINED)\n } catch (err) {\n return cache[type] = false\n }\n return cache[type] = true\n}\n\n/*\n// () => localStorage)\n// () => sessionStorage)\nexport function isSupported(getStorage) {\n try {\n const testKey = '__' + undef\n getStorage().setItem(testKey, testKey)\n getStorage().removeItem(testKey)\n return true\n } catch (e) {\n return false\n }\n}\n*/\n","export const FUNC = 'function'\nexport const UNDEF = 'undefined'\nexport const REDUCER = 'reducer'\n\nconst base = '@@redux/'\nexport const ACTION_INIT = base + 'INIT'\nexport const ACTION_TEST = base + Math.random().toString(36)\n","import { isObject } from '@analytics/type-utils'\nimport { FUNC, UNDEF, ACTION_INIT, REDUCER } from './utils/defs'\n\n// eslint-disable-next-line\nconst $$observable = /* #__PURE__ */ (() => (typeof Symbol === FUNC && Symbol.observable) || '@@observable')();\n\n/*\n * Creates a Redux store that holds the state tree.\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\nconst msg = ' != ' + FUNC\nexport default function createStore(reducer, preloadedState, enhancer) {\n if (typeof preloadedState === FUNC && typeof enhancer === UNDEF) {\n enhancer = preloadedState\n preloadedState = undefined\n }\n\n if (typeof enhancer !== UNDEF) {\n if (typeof enhancer !== FUNC) {\n throw new Error('enhancer' + msg)\n }\n\n return enhancer(createStore)(reducer, preloadedState)\n }\n\n if (typeof reducer !== FUNC) {\n throw new Error(REDUCER + msg)\n }\n\n let currentReducer = reducer\n let currentState = preloadedState\n let currentListeners = []\n let nextListeners = currentListeners\n let isDispatching = false\n\n function ensureCanMutateNextListeners() {\n if (nextListeners === currentListeners) {\n nextListeners = currentListeners.slice()\n }\n }\n\n /*\n * Reads the state tree managed by the store.\n *\n * @returns {any} The current state tree of your application.\n */\n function getState() {\n return currentState\n }\n\n /*\n * Adds a change listener. It will be called any time an action is dispatched,\n * and some part of the state tree may potentially have changed. You may then\n * call `getState()` to read the current state tree inside the callback.\n *\n * You may call `dispatch()` from a change listener, with the following\n * caveats:\n *\n * 1. The subscriptions are snapshotted just before every `dispatch()` call.\n * If you subscribe or unsubscribe while the listeners are being invoked, this\n * will not have any effect on the `dispatch()` that is currently in progress.\n * However, the next `dispatch()` call, whether nested or not, will use a more\n * recent snapshot of the subscription list.\n *\n * 2. The listener should not expect to see all state changes, as the state\n * might have been updated multiple times during a nested `dispatch()` before\n * the listener is called. It is, however, guaranteed that all subscribers\n * registered before the `dispatch()` started will be called with the latest\n * state by the time it exits.\n *\n * @param {Function} listener A callback to be invoked on every dispatch.\n * @returns {Function} A function to remove this change listener.\n */\n function subscribe(listener) {\n if (typeof listener !== FUNC) {\n throw new Error('Listener' + msg)\n }\n\n let isSubscribed = true\n\n ensureCanMutateNextListeners()\n nextListeners.push(listener)\n\n return function unsubscribe() {\n if (!isSubscribed) {\n return\n }\n\n isSubscribed = false\n\n ensureCanMutateNextListeners()\n const index = nextListeners.indexOf(listener)\n nextListeners.splice(index, 1)\n }\n }\n\n /**\n * Dispatches an action. It is the only way to trigger a state change.\n *\n * The `reducer` function, used to create the store, will be called with the\n * current state tree and the given `action`. Its return value will\n * be considered the **next** state of the tree, and the change listeners\n * will be notified.\n *\n * The base implementation only supports plain object actions. If you want to\n * dispatch a Promise, an Observable, a thunk, or something else, you need to\n * wrap your store creating function into the corresponding middleware. For\n * example, see the documentation for the `redux-thunk` package. Even the\n * middleware will eventually dispatch plain object actions using this method.\n *\n * @param {Object} action A plain object representing “what changed”. It is\n * a good idea to keep actions serializable so you can record and replay user\n * sessions, or use the time travelling `redux-devtools`. An action must have\n * a `type` property which may not be `undefined`. It is a good idea to use\n * string constants for action types.\n *\n * @returns {Object} For convenience, the same action object you dispatched.\n *\n * Note that, if you use a custom middleware, it may wrap `dispatch()` to\n * return something else (for example, a Promise you can await).\n */\n function dispatch(action) {\n /* // add default info to actions... \n console.log('dispatch before', _action)\n const action = {\n ..._action,\n ...{\n action: {\n ..._action.action,\n ...{ customInfo: 'yoooo'} \n }\n }\n }\n console.log('dispatch after', action)\n /** */\n\n if (!isObject(action)) {\n throw new Error('Act != obj')\n }\n\n if (typeof action.type === UNDEF) {\n throw new Error('ActType ' + UNDEF)\n }\n\n if (isDispatching) {\n throw new Error('Dispatch in ' + REDUCER)\n }\n\n try {\n isDispatching = true\n currentState = currentReducer(currentState, action)\n } finally {\n isDispatching = false\n }\n\n const listeners = currentListeners = nextListeners\n for (let i = 0; i < listeners.length; i++) {\n const listener = listeners[i]\n listener()\n }\n\n return action\n }\n\n /**\n * Replaces the reducer currently used by the store to calculate the state.\n *\n * You might need this if your app implements code splitting and you want to\n * load some of the reducers dynamically. You might also need this if you\n * implement a hot reloading mechanism for Redux.\n *\n * @param {Function} nextReducer The reducer for the store to use instead.\n * @returns {void}\n */\n function replaceReducer(nextReducer) {\n if (typeof nextReducer !== FUNC) {\n throw new Error('next ' + REDUCER + msg)\n }\n\n currentReducer = nextReducer\n dispatch({ type: ACTION_INIT })\n }\n\n /**\n * Interoperability point for observable/reactive libraries.\n * @returns {observable} A minimal observable of state changes.\n * For more information, see the observable proposal:\n * https://github.com/tc39/proposal-observable\n */\n function observable() {\n const outerSubscribe = subscribe\n return {\n /*\n * The minimal observable subscription method.\n * @param {Object} observer Any object that can be used as an observer.\n * The observer object should have a `next` method.\n * @returns {subscription} An object with an `unsubscribe` method that can\n * be used to unsubscribe the observable from the store, and prevent further\n * emission of values from the observable.\n */\n subscribe(observer) {\n if (typeof observer !== 'object') {\n throw new TypeError('Observer != obj')\n }\n\n function observeState() {\n if (observer.next) {\n observer.next(getState())\n }\n }\n\n observeState()\n const unsubscribe = outerSubscribe(observeState)\n return { unsubscribe }\n },\n\n [$$observable]() {\n return this\n }\n }\n }\n\n // When a store is created, an \"INIT\" action is dispatched so that every\n // reducer returns their initial state. This effectively populates\n // the initial state tree.\n dispatch({ type: ACTION_INIT })\n\n return {\n dispatch,\n subscribe,\n getState,\n replaceReducer,\n [$$observable]: observable\n }\n}\n","import { isObject } from '@analytics/type-utils'\nimport warning from './utils/warning'\nimport { FUNC, UNDEF, REDUCER, ACTION_INIT, ACTION_TEST } from './utils/defs'\n\nfunction getUndefinedStateErrorMessage(key, action) {\n const actionType = action && action.type\n const actionName = (actionType && actionType.toString()) || '?'\n\n return ('action ' + actionName + REDUCER + ' ' + key + ' returns ' + UNDEF)\n}\n\nfunction getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) {\n const reducerKeys = Object.keys(reducers)\n const argumentName = action && action.type === ACTION_INIT ? 'preloadedState arg passed to createStore' : 'previous state received by ' + REDUCER\n\n if (reducerKeys.length === 0) {\n return ('Store has no valid reducers')\n }\n\n if (!isObject(inputState)) {\n return (\n `The ${argumentName} has unexpected type of \"` +\n ({}).toString.call(inputState).match(/\\s([a-z|A-Z]+)/)[1] +\n `\". Expected argument to be an object with the following ` +\n `keys: \"${reducerKeys.join('\", \"')}\"`\n )\n }\n\n const unexpectedKeys = Object.keys(inputState).filter(key =>\n !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key]\n )\n\n unexpectedKeys.forEach(key => {\n unexpectedKeyCache[key] = true\n })\n\n if (unexpectedKeys.length > 0) {\n return (\n `Unexpected keys ${unexpectedKeys.join('\", \"')} in ${argumentName}. ` +\n `Expected to find 1 of the known reducer keys instead: ${reducerKeys.join('\", \"')}`\n )\n }\n}\n\nfunction assertReducerShape(reducers) {\n Object.keys(reducers).forEach(key => {\n const reducer = reducers[key]\n const initialState = reducer(undefined, { type: ACTION_INIT })\n if (\n typeof initialState === UNDEF ||\n typeof reducer(undefined, { type: ACTION_TEST }) === UNDEF\n ) {\n throw new Error(REDUCER + ' ' + key + ' ' + UNDEF)\n }\n })\n}\n\n/**\n * Turns an object whose values are different reducer functions, into a single\n * reducer function. It will call every child reducer, and gather their results\n * into a single state object, whose keys correspond to the keys of the passed\n * reducer functions.\n *\n * @param {Object} reducers An object whose values correspond to different\n * reducer functions that need to be combined into one. One handy way to obtain\n * it is to use ES6 `import * as reducers` syntax. The reducers may never return\n * undefined for any action. Instead, they should return their initial state\n * if the state passed to them was undefined, and the current state for any\n * unrecognized action.\n *\n * @returns {Function} A reducer function that invokes every reducer inside the\n * passed object, and builds a state object with the same shape.\n */\nexport default function combineReducers(reducers) {\n const reducerKeys = Object.keys(reducers)\n const finalReducers = {}\n for (let i = 0; i < reducerKeys.length; i++) {\n const key = reducerKeys[i]\n\n if (NODE_ENV !== 'production') {\n if (typeof reducers[key] === UNDEF) {\n warning(`No reducer > ${key}`)\n }\n }\n\n if (typeof reducers[key] === FUNC) {\n finalReducers[key] = reducers[key]\n }\n }\n const finalReducerKeys = Object.keys(finalReducers)\n\n let unexpectedKeyCache\n if (NODE_ENV !== 'production') {\n unexpectedKeyCache = {}\n }\n\n let shapeAssertionError\n try {\n assertReducerShape(finalReducers)\n } catch (e) {\n shapeAssertionError = e\n }\n\n return function combination(state = {}, action) {\n if (shapeAssertionError) {\n throw shapeAssertionError\n }\n\n if (NODE_ENV !== 'production') {\n const warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache)\n if (warningMessage) {\n warning(warningMessage)\n }\n }\n\n let hasChanged = false\n const nextState = {}\n for (let i = 0; i < finalReducerKeys.length; i++) {\n const key = finalReducerKeys[i]\n const reducer = finalReducers[key]\n const previousStateForKey = state[key]\n const nextStateForKey = reducer(previousStateForKey, action)\n if (typeof nextStateForKey === UNDEF) {\n const errorMessage = getUndefinedStateErrorMessage(key, action)\n throw new Error(errorMessage)\n }\n nextState[key] = nextStateForKey\n hasChanged = hasChanged || nextStateForKey !== previousStateForKey\n }\n return hasChanged ? nextState : state\n }\n}\n","/**\n * Composes single-argument functions from right to left. The rightmost\n * function can take multiple arguments as it provides the signature for\n * the resulting composite function.\n *\n * @param {...Function} funcs The functions to compose.\n * @returns {Function} A function obtained by composing the argument functions\n * from right to left. For example, compose(f, g, h) is identical to doing\n * (...args) => f(g(h(...args))).\n */\n\nexport default function compose(...funcs) {\n if (funcs.length === 0) {\n return arg => arg\n }\n\n if (funcs.length === 1) {\n return funcs[0]\n }\n\n return funcs.reduce((a, b) => (...args) => a(b(...args)))\n}\n","import compose from './compose'\n\n/**\n * Creates a store enhancer that applies middleware to the dispatch method\n * of the Redux store. This is handy for a variety of tasks, such as expressing\n * asynchronous actions in a concise manner, or logging every action payload.\n *\n * See `redux-thunk` package as an example of the Redux middleware.\n *\n * Because middleware is potentially asynchronous, this should be the first\n * store enhancer in the composition chain.\n *\n * Note that each middleware will be given the `dispatch` and `getState` functions\n * as named arguments.\n *\n * @param {...Function} middlewares The middleware chain to be applied.\n * @returns {Function} A store enhancer applying the middleware.\n */\nexport default function applyMiddleware(...middlewares) {\n return (createStore) => (reducer, preloadedState, enhancer) => {\n const store = createStore(reducer, preloadedState, enhancer)\n let dispatch = store.dispatch\n let chain = []\n\n const middlewareAPI = {\n getState: store.getState,\n dispatch: (action) => dispatch(action)\n }\n chain = middlewares.map(middleware => middleware(middlewareAPI))\n dispatch = compose(...chain)(store.dispatch)\n\n return {\n ...store,\n dispatch\n }\n }\n}\n","/**\n * Core Analytic constants. These are exposed for third party plugins & listeners\n * @typedef {Object} constants\n * @property {ANON_ID} ANON_ID - Anonymous visitor Id localstorage key\n * @property {USER_ID} USER_ID - Visitor Id localstorage key\n * @property {USER_TRAITS} USER_TRAITS - Visitor traits localstorage key\n */\nimport { PREFIX } from '@analytics/type-utils'\n\n\n/**\n * Anonymous visitor Id localstorage key\n * @typedef {String} ANON_ID\n */\nexport const ANON_ID = PREFIX + 'anon_id' // __anon_id\n/**\n * Visitor Id localstorage key\n * @typedef {String} USER_ID\n */\nexport const USER_ID = PREFIX + 'user_id' // __user_id\n/**\n * Visitor traits localstorage key\n * @typedef {String} USER_TRAITS\n */\nexport const USER_TRAITS = PREFIX + 'user_traits' // __user_traits\n","\nexport const LIB_NAME = 'analytics'\n\nexport const ID = 'userId'\n\nexport const ANONID = 'anonymousId'\n\nexport const ERROR_URL = 'https://lytics.dev/errors/'","/* Core Analytic Events */\n\nexport const coreEvents = [\n /**\n * `bootstrap` - Fires when analytics library starts up.\n * This is the first event fired. '.on/once' listeners are not allowed on bootstrap\n * Plugins can attach logic to this event\n */\n 'bootstrap',\n /**\n * `params` - Fires when analytics parses URL parameters\n */\n 'params',\n /**\n * `campaign` - Fires if params contain \"utm\" parameters\n */\n 'campaign',\n /**\n * `initializeStart` - Fires before 'initialize', allows for plugins to cancel loading of other plugins\n */\n 'initializeStart',\n /**\n * `initialize` - Fires when analytics loads plugins\n */\n 'initialize',\n /**\n * `initializeEnd` - Fires after initialize, allows for plugins to run logic after initialization methods run\n */\n 'initializeEnd',\n /**\n * `ready` - Fires when all analytic providers are fully loaded. This waits for 'initialize' and 'loaded' to return true\n */\n 'ready',\n /**\n * `resetStart` - Fires if analytic.reset() is called.\n * Use this event to cancel reset based on a specific condition\n */\n 'resetStart',\n /**\n * `reset` - Fires if analytic.reset() is called.\n * Use this event to run custom cleanup logic (if needed)\n */\n 'reset',\n /**\n * `resetEnd` - Fires after analytic.reset() is called.\n * Use this event to run a callback after user data is reset\n */\n 'resetEnd',\n /******************\n * Page Events\n ******************/\n /**\n * `pageStart` - Fires before 'page' events fire.\n * This allows for dynamic page view cancellation based on current state of user or options passed in.\n */\n 'pageStart',\n /**\n * `page` - Core analytics hook for page views.\n * If your plugin or integration tracks page views, this is the event to fire on.\n */\n 'page',\n /**\n * `pageEnd` - Fires after all registered 'page' methods fire.\n */\n 'pageEnd',\n /**\n * `pageAborted` - Fires if 'page' call is cancelled by a plugin\n */\n 'pageAborted',\n /****************\n * Track Events\n ***************/\n /**\n * `trackStart` - Called before the 'track' events fires.\n * This allows for dynamic page view cancellation based on current state of user or options passed in.\n */\n 'trackStart',\n /**\n * `track` - Core analytics hook for event tracking.\n * If your plugin or integration tracks custom events, this is the event to fire on.\n */\n 'track',\n /**\n * `trackEnd` - Fires after all registered 'track' events fire from plugins.\n */\n 'trackEnd',\n /**\n * `trackAborted` - Fires if 'track' call is cancelled by a plugin\n */\n 'trackAborted',\n /******************\n * Identify Events\n ******************/\n /**\n * `identifyStart` - Called before the 'identify' events fires.\n * This allows for dynamic page view cancellation based on current state of user or options passed in.\n */\n 'identifyStart',\n /**\n * `identify` - Core analytics hook for user identification.\n * If your plugin or integration identifies users or user traits, this is the event to fire on.\n */\n 'identify',\n /**\n * `identifyEnd` - Fires after all registered 'identify' events fire from plugins.\n */\n 'identifyEnd',\n /**\n * `identifyAborted` - Fires if 'track' call is cancelled by a plugin\n */\n 'identifyAborted',\n /**\n * `userIdChanged` - Fires when a user id is updated\n */\n 'userIdChanged',\n /******************\n * Plugin Events\n ******************/\n /**\n * `registerPlugins` - Fires when analytics is registering plugins\n */\n 'registerPlugins',\n /**\n * `enablePlugin` - Fires when 'analytics.plugins.enable()' is called\n */\n 'enablePlugin',\n /**\n * `disablePlugin` - Fires when 'analytics.plugins.disable()' is called\n */\n 'disablePlugin',\n /*\n * `loadPlugin` - Fires when 'analytics.loadPlugin()' is called\n */\n // 'loadPlugin',\n /******************\n * Browser activity events\n ******************/\n /**\n * `online` - Fires when browser network goes online.\n * This fires only when coming back online from an offline state.\n */\n 'online',\n /**\n * `offline` - Fires when browser network goes offline.\n */\n 'offline',\n /******************\n * Storage events\n ******************/\n /**\n * `setItemStart` - Fires when analytics.storage.setItem is initialized.\n * This event gives plugins the ability to intercept keys & values and alter them before they are persisted.\n */\n 'setItemStart',\n /**\n * `setItem` - Fires when analytics.storage.setItem is called.\n * This event gives plugins the ability to intercept keys & values and alter them before they are persisted.\n */\n 'setItem',\n /**\n * `setItemEnd` - Fires when setItem storage is complete.\n */\n 'setItemEnd',\n /**\n * `setItemAborted` - Fires when setItem storage is cancelled by a plugin.\n */\n 'setItemAborted',\n /**\n * `removeItemStart` - Fires when analytics.storage.removeItem is initialized.\n * This event gives plugins the ability to intercept removeItem calls and abort / alter them.\n */\n 'removeItemStart',\n /**\n * `removeItem` - Fires when analytics.storage.removeItem is called.\n * This event gives plugins the ability to intercept removeItem calls and abort / alter them.\n */\n 'removeItem',\n /**\n * `removeItemEnd` - Fires when removeItem storage is complete.\n */\n 'removeItemEnd',\n /**\n * `removeItemAborted` - Fires when removeItem storage is cancelled by a plugin.\n */\n 'removeItemAborted',\n]\n\n/* Keys on a plugin that are not considered events */\nexport const nonEvents = ['name', 'EVENTS', 'config', 'loaded']\n\nconst pluginEvents = {\n registerPluginType: (name) => `registerPlugin:${name}`,\n pluginReadyType: (name) => `ready:${name}`,\n}\n\nconst EVENTS = coreEvents.reduce((acc, curr) => {\n acc[curr] = curr\n return acc\n}, pluginEvents)\n\nexport default EVENTS\n\nexport function isReservedAction(type) {\n return coreEvents.includes(type)\n}\n","/* eslint-disable camelcase */\nimport EVENTS from '../events'\nimport { ANON_ID, USER_ID, USER_TRAITS } from '../constants'\n\nconst utmRegex = /^utm_/\nconst propRegex = /^an_prop_/\nconst traitRegex = /^an_trait_/\n\n// Middleware runs during EVENTS.initialize\nexport default function initializeMiddleware(instance) {\n const { setItem } = instance.storage\n return store => next => action => {\n /* Handle bootstrap event */\n if (action.type === EVENTS.bootstrap) {\n const { params, user, persistedUser, initialUser } = action\n const isKnownId = persistedUser.userId === user.userId\n /* 1. Set anonymous ID */\n if (persistedUser.anonymousId !== user.anonymousId) {\n setItem(ANON_ID, user.anonymousId)\n }\n /* 2. Set userId */\n if (!isKnownId) {\n setItem(USER_ID, user.userId)\n }\n /* 3. Set traits if they are different */\n if (initialUser.traits) {\n setItem(USER_TRAITS, {\n ...(isKnownId && persistedUser.traits) ? persistedUser.traits : {},\n ...initialUser.traits\n })\n /* TODO multi user setup\n setItem(`${USER_TRAITS}.${user.userId}`, {\n ...(isKnownId) ? existingTraits : {},\n ...initialUser.traits\n })\n */\n }\n /* 4. Parse url params */\n const paramsArray = Object.keys(action.params)\n if (paramsArray.length) {\n const { an_uid, an_event } = params\n const groupedParams = paramsArray.reduce((acc, key) => {\n // match utm params & dclid (display) & gclid (cpc)\n if (key.match(utmRegex) || key.match(/^(d|g)clid/)) {\n const cleanName = key.replace(utmRegex, '')\n const keyName = (cleanName === 'campaign') ? 'name' : cleanName\n acc.campaign[keyName] = params[key]\n }\n if (key.match(propRegex)) {\n acc.props[key.replace(propRegex, '')] = params[key]\n }\n if (key.match(traitRegex)) {\n acc.traits[key.replace(traitRegex, '')] = params[key]\n }\n return acc\n }, {\n campaign: {},\n props: {},\n traits: {}\n })\n\n store.dispatch({\n type: EVENTS.params,\n raw: params,\n ...groupedParams,\n ...(an_uid ? { userId: an_uid } : {}),\n })\n\n /* If userId set, call identify */\n if (an_uid) {\n // timeout to debounce and make sure integration is registered. Todo refactor\n setTimeout(() => instance.identify(an_uid, groupedParams.traits), 0)\n }\n\n /* If tracking event set, call track */\n if (an_event) {\n // timeout to debounce and make sure integration is registered. Todo refactor\n setTimeout(() => instance.track(an_event, groupedParams.props), 0)\n }\n\n // if url has utm params\n if (Object.keys(groupedParams.campaign).length) {\n store.dispatch({\n type: EVENTS.campaign,\n campaign: groupedParams.campaign\n })\n }\n }\n }\n return next(action)\n }\n}\n","import { get } from '@analytics/global-storage-utils'\nimport { isObject, PREFIX } from '@analytics/type-utils'\nimport { ANON_ID, USER_ID, USER_TRAITS } from '../constants'\nimport EVENTS from '../events'\n\n/* user reducer */\nexport default function userReducer(storage) {\n return function user(state = {}, action = {}) {\n\n if (action.type === EVENTS.setItemEnd) {\n // Set anonymousId if changed by storage.setItem\n if (action.key === ANON_ID) {\n return { ...state, ...{ anonymousId: action.value }}\n }\n // Set userId if changed by storage.setItem\n if (action.key === USER_ID) {\n return { ...state, ...{ userId: action.value }}\n }\n }\n\n switch (action.type) {\n case EVENTS.identify:\n return Object.assign({}, state, {\n userId: action.userId,\n traits: {\n ...state.traits,\n ...action.traits\n }\n })\n case EVENTS.reset:\n // Side effect to fix race condition in Node. TODO refactor\n // This is from default storage.removeItem: (key) => globalContext[key] = undefined\n [ USER_ID, ANON_ID, USER_TRAITS ].forEach((key) => {\n // sync storage, not instance.storage\n storage.removeItem(key)\n })\n return Object.assign({}, state, {\n userId: null,\n // TODO reset anon id automatically?\n anonymousId: null,\n traits: {},\n })\n default:\n return state\n }\n }\n}\n\nexport function getPersistedUserData(storage) {\n return {\n userId: storage.getItem(USER_ID),\n anonymousId: storage.getItem(ANON_ID),\n traits: storage.getItem(USER_TRAITS)\n }\n}\n\nexport const tempKey = (key) => PREFIX + 'TEMP' + PREFIX + key\n\nexport function getUserPropFunc(storage) {\n return function getUserProp(key, instance, payload) {\n /* 1. Try current state */\n const currentId = instance.getState('user')[key]\n if (currentId) {\n /*\n console.log(`from state ${key}`, currentId)\n /** */\n return currentId\n }\n\n /* 2. Try event payload */\n if (payload && isObject(payload) && payload[key]) {\n /*\n console.log(`from payload ${key}`, payload[key])\n /** */\n return payload[key]\n }\n\n /* 3. Try persisted data */\n const persistedInfo = getPersistedUserData(storage)[key]\n if (persistedInfo) {\n /*\n console.log(`from persistedInfo ${key}`, persistedInfo)\n /** */\n return persistedInfo\n }\n\n /* 4. Else, try to get in memory placeholder. TODO watch this for future issues */\n return get(tempKey(key)) || null\n }\n}\n","import { uuid } from 'analytics-utils'\nimport { remove } from '@analytics/global-storage-utils'\nimport { tempKey } from '../modules/user'\nimport { USER_ID, USER_TRAITS, ANON_ID } from '../constants'\nimport { ID, ANONID } from '../utils/internalConstants'\nimport EVENTS from '../events'\n\nexport default function identifyMiddleware(instance) {\n const { setItem, removeItem, getItem } = instance.storage\n return store => next => action => {\n const { userId, traits, options } = action\n /* Reset user id and traits */\n if (action.type === EVENTS.reset) {\n // Remove stored data\n [ USER_ID, USER_TRAITS, ANON_ID ].forEach((key) => {\n // Fires async removeItem dispatch\n removeItem(key)\n });\n [ ID, ANONID, 'traits' ].forEach((key) => {\n // Remove from global context\n remove(tempKey(key))\n })\n }\n\n if (action.type === EVENTS.identify) {\n /* If no anon id. Set it! */\n if (!getItem(ANON_ID)) {\n setItem(ANON_ID, uuid())\n }\n\n const currentId = getItem(USER_ID)\n const currentTraits = getItem(USER_TRAITS) || {}\n\n if (currentId && (currentId !== userId)) {\n store.dispatch({\n type: EVENTS.userIdChanged,\n old: {\n userId: currentId,\n traits: currentTraits,\n },\n new: {\n userId,\n traits\n },\n options: options,\n })\n }\n\n /* Save user id */\n if (userId) {\n setItem(USER_ID, userId)\n }\n\n /* Save user traits */\n if (traits) {\n setItem(USER_TRAITS, {\n ...currentTraits,\n ...traits\n })\n }\n }\n return next(action)\n }\n}\n","import { isFunction } from '@analytics/type-utils'\n\n// Stack to temporarily hold deferred promises/callbacks\nconst stack = {}\n\nfunction runCallback(id, payload) {\n if (stack[id] && isFunction(stack[id])) {\n // console.log(`run ${id}`)\n stack[id](payload)\n delete stack[id]\n }\n}\n\nexport { stack, runCallback }","/**\n * Wait until a given analytics provider is ready.\n * @param {Object} data - passthrough resolve data\n * @param {Function} predicate - function that resolves true\n * @param {Number} timeout - max wait time\n * @return {Promise}\n */\nexport default function waitForReady(data, predicate, timeout) {\n return new Promise((resolve, reject) => {\n if (predicate()) {\n return resolve(data)\n }\n // Timeout. Add to queue\n if (timeout < 1) {\n return reject({ ...data, queue: true }) // eslint-disable-line\n }\n // Else recursive retry\n return pause(10).then(_ => {\n return waitForReady(data, predicate, timeout - 10).then(resolve, reject)\n })\n })\n}\n\nfunction pause(ms) {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n","import { isFunction, isObject } from '@analytics/type-utils'\nimport { ID, ANONID } from './internalConstants'\n\nfunction abort(reason) {\n return { abort: reason }\n}\n\nexport function processQueue(store, getPlugins, instance) {\n const abortedCalls = {}\n const pluginMethods = getPlugins()\n const { plugins, context, queue, user } = store.getState()\n const isOnline = !context.offline\n /* If network connection found and there is items in queue, process them all */\n if (isOnline && queue && queue.actions && queue.actions.length) {\n const pipeline = queue.actions.reduce((acc, item, index) => {\n const isLoaded = plugins[item.plugin].loaded\n if (isLoaded) {\n acc.process.push(item)\n acc.processIndex.push(index)\n } else {\n acc.requeue.push(item)\n acc.requeueIndex.push(index)\n }\n return acc\n }, {\n processIndex: [],\n process: [],\n requeue: [],\n requeueIndex: []\n })\n\n if (pipeline.processIndex && pipeline.processIndex.length) {\n pipeline.processIndex.forEach((i) => {\n const processAction = queue.actions[i]\n // console.log('RePROCESS THIS>', processAction)\n // Call methods directly right now\n const currentPlugin = processAction.plugin\n const currentMethod = processAction.payload.type\n const method = pluginMethods[currentPlugin][currentMethod]\n if (method && isFunction(method)) {\n /* enrich queued payload with userId / anon id if missing */\n /* TODO hoist enrich into where action queued? */\n // console.log('before', processAction.payload)\n const enrichedPayload = enrich(processAction.payload, user)\n // console.log('user.userId', user.userId)\n // console.log('user.anonymousId', user.anonymousId)\n // console.log('after enrich', enrichedPayload)\n let retVal\n const isAborted = abortedCalls[enrichedPayload.meta.rid]\n /* if not aborted call method */\n if (!isAborted) {\n // TODO make async\n retVal = method({\n payload: enrichedPayload,\n config: plugins[currentPlugin].config,\n instance,\n abort\n })\n // If aborted, cancel the downstream calls\n if (retVal && isObject(retVal) && retVal.abort) {\n abortedCalls[enrichedPayload.meta.rid] = true\n return\n }\n }\n\n /* Then redispatch for .on listeners / other middleware */\n if (!isAborted) {\n const pluginEvent = `${currentMethod}:${currentPlugin}`\n store.dispatch({\n ...enrichedPayload,\n type: pluginEvent,\n /* Internal data for analytics engine */\n _: {\n called: pluginEvent,\n from: 'queueDrain'\n }\n })\n }\n }\n })\n\n /* Removed processed actions */\n const reQueueActions = queue.actions.filter((value, index) => {\n // note !~ === return pipeline.processIndex.indexOf(index) === -1\n return !~pipeline.processIndex.indexOf(index)\n })\n\n /* Set queue actions. TODO refactor to non mutatable or move out of redux */\n queue.actions = reQueueActions\n\n /*\n if (!reQueueActions.length) {\n console.log('Queue clears')\n console.log('abortedCalls', abortedCalls)\n }\n /** */\n }\n }\n}\n\n/* Heartbeat retries queued events */\nexport default function heartBeat(store, getPlugins, instance) {\n // 3e3 === 3000 ms\n return setInterval(() => processQueue(store, getPlugins, instance), 3e3)\n}\n\n// Assign userId && anonymousId values if present in payload but null\nfunction enrich(payload = {}, user = {}) {\n return [ ID, ANONID ].reduce((acc, key) => {\n if (payload.hasOwnProperty(key) && user[key] && (user[key] !== payload[key])) {\n // console.log(`${key} stale update with ${user[key]}`)\n acc[key] = user[key]\n }\n return acc\n }, payload)\n}\n","import EVENTS from '../../events'\nimport fitlerDisabledPlugins from '../../utils/filterDisabled'\nimport { isFunction, isObject, isString } from '@analytics/type-utils'\nimport { runCallback } from '../../utils/callback-stack'\n\nconst endsWithStartRegex = /Start$/\nconst bootstrapRegex = /^bootstrap/\nconst readyRegex = /^ready/\n\nexport default async function (action, getPlugins, instance, store, eventsInfo) {\n const pluginObject = isFunction(getPlugins) ? getPlugins() : getPlugins\n const originalType = action.type\n const updatedType = originalType.replace(endsWithStartRegex, '')\n\n /* If action already dispatched exit early. This makes it so plugin methods are not fired twice. */\n if (action._ && action._.called) {\n // console.log('Already called', action._.called)\n return action\n }\n\n const state = instance.getState()\n /* Remove plugins that are disabled by options or by settings */\n let activePlugins = fitlerDisabledPlugins(pluginObject, state.plugins, action.options)\n\n /* If analytics.plugin.enable calls do special behavior */\n if (originalType === EVENTS.initializeStart && action.fromEnable) {\n // Return list of all enabled plugins that have NOT been initialized yet\n activePlugins = Object.keys(state.plugins).filter((name) => {\n const info = state.plugins[name]\n return action.plugins.includes(name) && !info.initialized\n }).map((name) => pluginObject[name])\n }\n // console.log(`engine activePlugins ${action.type}`, activePlugins)\n\n const allActivePluginKeys = activePlugins.map((p) => p.name)\n // console.log('allActivePluginKeys', allActivePluginKeys)\n const allMatches = getAllMatchingCalls(originalType, activePlugins, pluginObject)\n // console.log('allMatches', allMatches)\n\n /* @TODO cache matches and purge on enable/disable/add plugin */\n\n /**\n * Process all 'actionBefore' hooks\n * Example:\n * This is processes 'pageStart' methods from plugins and update the event to send through the chain\n */\n const actionBefore = await processEvent({\n action: action,\n data: {\n exact: allMatches.before,\n namespaced: allMatches.beforeNS\n },\n state: state,\n allPlugins: pluginObject,\n allMatches,\n instance,\n store,\n EVENTS: eventsInfo\n })\n // console.log('____ actionBefore out', actionBefore)\n\n /* Abort if ‘eventBefore’ returns abort data */\n if (shouldAbortAll(actionBefore, allActivePluginKeys.length)) {\n return actionBefore\n }\n\n /* Filter over the plugin method calls and remove aborted plugin by name */\n // const activeAndNonAbortedCalls = activePlugins.filter((plugin) => {\n // if (shouldAbort(actionBefore, plugin.name)) return false\n // return true\n // })\n // console.log(`activeAndNonAbortedCalls ${action.type}`, activeAndNonAbortedCalls)\n\n let actionDuring\n if (originalType === updatedType) {\n /* If type the same don't double process */\n actionDuring = actionBefore\n } else {\n /**\n * Process all 'action' hooks\n * Example: This is process 'page' methods from plugins and update the event to send through\n */\n actionDuring = await processEvent({\n action: {\n ...actionBefore,\n type: updatedType\n },\n data: {\n exact: allMatches.during,\n namespaced: allMatches.duringNS\n },\n state: state,\n allPlugins: pluginObject,\n allMatches,\n instance,\n store,\n EVENTS: eventsInfo\n })\n }\n // console.log('____ actionDuring', actionDuring)\n\n /**\n * Process all 'actionEnd' hooks\n * Example:\n * This is process 'pageEnd' methods from plugins and update the event to send through\n */\n // Only trigger `eventTypeEnd` if originalAction has Start ending.\n if (originalType.match(endsWithStartRegex)) {\n const afterName = `${updatedType}End`\n const actionAfter = await processEvent({\n action: {\n ...actionDuring,\n type: afterName\n },\n data: {\n exact: allMatches.after,\n namespaced: allMatches.afterNS\n },\n state: state,\n allPlugins: pluginObject,\n allMatches,\n instance,\n store,\n EVENTS: eventsInfo\n })\n // console.log('____ actionAfter', actionAfter)\n\n /* Fire callback if supplied */\n if (actionAfter.meta && actionAfter.meta.hasCallback) {\n /*\n console.log('End of engine action has callback')\n console.log(actionAfter.meta)\n console.log('stack', stack)\n /** */\n\n // @TODO figure out exact args calls and .on will get\n runCallback(actionAfter.meta.rid, { payload: actionAfter })\n }\n }\n\n return actionBefore\n}\n\n/**\n * Async reduce over matched plugin methods\n * Fires plugin functions\n */\nasync function processEvent({\n data,\n action,\n instance,\n state,\n allPlugins,\n allMatches,\n store,\n EVENTS\n}) {\n const { plugins, context } = state\n const method = action.type\n const isStartEvent = method.match(endsWithStartRegex)\n // console.log(`data ${method}`, data)\n // console.log(`data allMatches ${method}`, allMatches)\n let abortable = data.exact.map((x) => {\n return x.pluginName\n })\n\n /* If abort is called from xyzStart */\n if (isStartEvent) {\n abortable = allMatches.during.map((x) => {\n return x.pluginName\n })\n }\n\n /* make args for functions to concume */\n const makeArgs = argumentFactory(instance, abortable)\n // console.log('makeArgs', makeArgs)\n\n /* Check if plugin loaded, if not mark action for queue */\n const queueData = data.exact.reduce((acc, thing) => {\n const { pluginName, methodName } = thing\n let addToQueue = false\n // Queue actions if plugin not loaded except for initialize and reset\n if (!methodName.match(/^initialize/) && !methodName.match(/^reset/)) {\n addToQueue = !plugins[pluginName].loaded\n }\n /* If offline and its a core method. Add to queue */\n if (context.offline && (methodName.match(/^(page|track|identify)/))) {\n addToQueue = true\n }\n acc[`${pluginName}`] = addToQueue\n return acc\n }, {})\n\n /* generate plugin specific payloads */\n const payloads = await data.exact.reduce(async (scoped, curr, i) => {\n const { pluginName } = curr\n const curScope = await scoped\n if (data.namespaced && data.namespaced[pluginName]) {\n const scopedPayload = await data.namespaced[pluginName].reduce(async (acc, p, count) => {\n // await value\n const curScopeData = await acc\n if (!p.method || !isFunction(p.method)) {\n return curScopeData\n }\n\n /* Make sure plugins don’t call themselves */\n validateMethod(p.methodName, p.pluginName)\n\n function genAbort(currentAct, pname, otherPlug) {\n return function (reason, plugins) {\n const callsite = otherPlug || pname\n // console.log(`__abort msg: ${reason}`)\n // console.log(`__abort ${pname}`)\n // console.log(`__abort xxx: ${plugins}`)\n // console.log(`__abort otherPlug`, otherPlug)\n return {\n ...currentAct,\n abort: {\n reason: reason,\n plugins: plugins || [pname],\n caller: method,\n from: callsite\n }\n }\n }\n }\n\n const val = await p.method({\n payload: curScopeData,\n instance,\n abort: genAbort(curScopeData, pluginName, p.pluginName),\n config: getConfig(p.pluginName, plugins, allPlugins),\n plugins: plugins\n })\n const returnValue = isObject(val) ? val : {}\n return Promise.resolve({\n ...curScopeData,\n ...returnValue\n })\n }, Promise.resolve(action))\n\n /* Set scoped payload */\n curScope[pluginName] = scopedPayload\n } else {\n /* Set payload as default action */\n curScope[pluginName] = action\n }\n return Promise.resolve(curScope)\n }, Promise.resolve({}))\n // console.log(`aaa scoped payloads ${action.type}`, payloads)\n\n // Then call the normal methods with scoped payload\n const resolvedAction = await data.exact.reduce(async (promise, curr, i) => {\n const lastLoop = data.exact.length === (i + 1)\n const { pluginName } = curr\n const currentPlugin = allPlugins[pluginName]\n const currentActionValue = await promise\n\n let payloadValue = (payloads[pluginName]) ? payloads[pluginName] : {}\n /* If eventStart, allow for value merging */\n if (isStartEvent) {\n payloadValue = currentActionValue\n }\n\n if (shouldAbort(payloadValue, pluginName)) {\n // console.log(`> Abort from payload specific \"${pluginName}\" abort value`, payloadValue)\n abortDispatch({\n data: payloadValue,\n method,\n instance,\n pluginName,\n store\n })\n return Promise.resolve(currentActionValue)\n }\n if (shouldAbort(currentActionValue, pluginName)) {\n // console.log(`> Abort from ${method} abort value`, currentActionValue)\n if (lastLoop) {\n abortDispatch({\n data: currentActionValue,\n method,\n instance,\n // pluginName,\n store\n })\n }\n return Promise.resolve(currentActionValue)\n }\n\n if (queueData.hasOwnProperty(pluginName) && queueData[pluginName] === true) {\n // console.log('Queue this instead', pluginName)\n store.dispatch({\n type: `queue`,\n plugin: pluginName,\n payload: payloadValue,\n /* Internal data for analytics engine */\n _: {\n called: `queue`,\n from: 'queueMechanism' // for debugging\n }\n })\n return Promise.resolve(currentActionValue)\n }\n /*\n const checkForLoaded = () => {\n const p = instance.getState('plugins')\n return p[currentPlugin.name].loaded\n }\n // const p = instance.getState('plugins')\n console.log(`loaded \"${currentPlugin.name}\" > ${method}:`, p[currentPlugin.name].loaded)\n // await waitForReady(currentPlugin, checkForLoaded, 10000).then((d) => {\n // console.log(`Loaded ${method}`, currentPlugin.name)\n // }).catch((e) => {\n // console.log(`Error ${method} ${currentPlugin.name}`, e)\n // // TODO dispatch failure\n // })\n */\n\n // @TODO figure out if we want queuing semantics\n\n const funcArgs = makeArgs(payloads[pluginName], allPlugins[pluginName])\n\n // console.log(`funcArgs ${method} ${pluginName}`, funcArgs)\n\n /* Run the plugin function */\n const val = await currentPlugin[method]({\n // currentPlugin: pluginName,\n abort: funcArgs.abort,\n // Send in original action value or scope payload\n payload: payloadValue,\n instance,\n config: getConfig(pluginName, plugins, allPlugins),\n plugins: plugins\n })\n\n const returnValue = isObject(val) ? val : {}\n const merged = {\n ...currentActionValue,\n ...returnValue\n }\n\n const scopedPayload = payloads[pluginName] // || currentActionValue\n if (shouldAbort(scopedPayload, pluginName)) {\n // console.log(`>> HANDLE abort ${method} ${pluginName}`)\n abortDispatch({\n data: scopedPayload,\n method,\n instance,\n pluginName,\n store\n })\n } else {\n const nameSpaceEvent = `${method}:${pluginName}`\n const actionDepth = (nameSpaceEvent.match(/:/g) || []).length\n if (actionDepth < 2 && !method.match(bootstrapRegex) && !method.match(readyRegex)) {\n const updatedPayload = (isStartEvent) ? merged : payloadValue\n // Dispatched for `.on('xyz') listeners.\n instance.dispatch({\n ...updatedPayload,\n type: nameSpaceEvent,\n _: {\n called: nameSpaceEvent,\n from: 'submethod'\n }\n })\n }\n }\n // console.log('merged', merged)\n return Promise.resolve(merged)\n }, Promise.resolve(action))\n\n // Dispatch End. Make sure actions don't get double dispatched. EG userIdChanged\n if (!method.match(endsWithStartRegex) &&\n !method.match(/^registerPlugin/) &&\n // !method.match(/^disablePlugin/) &&\n // !method.match(/^enablePlugin/) &&\n !method.match(readyRegex) &&\n !method.match(bootstrapRegex) &&\n !method.match(/^params/) &&\n !method.match(/^userIdChanged/)\n ) {\n if (EVENTS.plugins.includes(method)) {\n // console.log(`Dont dispatch for ${method}`, resolvedAction)\n // return resolvedAction\n }\n /*\n Verify this original action setup.\n It's intended to keep actions from double dispatching themselves\n */\n if (resolvedAction._ && resolvedAction._.originalAction === method) {\n // console.log(`Dont dispatch for ${method}`, resolvedAction)\n return resolvedAction\n }\n\n let endAction = {\n ...resolvedAction,\n ...{\n _: {\n originalAction: resolvedAction.type,\n called: resolvedAction.type,\n from: 'engineEnd'\n }\n }\n }\n\n /* If all plugins are aborted, dispatch xAborted */\n if (shouldAbortAll(resolvedAction, data.exact.length) && !method.match(/End$/)) {\n endAction = {\n ...endAction,\n ...{\n type: resolvedAction.type + 'Aborted',\n }\n }\n }\n\n store.dispatch(endAction)\n }\n\n return resolvedAction\n}\n\nfunction abortDispatch({ data, method, instance, pluginName, store }) {\n const postFix = (pluginName) ? ':' + pluginName : ''\n const abortEvent = method + 'Aborted' + postFix\n store.dispatch({\n ...data,\n type: abortEvent,\n _: {\n called: abortEvent,\n from: 'abort'\n }\n })\n}\n\nfunction getConfig(name, pluginState, allPlugins) {\n const pluginData = pluginState[name] || allPlugins[name]\n if (pluginData && pluginData.config) {\n return pluginData.config\n }\n return {}\n}\n\nfunction getPluginFunctions(methodName, plugins) {\n return plugins.reduce((arr, plugin) => {\n return (!plugin[methodName]) ? arr : arr.concat({\n methodName: methodName,\n pluginName: plugin.name,\n method: plugin[methodName],\n })\n }, [])\n}\n\nfunction formatMethod(type) {\n return type.replace(endsWithStartRegex, '')\n}\n\n/**\n * Return array of event names\n * @param {String} eventType - original event type\n * @param {String} namespace - optional namespace postfix\n * @return {array} - type, method, end\n */\nfunction getEventNames(eventType, namespace) {\n const method = formatMethod(eventType)\n const postFix = (namespace) ? `:${namespace}` : ''\n // `typeStart:pluginName`\n const type = `${eventType}${postFix}`\n // `type:pluginName`\n const methodName = `${method}${postFix}`\n // `typeEnd:pluginName`\n const end = `${method}End${postFix}`\n return [ type, methodName, end ]\n}\n\n/* Collect all calls for a given event in the system */\nfunction getAllMatchingCalls(eventType, activePlugins, allPlugins) {\n const eventNames = getEventNames(eventType)\n // console.log('eventNames', eventNames)\n // 'eventStart', 'event', & `eventEnd`\n const core = eventNames.map((word) => {\n return getPluginFunctions(word, activePlugins)\n })\n // Gather nameSpaced Events\n return activePlugins.reduce((acc, plugin) => {\n const { name } = plugin\n const nameSpacedEvents = getEventNames(eventType, name)\n // console.log('eventNames namespaced', nameSpacedEvents)\n const [ beforeFuncs, duringFuncs, afterFuncs ] = nameSpacedEvents.map((word) => {\n return getPluginFunctions(word, activePlugins)\n })\n\n if (beforeFuncs.length) {\n acc.beforeNS[name] = beforeFuncs\n }\n if (duringFuncs.length) {\n acc.duringNS[name] = duringFuncs\n }\n if (afterFuncs.length) {\n acc.afterNS[name] = afterFuncs\n }\n return acc\n }, {\n before: core[0],\n beforeNS: {},\n during: core[1],\n duringNS: {},\n after: core[2],\n afterNS: {}\n })\n}\n\nfunction shouldAbort({ abort }, pluginName) {\n if (!abort) return false\n if (abort === true) return true\n return includes(abort, pluginName) || (abort && includes(abort.plugins, pluginName))\n}\n\nfunction shouldAbortAll({ abort }, pluginsCount) {\n if (!abort) return false\n if (abort === true || isString(abort)) return true\n const { plugins } = abort\n return (isArray(abort) && (abort.length === pluginsCount)) || (isArray(plugins) && (plugins.length === pluginsCount))\n}\n\nfunction isArray(arr) {\n return Array.isArray(arr)\n}\n\nfunction includes(arr, name) {\n if (!arr || !isArray(arr)) return false\n return arr.includes(name)\n}\n\n/**\n * Generate arguments to pass to plugin methods\n * @param {Object} instance - analytics instance\n * @param {array} abortablePlugins - plugins that can be cancelled by caller\n * @return {*} function to inject plugin params\n */\nfunction argumentFactory(instance, abortablePlugins) {\n // console.log('abortablePlugins', abortablePlugins)\n return function (action, plugin, otherPlugin) {\n const { config, name } = plugin\n let method = `${name}.${action.type}`\n if (otherPlugin) {\n method = otherPlugin.event\n }\n\n const abortF = (action.type.match(endsWithStartRegex))\n ? abortFunction(name, method, abortablePlugins, otherPlugin, action)\n : notAbortableError(action, method)\n\n return {\n /* self: plugin, for future maybe */\n // clone objects to avoid reassign\n payload: formatPayload(action),\n instance: instance,\n config: config || {},\n abort: abortF\n }\n }\n}\n\nfunction abortFunction(pluginName, method, abortablePlugins, otherPlugin, action) {\n return function (reason, plugins) {\n const caller = (otherPlugin) ? otherPlugin.name : pluginName\n let pluginsToAbort = (plugins && isArray(plugins)) ? plugins : abortablePlugins\n if (otherPlugin) {\n pluginsToAbort = (plugins && isArray(plugins)) ? plugins : [pluginName]\n if (!pluginsToAbort.includes(pluginName) || pluginsToAbort.length !== 1) {\n throw new Error(`Method ${method} can only abort ${pluginName} plugin. ${JSON.stringify(pluginsToAbort)} input valid`)\n }\n }\n return {\n ...action, // 🔥 todo verify this merge is ok\n abort: {\n reason: reason,\n plugins: pluginsToAbort,\n caller: method,\n _: caller\n }\n }\n }\n}\n\nfunction notAbortableError(action, method) {\n return () => {\n throw new Error(action.type + ' action not cancellable. Remove abort in ' + method)\n }\n}\n\n/**\n * Verify plugin is not calling itself with whatever:myPluginName self refs\n */\nfunction validateMethod(actionName, pluginName) {\n const text = getNameSpacedAction(actionName)\n const methodCallMatchesPluginNamespace = text && (text.name === pluginName)\n if (methodCallMatchesPluginNamespace) {\n const sub = getNameSpacedAction(text.method)\n const subText = (sub) ? 'or ' + sub.method : ''\n throw new Error([ pluginName + ' plugin is calling method ' + actionName,\n 'Plugins cant call self',\n `Use ${text.method} ${subText} in ${pluginName} plugin insteadof ${actionName}`]\n .join('\\n')\n )\n }\n}\n\nfunction getNameSpacedAction(event) {\n const split = event.match(/(.*):(.*)/)\n if (!split) {\n return false\n }\n return {\n method: split[1],\n name: split[2],\n }\n}\n\nfunction formatPayload(action) {\n return Object.keys(action).reduce((acc, key) => {\n // redact type from { payload }\n if (key === 'type') {\n return acc\n }\n if (isObject(action[key])) {\n acc[key] = Object.assign({}, action[key])\n } else {\n acc[key] = action[key]\n }\n return acc\n }, {})\n}\n\n/*\nfunction getMatchingMethods(eventType, activePlugins) {\n const exact = getPluginFunctions(eventType, activePlugins)\n // console.log('exact', exact)\n // Gather nameSpaced Events\n return activePlugins.reduce((acc, plugin) => {\n const { name } = plugin\n const clean = getPluginFunctions(`${eventType}:${name}`, activePlugins)\n if (clean.length) {\n acc.namespaced[name] = clean\n }\n return acc\n }, {\n exact: exact,\n namespaced: {}\n })\n}\n*/\n","import EVENTS, { nonEvents } from '../../events'\nimport { runCallback, stack } from '../../utils/callback-stack'\nimport waitForReady from '../../utils/waitForReady'\nimport { processQueue } from '../../utils/heartbeat'\nimport runPlugins from './engine'\n\nexport default function pluginMiddleware(instance, getPlugins, systemEvents) {\n const isReady = {}\n return store => next => async action => {\n const { type, abort, plugins } = action\n let updatedAction = action\n\n if (abort) {\n return next(action)\n }\n\n /* Analytics.plugins.enable called, we need to init the plugins */\n if (type === EVENTS.enablePlugin) {\n store.dispatch({\n type: EVENTS.initializeStart,\n plugins: plugins,\n disabled: [],\n fromEnable: true,\n meta: action.meta\n })\n }\n \n if (type === EVENTS.disablePlugin) {\n // If cached callback, resolve promise/run callback. debounced to fix race condition\n setTimeout(() => runCallback(action.meta.rid, { payload: action }), 0)\n }\n\n /* @TODO implement\n if (type === EVENTS.loadPlugin) {\n // Rerun initialize calls in plugins\n const allPlugins = getPlugins()\n const pluginsToLoad = Object.keys(allPlugins).filter((name) => {\n return plugins.includes(name)\n }).reduce((acc, curr) => {\n acc[curr] = allPlugins[curr]\n return acc\n }, {})\n const initializeAction = {\n type: EVENTS.initializeStart,\n plugins: plugins\n }\n const updated = await runPlugins(initializeAction, pluginsToLoad, instance, store, systemEvents)\n return next(updated)\n }\n */\n\n // || type.match(/^initializeAbort:/)\n if (type === EVENTS.initializeEnd) {\n const allPlugins = getPlugins()\n const pluginsArray = Object.keys(allPlugins)\n const allRegisteredPlugins = pluginsArray.filter((name) => {\n return plugins.includes(name)\n }).map((name) => {\n return allPlugins[name]\n })\n let completed = []\n let failed = []\n let disabled = action.disabled\n // console.log('allRegisteredPlugins', allRegisteredPlugins)\n const waitForPluginsToLoad = allRegisteredPlugins.map((plugin) => {\n const { loaded, name, config } = plugin\n const loadedFn = () => loaded({ config }) // @TODO add in more to api to match other funcs?\n /* Plugins will abort trying to load after 10 seconds. 1e4 === 10000 MS */\n return waitForReady(plugin, loadedFn, 1e4).then((d) => {\n if (!isReady[name]) {\n // only dispatch namespaced rdy once\n store.dispatch({\n type: EVENTS.pluginReadyType(name), // `ready:${name}`\n name: name,\n events: Object.keys(plugin).filter((name) => {\n return !nonEvents.includes(name)\n })\n })\n isReady[name] = true\n }\n completed = completed.concat(name)\n\n return plugin\n // It's loaded! run the command\n }).catch((e) => {\n // Timeout Add to queue\n // console.log('Error generic waitForReady. Push this to queue', e)\n if (e instanceof Error) {\n throw new Error(e)\n }\n failed = failed.concat(e.name)\n // Failed to fire, add to queue\n return e\n })\n })\n\n Promise.all(waitForPluginsToLoad).then((calls) => {\n // setTimeout to ensure runs after 'page'\n const payload = {\n plugins: completed,\n failed: failed,\n disabled: disabled\n }\n setTimeout(() => {\n if (pluginsArray.length === (waitForPluginsToLoad.length + disabled.length)) {\n store.dispatch({\n ...{ type: EVENTS.ready },\n ...payload,\n \n })\n }\n }, 0)\n })\n }\n\n /* New plugin system */\n if (type !== EVENTS.bootstrap) {\n if (/^ready:([^:]*)$/.test(type)) {\n // Immediately flush queue\n setTimeout(() => processQueue(store, getPlugins, instance), 0)\n }\n const updated = await runPlugins(action, getPlugins, instance, store, systemEvents)\n return next(updated)\n }\n\n return next(updatedAction)\n }\n}\n","import { isBoolean } from '@analytics/type-utils'\n\nexport default function fitlerDisabledPlugins(allPlugins, settings = {}, options = {}) {\n return Object.keys(allPlugins).filter((name) => {\n const fromCallOptions = options.plugins || {}\n // If enabled/disabled by options. Override settings\n if (isBoolean(fromCallOptions[name])) {\n return fromCallOptions[name]\n }\n // If all: false disable everything unless true explicitly set\n if (fromCallOptions.all === false) {\n return false\n }\n // else use state.plugin settings\n if (settings[name] && settings[name].enabled === false) {\n return false\n }\n return true\n }).map((name) => allPlugins[name])\n}\n","import EVENTS from '../events'\n\nexport default function storageMiddleware(storage) {\n return store => next => action => {\n const { type, key, value, options } = action\n if (type === EVENTS.setItem || type === EVENTS.removeItem) {\n if (action.abort) {\n return next(action)\n }\n // Run storage set or remove\n if (type === EVENTS.setItem) {\n storage.setItem(key, value, options)\n } else {\n storage.removeItem(key, options)\n }\n }\n return next(action)\n }\n}\n\n/*\n Todo: emit events for keys we care about\n window.addEventListener('storage', (event) => console.log(event));\n*/\n","import { compose } from '../vendor/redux'\n\n/* Class to fix dynamic middlewares from conflicting with each other\nif more than one analytic instance is active */\nexport default class DynamicMiddleware {\n before = []\n after = []\n addMiddleware = (middlewares, position) => {\n this[position] = this[position].concat(middlewares)\n }\n removeMiddleware = (middleware, position) => {\n const index = this[position].findIndex(d => d === middleware)\n if (index === -1) return\n\n this[position] = [\n ...this[position].slice(0, index),\n ...this[position].slice(index + 1),\n ]\n }\n /* Not currently in use\n resetMiddlewares = (position) => {\n if (!position) {\n this.before = []\n this.after = []\n } else {\n this[position] = []\n }\n }\n */\n dynamicMiddlewares = (position) => {\n return store => next => action => {\n const middlewareAPI = {\n getState: store.getState,\n dispatch: (act) => store.dispatch(act),\n }\n const chain = this[position].map(middleware => middleware(middlewareAPI))\n return compose(...chain)(next)(action)\n }\n }\n}\n","// Integrations Reducer. Follows ducks pattern http://bit.ly/2DnERMc\nimport EVENTS from '../events'\n\nexport default function createReducer(getPlugins) {\n return function plugins(state = {}, action) {\n let newState = {}\n if (action.type === 'initialize:aborted') {\n return state\n }\n if (/^registerPlugin:([^:]*)$/.test(action.type)) {\n const name = getNameFromEventType(action.type, 'registerPlugin')\n const plugin = getPlugins()[name]\n if (!plugin || !name) {\n return state\n }\n const isEnabled = action.enabled\n const config = plugin.config\n newState[name] = {\n enabled: isEnabled,\n /* if no initialization method. Set initialized true */\n initialized: (isEnabled) ? Boolean(!plugin.initialize) : false,\n /* If plugin enabled === false, set loaded to false, else check plugin.loaded function */\n loaded: (isEnabled) ? Boolean(plugin.loaded({ config })) : false,\n config\n }\n return { ...state, ...newState }\n }\n if (/^initialize:([^:]*)$/.test(action.type)) {\n const name = getNameFromEventType(action.type, EVENTS.initialize)\n const plugin = getPlugins()[name]\n if (!plugin || !name) {\n return state\n }\n const config = plugin.config\n newState[name] = {\n ...state[name],\n ...{\n initialized: true,\n /* check plugin.loaded function */\n loaded: Boolean(plugin.loaded({ config }))\n }\n }\n return { ...state, ...newState }\n }\n if (/^ready:([^:]*)$/.test(action.type)) {\n // const name = getNameFromEventType(action.type, 'ready')\n newState[action.name] = {\n ...state[action.name],\n ...{ loaded: true }\n }\n return { ...state, ...newState }\n }\n switch (action.type) {\n /* case EVENTS.pluginFailed:\n // console.log('PLUGIN_FAILED', action.name)\n newState[action.name] = {\n ...state[action.name],\n ...{ loaded: false }\n }\n return { ...state, ...newState }\n */\n /* When analytics.plugins.disable called */\n case EVENTS.disablePlugin:\n return { \n ...state,\n ...togglePluginStatus(action.plugins, false, state)\n }\n /* When analytics.plugins.enable called */\n case EVENTS.enablePlugin:\n return {\n ...state, \n ...togglePluginStatus(action.plugins, true, state)\n }\n default:\n return state\n }\n }\n}\n\nfunction getNameFromEventType(type, baseName) {\n return type.substring(baseName.length + 1, type.length)\n}\n\nfunction togglePluginStatus(plugins, status, currentState) {\n return plugins.reduce((acc, pluginKey) => {\n acc[pluginKey] = {\n ...currentState[pluginKey],\n ...{\n enabled: status \n }\n }\n return acc\n }, currentState)\n}\n","export default function serialize(obj) {\n try {\n return JSON.parse(JSON.stringify(obj))\n } catch (err) {}\n return obj\n}","// Track Module. Follows ducks pattern http://bit.ly/2DnERMc\nimport EVENTS from '../events'\nimport serialize from '../utils/serialize'\n\n// Track State\nconst initialState = {\n last: {},\n history: [],\n}\n\n// track reducer\nexport default function trackReducer(state = initialState, action) {\n const { type, event, properties, options, meta } = action\n\n switch (type) {\n case EVENTS.track:\n const trackEvent = serialize({\n event,\n properties,\n ...(Object.keys(options).length) && { options: options },\n meta\n })\n return {\n ...state,\n ...{\n last: trackEvent,\n // Todo prevent LARGE arrays https://bit.ly/2MnBwPT\n history: state.history.concat(trackEvent)\n }\n }\n default:\n return state\n }\n}\n","import EVENTS from '../events'\n/*\nTODO figure out if this should live in state...\nQueue could be in mermory as well.\nBut also needs to be persisted to storage\n*/\n\nconst initialState = {\n actions: [],\n}\n\nexport default function queueReducer(state = initialState, action) {\n const { type, payload } = action\n\n switch (type) {\n case 'queue':\n let actionChain\n /* prioritize identify in event queue */\n if (payload && payload.type && payload.type === EVENTS.identify) {\n actionChain = [action].concat(state.actions)\n } else {\n actionChain = state.actions.concat(action)\n }\n return {\n ...state,\n actions: actionChain\n }\n case 'dequeue':\n return []\n // todo push events to history\n default:\n return state\n }\n}\n\nexport const queueAction = (data, timestamp) => {\n return {\n type: 'queue',\n timestamp: timestamp,\n data: data\n }\n}\n","// Page View Reducer. Follows ducks pattern http://bit.ly/2DnERMc\nimport { isBrowser } from '@analytics/type-utils'\nimport serialize from '../utils/serialize'\n\nimport EVENTS from '../events'\n\nconst hashRegex = /#.*$/\n\nfunction canonicalUrl() {\n if (!isBrowser) return\n const tags = document.getElementsByTagName('link')\n for (var i = 0, tag; tag = tags[i]; i++) {\n if (tag.getAttribute('rel') === 'canonical') {\n return tag.getAttribute('href')\n }\n }\n}\n\nfunction urlPath(url) {\n const regex = /(http[s]?:\\/\\/)?([^\\/\\s]+\\/)(.*)/g\n const matches = regex.exec(url)\n const pathMatch = (matches && matches[3]) ? matches[3].split('?')[0].replace(hashRegex, '') : ''\n return '/' + pathMatch\n}\n\n/**\n * Return the canonical URL and rmove the hash.\n * @param {string} search - search param\n * @return {string} return current canonical URL\n */\nfunction currentUrl(search) {\n const canonical = canonicalUrl()\n if (!canonical) return window.location.href.replace(hashRegex, '')\n return canonical.match(/\\?/) ? canonical : canonical + search\n}\n\n/**\n * Page data for overides\n * @typedef {object} PageData\n * @property {string} [title] - Page title\n * @property {string} [url] - Page url\n * @property {string} [path] - Page path\n * @property {string} [search] - Page search\n * @property {string} [width] - Page width\n * @property {string} [height] - Page height\n*/\n\n/**\n * Get information about current page\n * @typedef {Function} getPageData\n * @param {PageData} [pageData = {}] - Page data overides\n * @return {PageData} resolved page data\n */\nexport const getPageData = (pageData = {}) => {\n if (!isBrowser) return pageData\n const { title, referrer } = document\n const { location, innerWidth, innerHeight } = window\n const { hash, search } = location\n const url = currentUrl(search)\n const page = {\n title: title,\n url: url,\n path: urlPath(url),\n hash: hash,\n search: search,\n width: innerWidth,\n height: innerHeight,\n }\n if (referrer && referrer !== '') {\n page.referrer = referrer\n }\n\n return {\n ...page,\n /* .page() user overrrides */\n ...pageData\n }\n}\n\nconst initialState = {\n last: {},\n history: [],\n}\n\n// page reducer\nexport default function page(state = initialState, action) {\n const { properties, options, meta } = action\n switch (action.type) {\n case EVENTS.page:\n const viewData = serialize({\n properties,\n meta,\n ...(Object.keys(options).length) && { options: options },\n })\n return {\n ...state,\n ...{\n last: viewData,\n // Todo prevent LARGE arrays https://bit.ly/2MnBwPT\n history: state.history.concat(viewData)\n }\n }\n default:\n return state\n }\n}\n","// Context Reducer. Follows ducks pattern http://bit.ly/2DnERMc\nimport { getBrowserLocale, getTimeZone, uuid } from 'analytics-utils'\nimport { isBrowser } from '@analytics/type-utils'\nimport EVENTS from '../events'\nimport { LIB_NAME } from '../utils/internalConstants'\nimport getOSNameNode from '../utils/getOSName/node'\nimport getOSNameBrowser from '../utils/getOSName/browser'\n\nlet osName\nlet referrer\nlet locale\nlet timeZone\nif (BROWSER) {\n osName = getOSNameBrowser()\n referrer = (isBrowser) ? document.referrer : null\n locale = getBrowserLocale()\n timeZone = getTimeZone()\n} else {\n osName = getOSNameNode()\n referrer = {}\n}\n\nconst initialState = {\n initialized: false,\n sessionId: uuid(),\n app: null,\n version: null,\n debug: false,\n offline: (isBrowser) ? !navigator.onLine : false, // use node network is-online\n os: {\n name: osName,\n },\n userAgent: (isBrowser) ? navigator.userAgent : 'node', // https://github.com/bestiejs/platform.js\n library: {\n name: LIB_NAME,\n // TODO fix version number. npm run publish:patch has wrong version\n version: VERSION\n },\n timezone: timeZone,\n locale: locale,\n campaign: {},\n referrer: referrer,\n}\n\n// context reducer\nexport default function context(state = initialState, action) {\n const { initialized } = state\n const { type, campaign } = action\n switch (type) {\n case EVENTS.campaign:\n return {\n ...state,\n ...{ campaign: campaign }\n }\n case EVENTS.offline:\n return {\n ...state,\n ...{ offline: true }\n }\n case EVENTS.online:\n return {\n ...state,\n ...{ offline: false }\n }\n default:\n if (!initialized) {\n return {\n ...initialState,\n ...state,\n ...{ initialized: true }\n }\n }\n return state\n }\n}\n\nconst excludeItems = ['plugins', 'reducers', 'storage']\n// Pull plugins and reducers off intital config\nexport function makeContext(config) {\n return Object.keys(config).reduce((acc, current) => {\n if (excludeItems.includes(current)) {\n return acc\n }\n acc[current] = config[current]\n return acc\n }, {})\n}\n","import { isBrowser } from '@analytics/type-utils'\n\nexport default function getBrowserOS() {\n if (!isBrowser) return false\n const os = navigator.appVersion\n // ~os bitwise operator to check if in navigator\n if (~os.indexOf('Win')) return 'Windows'\n if (~os.indexOf('Mac')) return 'MacOS'\n if (~os.indexOf('X11')) return 'UNIX'\n if (~os.indexOf('Linux')) return 'Linux'\n // default\n return 'Unknown OS'\n}\n","import { isBrowser } from '@analytics/type-utils'\n\n/**\n * @returns {string | undefined}\n */\nexport function getBrowserLocale() {\n if (!isBrowser) return\n const { language, languages, userLanguage } = navigator\n if (userLanguage) return userLanguage // IE only\n return (languages && languages.length) ? languages[0] : language\n}\n","\n/**\n * @returns {string | undefined}\n */\nexport function getTimeZone() {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone\n } catch (error) {}\n}\n","import { isBrowser } from '@analytics/type-utils'\n\nfunction listen(events, func, toAdd) {\n if (!isBrowser) return\n const fn = window[(toAdd ? 'add' : 'remove') + 'EventListener']\n events.split(' ').forEach(ev => {\n fn(ev, func)\n })\n}\n\nexport function check() {\n return Promise.resolve(!navigator.onLine)\n}\n\nexport function watch(cb) {\n const fn = _ => check().then(cb)\n const listener = listen.bind(null, 'online offline', fn)\n listener(true)\n // return unsubscribe function\n return _ => listener(false)\n}\n","import { set, globalContext, KEY } from '@analytics/global-storage-utils'\nimport { compose } from '../vendor/redux'\nimport { LIB_NAME } from './internalConstants'\n\nexport function Debug() {\n // Global key is window.__global__.analytics\n set(LIB_NAME, [])\n // Return debugger\n return (createStore) => {\n return (reducer, preloadedState, enhancer) => {\n const store = createStore(reducer, preloadedState, enhancer)\n const origDispatch = store.dispatch\n const dispatch = (action) => {\n const a = action.action || action\n globalContext[KEY][LIB_NAME].push(a)\n return origDispatch(action)\n }\n return Object.assign(store, { dispatch: dispatch })\n }\n }\n}\n\nexport function composeWithDebug(config) {\n return function () {\n return compose(compose.apply(null, arguments), Debug(config))\n }\n}\n","import { isArray } from '@analytics/type-utils'\n\nexport default function ensureArray(singleOrArray) {\n if (!singleOrArray) return []\n if (isArray(singleOrArray)) return singleOrArray\n return [singleOrArray] \n}","import getCallback from './getCallback'\nimport { stack } from './callback-stack'\nimport timestamp from './timestamp'\nimport { uuid } from 'analytics-utils'\n\n// Async promise resolver\nfunction deferredPromiseResolver(resolver, callback) {\n return (data) => {\n if (callback) callback(data)\n resolver(data)\n }\n}\n\nexport default function generateMeta(meta = {}, resolve, possibleCallbacks) {\n const rid = uuid()\n if (resolve) {\n // stack[`${rid}-info`] = meta\n stack[rid] = deferredPromiseResolver(resolve, getCallback(possibleCallbacks))\n }\n return {\n ...meta,\n rid: rid,\n ts: timestamp(),\n ...(!resolve) ? {} : { hasCallback: true },\n }\n }","import { isFunction } from '@analytics/type-utils'\n\n/**\n * Grab first function found from arguments\n * @param {array} [argArray] - arguments array to find first function\n * @returns {Function|undefined}\n */\nexport default function getCallbackFromArgs(argArray) {\n const args = argArray || Array.prototype.slice.call(arguments)\n let cb\n for (let i = 0; i < args.length; i++) {\n if (isFunction(args[i])) {\n cb = args[i]; break;\n }\n }\n return cb\n}","\nexport default function timeStamp() {\n return new Date().getTime()\n}\n","import { uuid, paramsParse, dotProp } from 'analytics-utils'\nimport { get, set, remove } from '@analytics/global-storage-utils'\nimport { isBrowser, isFunction, isObject, isString } from '@analytics/type-utils'\nimport { createStore, combineReducers, applyMiddleware, compose } from './vendor/redux'\nimport * as CONSTANTS from './constants'\nimport { ID, ANONID, ERROR_URL } from './utils/internalConstants'\nimport EVENTS, { coreEvents, nonEvents, isReservedAction } from './events'\n// Middleware\nimport * as middleware from './middleware'\nimport DynamicMiddleware from './middleware/dynamic'\n// Modules\nimport pluginsMiddleware from './modules/plugins'\nimport track from './modules/track'\nimport queue from './modules/queue'\nimport page, { getPageData } from './modules/page'\nimport context, { makeContext } from './modules/context'\nimport user, { getUserPropFunc, tempKey, getPersistedUserData } from './modules/user'\n/* Utils */\nimport { watch } from './utils/handleNetworkEvents'\nimport { Debug, composeWithDebug } from './utils/debug'\nimport heartBeat from './utils/heartbeat'\nimport ensureArray from './utils/ensureArray'\nimport enrichMeta from './utils/enrichMeta'\nimport './pluginTypeDef'\n\n\n/**\n * Analytics library configuration\n *\n * After the library is initialized with config, the core API is exposed & ready for use in the application.\n *\n * @param {object} config - analytics core config\n * @param {string} [config.app] - Name of site / app\n * @param {string|number} [config.version] - Version of your app\n * @param {boolean} [config.debug] - Should analytics run in debug mode\n * @param {Array.} [config.plugins] - Array of analytics plugins\n * @return {AnalyticsInstance} Analytics Instance\n * @example\n *\n * import Analytics from 'analytics'\n * import pluginABC from 'analytics-plugin-abc'\n * import pluginXYZ from 'analytics-plugin-xyz'\n *\n * // initialize analytics\n * const analytics = Analytics({\n * app: 'my-awesome-app',\n * plugins: [\n * pluginABC,\n * pluginXYZ\n * ]\n * })\n *\n */\nfunction analytics(config = {}) {\n const customReducers = config.reducers || {}\n const initialUser = config.initialUser || {}\n // @TODO add custom value reolvers for userId and anonId\n // const resolvers = config.resolvers || {}\n // if (BROWSER) {\n // console.log('INIT browser')\n // }\n // if (SERVER) {\n // console.log('INIT SERVER')\n // }\n /* Parse plugins array */\n const parsedOptions = (config.plugins || []).reduce((acc, plugin) => {\n if (isFunction(plugin)) {\n /* Custom redux middleware */\n acc.middlewares = acc.middlewares.concat(plugin)\n return acc\n }\n // Legacy plugin with name\n if (plugin.NAMESPACE) plugin.name = plugin.NAMESPACE\n if (!plugin.name) {\n /* Plugins must supply a \"name\" property. See error url for more details */\n throw new Error(ERROR_URL + '1')\n }\n // Set config if empty\n if (!plugin.config) plugin.config = {}\n // if plugin exposes EVENTS capture available events\n const definedEvents = (plugin.EVENTS) ? Object.keys(plugin.EVENTS).map((k) => {\n return plugin.EVENTS[k]\n }) : []\n\n const enabledFromMerge = !(plugin.enabled === false)\n const enabledFromPluginConfig = !(plugin.config.enabled === false)\n // top level { enabled: false } takes presidence over { config: enabled: false }\n acc.pluginEnabled[plugin.name] = enabledFromMerge && enabledFromPluginConfig\n delete plugin.enabled\n\n if (plugin.methods) {\n acc.methods[plugin.name] = Object.keys(plugin.methods).reduce((a, c) => {\n // enrich methods with analytics instance\n a[c] = appendArguments(plugin.methods[c])\n return a\n }, {})\n // Remove additional methods from plugins\n delete plugin.methods\n }\n // Convert available methods into events\n const methodsToEvents = Object.keys(plugin)\n // Combine events\n const allEvents = methodsToEvents.concat(definedEvents)\n // Dedupe events list\n const allEventsUnique = new Set(acc.events.concat(allEvents))\n acc.events = Array.from(allEventsUnique)\n\n acc.pluginsArray = acc.pluginsArray.concat(plugin)\n\n if (acc.plugins[plugin.name]) {\n throw new Error(plugin.name + 'AlreadyLoaded')\n }\n acc.plugins[plugin.name] = plugin\n if (!acc.plugins[plugin.name].loaded) {\n // set default loaded func\n acc.plugins[plugin.name].loaded = () => true\n }\n return acc\n }, {\n plugins: {},\n pluginEnabled: {},\n methods: {},\n pluginsArray: [],\n middlewares: [],\n events: []\n })\n \n /* Storage by default is set to global & is not persisted */\n const storage = (config.storage) ? config.storage : {\n getItem: get,\n setItem: set,\n removeItem: remove\n }\n\n const getUserProp = getUserPropFunc(storage)\n\n // mutable intregrations object for dynamic loading\n let customPlugins = parsedOptions.plugins\n\n /* Grab all registered events from plugins loaded */\n const allPluginEvents = parsedOptions.events.filter((name) => {\n return !nonEvents.includes(name)\n }).sort()\n const uniqueEvents = new Set(allPluginEvents.concat(coreEvents).filter((name) => {\n return !nonEvents.includes(name)\n }))\n const allSystemEvents = Array.from(uniqueEvents).sort()\n\n /* plugin methods(functions) must be kept out of state. thus they live here */\n const getPlugins = () => customPlugins\n\n const {\n addMiddleware,\n removeMiddleware,\n dynamicMiddlewares\n } = new DynamicMiddleware()\n\n const nonAbortable = () => {\n // throw new Error(`${ERROR_URL}3`)\n throw new Error('Abort disabled inListener')\n }\n \n // Parse URL parameters\n const params = paramsParse()\n // Initialize visitor information\n const persistedUser = getPersistedUserData(storage)\n const visitorInfo = {\n ...persistedUser,\n ...initialUser,\n ...(!params.an_uid) ? {} : { userId: params.an_uid },\n ...(!params.an_aid) ? {} : { anonymousId: params.an_aid },\n }\n // If no anon id set, create one\n if (!visitorInfo.anonymousId) {\n visitorInfo.anonymousId = uuid()\n }\n\n /**\n * Async Management methods for plugins. \n * \n * This is also where [custom methods](https://bit.ly/329vFXy) are loaded into the instance.\n * @typedef {Object} Plugins\n * @property {EnablePlugin} enable - Set storage value\n * @property {DisablePlugin} disable - Remove storage value\n * @example\n *\n * // Enable a plugin by namespace\n * analytics.plugins.enable('keenio')\n *\n * // Disable a plugin by namespace\n * analytics.plugins.disable('google-analytics')\n */\n const plugins = {\n /**\n * Enable analytics plugin\n * @typedef {Function} EnablePlugin\n * @param {string|string[]} plugins - name of plugins(s) to disable\n * @param {Function} [callback] - callback after enable runs\n * @returns {Promise}\n * @example\n *\n * analytics.plugins.enable('google-analytics').then(() => {\n * console.log('do stuff')\n * })\n *\n * // Enable multiple plugins at once\n * analytics.plugins.enable(['google-analytics', 'segment']).then(() => {\n * console.log('do stuff')\n * })\n */\n enable: (plugins, callback) => {\n return new Promise((resolve) => {\n store.dispatch({\n type: EVENTS.enablePlugin,\n plugins: ensureArray(plugins),\n _: { originalAction: EVENTS.enablePlugin },\n }, resolve, [ callback ])\n })\n },\n /**\n * Disable analytics plugin\n * @typedef {Function} DisablePlugin\n * @param {string|string[]} plugins - name of integration(s) to disable\n * @param {Function} [callback] - callback after disable runs\n * @returns {Promise}\n * @example\n *\n * analytics.plugins.disable('google').then(() => {\n * console.log('do stuff')\n * })\n *\n * analytics.plugins.disable(['google', 'segment']).then(() => {\n * console.log('do stuff')\n * })\n */\n disable: (plugins, callback) => {\n return new Promise((resolve) => {\n store.dispatch({\n type: EVENTS.disablePlugin,\n plugins: ensureArray(plugins),\n _: { originalAction: EVENTS.disablePlugin },\n }, resolve, [callback])\n })\n },\n /*\n * Load registered analytic providers.\n * @param {String} plugins - integration namespace\n *\n * @example\n * analytics.plugins.load('segment')\n @TODO implement\n load: (plugins) => {\n store.dispatch({\n type: EVENTS.loadPlugin,\n // Todo handle multiple plugins via array\n plugins: (plugins) ? [plugins] : Object.keys(getPlugins()),\n })\n },\n */\n /* @TODO if it stays, state loaded needs to be set. Re PLUGIN_INIT above\n add: (newPlugin) => {\n if (typeof newPlugin !== 'object') return false\n // Set on global integration object\n customPlugins = Object.assign({}, customPlugins, {\n [`${newPlugin.name}`]: newPlugin\n })\n // then add it, and init state key\n store.dispatch({\n type: EVENTS.pluginRegister,\n name: newPlugin.name,\n plugin: newPlugin\n })\n }, */\n // Merge in custom plugin methods\n ...parsedOptions.methods\n }\n \n let readyCalled = false\n /**\n * Analytic instance returned from initialization\n * @typedef {Object} AnalyticsInstance\n * @property {Identify} identify - Identify a user\n * @property {Track} track - Track an analytics event\n * @property {Page} page - Trigger page view\n * @property {User} user - Get user data\n * @property {Reset} reset - Clear information about user & reset analytics\n * @property {Ready} ready - Fire callback on analytics ready event\n * @property {On} on - Fire callback on analytics lifecycle events.\n * @property {Once} once - Fire callback on analytics lifecycle events once.\n * @property {GetState} getState - Get data about user, activity, or context.\n * @property {Storage} storage - storage methods\n * @property {Plugins} plugins - plugin methods\n */\n const instance = {\n /**\n * Identify a user. This will trigger `identify` calls in any installed plugins and will set user data in localStorage\n * @typedef {Function} Identify\n * @param {String} userId - Unique ID of user\n * @param {Object} [traits] - Object of user traits\n * @param {Object} [options] - Options to pass to identify call\n * @param {Function} [callback] - Callback function after identify completes\n * @returns {Promise}\n * @api public\n *\n * @example\n *\n * // Basic user id identify\n * analytics.identify('xyz-123')\n *\n * // Identify with additional traits\n * analytics.identify('xyz-123', {\n * name: 'steve',\n * company: 'hello-clicky'\n * })\n *\n * // Fire callback with 2nd or 3rd argument\n * analytics.identify('xyz-123', () => {\n * console.log('do this after identify')\n * })\n *\n * // Disable sending user data to specific analytic tools\n * analytics.identify('xyz-123', {}, {\n * plugins: {\n * // disable sending this identify call to segment\n * segment: false\n * }\n * })\n *\n * // Send user data to only to specific analytic tools\n * analytics.identify('xyz-123', {}, {\n * plugins: {\n * // disable this specific identify in all plugins except customerio\n * all: false,\n * customerio: true\n * }\n * })\n */\n identify: async (userId, traits, options, callback) => {\n const id = isString(userId) ? userId : null\n const data = isObject(userId) ? userId : traits\n const opts = options || {}\n const user = instance.user()\n\n /* sets temporary in memory id. Not to be relied on */\n set(tempKey(ID), id)\n\n const resolvedId = id || data.userId || getUserProp(ID, instance, data)\n\n return new Promise((resolve) => {\n store.dispatch({\n type: EVENTS.identifyStart,\n userId: resolvedId,\n traits: data || {},\n options: opts,\n anonymousId: user.anonymousId,\n // Add previousId if exists\n ...(user.id && (user.id !== id) && { previousId: user.id }),\n }, resolve, [traits, options, callback])\n })\n },\n /**\n * Track an analytics event. This will trigger `track` calls in any installed plugins\n * @typedef {Function} Track\n * @param {String} eventName - Event name\n * @param {Object} [payload] - Event payload\n * @param {Object} [options] - Event options\n * @param {Function} [callback] - Callback to fire after tracking completes\n * @returns {Promise}\n * @api public\n *\n * @example\n *\n * // Basic event tracking\n * analytics.track('buttonClicked')\n *\n * // Event tracking with payload\n * analytics.track('itemPurchased', {\n * price: 11,\n * sku: '1234'\n * })\n *\n * // Fire callback with 2nd or 3rd argument\n * analytics.track('newsletterSubscribed', () => {\n * console.log('do this after track')\n * })\n *\n * // Disable sending this event to specific analytic tools\n * analytics.track('cartAbandoned', {\n * items: ['xyz', 'abc']\n * }, {\n * plugins: {\n * // disable track event for segment\n * segment: false\n * }\n * })\n *\n * // Send event to only to specific analytic tools\n * analytics.track('customerIoOnlyEventExample', {\n * price: 11,\n * sku: '1234'\n * }, {\n * plugins: {\n * // disable this specific track call all plugins except customerio\n * all: false,\n * customerio: true\n * }\n * })\n */\n track: async (eventName, payload, options, callback) => {\n const name = isObject(eventName) ? eventName.event : eventName\n if (!name || !isString(name)) {\n throw new Error('EventMissing')\n }\n const data = isObject(eventName) ? eventName : (payload || {})\n const opts = isObject(options) ? options : {}\n\n return new Promise((resolve) => {\n store.dispatch({\n type: EVENTS.trackStart,\n event: name,\n properties: data,\n options: opts,\n userId: getUserProp(ID, instance, payload),\n anonymousId: getUserProp(ANONID, instance, payload),\n }, resolve, [payload, options, callback])\n })\n },\n /**\n * Trigger page view. This will trigger `page` calls in any installed plugins\n * @typedef {Function} Page\n * @param {PageData} [data] - Page data overrides.\n * @param {Object} [options] - Page tracking options\n * @param {Function} [callback] - Callback to fire after page view call completes\n * @returns {Promise}\n * @api public\n *\n * @example\n *\n * // Basic page tracking\n * analytics.page()\n *\n * // Page tracking with page data overrides\n * analytics.page({\n * url: 'https://google.com'\n * })\n *\n * // Fire callback with 1st, 2nd or 3rd argument\n * analytics.page(() => {\n * console.log('do this after page')\n * })\n *\n * // Disable sending this pageview to specific analytic tools\n * analytics.page({}, {\n * plugins: {\n * // disable page tracking event for segment\n * segment: false\n * }\n * })\n *\n * // Send pageview to only to specific analytic tools\n * analytics.page({}, {\n * plugins: {\n * // disable this specific page in all plugins except customerio\n * all: false,\n * customerio: true\n * }\n * })\n */\n page: async (data, options, callback) => {\n const d = isObject(data) ? data : {}\n const opts = isObject(options) ? options : {}\n\n /*\n // @TODO add custom value reolvers for userId and anonId\n if (resolvers.getUserId) {\n const asyncUserId = await resolvers.getUserId()\n console.log('x', x)\n }\n */\n\n return new Promise((resolve) => {\n store.dispatch({\n type: EVENTS.pageStart,\n properties: getPageData(d),\n options: opts,\n userId: getUserProp(ID, instance, d),\n anonymousId: getUserProp(ANONID, instance, d),\n }, resolve, [data, options, callback])\n })\n },\n /**\n * Get user data\n * @typedef {Function} User\n * @param {string} [key] - dot.prop.path of user data. Example: 'traits.company.name'\n * @returns {string|object} value of user data or null\n *\n * @example\n *\n * // Get all user data\n * const userData = analytics.user()\n *\n * // Get user id\n * const userId = analytics.user('userId')\n *\n * // Get user company name\n * const companyName = analytics.user('traits.company.name')\n */\n user: (key) => {\n if (key === ID || key === 'id') {\n return getUserProp(ID, instance)\n }\n if (key === ANONID || key === 'anonId') {\n return getUserProp(ANONID, instance)\n }\n const user = instance.getState('user')\n if (!key) return user\n return dotProp(user, key)\n },\n /**\n * Clear all information about the visitor & reset analytic state.\n * @typedef {Function} Reset\n * @param {Function} [callback] - Handler to run after reset\n * @returns {Promise}\n * @example\n *\n * // Reset current visitor\n * analytics.reset()\n */\n reset: (callback) => {\n return new Promise((resolve) => {\n store.dispatch({\n type: EVENTS.resetStart\n }, resolve, callback)\n })\n },\n /**\n * Fire callback on analytics ready event\n * @typedef {Function} Ready\n * @param {Function} callback - function to trigger when all providers have loaded\n * @returns {DetachListeners} - Function to detach listener\n *\n * @example\n *\n * analytics.ready((payload) => {\n * console.log('all plugins have loaded or were skipped', payload);\n * })\n */\n ready: (callback) => {\n // If ready already fired. Call callback immediately\n if (readyCalled) callback({ plugins, instance })\n return instance.on(EVENTS.ready, (x) => {\n callback(x)\n readyCalled = true\n })\n },\n /**\n * Attach an event handler function for analytics lifecycle events.\n * @typedef {Function} On\n * @param {String} name - Name of event to listen to\n * @param {Function} callback - function to fire on event\n * @return {DetachListeners} - Function to detach listener\n *\n * @example\n *\n * // Fire function when 'track' calls happen\n * analytics.on('track', ({ payload }) => {\n * console.log('track call just happened. Do stuff')\n * })\n *\n * // Remove listener before it is called\n * const removeListener = analytics.on('track', ({ payload }) => {\n * console.log('This will never get called')\n * })\n *\n * // cleanup .on listener\n * removeListener()\n */\n on: (name, callback) => {\n if (!name || !isFunction(callback)) {\n return false\n }\n if (name === EVENTS.bootstrap) {\n throw new Error('.on disabled for ' + name)\n }\n const startRegex = /Start$|Start:/\n if (name === '*') {\n const beforeHandler = store => next => action => {\n if (action.type.match(startRegex)) {\n callback({ // eslint-disable-line\n payload: action,\n instance,\n plugins: customPlugins\n })\n }\n return next(action)\n }\n const afterHandler = store => next => action => {\n if (!action.type.match(startRegex)) {\n callback({ // eslint-disable-line\n payload: action,\n instance,\n plugins: customPlugins\n })\n }\n return next(action)\n }\n addMiddleware(beforeHandler, before)\n addMiddleware(afterHandler, after)\n /**\n * Detach listeners\n * @typedef {Function} DetachListeners\n */\n return () => {\n removeMiddleware(beforeHandler, before)\n removeMiddleware(afterHandler, after)\n }\n }\n\n const position = (name.match(startRegex)) ? before : after // eslint-disable-line\n const handler = store => next => action => {\n // Subscribe to EVERYTHING\n if (action.type === name) {\n callback({ // eslint-disable-line\n payload: action,\n instance: instance,\n plugins: customPlugins,\n abort: nonAbortable\n })\n }\n /* For future matching of event subpaths `track:*` etc\n } else if (name.match(/\\*$/)) {\n const match = (name === '*') ? '.' : name\n const regex = new RegExp(`${match}`, 'g')\n } */\n return next(action)\n }\n addMiddleware(handler, position)\n return () => removeMiddleware(handler, position)\n },\n /**\n * Attach a handler function to an event and only trigger it once.\n * @typedef {Function} Once\n * @param {String} name - Name of event to listen to\n * @param {Function} callback - function to fire on event\n * @return {DetachListeners} - Function to detach listener\n *\n * @example\n *\n * // Fire function only once per 'track'\n * analytics.once('track', ({ payload }) => {\n * console.log('This is only triggered once when analytics.track() fires')\n * })\n *\n * // Remove listener before it is called\n * const listener = analytics.once('track', ({ payload }) => {\n * console.log('This will never get called b/c listener() is called')\n * })\n *\n * // cleanup .once listener before it fires\n * listener()\n */\n once: (name, callback) => {\n if (!name || !isFunction(callback)) {\n return false\n }\n if (name === EVENTS.bootstrap) {\n throw new Error('.once disabled for ' + name)\n }\n const detachListener = instance.on(name, ({ payload }) => {\n callback({ // eslint-disable-line\n payload: payload,\n instance: instance,\n plugins: customPlugins,\n abort: nonAbortable\n })\n // detach listener after its called once\n detachListener()\n })\n return detachListener\n },\n /**\n * Get data about user, activity, or context. Access sub-keys of state with `dot.prop` syntax.\n * @typedef {Function} GetState\n * @param {string} [key] - dot.prop.path value of state\n * @return {any}\n *\n * @example\n *\n * // Get the current state of analytics\n * analytics.getState()\n *\n * // Get a subpath of state\n * analytics.getState('context.offline')\n */\n getState: (key) => {\n const state = store.getState()\n if (key) return dotProp(state, key)\n return Object.assign({}, state)\n },\n /*\n * Emit events for other plugins or middleware to react to.\n * @param {Object} action - event to dispatch\n */\n dispatch: (action) => {\n const actionData = isString(action) ? { type: action } : action\n if (isReservedAction(actionData.type)) {\n throw new Error('reserved action ' + actionData.type)\n }\n const _private = action._ || {}\n // Dispatch actionStart\n // const autoPrefixType = `${actionData.type.replace(/Start$/, '')}Start`\n\n const dispatchData = {\n ...actionData,\n _: {\n originalAction: actionData.type,\n ..._private\n }\n // type: `${autoPrefixType}`\n }\n store.dispatch(dispatchData)\n },\n // Do not use. Will be removed. Here for Backwards compatiblity.\n // Moved to analytics.plugins.enable\n enablePlugin: plugins.enable,\n /// Do not use. Will be removed. Here for Backwards compatiblity.\n /// Moved to analytics.plugins.disable\n disablePlugin: plugins.disable,\n // Do not use. Will be removed. Here for Backwards compatiblity.\n // New plugins api\n plugins: plugins,\n /**\n * Storage utilities for persisting data.\n * These methods will allow you to save data in localStorage, cookies, or to the window.\n * @typedef {Object} Storage\n * @property {GetItem} getItem - Get value from storage\n * @property {SetItem} setItem - Set storage value\n * @property {RemoveItem} removeItem - Remove storage value\n *\n * @example\n *\n * // Pull storage off analytics instance\n * const { storage } = analytics\n *\n * // Get value\n * storage.getItem('storage_key')\n *\n * // Set value\n * storage.setItem('storage_key', 'value')\n *\n * // Remove value\n * storage.removeItem('storage_key')\n */\n storage: {\n /**\n * Get value from storage\n * @typedef {Function} GetItem\n * @param {String} key - storage key\n * @param {Object} [options] - storage options\n * @return {Any}\n *\n * @example\n *\n * analytics.storage.getItem('storage_key')\n */\n getItem: storage.getItem,\n /**\n * Set storage value\n * @typedef {Function} SetItem\n * @param {String} key - storage key\n * @param {any} value - storage value\n * @param {Object} [options] - storage options\n *\n * @example\n *\n * analytics.storage.setItem('storage_key', 'value')\n */\n setItem: (key, value, options) => {\n store.dispatch({\n type: EVENTS.setItemStart,\n key: key,\n value: value,\n options: options\n })\n },\n /**\n * Remove storage value\n * @typedef {Function} RemoveItem\n * @param {String} key - storage key\n * @param {Object} [options] - storage options\n *\n * @example\n *\n * analytics.storage.removeItem('storage_key')\n */\n removeItem: (key, options) => {\n store.dispatch({\n type: EVENTS.removeItemStart,\n key: key,\n options: options\n })\n },\n },\n /*\n * Set the anonymous ID of the visitor\n * @param {String} anonymousId - anonymous Id to set\n * @param {Object} [options] - storage options\n *\n * @example\n *\n * // Set anonymous ID\n * analytics.setAnonymousId('1234567')\n */\n setAnonymousId: (anonymousId, options) => {\n /* sets temporary in memory id. Not to be relied on */\n // set(tempKey(ANONID), anonymousId)\n instance.storage.setItem(CONSTANTS.ANON_ID, anonymousId, options)\n },\n /*\n * Events exposed by core analytics library and all loaded plugins\n * @type {Array}\n */\n events: {\n core: coreEvents,\n plugins: allPluginEvents,\n // byType: (type) => {} @Todo grab logic from engine and give inspectable events\n }\n }\n const enrichMiddleware = storeAPI => next => action => {\n if (!action.meta) {\n action.meta = enrichMeta()\n }\n return next(action)\n }\n const middlewares = parsedOptions.middlewares.concat([\n enrichMiddleware,\n /* Core analytics middleware */\n dynamicMiddlewares(before), // Before dynamic middleware <-- fixed pageStart .on listener\n /* Plugin engine */\n middleware.plugins(instance, getPlugins, {\n all: allSystemEvents,\n plugins: allPluginEvents\n }),\n middleware.storage(storage),\n middleware.initialize(instance),\n middleware.identify(instance, storage),\n /* after dynamic middleware */\n dynamicMiddlewares(after)\n ])\n\n /* Initial analytics state keys */\n const coreReducers = {\n context: context,\n user: user(storage),\n page: page,\n track: track,\n plugins: pluginsMiddleware(getPlugins),\n queue: queue\n }\n\n let composeEnhancers = compose\n let composeWithGlobalDebug = compose\n if (isBrowser && config.debug) {\n const devTools = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__\n if (devTools) {\n composeEnhancers = devTools({ trace: true, traceLimit: 25 })\n }\n composeWithGlobalDebug = function() {\n if (arguments.length === 0) return Debug()\n if (isObject(typeof arguments[0])) return composeWithDebug(arguments[0])\n return composeWithDebug().apply(null, arguments)\n }\n }\n\n const initialConfig = makeContext(config)\n\n const intialPluginState = parsedOptions.pluginsArray.reduce((acc, plugin) => {\n const { name, config, loaded } = plugin\n const isEnabled = parsedOptions.pluginEnabled[name]\n acc[name] = {\n enabled: isEnabled,\n // If plugin enabled & has no initialize method, set initialized to true, else false\n initialized: (isEnabled) ? Boolean(!plugin.initialize) : false,\n loaded: Boolean(loaded({ config })),\n config\n }\n return acc\n }, {})\n \n const initialState = {\n context: initialConfig,\n user: visitorInfo,\n plugins: intialPluginState,\n // Todo allow for more userland defined initial state?\n }\n\n /* Create analytics store! */\n const store = createStore(\n // register reducers\n combineReducers({ ...coreReducers, ...customReducers }),\n // set user defined initial state\n initialState,\n // register middleware & plugins used\n composeWithGlobalDebug(\n composeEnhancers(\n applyMiddleware(...middlewares),\n )\n )\n )\n\n /* Supe up dispatch with callback promise resolver. Happens in enrichMeta */\n function enhanceDispatch(fn) {\n return function (event, resolver, callbacks) {\n // console.log('original event', event)\n const meta = enrichMeta(event.meta, resolver, ensureArray(callbacks))\n // if (resolver) console.log('dispatch resolver', resolver)\n // if (callbacks) console.log('dispatch callbacks', callbacks)\n const newEvent = { ...event, ...{ meta: meta } }\n // console.log('newEvent', newEvent)\n return fn.apply(null, [ newEvent ])\n }\n }\n\n // Automatically apply meta to dispatch calls\n store.dispatch = enhanceDispatch(store.dispatch)\n\n /* Synchronously call bootstrap & register Plugin methods */\n const pluginKeys = Object.keys(customPlugins)\n\n /* Bootstrap analytic plugins */\n store.dispatch({\n type: EVENTS.bootstrap,\n plugins: pluginKeys,\n config: initialConfig,\n params: params,\n user: visitorInfo,\n initialUser,\n persistedUser\n })\n\n const enabledPlugins = pluginKeys.filter((name) => parsedOptions.pluginEnabled[name])\n const disabledPlugins = pluginKeys.filter((name) => !parsedOptions.pluginEnabled[name])\n \n /* Register analytic plugins */\n store.dispatch({\n type: EVENTS.registerPlugins,\n plugins: pluginKeys,\n enabled: parsedOptions.pluginEnabled,\n })\n\n /* dispatch register for individual plugins */\n parsedOptions.pluginsArray.map((plugin, i) => {\n const { bootstrap, config, name } = plugin\n if (bootstrap && isFunction(bootstrap)) {\n bootstrap({ instance, config, payload: plugin })\n }\n /* Register plugins */\n store.dispatch({\n type: EVENTS.registerPluginType(name),\n name: name,\n enabled: parsedOptions.pluginEnabled[name],\n plugin: plugin\n })\n\n /* All plugins registered initialize, is last loop */\n if (parsedOptions.pluginsArray.length === (i + 1)) {\n store.dispatch({\n type: EVENTS.initializeStart,\n plugins: enabledPlugins,\n disabled: disabledPlugins\n })\n }\n })\n\n if (BROWSER) {\n /* Watch for network events */\n watch((offline) => {\n store.dispatch({\n type: (offline) ? EVENTS.offline : EVENTS.online,\n })\n })\n /* Tick heartbeat for queued events */\n heartBeat(store, getPlugins, instance)\n }\n\n function appendArguments(fn) {\n return function () {\n /* Get original args */\n const args = Array.prototype.slice.call(arguments)\n /* Create clone of args */\n let newArgs = new Array(fn.length)\n for (let i = 0; i < args.length; i++) {\n newArgs[i] = args[i]\n }\n /* Append new arg to end */\n newArgs[newArgs.length] = instance\n // Set instance on extended methods\n return fn.apply({ instance }, newArgs)\n }\n }\n\n /* Return analytics instance */\n return instance\n}\n\n// Duplicated strings\nconst before = 'before'\nconst after = 'after'\n\nexport default analytics\n\n/*\n * analytics.init exported for standalone browser build\n * CDN build exposes global _analytics variable\n *\n * Initialize instance with _analytics.init() or _analytics['default']()\n */\nexport { analytics as init }\n\n/*\n * analytics.Analytics exported for node usage\n *\n * Initialize instance with _analytics.init() or _analytics['default']()\n */\nexport { analytics as Analytics }\n/*\n * Core Analytic events. These are exposed for third party plugins & listeners\n * Use these magic strings to attach functions to event names.\n * @type {Object}\n */\nexport { EVENTS }\n\nexport { CONSTANTS }\n","import { get, set, remove } from '@analytics/global-storage-utils'\n\nexport const COOKIE = 'cookie'\n\nlet isSupported = hasCookies()\n\n/**\n * Get a cookie value\n * @param {string} name - key of cookie\n * @return {string} value of cookie\n */\nexport const getCookie = cookie\n\n/**\n * Set a cookie value\n * @param {string} name - key of cookie\n * @param {string} value - value of cookie\n * @param {string} days - days to keep cookie\n */\nexport const setCookie = cookie\n\n/**\n * Remove a cookie value.\n * @param {string} name - key of cookie\n */\nexport function removeCookie(name) {\n return isSupported ? cookie(name, '', -1) : remove(name) \n}\n\n/**\n * Check if browser has cookie support\n * @returns {boolean}\n */\nexport function hasCookies() {\n if (typeof isSupported !== 'undefined') {\n return isSupported\n }\n const tmp = COOKIE + COOKIE\n try {\n // Try to set cookie\n cookie(tmp, tmp)\n isSupported = document.cookie.indexOf(tmp) !== -1\n // Cleanup cookie\n removeCookie(tmp)\n } catch (e) {\n isSupported = false\n }\n return isSupported\n}\n\n/** \n * Cookie setter & getter\n * @version 1.0.4\n * @date 2015-03-13\n * @stability 3 - Stable\n * @author Lauri Rooden \n * @license MIT License\n * Modified by David Wells\n * @param {string} name \n * @param {*} value \n * @param {*} ttl - Time to live in seconds\n * @param {*} path - Cookie domain\n * @param {*} domain - Cookie domain\n * @param {Boolean} secure - secure cookie\n * @returns {*} value\n * @example\n cookie('test', 'a') // set\n cookie('test', 'a', 60*60*24, '/api', '*.example.com', true) // complex set - cookie(name, value, ttl, path, domain, secure)\n cookie('test') // get\n cookie('test', '', -1) // destroy\n*/\nfunction cookie(name, value, ttl, path, domain, secure) {\n if (typeof window === 'undefined') return\n const isSet = arguments.length > 1\n /* If cookies not supported fallback to global */\n if (isSupported === false) (isSet) ? set(name, value) : get(name)\n /* Set values */\n if (isSet) {\n return document.cookie = name + '=' + encodeURIComponent(value) +\n /* Set TTL set expiration on cookie */\n ((!ttl) ? '' : '; expires=' + new Date(+new Date() + (ttl * 1000)).toUTCString() +\n // If path set path\n ((!path) ? '' : '; path=' + path) +\n // If domain set domain\n ((!domain) ? '' : '; domain=' + domain) +\n // If secure set secure\n ((!secure) ? '' : '; secure'))\n }\n /* Get values */\n return decodeURIComponent((('; ' + document.cookie).split('; ' + name + '=')[1] || '').split(';')[0])\n}\n","import { get, set, remove, hasSupport, wrap } from '@analytics/global-storage-utils'\n\nconst LOCAL_STORAGE = 'localStorage'\n\n/**\n * Check if browser has access to LocalStorage\n * @returns {Boolean}\n */\nconst hasLocalStorage = hasSupport.bind(null, LOCAL_STORAGE)\n\n/**\n * Get value from localStorage or fallback to global window\n * @param {string} key - Key of value to get\n * @returns {*} value\n */\nconst getItem = wrap(LOCAL_STORAGE, 'getItem', get)\n\n/**\n * Set value to localStorage or fallback to global window\n * @param {string} key - Key of value to set\n * @param {*} value \n * @returns value\n */\nconst setItem = wrap(LOCAL_STORAGE, 'setItem', set)\n\n/**\n * Remove value from localStorage or fallback to global window\n * @param {string} key - Key of value to remove\n */\nconst removeItem = wrap(LOCAL_STORAGE, 'removeItem', remove)\n\nexport {\n LOCAL_STORAGE,\n hasLocalStorage,\n getItem,\n setItem,\n removeItem\n}","import { get, set, remove, hasSupport, wrap } from '@analytics/global-storage-utils'\n\nconst SESSION_STORAGE = 'sessionStorage'\n\n/**\n * Check if browser has access to sessionStorage\n * @returns {Boolean}\n */\nconst hasSessionStorage = hasSupport.bind(null, SESSION_STORAGE)\n\n/**\n * Get value from sessionStorage or fallback to global window\n * @param {string} key - Key of value to get\n * @returns {*} value\n */\nconst getSessionItem = wrap(SESSION_STORAGE, 'getItem', get)\n\n/**\n * Set value to sessionStorage or fallback to global window\n * @param {string} key - Key of value to set\n * @param {*} value \n * @returns value\n */\nconst setSessionItem = wrap(SESSION_STORAGE, 'setItem', set)\n\n/**\n * Remove value from sessionStorage or fallback to global window\n * @param {string} key - Key of value to remove\n */\nconst removeSessionItem = wrap(SESSION_STORAGE, 'removeItem', remove)\n\nexport {\n SESSION_STORAGE,\n hasSessionStorage,\n getSessionItem,\n setSessionItem,\n removeSessionItem\n}","import { isObject } from '@analytics/type-utils'\n/**\n * Safe JSON parse\n * @param {*} input - value to parse\n * @return {*} parsed input\n */\nexport default function parse(input) {\n let value = input\n try {\n value = JSON.parse(input)\n if (value === 'true') return true\n if (value === 'false') return false\n if (isObject(value)) return value\n if (parseFloat(value) === value) {\n value = parseFloat(value)\n }\n } catch (e) { }\n if (value === null || value === \"\") {\n return\n }\n return value\n}\n","import { set, get, remove, globalContext, GLOBAL } from '@analytics/global-storage-utils'\nimport { getCookie, setCookie, removeCookie, hasCookies, COOKIE } from '@analytics/cookie-utils'\nimport { hasLocalStorage, LOCAL_STORAGE } from '@analytics/localstorage-utils'\nimport { hasSessionStorage, SESSION_STORAGE } from '@analytics/session-storage-utils'\nimport { isUndefined, isString, ANY, ALL } from '@analytics/type-utils'\nimport parse from './utils/parse'\n\n// Verify support\nconst hasStorage = hasLocalStorage()\nconst hasSessionSupport = hasSessionStorage()\nconst hasCookiesSupport = hasCookies()\n\n/**\n * Get storage item from localStorage, cookie, or window\n * @param {string} key - key of item to get\n * @param {object|string} [options] - storage options. If string location of where to get storage\n * @param {string} [options.storage] - Define type of storage to pull from.\n * @return {Any} the value of key\n */\nexport function getItem(key, options) {\n if (!key) return\n const type = getStorageType(options)\n const getFirst = !useAll(type)\n\n /* 1. Try localStorage */\n const localValue = useLocal(type) ? parse(localStorage.getItem(key)) : undefined\n if (getFirst && !isUndefined(localValue)) {\n return localValue\n }\n\n /* 2. Fallback to cookie */\n const cookieVal = useCookie(type) ? parse(getCookie(key)) : undefined\n if (getFirst && cookieVal) {\n return cookieVal\n }\n\n /* 3. Fallback to sessionStorage */\n const sessionVal = useSession(type) ? parse(sessionStorage.getItem(key)) : undefined\n if (getFirst && sessionVal) {\n return sessionVal\n }\n\n /* 4. Fallback to window/global. */\n const globalValue = get(key)\n\n return getFirst ? globalValue : {\n localStorage: localValue,\n sessionStorage: sessionVal,\n cookie: cookieVal,\n global: globalValue\n }\n}\n\n/**\n * Store values in localStorage, cookie, or window\n * @param {string} key - key of item to set\n * @param {*} value - value of item to set\n * @param {object|string} [options] - storage options. If string location of where to get storage\n * @param {string} [options.storage] - Define type of storage to pull from.\n * @returns {object} returns old value, new values, & location of storage\n */\nexport function setItem(key, value, options) {\n if (!key || isUndefined(value)) {\n return\n }\n const data = {}\n const type = getStorageType(options)\n const saveValue = JSON.stringify(value)\n const setFirst = !useAll(type)\n\n /* 1. Try localStorage */\n if (useLocal(type)) {\n // console.log('SET as localstorage', saveValue)\n data[LOCAL_STORAGE] = format(LOCAL_STORAGE, value, parse(localStorage.getItem(key)))\n // Set LocalStorage item\n localStorage.setItem(key, saveValue)\n if (setFirst) {\n return data[LOCAL_STORAGE]\n }\n }\n\n /* 2. Fallback to cookie */\n if (useCookie(type)) {\n // console.log('SET as cookie', saveValue)\n data[COOKIE] = format(COOKIE, value, parse(getCookie(key)))\n // Set Cookie\n setCookie(key, saveValue)\n if (setFirst) {\n return data[COOKIE]\n }\n }\n\n /* 3. Try sessionStorage */\n if (useSession(type)) {\n // console.log('SET as localstorage', saveValue)\n data[SESSION_STORAGE] = format(SESSION_STORAGE, value, parse(sessionStorage.getItem(key)))\n // Set sessionStorage item\n sessionStorage.setItem(key, saveValue)\n if (setFirst) {\n return data[SESSION_STORAGE]\n }\n }\n\n /* 4. Fallback to window/global */\n data[GLOBAL] = format(GLOBAL, value, get(key))\n // Set global value\n set(key, value)\n // Return set value(s)\n return (setFirst) ? data[GLOBAL] : data\n}\n\n/**\n * Remove values from localStorage, cookie, or window\n * @param {string} key - key of item to set\n * @param {object|string} [options] - storage options. If string location of where to get storage\n * @param {string} [options.storage] - Define type of storage to pull from.\n */\nexport function removeItem(key, options) {\n if (!key) return\n const type = getStorageType(options)\n const values = getItem(key, ALL)\n\n const data = {}\n /* 1. Try localStorage */\n if (!isUndefined(values.localStorage) && useLocal(type)) {\n localStorage.removeItem(key)\n data[LOCAL_STORAGE] = values.localStorage\n }\n /* 2. Fallback to cookie */\n if (!isUndefined(values.cookie) && useCookie(type)) {\n removeCookie(key)\n data[COOKIE] = values.cookie\n }\n /* 3. Try sessionStorage */\n if (!isUndefined(values.sessionStorage) && useSession(type)) {\n sessionStorage.removeItem(key)\n data[SESSION_STORAGE] = values.sessionStorage\n }\n /* 4. Fallback to window/global */\n if (!isUndefined(values.global) && useGlobal(type)) {\n remove(key)\n data[GLOBAL] = values.global\n }\n return data\n}\n\nfunction getStorageType(opts) {\n if (!opts) return ANY\n return isString(opts) ? opts : opts.storage\n}\n\nfunction useGlobal(storage) {\n return useType(storage, GLOBAL)\n}\n\nfunction useLocal(storage) {\n // If has localStorage and storage option not defined, or is set to 'localStorage' or '*'\n return hasStorage && useType(storage, LOCAL_STORAGE)\n}\n\nfunction useCookie(storage) {\n // If has cookies and storage option not defined, or is set to 'cookies' or '*'\n return hasCookiesSupport && useType(storage, COOKIE)\n}\n\nfunction useSession(storage) {\n // If has sessionStorage and storage option not defined, or is set to 'sessionStorage' or '*'\n return hasSessionSupport && useType(storage, SESSION_STORAGE)\n}\n\nfunction useAll(storage) {\n return storage === ALL || storage === 'all'\n}\n\nfunction useType(storage, type) {\n return (storage === ANY || storage === type || useAll(storage))\n}\n\n/**\n * Format response\n * @param {string} location \n * @param {*} current - current value\n * @param {*} previous - previous value\n * @returns \n */\nfunction format(location, current, previous) {\n return { location, current, previous }\n}\n\n// const TYPES = {\n// ALL,\n// ANY,\n// GLOBAL,\n// COOKIE,\n// LOCAL_STORAGE,\n// SESSION_STORAGE, \n// }\n\nexport {\n ALL,\n ANY,\n GLOBAL,\n COOKIE,\n LOCAL_STORAGE,\n SESSION_STORAGE,\n getCookie,\n setCookie,\n removeCookie,\n globalContext,\n hasSessionStorage,\n hasLocalStorage,\n hasCookies\n}\n\nexport default {\n setItem,\n getItem,\n removeItem\n}","import { Analytics } from '@analytics/core';\nexport { CONSTANTS, EVENTS } from '@analytics/core';\nimport storage from '@analytics/storage-utils';\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n enumerableOnly && (symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n })), keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = null != arguments[i] ? arguments[i] : {};\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n\n return target;\n}\n\nfunction analyticsLib() {\n var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var defaultSettings = {\n storage: storage\n };\n return Analytics(_objectSpread2(_objectSpread2({}, defaultSettings), opts));\n}\n\nexport { analyticsLib as Analytics, analyticsLib as default, analyticsLib as init };\n","export default function dlv(obj, key, def, p, undef) {\n\tkey = key.split ? key.split('.') : key;\n\tfor (p = 0; p < key.length; p++) {\n\t\tobj = obj ? obj[key[p]] : undef;\n\t}\n\treturn obj === undef ? def : obj;\n}\n"],"names":["ownKeys","object","enumerableOnly","keys","Object","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","target","i","arguments","length","source","forEach","key","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","obj","value","configurable","writable","defaultConfig","trackingId","debug","anonymizeIp","customDimensions","resetCustomDimensionsOnPage","setCustomDimensionsToPage","loadedInstances","googleAnalyticsV3","pluginConfig","undefined","pageCalledOnce","_getInstanceDetails","getInstanceDetails","instanceName","instancePrefix","name","config","initialize","pluginApi","instance","Error","customScriptSrc","nonce","scriptSrc","gaNotLoaded","s","o","g","r","a","m","q","l","Date","createElement","getElementsByTagName","async","src","setAttribute","parentNode","insertBefore","window","document","gaConfig","cookieDomain","domain","siteSpeedSampleRate","sampleRate","allowLinker","cookieConfig","ga","concat","ga_debug","trace","tasks","taskName","hasOwnProperty","task","traits","user","dimensions","formatObjectIntoDimensions","page","_ref","payload","properties","campaign","getState","resetDimensions","reduce","acc","path","location","pathname","pageView","title","url","pageData","referrer","campaignData","addCampaignData","setCustomDimensions","finalPayload","track","_ref2","event","label","trackEvent","hitType","category","nonInteraction","identify","_ref3","identifyVisitor","userId","loaded","gaplugins","scripts","querySelectorAll","scriptLoaded","eventData","opts","data","eventAction","eventLabel","eventCategory","eventValue","Math","round","medium","content","keyword","campaignName","campaignSource","campaignMedium","campaignContent","campaignKeyword","dimensionKey","def","p","undef","split","get","toString","id","conf","custom","index","e","F","process","$","env","NODE_ENV","hostname","versions","node","Deno","core","self","constructor","navigator","userAgent","includes","M","n","t","charAt","slice","U","bind","H","J","Y","W","yn","prototype","call","R","V","I","Q","nn","isNaN","rn","on","un","getPrototypeOf","On","message","stackTraceLimit","hn","TypeError","SyntaxError","$n","Element","HTMLDocument","nodeName","toUpperCase","Tn","_n","decodeURIComponent","replace","create","exec","substring","u","Array","isArray","c","map","match","search","y","random","global","f","b","setItem","removeItem","w","Symbol","observable","E","P","d","indexOf","splice","type","dispatch","subscribe","replaceReducer","next","unsubscribe","this","S","N","O","v","A","_","x","k","T","z","registerPluginType","pluginReadyType","L","C","storage","bootstrap","params","persistedUser","initialUser","anonymousId","an_uid","an_event","props","raw","setTimeout","setItemEnd","assign","reset","getItem","D","B","options","userIdChanged","old","new","X","Promise","queue","then","abort","plugins","context","offline","actions","plugin","processIndex","requeue","requeueIndex","h","meta","rid","called","from","G","action","state","allPlugins","allMatches","store","EVENTS","K","exact","pluginName","during","ae","JSON","stringify","reason","caller","ce","methodName","resolve","namespaced","method","ue","join","ee","reject","re","Z","originalAction","ie","ne","te","oe","se","enablePlugin","initializeStart","disabled","fromEnable","disablePlugin","initializeEnd","events","catch","all","failed","ready","test","enabled","initialized","beforeNS","duringNS","afterNS","before","after","hasCallback","le","fe","addMiddleware","removeMiddleware","findIndex","dynamicMiddlewares","de","pe","Boolean","me","ge","parse","he","last","history","ve","ye","be","Ie","we","Ee","Pe","Se","Ne","Oe","innerWidth","innerHeight","hash","getAttribute","href","width","height","Ae","_e","appVersion","languages","userLanguage","language","Intl","DateTimeFormat","resolvedOptions","timeZone","xe","sessionId","app","version","onLine","os","library","timezone","locale","je","online","ke","Te","ze","Me","analytics","qe","Ue","Ve","ts","getTime","Le","reducers","middlewares","NAMESPACE","pluginEnabled","methods","Set","pluginsArray","sort","j","an_aid","enable","disable","identifyStart","previousId","trackStart","pageStart","resetStart","Ce","Re","once","setItemStart","removeItemStart","setAnonymousId","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","traceLimit","registerPlugins","setInterval","cookie","encodeURIComponent","toUTCString","parseFloat","localStorage","sessionStorage","current","previous","_objectSpread2","analyticsLib","Analytics"],"sourceRoot":""}