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