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