UNPKG

@analytics/core

Version:

Lightweight analytics library for tracking events, page views, & identifying users. Works with any third party analytics provider via an extendable plugin system.

3 lines (2 loc) 22.3 kB
import{uuid as e,paramsParse as t,dotProp as n}from"analytics-utils";import{get as r,remove as i,set as a,globalContext as o,KEY as s}from"@analytics/global-storage-utils";import{isObject as c,PREFIX as u,isFunction as l,isBoolean as d,isString as p,isBrowser as f,isArray as m}from"@analytics/type-utils";function g(){return g=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},g.apply(this,arguments)}const y="function",h="undefined",b="@@redux/"+Math.random().toString(36),w=/* #__PURE__ */(()=>typeof Symbol===y&&Symbol.observable||"@@observable")(),I=" != "+y;function E(e,t,n){if(typeof t===y&&typeof n===h&&(n=t,t=void 0),typeof n!==h){if(typeof n!==y)throw new Error("enhancer"+I);return n(E)(e,t)}if(typeof e!==y)throw new Error("reducer"+I);let r=e,i=t,a=[],o=a,s=!1;function u(){o===a&&(o=a.slice())}function l(){return i}function d(e){if(typeof e!==y)throw new Error("Listener"+I);let t=!0;return u(),o.push(e),function(){if(!t)return;t=!1,u();const n=o.indexOf(e);o.splice(n,1)}}function p(e){if(!c(e))throw new Error("Act != obj");if(typeof e.type===h)throw new Error("ActType "+h);if(s)throw new Error("Dispatch in reducer");try{s=!0,i=r(i,e)}finally{s=!1}const t=a=o;for(let e=0;e<t.length;e++)(0,t[e])();return e}return p({type:"@@redux/INIT"}),{dispatch:p,subscribe:d,getState:l,replaceReducer:function(e){if(typeof e!==y)throw new Error("next reducer"+I);r=e,p({type:"@@redux/INIT"})},[w]:function(){const e=d;return{subscribe(t){if("object"!=typeof t)throw new TypeError("Observer != obj");function n(){t.next&&t.next(l())}return n(),{unsubscribe:e(n)}},[w](){return this}}}}}function v(e,t){const n=t&&t.type;return"action "+(n&&n.toString()||"?")+"reducer "+e+" returns "+h}function S(...e){return 0===e.length?e=>e:1===e.length?e[0]:e.reduce((e,t)=>(...n)=>e(t(...n)))}const P=u+"anon_id",N=u+"user_id",A=u+"user_traits";var _={__proto__:null,ANON_ID:P,USER_ID:N,USER_TRAITS:A};const O="userId",k="anonymousId",x=["bootstrap","params","campaign","initializeStart","initialize","initializeEnd","ready","resetStart","reset","resetEnd","pageStart","page","pageEnd","pageAborted","trackStart","track","trackEnd","trackAborted","identifyStart","identify","identifyEnd","identifyAborted","userIdChanged","registerPlugins","enablePlugin","disablePlugin","online","offline","setItemStart","setItem","setItemEnd","setItemAborted","removeItemStart","removeItem","removeItemEnd","removeItemAborted"],T=["name","EVENTS","config","loaded"];var $=x.reduce((e,t)=>(e[t]=t,e),{registerPluginType:e=>`registerPlugin:${e}`,pluginReadyType:e=>`ready:${e}`});const j=/^utm_/,z=/^an_prop_/,M=/^an_trait_/;function q(e){const{setItem:t}=e.storage;return n=>r=>i=>{if(i.type===$.bootstrap){const{params:r,user:a,persistedUser:o,initialUser:s}=i,c=o.userId===a.userId;o.anonymousId!==a.anonymousId&&t(P,a.anonymousId),c||t(N,a.userId),s.traits&&t(A,g({},c&&o.traits?o.traits:{},s.traits));const u=Object.keys(i.params);if(u.length){const{an_uid:t,an_event:i}=r,a=u.reduce((e,t)=>{if(t.match(j)||t.match(/^(d|g)clid/)){const n=t.replace(j,"");e.campaign["campaign"===n?"name":n]=r[t]}return t.match(z)&&(e.props[t.replace(z,"")]=r[t]),t.match(M)&&(e.traits[t.replace(M,"")]=r[t]),e},{campaign:{},props:{},traits:{}});n.dispatch(g({type:$.params,raw:r},a,t?{userId:t}:{})),t&&setTimeout(()=>e.identify(t,a.traits),0),i&&setTimeout(()=>e.track(i,a.props),0),Object.keys(a.campaign).length&&n.dispatch({type:$.campaign,campaign:a.campaign})}}return r(i)}}function V(e){return function(t={},n={}){if(n.type===$.setItemEnd){if(n.key===P)return g({},t,{anonymousId:n.value});if(n.key===N)return g({},t,{userId:n.value})}switch(n.type){case $.identify:return Object.assign({},t,{userId:n.userId,traits:g({},t.traits,n.traits)});case $.reset:return[N,P,A].forEach(t=>{e.removeItem(t)}),Object.assign({},t,{userId:null,anonymousId:null,traits:{}});default:return t}}}function C(e){return{userId:e.getItem(N),anonymousId:e.getItem(P),traits:e.getItem(A)}}const U=e=>u+"TEMP"+u+e;function R(t){const{setItem:n,removeItem:r,getItem:a}=t.storage;return t=>o=>s=>{const{userId:c,traits:u,options:l}=s;if(s.type===$.reset&&([N,A,P].forEach(e=>{r(e)}),[O,k,"traits"].forEach(e=>{i(U(e))})),s.type===$.identify){a(P)||n(P,e());const r=a(N),i=a(A)||{};r&&r!==c&&t.dispatch({type:$.userIdChanged,old:{userId:r,traits:i},new:{userId:c,traits:u},options:l}),c&&n(N,c),u&&n(A,g({},i,u))}return o(s)}}const D={};function B(e,t){D[e]&&l(D[e])&&(D[e](t),delete D[e])}function L(e,t,n){return new Promise((r,i)=>t()?r(e):n<1?i(g({},e,{queue:!0})):new Promise(e=>setTimeout(e,10)).then(a=>L(e,t,n-10).then(r,i)))}function J(e){return{abort:e}}function X(e,t,n){const r={},i=t(),{plugins:a,context:o,queue:s,user:u}=e.getState();if(!o.offline&&s&&s.actions&&s.actions.length){const t=s.actions.reduce((e,t,n)=>(a[t.plugin].loaded?(e.process.push(t),e.processIndex.push(n)):(e.requeue.push(t),e.requeueIndex.push(n)),e),{processIndex:[],process:[],requeue:[],requeueIndex:[]});if(t.processIndex&&t.processIndex.length){t.processIndex.forEach(t=>{const o=s.actions[t],d=o.plugin,p=o.payload.type,f=i[d][p];if(f&&l(f)){const t=function(e={},t={}){return[O,k].reduce((n,r)=>(e.hasOwnProperty(r)&&t[r]&&t[r]!==e[r]&&(n[r]=t[r]),n),e)}(o.payload,u);let i;const s=r[t.meta.rid];if(!s&&(i=f({payload:t,config:a[d].config,instance:n,abort:J}),i&&c(i)&&i.abort))return void(r[t.meta.rid]=!0);if(!s){const n=`${p}:${d}`;e.dispatch(g({},t,{type:n,_:{called:n,from:"queueDrain"}}))}}});const o=s.actions.filter((e,n)=>!~t.processIndex.indexOf(n));s.actions=o}}}const H=/Start$/,W=/^bootstrap/,F=/^ready/;async function G({data:e,action:t,instance:n,state:r,allPlugins:i,allMatches:a,store:o,EVENTS:s}){const{plugins:u,context:d}=r,p=t.type,f=p.match(H);let m=e.exact.map(e=>e.pluginName);f&&(m=a.during.map(e=>e.pluginName));const y=function(e,t){return function(n,r,i){const{config:a,name:o}=r;let s=`${o}.${n.type}`;i&&(s=i.event);const c=n.type.match(H)?function(e,t,n,r,i){return function(a,o){const s=r?r.name:e;let c=o&&ne(o)?o:n;if(r&&(c=o&&ne(o)?o:[e],!c.includes(e)||1!==c.length))throw new Error(`Method ${t} can only abort ${e} plugin. ${JSON.stringify(c)} input valid`);return g({},i,{abort:{reason:a,plugins:c,caller:t,_:s}})}}(o,s,t,i,n):function(e,t){return()=>{throw new Error(e.type+" action not cancellable. Remove abort in "+t)}}(n,s);return{payload:ae(n),instance:e,config:a||{},abort:c}}}(n,m),h=e.exact.reduce((e,t)=>{const{pluginName:n,methodName:r}=t;let i=!1;return r.match(/^initialize/)||r.match(/^reset/)||(i=!u[n].loaded),d.offline&&r.match(/^(page|track|identify)/)&&(i=!0),e[`${n}`]=i,e},{}),b=await e.exact.reduce(async(r,a,o)=>{const{pluginName:s}=a,d=await r;if(e.namespaced&&e.namespaced[s]){const r=await e.namespaced[s].reduce(async(e,t,r)=>{const a=await e;if(!t.method||!l(t.method))return a;!function(e,t){const n=ie(e);if(n&&n.name===t){const r=ie(n.method);throw new Error([t+" plugin is calling method "+e,"Plugins cant call self",`Use ${n.method} ${r?"or "+r.method:""} in ${t} plugin insteadof ${e}`].join("\n"))}}(t.methodName,t.pluginName);const o=await t.method({payload:a,instance:n,abort:(d=a,f=s,m=t.pluginName,function(e,t){return g({},d,{abort:{reason:e,plugins:t||[f],caller:p,from:m||f}})}),config:Q(t.pluginName,u,i),plugins:u});var d,f,m;const y=c(o)?o:{};return Promise.resolve(g({},a,y))},Promise.resolve(t));d[s]=r}else d[s]=t;return Promise.resolve(d)},Promise.resolve({})),w=await e.exact.reduce(async(t,r,a)=>{const s=e.exact.length===a+1,{pluginName:l}=r,d=i[l],m=await t;let w=b[l]?b[l]:{};if(f&&(w=m),ee(w,l))return K({data:w,method:p,instance:n,pluginName:l,store:o}),Promise.resolve(m);if(ee(m,l))return s&&K({data:m,method:p,instance:n,store:o}),Promise.resolve(m);if(h.hasOwnProperty(l)&&!0===h[l])return o.dispatch({type:"queue",plugin:l,payload:w,_:{called:"queue",from:"queueMechanism"}}),Promise.resolve(m);const I=y(b[l],i[l]),E=await d[p]({abort:I.abort,payload:w,instance:n,config:Q(l,u,i),plugins:u}),v=g({},m,c(E)?E:{}),S=b[l];if(ee(S,l))K({data:S,method:p,instance:n,pluginName:l,store:o});else{const e=`${p}:${l}`;(e.match(/:/g)||[]).length<2&&!p.match(W)&&!p.match(F)&&n.dispatch(g({},f?v:w,{type:e,_:{called:e,from:"submethod"}}))}return Promise.resolve(v)},Promise.resolve(t));if(!(p.match(H)||p.match(/^registerPlugin/)||p.match(F)||p.match(W)||p.match(/^params/)||p.match(/^userIdChanged/))){if(s.plugins.includes(p),w._&&w._.originalAction===p)return w;let t=g({},w,{_:{originalAction:w.type,called:w.type,from:"engineEnd"}});te(w,e.exact.length)&&!p.match(/End$/)&&(t=g({},t,{type:w.type+"Aborted"})),o.dispatch(t)}return w}function K({data:e,method:t,pluginName:n,store:r}){const i=t+"Aborted"+(n?":"+n:"");r.dispatch(g({},e,{type:i,_:{called:i,from:"abort"}}))}function Q(e,t,n){const r=t[e]||n[e];return r&&r.config?r.config:{}}function Y(e,t){return t.reduce((t,n)=>n[e]?t.concat({methodName:e,pluginName:n.name,method:n[e]}):t,[])}function Z(e,t){const n=e.replace(H,""),r=t?`:${t}`:"";return[`${e}${r}`,`${n}${r}`,`${n}End${r}`]}function ee({abort:e},t){return!!e&&(!0===e||re(e,t)||e&&re(e.plugins,t))}function te({abort:e},t){if(!e)return!1;if(!0===e||p(e))return!0;const{plugins:n}=e;return ne(e)&&e.length===t||ne(n)&&n.length===t}function ne(e){return Array.isArray(e)}function re(e,t){return!(!e||!ne(e))&&e.includes(t)}function ie(e){const t=e.match(/(.*):(.*)/);return!!t&&{method:t[1],name:t[2]}}function ae(e){return Object.keys(e).reduce((t,n)=>("type"===n||(t[n]=c(e[n])?Object.assign({},e[n]):e[n]),t),{})}function oe(e,t,n){const r={};return i=>a=>async o=>{const{type:s,abort:c,plugins:u}=o;let p=o;if(c)return a(o);if(s===$.enablePlugin&&i.dispatch({type:$.initializeStart,plugins:u,disabled:[],fromEnable:!0,meta:o.meta}),s===$.disablePlugin&&setTimeout(()=>B(o.meta.rid,{payload:o}),0),s===$.initializeEnd){const e=t(),n=Object.keys(e),a=n.filter(e=>u.includes(e)).map(t=>e[t]);let s=[],c=[],l=o.disabled;const d=a.map(e=>{const{loaded:t,name:n,config:a}=e;return L(e,()=>t({config:a}),1e4).then(t=>(r[n]||(i.dispatch({type:$.pluginReadyType(n),name:n,events:Object.keys(e).filter(e=>!T.includes(e))}),r[n]=!0),s=s.concat(n),e)).catch(e=>{if(e instanceof Error)throw new Error(e);return c=c.concat(e.name),e})});Promise.all(d).then(e=>{const t={plugins:s,failed:c,disabled:l};setTimeout(()=>{n.length===d.length+l.length&&i.dispatch(g({},{type:$.ready},t))},0)})}if(s!==$.bootstrap){/^ready:([^:]*)$/.test(s)&&setTimeout(()=>X(i,t,e),0);const r=await async function(e,t,n,r,i){const a=l(t)?t():t,o=e.type,s=o.replace(H,"");if(e._&&e._.called)return e;const c=n.getState();let u=function(e,t={},n={}){return Object.keys(e).filter(e=>{const r=n.plugins||{};return d(r[e])?r[e]:!1!==r.all&&(!t[e]||!1!==t[e].enabled)}).map(t=>e[t])}(a,c.plugins,e.options);o===$.initializeStart&&e.fromEnable&&(u=Object.keys(c.plugins).filter(t=>{const n=c.plugins[t];return e.plugins.includes(t)&&!n.initialized}).map(e=>a[e]));const p=u.map(e=>e.name),f=function(e,t,n){const r=Z(e).map(e=>Y(e,t));return t.reduce((n,r)=>{const{name:i}=r,a=Z(e,i),[o,s,c]=a.map(e=>Y(e,t));return o.length&&(n.beforeNS[i]=o),s.length&&(n.duringNS[i]=s),c.length&&(n.afterNS[i]=c),n},{before:r[0],beforeNS:{},during:r[1],duringNS:{},after:r[2],afterNS:{}})}(o,u),m=await G({action:e,data:{exact:f.before,namespaced:f.beforeNS},state:c,allPlugins:a,allMatches:f,instance:n,store:r,EVENTS:i});if(te(m,p.length))return m;let y;if(y=o===s?m:await G({action:g({},m,{type:s}),data:{exact:f.during,namespaced:f.duringNS},state:c,allPlugins:a,allMatches:f,instance:n,store:r,EVENTS:i}),o.match(H)){const e=`${s}End`,t=await G({action:g({},y,{type:e}),data:{exact:f.after,namespaced:f.afterNS},state:c,allPlugins:a,allMatches:f,instance:n,store:r,EVENTS:i});t.meta&&t.meta.hasCallback&&B(t.meta.rid,{payload:t})}return m}(o,t,e,i,n);return a(r)}return a(p)}}function se(e){return t=>t=>n=>{const{type:r,key:i,value:a,options:o}=n;if(r===$.setItem||r===$.removeItem){if(n.abort)return t(n);r===$.setItem?e.setItem(i,a,o):e.removeItem(i,o)}return t(n)}}class ce{constructor(){this.before=[],this.after=[],this.addMiddleware=(e,t)=>{this[t]=this[t].concat(e)},this.removeMiddleware=(e,t)=>{const n=this[t].findIndex(t=>t===e);-1!==n&&(this[t]=[...this[t].slice(0,n),...this[t].slice(n+1)])},this.dynamicMiddlewares=e=>t=>n=>r=>{const i={getState:t.getState,dispatch:e=>t.dispatch(e)};return S(...this[e].map(e=>e(i)))(n)(r)}}}function ue(e){return function(t={},n){let r={};if("initialize:aborted"===n.type)return t;if(/^registerPlugin:([^:]*)$/.test(n.type)){const i=le(n.type,"registerPlugin"),a=e()[i];if(!a||!i)return t;const o=n.enabled,s=a.config;return r[i]={enabled:o,initialized:!!o&&Boolean(!a.initialize),loaded:!!o&&Boolean(a.loaded({config:s})),config:s},g({},t,r)}if(/^initialize:([^:]*)$/.test(n.type)){const i=le(n.type,$.initialize),a=e()[i];return a&&i?(r[i]=g({},t[i],{initialized:!0,loaded:Boolean(a.loaded({config:a.config}))}),g({},t,r)):t}if(/^ready:([^:]*)$/.test(n.type))return r[n.name]=g({},t[n.name],{loaded:!0}),g({},t,r);switch(n.type){case $.disablePlugin:return g({},t,de(n.plugins,!1,t));case $.enablePlugin:return g({},t,de(n.plugins,!0,t));default:return t}}}function le(e,t){return e.substring(t.length+1,e.length)}function de(e,t,n){return e.reduce((e,r)=>(e[r]=g({},n[r],{enabled:t}),e),n)}function pe(e){try{return JSON.parse(JSON.stringify(e))}catch(e){}return e}const fe={last:{},history:[]};function me(e=fe,t){const{type:n,event:r,properties:i,options:a,meta:o}=t;if(n===$.track){const t=pe(g({event:r,properties:i},Object.keys(a).length&&{options:a},{meta:o}));return g({},e,{last:t,history:e.history.concat(t)})}return e}const ge={actions:[]};function ye(e=ge,t){const{type:n,payload:r}=t;switch(n){case"queue":let n;return n=r&&r.type&&r.type===$.identify?[t].concat(e.actions):e.actions.concat(t),g({},e,{actions:n});case"dequeue":return[];default:return e}}const he=/#.*$/;function be(e){const t=/(http[s]?:\/\/)?([^\/\s]+\/)(.*)/g.exec(e);return"/"+(t&&t[3]?t[3].split("?")[0].replace(he,""):"")}const we=(e={})=>{if(!f)return e;const{title:t,referrer:n}=document,{location:r,innerWidth:i,innerHeight:a}=window,{hash:o,search:s}=r,c=function(e){const t=function(){if(!f)return;const e=document.getElementsByTagName("link");for(var t,n=0;t=e[n];n++)if("canonical"===t.getAttribute("rel"))return t.getAttribute("href")}();return t?t.match(/\?/)?t:t+e:window.location.href.replace(he,"")}(s),u={title:t,url:c,path:be(c),hash:o,search:s,width:i,height:a};return n&&""!==n&&(u.referrer=n),g({},u,e)},Ie={last:{},history:[]};function Ee(e=Ie,t){const{properties:n,options:r,meta:i}=t;if(t.type===$.page){const t=pe(g({properties:n,meta:i},Object.keys(r).length&&{options:r}));return g({},e,{last:t,history:e.history.concat(t)})}return e}let ve,Se;ve="na",Se={};const Pe={initialized:!1,sessionId:e(),app:null,version:null,debug:!1,offline:!!f&&!navigator.onLine,os:{name:"na"},userAgent:f?navigator.userAgent:"node",library:{name:"analytics",version:"0.12.16"},timezone:void 0,locale:void 0,campaign:{},referrer:Se};function Ne(e=Pe,t){const{initialized:n}=e,{type:r,campaign:i}=t;switch(r){case $.campaign:return g({},e,{campaign:i});case $.offline:return g({},e,{offline:!0});case $.online:return g({},e,{offline:!1});default:return n?e:g({},Pe,e,{initialized:!0})}}const Ae=["plugins","reducers","storage"];function _e(){return a("analytics",[]),e=>(t,n,r)=>{const i=e(t,n,r),a=i.dispatch;return Object.assign(i,{dispatch:e=>(o[s].analytics.push(e.action||e),a(e))})}}function Oe(e){return function(){return S(S.apply(null,arguments),_e())}}function ke(e){return e?m(e)?e:[e]:[]}function xe(t={},n,r){const i=e();var a,o;return n&&(D[i]=(a=n,o=function(e){const t=e||Array.prototype.slice.call(arguments);let n;for(let e=0;e<t.length;e++)if(l(t[e])){n=t[e];break}return n}(r),e=>{o&&o(e),a(e)})),g({},t,{rid:i,ts:(new Date).getTime()},n?{hasCallback:!0}:{})}function Te(o={}){const s=o.reducers||{},u=o.initialUser||{},d=(o.plugins||[]).reduce((e,t)=>{if(l(t))return e.middlewares=e.middlewares.concat(t),e;if(t.NAMESPACE&&(t.name=t.NAMESPACE),!t.name)throw new Error("https://lytics.dev/errors/1");t.config||(t.config={});const n=t.EVENTS?Object.keys(t.EVENTS).map(e=>t.EVENTS[e]):[];e.pluginEnabled[t.name]=!(!1===t.enabled||!1===t.config.enabled),delete t.enabled,t.methods&&(e.methods[t.name]=Object.keys(t.methods).reduce((e,n)=>{var r;return e[n]=(r=t.methods[n],function(){const e=Array.prototype.slice.call(arguments);let t=new Array(r.length);for(let n=0;n<e.length;n++)t[n]=e[n];return t[t.length]=F,r.apply({instance:F},t)}),e},{}),delete t.methods);const r=Object.keys(t).concat(n),i=new Set(e.events.concat(r));if(e.events=Array.from(i),e.pluginsArray=e.pluginsArray.concat(t),e.plugins[t.name])throw new Error(t.name+"AlreadyLoaded");return e.plugins[t.name]=t,e.plugins[t.name].loaded||(e.plugins[t.name].loaded=()=>!0),e},{plugins:{},pluginEnabled:{},methods:{},pluginsArray:[],middlewares:[],events:[]}),m=o.storage?o.storage:{getItem:r,setItem:a,removeItem:i},w=function(e){return function(t,n,i){return n.getState("user")[t]||(i&&c(i)&&i[t]?i[t]:C(e)[t]||r(U(t))||null)}}(m);let I=d.plugins;const N=d.events.filter(e=>!T.includes(e)).sort(),A=new Set(N.concat(x).filter(e=>!T.includes(e))),_=Array.from(A).sort(),j=()=>I,{addMiddleware:z,removeMiddleware:M,dynamicMiddlewares:D}=new ce,B=()=>{throw new Error("Abort disabled inListener")},L=t(),J=C(m),X=g({},J,u,L.an_uid?{userId:L.an_uid}:{},L.an_aid?{anonymousId:L.an_aid}:{});X.anonymousId||(X.anonymousId=e());const H=g({enable:(e,t)=>new Promise(n=>{ne.dispatch({type:$.enablePlugin,plugins:ke(e),_:{originalAction:$.enablePlugin}},n,[t])}),disable:(e,t)=>new Promise(n=>{ne.dispatch({type:$.disablePlugin,plugins:ke(e),_:{originalAction:$.disablePlugin}},n,[t])})},d.methods);let W=!1;const F={identify:async(e,t,n,r)=>{const i=p(e)?e:null,o=c(e)?e:t,s=n||{},u=F.user();a(U(O),i);const l=i||o.userId||w(O,F,o);return new Promise(e=>{ne.dispatch(g({type:$.identifyStart,userId:l,traits:o||{},options:s,anonymousId:u.anonymousId},u.id&&u.id!==i&&{previousId:u.id}),e,[t,n,r])})},track:async(e,t,n,r)=>{const i=c(e)?e.event:e;if(!i||!p(i))throw new Error("EventMissing");const a=c(e)?e:t||{},o=c(n)?n:{};return new Promise(e=>{ne.dispatch({type:$.trackStart,event:i,properties:a,options:o,userId:w(O,F,t),anonymousId:w(k,F,t)},e,[t,n,r])})},page:async(e,t,n)=>{const r=c(e)?e:{},i=c(t)?t:{};return new Promise(a=>{ne.dispatch({type:$.pageStart,properties:we(r),options:i,userId:w(O,F,r),anonymousId:w(k,F,r)},a,[e,t,n])})},user:e=>{if(e===O||"id"===e)return w(O,F);if(e===k||"anonId"===e)return w(k,F);const t=F.getState("user");return e?n(t,e):t},reset:e=>new Promise(t=>{ne.dispatch({type:$.resetStart},t,e)}),ready:e=>(W&&e({plugins:H,instance:F}),F.on($.ready,t=>{e(t),W=!0})),on:(e,t)=>{if(!e||!l(t))return!1;if(e===$.bootstrap)throw new Error(".on disabled for "+e);const n=/Start$|Start:/;if("*"===e){const e=e=>e=>r=>(r.type.match(n)&&t({payload:r,instance:F,plugins:I}),e(r)),r=e=>e=>r=>(r.type.match(n)||t({payload:r,instance:F,plugins:I}),e(r));return z(e,$e),z(r,je),()=>{M(e,$e),M(r,je)}}const r=e.match(n)?$e:je,i=n=>n=>r=>(r.type===e&&t({payload:r,instance:F,plugins:I,abort:B}),n(r));return z(i,r),()=>M(i,r)},once:(e,t)=>{if(!e||!l(t))return!1;if(e===$.bootstrap)throw new Error(".once disabled for "+e);const n=F.on(e,({payload:e})=>{t({payload:e,instance:F,plugins:I,abort:B}),n()});return n},getState:e=>{const t=ne.getState();return e?n(t,e):Object.assign({},t)},dispatch:e=>{const t=p(e)?{type:e}:e;if(x.includes(t.type))throw new Error("reserved action "+t.type);const n=g({},t,{_:g({originalAction:t.type},e._||{})});ne.dispatch(n)},enablePlugin:H.enable,disablePlugin:H.disable,plugins:H,storage:{getItem:m.getItem,setItem:(e,t,n)=>{ne.dispatch({type:$.setItemStart,key:e,value:t,options:n})},removeItem:(e,t)=>{ne.dispatch({type:$.removeItemStart,key:e,options:t})}},setAnonymousId:(e,t)=>{F.storage.setItem(P,e,t)},events:{core:x,plugins:N}},G=d.middlewares.concat([e=>e=>t=>(t.meta||(t.meta=xe()),e(t)),D($e),oe(F,j,{all:_,plugins:N}),se(m),q(F),R(F),D(je)]),K={context:Ne,user:V(m),page:Ee,track:me,plugins:ue(j),queue:ye};let Q=S,Y=S;if(f&&o.debug){const e=window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__;e&&(Q=e({trace:!0,traceLimit:25})),Y=function(){return 0===arguments.length?_e():c(typeof arguments[0])?Oe():Oe().apply(null,arguments)}}const Z=function(e){return Object.keys(e).reduce((t,n)=>(Ae.includes(n)||(t[n]=e[n]),t),{})}(o),ee=d.pluginsArray.reduce((e,t)=>{const{name:n,config:r,loaded:i}=t,a=d.pluginEnabled[n];return e[n]={enabled:a,initialized:!!a&&Boolean(!t.initialize),loaded:Boolean(i({config:r})),config:r},e},{}),te={context:Z,user:X,plugins:ee},ne=E(function(e){const t=Object.keys(e),n={};for(let r=0;r<t.length;r++){const i=t[r];typeof e[i]===y&&(n[i]=e[i])}const r=Object.keys(n);let i;try{!function(e){Object.keys(e).forEach(t=>{const n=e[t];if(typeof n(void 0,{type:"@@redux/INIT"})===h||typeof n(void 0,{type:b})===h)throw new Error("reducer "+t+" "+h)})}(n)}catch(e){i=e}return function(e={},t){if(i)throw i;let a=!1;const o={};for(let i=0;i<r.length;i++){const s=r[i],c=e[s],u=(0,n[s])(c,t);if(typeof u===h){const e=v(s,t);throw new Error(e)}o[s]=u,a=a||u!==c}return a?o:e}}(g({},K,s)),te,Y(Q(function(...e){return t=>(n,r,i)=>{const a=t(n,r,i);let o=a.dispatch,s=[];const c={getState:a.getState,dispatch:e=>o(e)};return s=e.map(e=>e(c)),o=S(...s)(a.dispatch),g({},a,{dispatch:o})}}(...G))));var re;ne.dispatch=(re=ne.dispatch,function(e,t,n){const r=g({},e,{meta:xe(e.meta,t,ke(n))});return re.apply(null,[r])});const ie=Object.keys(I);ne.dispatch({type:$.bootstrap,plugins:ie,config:Z,params:L,user:X,initialUser:u,persistedUser:J});const ae=ie.filter(e=>d.pluginEnabled[e]),le=ie.filter(e=>!d.pluginEnabled[e]);return ne.dispatch({type:$.registerPlugins,plugins:ie,enabled:d.pluginEnabled}),d.pluginsArray.map((e,t)=>{const{bootstrap:n,config:r,name:i}=e;n&&l(n)&&n({instance:F,config:r,payload:e}),ne.dispatch({type:$.registerPluginType(i),name:i,enabled:d.pluginEnabled[i],plugin:e}),d.pluginsArray.length===t+1&&ne.dispatch({type:$.initializeStart,plugins:ae,disabled:le})}),F}const $e="before",je="after";export{Te as Analytics,_ as CONSTANTS,$ as EVENTS,Te as default,Te as init}; //# sourceMappingURL=analytics-core.modern.js.map