better-analytics
Version:
Zero-dependency micro-analytics JavaScript SDK < 3KB gzipped with React/Next.js/Expo support
2 lines (1 loc) • 9.57 kB
JavaScript
;"use client";var Q=Object.create;var v=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var q=Object.getPrototypeOf,L=Object.prototype.hasOwnProperty;var U=(e,n)=>{for(var t in n)v(e,t,{get:n[t],enumerable:!0})},C=(e,n,t,o)=>{if(n&&typeof n=="object"||typeof n=="function")for(let i of W(n))!L.call(e,i)&&i!==t&&v(e,i,{get:()=>n[i],enumerable:!(o=T(n,i))||o.enumerable});return e};var $=(e,n,t)=>(t=e!=null?Q(q(e)):{},C(n||!e||!e.__esModule?v(t,"default",{value:e,enumerable:!0}):t,e)),j=e=>C(v({},"__esModule",{value:!0}),e);var te={};U(te,{Analytics:()=>ee});module.exports=j(te);var u=$(require("react"));function R(){typeof window>"u"||window.ba?.ready||(window.baq=window.baq||[],window.ba=function(n,...t){if(window.ba?.ready&&window.ba.processQueue){window.ba.processQueue();return}let o={type:n,timestamp:Date.now()};n==="track"&&t[0]?(o.event=t[0],o.props=t[1]):n==="pageview"?o.props=t[0]:n==="identify"&&t[0]&&(o.props={userId:t[0],...t[1]}),window.baq=window.baq||[],window.baq.push(o)},window.ba.queue=window.baq)}function S(e){if(typeof window>"u")return;let n=window.baq||[];for(window.ba&&(window.ba.ready=!0,window.ba.processQueue=()=>S(e));n.length>0;){let t=n.shift();if(t)try{e(t)}catch{(t.retries||0)<3&&(t.retries=(t.retries||0)+1,n.push(t))}}}var A="ba_offline_queue",M=100;function I(e){if(!(typeof window>"u"))try{let t=[..._(),...e].slice(-M);localStorage.setItem(A,JSON.stringify(t))}catch{}}function _(){if(typeof window>"u")return[];try{let e=localStorage.getItem(A);if(e)return JSON.parse(e)}catch{}return[]}function k(){if(!(typeof window>"u"))try{localStorage.removeItem(A)}catch{}}var s=null,N="production",B;function V(){try{let e=process.env.NODE_ENV;if(e==="development"||e==="test")return"development"}catch{}return"production"}function X(e="auto"){if(e==="auto"){N=V();return}N=e}function z(){return N}function w(){return z()==="development"}function F(e){try{let n=new URL(e);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 J(){if(typeof window>"u")return"ssr";try{let n=localStorage.getItem("ba_s");if(n){let{id:t,t:o}=JSON.parse(n);if(Date.now()-o<18e5)return localStorage.setItem("ba_s",JSON.stringify({id:t,t:Date.now()})),t}}catch{}let e=Date.now().toString(36)+Math.random().toString(36).substring(2);try{localStorage.setItem("ba_s",JSON.stringify({id:e,t:Date.now()}))}catch{}return e}function H(){if(typeof window>"u")return"ssr";try{let n=localStorage.getItem("ba_d");if(n)return n}catch{}let e=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,t)=>{let o=(n<<5)-n+t.charCodeAt(0);return o&o},0)).toString(36)}`;try{localStorage.setItem("ba_d",e)}catch{}return e}function K(){if(typeof window>"u")return{};let e={},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 o=navigator.connection;o&&(n.connectionType=o.effectiveType)}Object.keys(n).length>0&&(e.device=n);let t={};if(document.title&&(t.title=document.title),window.location&&(t.pathname=window.location.pathname,t.hostname=window.location.hostname),window.performance?.timing){let o=window.performance.timing;if(o.loadEventEnd&&o.navigationStart){let i=o.loadEventEnd-o.navigationStart;i>0&&(t.loadTime=i)}}if(Object.keys(t).length>0&&(e.page=t),window.location?.href){let o=F(window.location.href),i={};o.utmSource&&(i.source=o.utmSource),o.utmMedium&&(i.medium=o.utmMedium),o.utmCampaign&&(i.campaign=o.utmCampaign),o.utmTerm&&(i.term=o.utmTerm),o.utmContent&&(i.content=o.utmContent),Object.keys(i).length>0&&(e.utm=i)}return e.sessionId=J(),{...e,deviceId:H()}}function x(e){s=e,X(e.mode),B=e.beforeSend,R();let n=_();if(n.length>0){k();for(let t of n)t.type==="track"&&t.event?b(t.event,t.props):t.type==="pageview"&&y()}if(S(t=>{if(t.type==="track"&&t.event)b(t.event,t.props);else if(t.type==="pageview")y();else if(t.type==="identify"){let o=t.props?.userId;o&&Y(o,t.props)}}),w()&&s.debug!==!1){let t=w()?"development":"production";if(console.log(`\u{1F680} Better Analytics initialized in ${t} mode`),s.debug){let o=s.endpoint||"https://better-analytics.app/api/collect (default)";console.log("\u{1F4CD} Endpoint:",o),console.log("\u{1F3F7}\uFE0F Site:",s.site),console.log("\u{1F50D} Events will be logged to console, not sent to server")}}else if(s.debug){let t=s.endpoint||"https://better-analytics.app/api/collect (default)";console.log("\u{1F680} Better Analytics initialized in production mode"),console.log("\u{1F4CD} Endpoint:",t),console.log("\u{1F3F7}\uFE0F Site:",s.site),console.log("\u{1F50D} Debug mode enabled - events will be logged AND sent to server")}}function y(e){b("pageview",e?{path:e}:void 0)}function b(e,n){if(!s){if(typeof window<"u"&&window.ba){window.ba("track",e,n);return}console.warn("Better Analytics: SDK not initialized. Call init() first.");return}if(!s.site){console.warn("Better Analytics: No site identifier provided. Please set the site parameter.");return}let t=K(),o={event:e,timestamp:Date.now(),url:typeof window<"u"?window.location.href:"",referrer:typeof window<"u"?document.referrer:"",site:s.site,...t.sessionId&&{sessionId:t.sessionId},...t.deviceId&&{deviceId:t.deviceId},...t.device&&{device:t.device},...t.page&&{page:t.page},...t.utm&&{utm:t.utm},...n&&{props:n}};if(B){let i=e==="pageview"?{type:"pageview",url:o.url,path:n?.path,data:o}:{type:"event",name:e,url:o.url,data:o},r=B(i);if(r instanceof Promise){r.then(a=>{a?.data&&D(a.data)});return}if(!r)return;if(r.data){D(r.data);return}}D(o)}function Y(e,n){if(typeof window<"u")try{localStorage.setItem("ba_uid",e)}catch{}b("identify",{userId:e,...n})}async function D(e){if(s){if(w()){if(console.log("\u{1F4E6} Data:",e),s.debug){let n=s.endpoint||"https://better-analytics.app/api/collect (default)";console.log("\u{1F4CA} Better Analytics Event:",e.event),console.log("\u{1F4CD} Endpoint:",n)}return}if(s.debug&&(console.log("\u{1F4CA} Better Analytics Event (debug):",e.event),console.log("\u{1F4E6} Data:",e)),typeof window<"u"&&!navigator.onLine){let n={type:e.event==="pageview"?"pageview":"track",event:e.event,props:e.props,timestamp:e.timestamp};I([n]);return}try{let n=s.endpoint||"https://better-analytics.app/api/collect",t=JSON.stringify(e);await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:t})}catch(n){if(typeof window<"u"){let t={type:e.event==="pageview"?"pageview":"track",event:e.event,props:e.props,timestamp:e.timestamp,retries:1};I([t])}w()&&console.error("Better Analytics: Failed to send event",n)}}}function O(e,n){if(!e||!n)return e;let t=e;try{let o=Object.entries(n);o.sort(([,i],[,r])=>{let a=Array.isArray(i)?i.join("/").length:i.length;return(Array.isArray(r)?r.join("/").length:r.length)-a});for(let[i,r]of o)if(!Array.isArray(r)){let a=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c=new RegExp(`/${a}(?=/|$)`,"g");c.test(t)&&(t=t.replace(c,`/[${i}]`))}for(let[i,r]of o)if(Array.isArray(r)){let a=r.join("/").replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c=new RegExp(`/${a}(?=/|$)`,"g");c.test(t)&&(t=t.replace(c,`/[...${i}]`))}return t}catch{return e}}var g=require("next/navigation");function Z(){let e=(0,g.usePathname)(),n=(0,g.useParams)(),t=(0,g.useSearchParams)();if(!e)return null;if(!n)return{route:e,path:e};let o=Object.keys(n).length?n:Object.fromEntries(t.entries());return{route:O(e,o)||e,path:e,params:o}}function G(e){let n=Z(),{api:t,endpoint:o,site:i,urlEnvVar:r,siteEnvVar:a,mode:c,debug:d,beforeSend:E}=e;return(0,u.useEffect)(()=>{let f=r||"NEXT_PUBLIC_BA_URL",l=a||"NEXT_PUBLIC_BA_SITE",p=m=>{switch(m){case"NEXT_PUBLIC_BA_URL":return process.env.NEXT_PUBLIC_BA_URL;case"NEXT_PUBLIC_BA_SITE":return process.env.NEXT_PUBLIC_BA_SITE;default:return process.env[m]}},h=t||o||p(f),P=i||p(l);if(P){let m={site:P,mode:c||"auto",debug:d,beforeSend:E,...h&&{endpoint:h}};x(m),d&&typeof window<"u"&&(console.log("\u{1F4E6} Next.js Analytics Sources:"),console.log(" URL:",t||o?"prop":h?`env(${f})`:"default SaaS"),console.log(" Site:",i?"prop":`env(${l})`),console.log("\u{1F50D} Environment variables:",{[f]:p(f),[l]:p(l)}),E&&console.log("\u{1F504} beforeSend middleware configured"))}else typeof window<"u"&&(process.env.NODE_ENV==="development"||d)&&(console.warn("\u26A0\uFE0F Better Analytics: No site identifier provided. Set",l,"environment variable or pass site prop."),d&&console.log("\u{1F50D} Debug env vars:",{[f]:p(f),[l]:p(l)}))},[t,o,i,r,a,c,d,E]),(0,u.useEffect)(()=>{n&&(y(n.path),d&&typeof window<"u"&&(console.log("\u{1F4CA} Next.js Analytics: Page view tracked"),console.log(" \u{1F4CD} Path:",n.path),console.log(" \u{1F500} Route:",n.route),n.params&&Object.keys(n.params).length>0&&console.log(" \u{1F4CC} Params:",n.params)))},[n?.path,d]),null}function ee(e={}){return u.default.createElement(u.Suspense,{fallback:null},u.default.createElement(G,e))}0&&(module.exports={Analytics});