@trainerday/analytics-client
Version:
A lightweight JavaScript analytics client library with offline support for Hybrid and Progressive Web Apps
8 lines • 8.11 kB
JavaScript
/*!
* mixpanel-lite.js - v1.3.3
* Lightweight version of mixpanel-js with offline support
* https://github.com/john-doherty/mixpanel-lite
* @author John Doherty <www.johndoherty.info>
* @license MIT
*/
!function(e,n){"use strict";if(e.localStorage)if(e.Promise){var t="https://api.mixpanel.com/track?ip=1&verbose=1&data=",i="https://api.mixpanel.com/engage?ip=1&verbose=1&data=",r=null,o=!1,a="1"===String(navigator.doNotTrack||"0"),s={},l={_key:"mixpanel-lite",all:function(){return JSON.parse(localStorage.getItem(l._key)||"[]")},add:function(e){var n=l.all();(function(e,n,t){e=JSON.parse(JSON.stringify(e||{})),n=JSON.parse(JSON.stringify(n||{}));for(var i=0,r=(t=t||[]).length;i<r;i++)g(e,t[i]),g(n,t[i]);return JSON.stringify(e)===JSON.stringify(n)})(e,n.slice(-1)[0]||{},["properties.time","properties.$insert_id"])||(n.push(e),localStorage.setItem(l._key,JSON.stringify(n)))},clear:function(){localStorage.setItem(l._key,JSON.stringify([]))},reset:function(e){localStorage.setItem(l._key,JSON.stringify(e||[]))}},c={init:function(e,n){console.log("mixpanel.track('"+e+"',"+JSON.stringify(n||{})+")")},track:function(e,n){console.log("mixpanel.track('"+e+"',"+JSON.stringify(n||{})+")")},register:function(e){console.log("mixpanel.register("+JSON.stringify(e||{})+")")},reset:function(){console.log("mixpanel.reset()")},identify:function(e){console.log("mixpanel.identify('"+e+"')")},people:{set:function(e){console.log("mixpanel.people.set("+JSON.stringify(e||{})+")")}},mute:v,unmute:h,muted:!0},d={init:y,track:f,register:function(e){Object.keys(e||{}).forEach(function(n){null!==e[n]&&""!==e[n]?s[n]=e[n]:delete s[n]})},reset:function(){y(r),o&&console.log("mixpanel.reset()")},identify:function(e){e&&""!==e.trim()?(o&&console.log("mixpanel.identify('"+e+"')"),f("$identify",{$anon_distinct_id:s.distinct_id,distinct_id:e,$user_id:e}),s.distinct_id=e,s.$user_id=e):console.warn("mixpanel.identify: Invalid id")},people:{set:function(e){if(e&&"object"==typeof e)if(a)console.warn("mixpanel.track: user does not want to be tracked");else{var n={$token:r,$distinct_id:s.distinct_id,$set:{}};Object.keys(e||{}).forEach(function(t){n.$set[t]=e[t]}),Object.keys(n.$set).forEach(function(e){null!==n.$set[e]&&""!==n.$set[e]||delete n.$set[e]}),l.add(n),p(),o&&(console.log("mixpanel.people.set("+JSON.stringify(e||{})+")"),console.dir(n))}else console.warn("mixpanel.setPeople: Invalid data param, must be an object")}},mute:v,unmute:h,muted:!1};e.mixpanel=d,e.addEventListener(e.cordova?"deviceready":"load",p,{passive:!0}),e.addEventListener("online",p,{passive:!0})}else console.warn("mixpanel-lite: Promise not supported (try adding a polyfill)");else console.warn("mixpanel-lite: localStorage not supported");function u(){var e=navigator.connection||navigator.mozConnection||navigator.webkitConnection||{};return e.effectiveType||e.type||""}function f(e,n){if(r)if(e&&""!==e)if(n&&"object"!=typeof n)console.warn("mixpanel.track: Data param must be an object");else if(a)console.warn("mixpanel.track: user does not want to be tracked");else{var t,i={event:e,properties:(t=s,JSON.parse(JSON.stringify(t)))};Object.keys(n||{}).forEach(function(e){i.properties[e]=n[e]}),i.properties.$insert_id=Math.random().toString(36).substring(2,10)+Math.random().toString(36).substring(2,10),i.properties.time=Math.round((new Date).getTime()/1e3),Object.keys(i.properties).forEach(function(e){null!==i.properties[e]&&""!==i.properties[e]||delete i.properties[e]}),l.add(i),p(),o&&(n?console.log("mixpanel.track('"+e+"',"+JSON.stringify(n||{})+")"):console.log("mixpanel.track('"+e+"')"),console.dir(i))}else console.warn("mixpanel.track: Invalid eventName");else console.warn("mixpanel.track: You must call mixpanel.init(token) first")}function p(){var n,r,o=l.all().filter(function(e){return!e.__completed}),a=o.map(function(n){return function(){var r,o=n.$set?i:t,a=(r=JSON.stringify(n),e.btoa(unescape(encodeURIComponent(r))));return o+=encodeURIComponent(a)+"&_="+(new Date).getTime(),n.__completed=!1,function(e){return new Promise(function(n,t){var i=new XMLHttpRequest;i.open("GET",e),i.withCredentials=!0,i.onreadystatechange=function(){4===i.readyState&&(200===i.status?n({url:e,status:200,body:i.responseText||""}):t({url:e,status:i.status,body:i.responseText||""}))},i.send()})}(o).then(function(){n.__completed=!0})}});(n=a,r=Promise.resolve(),n.forEach(function(e){r=r.then(e)}),r).then(function(){var e=o.filter(function(e){return!e.__completed});l.reset(e)})}function g(e,n){if(e&&n){"string"==typeof n&&(n=n.split("."));for(var t=0;t<n.length-1;t++)if(void 0===(e=e[n[t]]))return;delete e[n.pop()]}}function m(){var n=navigator.userAgent,t=navigator.vendor||"";function i(e,n){return-1!==e.indexOf(n)}return e.opera||i(n," OPR/")?i(n,"Mini")?"Opera Mini":"Opera":/(BlackBerry|PlayBook|BB10)/i.test(n)?"BlackBerry":i(n,"IEMobile")||i(n,"WPDesktop")?"Internet Explorer Mobile":i(n,"Edge")?"Microsoft Edge":i(n,"FBIOS")?"Facebook Mobile":i(n,"Chrome")?"Chrome":i(n,"CriOS")?"Chrome iOS":i(n,"UCWEB")||i(n,"UCBrowser")?"UC Browser":i(n,"FxiOS")?"Firefox iOS":i(t,"Apple")?i(n,"Mobile")?"Mobile Safari":"Safari":i(n,"Android")?"Android Mobile":i(n,"Konqueror")?"Konqueror":i(n,"Firefox")?"Firefox":i(n,"MSIE")||i(n,"Trident/")?"Internet Explorer":i(n,"Gecko")?"Mozilla":""}function v(){e.mixpanel=c}function h(){e.mixpanel=d}function y(a,l){if(!0===(l=l||{}).mute&&(e.mixpanel=c),l.trackingUrl&&""!==l.trackingUrl&&(t=l.trackingUrl),l.engageUrl&&""!==l.engageUrl&&(i=l.engageUrl),""!==(a=String(a||""))){r=a,o=!0===l.debug;var d,f,p,g,v=(d=function(){for(var e=1*new Date,n=0;e==1*new Date;)n++;return e.toString(16)+n.toString(16)},f=(screen.height*screen.width).toString(16),d()+"-"+Math.random().toString(16).replace(".","")+"-"+function(){var e,n,t=navigator.userAgent,i=[],r=0;function o(e,n){var t,r=0;for(t=0;t<n.length;t++)r|=i[t]<<8*t;return e^r}for(e=0;e<t.length;e++)n=t.charCodeAt(e),i.unshift(255&n),i.length>=4&&(r=o(r,i),i=[]);return i.length>0&&(r=o(r,i)),r.toString(16)}()+"-"+f+"-"+d());s={token:a,$os:(g=navigator.userAgent,/Windows/i.test(g)?/Phone/.test(g)||/WPDesktop/.test(g)?"Windows Phone":"Windows":/(iPhone|iPad|iPod)/.test(g)?"iOS":/Android/.test(g)?"Android":/(BlackBerry|PlayBook|BB10)/i.test(g)?"BlackBerry":/Mac/i.test(g)?"Mac OS X":/Linux/.test(g)?"Linux":/CrOS/.test(g)?"Chrome OS":""),$browser:m(),$browser_version:function(){var e=m(),n=navigator.userAgent,t={"Internet Explorer Mobile":/rv:(\d+(\.\d+)?)/,"Microsoft Edge":/Edge\/(\d+(\.\d+)?)/,Chrome:/Chrome\/(\d+(\.\d+)?)/,"Chrome iOS":/CriOS\/(\d+(\.\d+)?)/,"UC Browser":/(UCBrowser|UCWEB)\/(\d+(\.\d+)?)/,Safari:/Version\/(\d+(\.\d+)?)/,"Mobile Safari":/Version\/(\d+(\.\d+)?)/,Opera:/(Opera|OPR)\/(\d+(\.\d+)?)/,Firefox:/Firefox\/(\d+(\.\d+)?)/,"Firefox iOS":/FxiOS\/(\d+(\.\d+)?)/,Konqueror:/Konqueror:(\d+(\.\d+)?)/,BlackBerry:/BlackBerry (\d+(\.\d+)?)/,"Android Mobile":/android\s(\d+(\.\d+)?)/,"Internet Explorer":/(rv:|MSIE )(\d+(\.\d+)?)/,Mozilla:/rv:(\d+(\.\d+)?)/}[e];if(void 0===t)return null;var i=n.match(t);return i?parseFloat(i[i.length-2]):null}(),$device:function(){var e=navigator.userAgent;return/Windows Phone/i.test(e)||/WPDesktop/.test(e)?"Windows Phone":/iPad/.test(e)?"iPad":/iPod/.test(e)?"iPod Touch":/iPhone/.test(e)?"iPhone":/(BlackBerry|PlayBook|BB10)/i.test(e)?"BlackBerry":/Android/.test(e)?"Android":""}(),$screen_height:screen.height,$screen_width:screen.width,$referrer:n.referrer,$referring_domain:(p=String(n.referrer||"").split("/"),p.length>=3?p[2]:""),distinct_id:v,$device_id:v,mp_lib:"mixpanel-lite",$lib_version:"1.3.3"},0===String(e.location.protocol).indexOf("http")&&(s.$current_url=e.location.href),e.device&&(e.device.manufacturer&&(s.$manufacturer=e.device.manufacturer),e.device.model&&(s.$model=e.device.model),e.device.version&&(s.$os_version=e.device.version)),s.connectionType=u();var h=navigator.connection||navigator.mozConnection||navigator.webkitConnection;h&&h.addEventListener&&h.addEventListener("change",function(){s.connectionType=u()}),o&&console.log("mixpanel.init('"+r+"')")}else console.warn("mixpanel.init: invalid token")}}(this,document);