{"version":3,"file":"static/js/723.029dc28b.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 * @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; // 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 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\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.substring(k.length - 2) === '[]') {\n k = k.substring(0, k.length - 2);\n (params[k] || (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","scriptSrc","customScriptSrc","gaNotLoaded","s","o","g","r","a","m","q","l","Date","createElement","getElementsByTagName","async","src","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","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","Array","isArray","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":""}