@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
JavaScript
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?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},g.apply(null,arguments)}const y="function",h="undefined",b="reducer",w="@@redux/",I=w+"INIT",E=w+Math.random().toString(36),v=/* #__PURE__ */(()=>typeof Symbol===y&&Symbol.observable||"@@observable")(),S=" != "+y;function P(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"+S);return n(P)(e,t)}if(typeof e!==y)throw new Error(b+S);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"+S);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 "+b);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:I}),{dispatch:p,subscribe:d,getState:l,replaceReducer:function(e){if(typeof e!==y)throw new Error("next "+b+S);r=e,p({type:I})},[v]: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)}},[v](){return this}}}}}function N(e,t){const n=t&&t.type;return"action "+(n&&n.toString()||"?")+b+" "+e+" returns "+h}function A(...e){return 0===e.length?e=>e:1===e.length?e[0]:e.reduce((e,t)=>(...n)=>e(t(...n)))}const _=u+"anon_id",O=u+"user_id",k=u+"user_traits";var $={__proto__:null,ANON_ID:_,USER_ID:O,USER_TRAITS:k};const T="analytics",x="userId",j="anonymousId",z=["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"],M=["name","EVENTS","config","loaded"];var q=z.reduce((e,t)=>(e[t]=t,e),{registerPluginType:e=>`registerPlugin:${e}`,pluginReadyType:e=>`ready:${e}`});const V=/^utm_/,C=/^an_prop_/,U=/^an_trait_/;function R(e){const{setItem:t}=e.storage;return n=>r=>i=>{if(i.type===q.bootstrap){const{params:r,user:a,persistedUser:o,initialUser:s}=i,c=o.userId===a.userId;o.anonymousId!==a.anonymousId&&t(_,a.anonymousId),c||t(O,a.userId),s.traits&&t(k,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(V)||t.match(/^(d|g)clid/)){const n=t.replace(V,"");e.campaign["campaign"===n?"name":n]=r[t]}return t.match(C)&&(e.props[t.replace(C,"")]=r[t]),t.match(U)&&(e.traits[t.replace(U,"")]=r[t]),e},{campaign:{},props:{},traits:{}});n.dispatch(g({type:q.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:q.campaign,campaign:a.campaign})}}return r(i)}}function D(e){return function(t={},n={}){if(n.type===q.setItemEnd){if(n.key===_)return g({},t,{anonymousId:n.value});if(n.key===O)return g({},t,{userId:n.value})}switch(n.type){case q.identify:return Object.assign({},t,{userId:n.userId,traits:g({},t.traits,n.traits)});case q.reset:return[O,_,k].forEach(t=>{e.removeItem(t)}),Object.assign({},t,{userId:null,anonymousId:null,traits:{}});default:return t}}}function B(e){return{userId:e.getItem(O),anonymousId:e.getItem(_),traits:e.getItem(k)}}const L=e=>u+"TEMP"+u+e;function J(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===q.reset&&([O,k,_].forEach(e=>{r(e)}),[x,j,"traits"].forEach(e=>{i(L(e))})),s.type===q.identify){a(_)||n(_,e());const r=a(O),i=a(k)||{};r&&r!==c&&t.dispatch({type:q.userIdChanged,old:{userId:r,traits:i},new:{userId:c,traits:u},options:l}),c&&n(O,c),u&&n(k,g({},i,u))}return o(s)}}const X={};function H(e,t){X[e]&&l(X[e])&&(X[e](t),delete X[e])}function W(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=>W(e,t,n-10).then(r,i)))}function F(e){return{abort:e}}function G(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[x,j].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:F}),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 K=/Start$/,Q=/^bootstrap/,Y=/^ready/;async function Z({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(K);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(K)?function(e,t,n,r,i){return function(a,o){const s=r?r.name:e;let c=o&&oe(o)?o:n;if(r&&(c=o&&oe(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:ue(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=ce(e);if(n&&n.name===t){const r=ce(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:te(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),ie(w,l))return ee({data:w,method:p,instance:n,pluginName:l,store:o}),Promise.resolve(m);if(ie(m,l))return s&&ee({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:te(l,u,i),plugins:u}),v=g({},m,c(E)?E:{}),S=b[l];if(ie(S,l))ee({data:S,method:p,instance:n,pluginName:l,store:o});else{const e=`${p}:${l}`;(e.match(/:/g)||[]).length<2&&!p.match(Q)&&!p.match(Y)&&n.dispatch(g({},f?v:w,{type:e,_:{called:e,from:"submethod"}}))}return Promise.resolve(v)},Promise.resolve(t));if(!(p.match(K)||p.match(/^registerPlugin/)||p.match(Y)||p.match(Q)||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"}});ae(w,e.exact.length)&&!p.match(/End$/)&&(t=g({},t,{type:w.type+"Aborted"})),o.dispatch(t)}return w}function ee({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 te(e,t,n){const r=t[e]||n[e];return r&&r.config?r.config:{}}function ne(e,t){return t.reduce((t,n)=>n[e]?t.concat({methodName:e,pluginName:n.name,method:n[e]}):t,[])}function re(e,t){const n=e.replace(K,""),r=t?`:${t}`:"";return[`${e}${r}`,`${n}${r}`,`${n}End${r}`]}function ie({abort:e},t){return!!e&&(!0===e||se(e,t)||e&&se(e.plugins,t))}function ae({abort:e},t){if(!e)return!1;if(!0===e||p(e))return!0;const{plugins:n}=e;return oe(e)&&e.length===t||oe(n)&&n.length===t}function oe(e){return Array.isArray(e)}function se(e,t){return!(!e||!oe(e))&&e.includes(t)}function ce(e){const t=e.match(/(.*):(.*)/);return!!t&&{method:t[1],name:t[2]}}function ue(e){return Object.keys(e).reduce((t,n)=>("type"===n||(t[n]=c(e[n])?Object.assign({},e[n]):e[n]),t),{})}function le(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===q.enablePlugin&&i.dispatch({type:q.initializeStart,plugins:u,disabled:[],fromEnable:!0,meta:o.meta}),s===q.disablePlugin&&setTimeout(()=>H(o.meta.rid,{payload:o}),0),s===q.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 W(e,()=>t({config:a}),1e4).then(t=>(r[n]||(i.dispatch({type:q.pluginReadyType(n),name:n,events:Object.keys(e).filter(e=>!M.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:q.ready},t))},0)})}if(s!==q.bootstrap){/^ready:([^:]*)$/.test(s)&&setTimeout(()=>G(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(K,"");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===q.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){const n=re(e).map(e=>ne(e,t));return t.reduce((n,r)=>{const{name:i}=r,a=re(e,i),[o,s,c]=a.map(e=>ne(e,t));return o.length&&(n.beforeNS[i]=o),s.length&&(n.duringNS[i]=s),c.length&&(n.afterNS[i]=c),n},{before:n[0],beforeNS:{},during:n[1],duringNS:{},after:n[2],afterNS:{}})}(o,u),m=await Z({action:e,data:{exact:f.before,namespaced:f.beforeNS},state:c,allPlugins:a,allMatches:f,instance:n,store:r,EVENTS:i});if(ae(m,p.length))return m;let y;if(y=o===s?m:await Z({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(K)){const e=`${s}End`,t=await Z({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&&H(t.meta.rid,{payload:t})}return m}(o,t,e,i,n);return a(r)}return a(p)}}function de(e){return t=>t=>n=>{const{type:r,key:i,value:a,options:o}=n;if(r===q.setItem||r===q.removeItem){if(n.abort)return t(n);r===q.setItem?e.setItem(i,a,o):e.removeItem(i,o)}return t(n)}}class pe{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 A(...this[e].map(e=>e(i)))(n)(r)}}}function fe(e){return function(t={},n){let r={};if("initialize:aborted"===n.type)return t;if(/^registerPlugin:([^:]*)$/.test(n.type)){const i=me(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=me(n.type,q.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 q.disablePlugin:return g({},t,ge(n.plugins,!1,t));case q.enablePlugin:return g({},t,ge(n.plugins,!0,t));default:return t}}}function me(e,t){return e.substring(t.length+1,e.length)}function ge(e,t,n){return e.reduce((e,r)=>(e[r]=g({},n[r],{enabled:t}),e),n)}function ye(e){try{return JSON.parse(JSON.stringify(e))}catch(e){}return e}const he={last:{},history:[]};function be(e=he,t){const{type:n,event:r,properties:i,options:a,meta:o}=t;if(n===q.track){const t=ye(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 we={actions:[]};function Ie(e=we,t){const{type:n,payload:r}=t;switch(n){case"queue":let n;return n=r&&r.type&&r.type===q.identify?[t].concat(e.actions):e.actions.concat(t),g({},e,{actions:n});case"dequeue":return[];default:return e}}const Ee=/#.*$/;function ve(e){const t=/(http[s]?:\/\/)?([^\/\s]+\/)(.*)/g.exec(e);return"/"+(t&&t[3]?t[3].split("?")[0].replace(Ee,""):"")}const Se=(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(Ee,"")}(s),u={title:t,url:c,path:ve(c),hash:o,search:s,width:i,height:a};return n&&""!==n&&(u.referrer=n),g({},u,e)},Pe={last:{},history:[]};function Ne(e=Pe,t){const{properties:n,options:r,meta:i}=t;if(t.type===q.page){const t=ye(g({properties:n,meta:i},Object.keys(r).length&&{options:r}));return g({},e,{last:t,history:e.history.concat(t)})}return e}let Ae,_e;Ae="na",_e={};const Oe={initialized:!1,sessionId:e(),app:null,version:null,debug:!1,offline:!!f&&!navigator.onLine,os:{name:"na"},userAgent:f?navigator.userAgent:"node",library:{name:T,version:"0.13.1"},timezone:void 0,locale:void 0,campaign:{},referrer:_e};function ke(e=Oe,t){const{initialized:n}=e,{type:r,campaign:i}=t;switch(r){case q.campaign:return g({},e,{campaign:i});case q.offline:return g({},e,{offline:!0});case q.online:return g({},e,{offline:!1});default:return n?e:g({},Oe,e,{initialized:!0})}}const $e=["plugins","reducers","storage"];function Te(){return a(T,[]),e=>(t,n,r)=>{const i=e(t,n,r),a=i.dispatch;return Object.assign(i,{dispatch:e=>(o[s][T].push(e.action||e),a(e))})}}function xe(e){return function(){return A(A.apply(null,arguments),Te())}}function je(e){return e?m(e)?e:[e]:[]}function ze(t={},n,r){const i=e();var a,o;return n&&(X[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 Me(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]=K,r.apply({instance:K},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]:B(e)[t]||r(L(t))||null)}}(m);let v=d.plugins;const S=d.events.filter(e=>!M.includes(e)).sort(),O=new Set(S.concat(z).filter(e=>!M.includes(e))),k=Array.from(O).sort(),$=()=>v,{addMiddleware:T,removeMiddleware:V,dynamicMiddlewares:C}=new pe,U=()=>{throw new Error("Abort disabled inListener")},X=t(),H=B(m),W=g({},H,u,X.an_uid?{userId:X.an_uid}:{},X.an_aid?{anonymousId:X.an_aid}:{});W.anonymousId||(W.anonymousId=e());const F=g({enable:(e,t)=>new Promise(n=>{ie.dispatch({type:q.enablePlugin,plugins:je(e),_:{originalAction:q.enablePlugin}},n,[t])}),disable:(e,t)=>new Promise(n=>{ie.dispatch({type:q.disablePlugin,plugins:je(e),_:{originalAction:q.disablePlugin}},n,[t])})},d.methods);let G=!1;const K={identify:async(e,t,n,r)=>{const i=p(e)?e:null,o=c(e)?e:t,s=n||{},u=K.user();a(L(x),i);const l=i||o.userId||w(x,K,o);return new Promise(e=>{ie.dispatch(g({type:q.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=>{ie.dispatch({type:q.trackStart,event:i,properties:a,options:o,userId:w(x,K,t),anonymousId:w(j,K,t)},e,[t,n,r])})},page:async(e,t,n)=>{const r=c(e)?e:{},i=c(t)?t:{};return new Promise(a=>{ie.dispatch({type:q.pageStart,properties:Se(r),options:i,userId:w(x,K,r),anonymousId:w(j,K,r)},a,[e,t,n])})},user:e=>{if(e===x||"id"===e)return w(x,K);if(e===j||"anonId"===e)return w(j,K);const t=K.getState("user");return e?n(t,e):t},reset:e=>new Promise(t=>{ie.dispatch({type:q.resetStart},t,e)}),ready:e=>(G&&e({plugins:F,instance:K}),K.on(q.ready,t=>{e&&e(t),G=!0})),on:(e,t)=>{if(!e||!l(t))return!1;if(e===q.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:K,plugins:v}),e(r)),r=e=>e=>r=>(r.type.match(n)||t({payload:r,instance:K,plugins:v}),e(r));return T(e,qe),T(r,Ve),()=>{V(e,qe),V(r,Ve)}}const r=e.match(n)?qe:Ve,i=n=>n=>r=>(r.type===e&&t({payload:r,instance:K,plugins:v,abort:U}),n(r));return T(i,r),()=>V(i,r)},once:(e,t)=>{if(!e||!l(t))return!1;if(e===q.bootstrap)throw new Error(".once disabled for "+e);const n=K.on(e,({payload:e})=>{t({payload:e,instance:K,plugins:v,abort:U}),n()});return n},getState:e=>{const t=ie.getState();return e?n(t,e):Object.assign({},t)},dispatch:e=>{const t=p(e)?{type:e}:e;if(z.includes(t.type))throw new Error("reserved action "+t.type);const n=g({},t,{_:g({originalAction:t.type},e._||{})});ie.dispatch(n)},enablePlugin:F.enable,disablePlugin:F.disable,plugins:F,storage:{getItem:m.getItem,setItem:(e,t,n)=>{ie.dispatch({type:q.setItemStart,key:e,value:t,options:n})},removeItem:(e,t)=>{ie.dispatch({type:q.removeItemStart,key:e,options:t})}},setAnonymousId:(e,t)=>{K.storage.setItem(_,e,t)},events:{core:z,plugins:S}},Q=d.middlewares.concat([e=>e=>t=>(t.meta||(t.meta=ze()),e(t)),C(qe),le(K,$,{all:k,plugins:S}),de(m),R(K),J(K),C(Ve)]),Y={context:ke,user:D(m),page:Ne,track:be,plugins:fe($),queue:Ie};let Z=A,ee=A;if(f&&o.debug){const e=window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__;e&&(Z=e({trace:!0,traceLimit:25})),ee=function(){return 0===arguments.length?Te():c(typeof arguments[0])?xe():xe().apply(null,arguments)}}const te=function(e){return Object.keys(e).reduce((t,n)=>($e.includes(n)||(t[n]=e[n]),t),{})}(o),ne=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},{}),re={context:te,user:W,plugins:ne},ie=P(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:I})===h||typeof n(void 0,{type:E})===h)throw new Error(b+" "+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=N(s,t);throw new Error(e)}o[s]=u,a=a||u!==c}return a?o:e}}(g({},Y,s)),re,ee(Z(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=A(...s)(a.dispatch),g({},a,{dispatch:o})}}(...Q))));var ae;ie.dispatch=(ae=ie.dispatch,function(e,t,n){const r=g({},e,{meta:ze(e.meta,t,je(n))});return ae.apply(null,[r])});const oe=Object.keys(v);ie.dispatch({type:q.bootstrap,plugins:oe,config:te,params:X,user:W,initialUser:u,persistedUser:H});const se=oe.filter(e=>d.pluginEnabled[e]),ce=oe.filter(e=>!d.pluginEnabled[e]);return ie.dispatch({type:q.registerPlugins,plugins:oe,enabled:d.pluginEnabled}),d.pluginsArray.map((e,t)=>{const{bootstrap:n,config:r,name:i}=e;n&&l(n)&&n({instance:K,config:r,payload:e}),ie.dispatch({type:q.registerPluginType(i),name:i,enabled:d.pluginEnabled[i],plugin:e}),d.pluginsArray.length===t+1&&ie.dispatch({type:q.initializeStart,plugins:se,disabled:ce})}),K}const qe="before",Ve="after";export{Me as Analytics,$ as CONSTANTS,q as EVENTS,Me as default,Me as init};
//# sourceMappingURL=analytics-core.modern.js.map