better-analytics
Version:
Zero-dependency micro-analytics JavaScript SDK < 3KB gzipped with React/Next.js/Expo support
2 lines (1 loc) • 7.88 kB
JavaScript
;var p=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var Q=Object.prototype.hasOwnProperty;var x=(t,n)=>{for(var e in n)p(t,e,{get:n[e],enumerable:!0})},O=(t,n,e,i)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of A(n))!Q.call(t,o)&&o!==e&&p(t,o,{get:()=>n[o],enumerable:!(i=D(n,o))||i.enumerable});return t};var k=t=>O(p({},"__esModule",{value:!0}),t);var j={};x(j,{_resetConfig:()=>T,computeRoute:()=>$,identify:()=>I,init:()=>S,initWithPageview:()=>R,track:()=>d,trackPageview:()=>g});module.exports=k(j);function h(){typeof window>"u"||window.ba?.ready||(window.baq=window.baq||[],window.ba=function(n,...e){if(window.ba?.ready&&window.ba.processQueue){window.ba.processQueue();return}let i={type:n,timestamp:Date.now()};n==="track"&&e[0]?(i.event=e[0],i.props=e[1]):n==="pageview"?i.props=e[0]:n==="identify"&&e[0]&&(i.props={userId:e[0],...e[1]}),window.baq=window.baq||[],window.baq.push(i)},window.ba.queue=window.baq)}function w(t){if(typeof window>"u")return;let n=window.baq||[];for(window.ba&&(window.ba.ready=!0,window.ba.processQueue=()=>w(t));n.length>0;){let e=n.shift();if(e)try{t(e)}catch{(e.retries||0)<3&&(e.retries=(e.retries||0)+1,n.push(e))}}}var v="ba_offline_queue",N=100;function m(t){if(!(typeof window>"u"))try{let e=[...y(),...t].slice(-N);localStorage.setItem(v,JSON.stringify(e))}catch{}}function y(){if(typeof window>"u")return[];try{let t=localStorage.getItem(v);if(t)return JSON.parse(t)}catch{}return[]}function E(){if(!(typeof window>"u"))try{localStorage.removeItem(v)}catch{}}var r=null,u="production",f;function W(){try{let t=process.env.NODE_ENV;if(t==="development"||t==="test")return"development"}catch{}return"production"}function C(t="auto"){if(t==="auto"){u=W();return}u=t}function _(){return u}function l(){return _()==="development"}function q(t){try{let n=new URL(t);return{utmSource:n.searchParams.get("utm_source"),utmMedium:n.searchParams.get("utm_medium"),utmCampaign:n.searchParams.get("utm_campaign"),utmTerm:n.searchParams.get("utm_term"),utmContent:n.searchParams.get("utm_content")}}catch{return{utmSource:null,utmMedium:null,utmCampaign:null,utmTerm:null,utmContent:null}}}function B(){if(typeof window>"u")return"ssr";try{let n=localStorage.getItem("ba_s");if(n){let{id:e,t:i}=JSON.parse(n);if(Date.now()-i<18e5)return localStorage.setItem("ba_s",JSON.stringify({id:e,t:Date.now()})),e}}catch{}let t=Date.now().toString(36)+Math.random().toString(36).substring(2);try{localStorage.setItem("ba_s",JSON.stringify({id:t,t:Date.now()}))}catch{}return t}function M(){if(typeof window>"u")return"ssr";try{let n=localStorage.getItem("ba_d");if(n)return n}catch{}let t=crypto?.randomUUID?.()||`${Date.now().toString(36)}-${Math.random().toString(36).substring(2)}-${Math.abs([navigator.language||"",screen.width||0,screen.height||0,new Date().getTimezoneOffset()].join("|").split("").reduce((n,e)=>{let i=(n<<5)-n+e.charCodeAt(0);return i&i},0)).toString(36)}`;try{localStorage.setItem("ba_d",t)}catch{}return t}function P(){if(typeof window>"u")return{};let t={},n={};navigator.userAgent&&(n.userAgent=navigator.userAgent),screen.width&&screen.height&&(n.screenWidth=screen.width,n.screenHeight=screen.height),window.innerWidth&&window.innerHeight&&(n.viewportWidth=window.innerWidth,n.viewportHeight=window.innerHeight),navigator.language&&(n.language=navigator.language);try{n.timezone=Intl.DateTimeFormat().resolvedOptions().timeZone}catch{}if("connection"in navigator){let i=navigator.connection;i&&(n.connectionType=i.effectiveType)}Object.keys(n).length>0&&(t.device=n);let e={};if(document.title&&(e.title=document.title),window.location&&(e.pathname=window.location.pathname,e.hostname=window.location.hostname),window.performance?.timing){let i=window.performance.timing;if(i.loadEventEnd&&i.navigationStart){let o=i.loadEventEnd-i.navigationStart;o>0&&(e.loadTime=o)}}if(Object.keys(e).length>0&&(t.page=e),window.location?.href){let i=q(window.location.href),o={};i.utmSource&&(o.source=i.utmSource),i.utmMedium&&(o.medium=i.utmMedium),i.utmCampaign&&(o.campaign=i.utmCampaign),i.utmTerm&&(o.term=i.utmTerm),i.utmContent&&(o.content=i.utmContent),Object.keys(o).length>0&&(t.utm=o)}return t.sessionId=B(),{...t,deviceId:M()}}function S(t){r=t,C(t.mode),f=t.beforeSend,h();let n=y();if(n.length>0){E();for(let e of n)e.type==="track"&&e.event?d(e.event,e.props):e.type==="pageview"&&g()}if(w(e=>{if(e.type==="track"&&e.event)d(e.event,e.props);else if(e.type==="pageview")g();else if(e.type==="identify"){let i=e.props?.userId;i&&I(i,e.props)}}),l()&&r.debug!==!1){let e=l()?"development":"production";if(console.log(`\u{1F680} Better Analytics initialized in ${e} mode`),r.debug){let i=r.endpoint||"https://better-analytics.app/api/collect (default)";console.log("\u{1F4CD} Endpoint:",i),console.log("\u{1F3F7}\uFE0F Site:",r.site),console.log("\u{1F50D} Events will be logged to console, not sent to server")}}else if(r.debug){let e=r.endpoint||"https://better-analytics.app/api/collect (default)";console.log("\u{1F680} Better Analytics initialized in production mode"),console.log("\u{1F4CD} Endpoint:",e),console.log("\u{1F3F7}\uFE0F Site:",r.site),console.log("\u{1F50D} Debug mode enabled - events will be logged AND sent to server")}}function R(t){S(t),g()}function g(t){d("pageview",t?{path:t}:void 0)}function d(t,n){if(!r){if(typeof window<"u"&&window.ba){window.ba("track",t,n);return}console.warn("Better Analytics: SDK not initialized. Call init() first.");return}if(!r.site){console.warn("Better Analytics: No site identifier provided. Please set the site parameter.");return}let e=P(),i={event:t,timestamp:Date.now(),url:typeof window<"u"?window.location.href:"",referrer:typeof window<"u"?document.referrer:"",site:r.site,...e.sessionId&&{sessionId:e.sessionId},...e.deviceId&&{deviceId:e.deviceId},...e.device&&{device:e.device},...e.page&&{page:e.page},...e.utm&&{utm:e.utm},...n&&{props:n}};if(f){let o=t==="pageview"?{type:"pageview",url:i.url,path:n?.path,data:i}:{type:"event",name:t,url:i.url,data:i},a=f(o);if(a instanceof Promise){a.then(s=>{s?.data&&b(s.data)});return}if(!a)return;if(a.data){b(a.data);return}}b(i)}function I(t,n){if(typeof window<"u")try{localStorage.setItem("ba_uid",t)}catch{}d("identify",{userId:t,...n})}async function b(t){if(r){if(l()){if(console.log("\u{1F4E6} Data:",t),r.debug){let n=r.endpoint||"https://better-analytics.app/api/collect (default)";console.log("\u{1F4CA} Better Analytics Event:",t.event),console.log("\u{1F4CD} Endpoint:",n)}return}if(r.debug&&(console.log("\u{1F4CA} Better Analytics Event (debug):",t.event),console.log("\u{1F4E6} Data:",t)),typeof window<"u"&&!navigator.onLine){let n={type:t.event==="pageview"?"pageview":"track",event:t.event,props:t.props,timestamp:t.timestamp};m([n]);return}try{let n=r.endpoint||"https://better-analytics.app/api/collect",e=JSON.stringify(t);await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:e})}catch(n){if(typeof window<"u"){let e={type:t.event==="pageview"?"pageview":"track",event:t.event,props:t.props,timestamp:t.timestamp,retries:1};m([e])}l()&&console.error("Better Analytics: Failed to send event",n)}}}function $(t,n){if(!t||!n)return t;let e=t;try{let i=Object.entries(n);i.sort(([,o],[,a])=>{let s=Array.isArray(o)?o.join("/").length:o.length;return(Array.isArray(a)?a.join("/").length:a.length)-s});for(let[o,a]of i)if(!Array.isArray(a)){let s=a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c=new RegExp(`/${s}(?=/|$)`,"g");c.test(e)&&(e=e.replace(c,`/[${o}]`))}for(let[o,a]of i)if(Array.isArray(a)){let s=a.join("/").replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c=new RegExp(`/${s}(?=/|$)`,"g");c.test(e)&&(e=e.replace(c,`/[...${o}]`))}return e}catch{return t}}function T(){r=null,u="production",f=void 0}0&&(module.exports={_resetConfig,computeRoute,identify,init,initWithPageview,track,trackPageview});