UNPKG

pathingjs

Version:

Enhanced analytics tracking library with comprehensive device, browser, and engagement data collection

3 lines (2 loc) 10.4 kB
"use strict";(()=>{var k=Object.defineProperty,j=Object.defineProperties;var A=Object.getOwnPropertyDescriptors;var b=Object.getOwnPropertySymbols;var H=Object.prototype.hasOwnProperty,_=Object.prototype.propertyIsEnumerable;var E=(e,t,n)=>t in e?k(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,c=(e,t)=>{for(var n in t||(t={}))H.call(t,n)&&E(e,n,t[n]);if(b)for(var n of b(t))_.call(t,n)&&E(e,n,t[n]);return e},d=(e,t)=>j(e,A(t));var S=(e,t)=>{for(var n in t)k(e,n,{get:t[n],enumerable:!0})};var h={};S(h,{button:()=>g,playback:()=>m,purchase:()=>p});var s={publicKey:null,verificationError:!1};var r=class e{constructor(t,n,o){this.label=t;this.key=n;this.value=o}static unwrap(t){let n={};for(let[o,i]of Object.entries(t))n[o]=i instanceof e?i.value:i;return n}static metadata(t){let n={};for(let[o,i]of Object.entries(t))i instanceof e&&(n[o]={label:i.label,key:i.key});return n}};var D={getBrowserInfo(){return typeof window=="undefined"||typeof navigator=="undefined"?{}:{userAgent:navigator.userAgent,language:navigator.language,languages:Array.from(navigator.languages||[]),cookieEnabled:navigator.cookieEnabled,doNotTrack:navigator.doNotTrack||navigator.doNotTrack||window.doNotTrack,vendor:navigator.vendor,platform:navigator.platform,screenWidth:window.screen.width,screenHeight:window.screen.height,screenColorDepth:window.screen.colorDepth,screenPixelDepth:window.screen.pixelDepth,innerWidth:window.innerWidth,innerHeight:window.innerHeight,devicePixelRatio:window.devicePixelRatio,orientation:typeof window.screen.orientation=="object"?window.screen.orientation.type:"unknown"}},getConnectionInfo(){if(typeof navigator=="undefined"||!navigator.connection)return{};let e=navigator.connection;return{effectiveType:e.effectiveType,downlink:e.downlink,rtt:e.rtt,saveData:e.saveData}},getPerformanceInfo(){if(typeof window=="undefined"||!window.performance)return{};let e={};if(window.performance.timing){let t=window.performance.timing;e={connectEnd:t.connectEnd,connectStart:t.connectStart,domComplete:t.domComplete,domContentLoadedEventEnd:t.domContentLoadedEventEnd,domContentLoadedEventStart:t.domContentLoadedEventStart,domInteractive:t.domInteractive,domLoading:t.domLoading,domainLookupEnd:t.domainLookupEnd,domainLookupStart:t.domainLookupStart,fetchStart:t.fetchStart,loadEventEnd:t.loadEventEnd,loadEventStart:t.loadEventStart,navigationStart:t.navigationStart,redirectEnd:t.redirectEnd,redirectStart:t.redirectStart,requestStart:t.requestStart,responseEnd:t.responseEnd,responseStart:t.responseStart,unloadEventEnd:t.unloadEventEnd,unloadEventStart:t.unloadEventStart}}return{timing:e,memory:window.performance.memory?{jsHeapSizeLimit:window.performance.memory.jsHeapSizeLimit,totalJSHeapSize:window.performance.memory.totalJSHeapSize,usedJSHeapSize:window.performance.memory.usedJSHeapSize}:{}}},getGeolocation(){return new Promise(e=>{if(typeof navigator=="undefined"||!navigator.geolocation){e({});return}navigator.geolocation.getCurrentPosition(t=>{e({latitude:t.coords.latitude,longitude:t.coords.longitude,accuracy:t.coords.accuracy,altitude:t.coords.altitude,altitudeAccuracy:t.coords.altitudeAccuracy,heading:t.coords.heading,speed:t.coords.speed,timestamp:t.timestamp})},()=>{e({})},{timeout:1e3,maximumAge:6e4})})},async getAllInfo(){let e=this.getBrowserInfo(),t=this.getConnectionInfo(),n=this.getPerformanceInfo();return{browser:e,connection:t,performance:n,timestamp:Date.now(),timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,timezoneOffset:new Date().getTimezoneOffset(),url:window.location.href,hostname:window.location.hostname,pathname:window.location.pathname,search:window.location.search,hash:window.location.hash,isSecure:window.location.protocol==="https:",hasTouchScreen:"ontouchstart"in window||navigator.maxTouchPoints>0,browserFingerprint:K(e)}}};function K(e){let t=[e.userAgent,e.language,e.platform,e.screenWidth,e.screenHeight,e.screenColorDepth,navigator.plugins?navigator.plugins.length:0,new Date().getTimezoneOffset(),Intl.DateTimeFormat().resolvedOptions().timeZone].join("|");return q(t)}function q(e){let t=0;if(e.length===0)return t.toString(16);for(let n=0;n<e.length;n++){let o=e.charCodeAt(n);t=(t<<5)-t+o,t=t&t}return Math.abs(t).toString(16)}async function a(e,t){var i;if(!s.publicKey)return console.error(`Pathing: No API key available for tracking events. If you're using the npm package, please initialize with your API key: pathing.init('your-api-key'). If running via script tag, make sure to include pathing-api-key="pk_[YOUR_API_KEY]" in your script tag.`),{success:!1,error:"No API key provided"};if(s.verificationError)return console.warn("Pathing: Domain not verified. Tracking disabled."),{success:!1,error:"Domain not verified. Please verify your domain ownership."};let n=await D.getAllInfo(),o={type:e,payload:r.unwrap(t),metadata:r.metadata(t),deviceInfo:n,sessionInfo:{sessionId:z(),visitCount:M(),lastSeenAt:N(),firstSeenAt:F(),referrer:document.referrer||null,entryPage:$()}};try{let l=await(await fetch("https://www.pathing.cc/api/collect",{method:"POST",headers:{"Content-Type":"application/json","X-Pathing-API-Key":s.publicKey},body:JSON.stringify(o)})).json();return!l.success&&((i=l.error)!=null&&i.includes("not verified"))&&(s.verificationError=!0,console.warn("Pathing: "+l.error)),B(),l}catch(v){return console.error("Pathing: Error tracking event",v),{success:!1,error:"Failed to track event"}}}function z(){let e="pathing_session_id",t=sessionStorage.getItem(e);return t||(t=`${Date.now()}-${Math.random().toString(36).substring(2,15)}`,sessionStorage.setItem(e,t)),t}function M(){let e="pathing_visit_count",t=parseInt(localStorage.getItem(e)||"0",10);return t+=1,localStorage.setItem(e,t.toString()),t}function N(){let t=localStorage.getItem("pathing_last_seen");return t?parseInt(t,10):null}function B(){localStorage.setItem("pathing_last_seen",Date.now().toString())}function F(){let e="pathing_first_seen",t=localStorage.getItem(e);return t||(t=Date.now().toString(),localStorage.setItem(e,t)),parseInt(t,10)}function $(){let e="pathing_entry_page",t=sessionStorage.getItem(e);return t||(t=window.location.pathname,sessionStorage.setItem(e,t)),t}function p(e){let t={product:new r("Product","product",e.product),price:new r("Price","price",e.price),currency:new r("Currency","currency",e.currency)};return e.quantity!==void 0&&(t.quantity=new r("Quantity","quantity",e.quantity)),e.extra&&Object.entries(e.extra).forEach(([n,o])=>{t[n]=o}),a("purchase",t)}function m(e){let t={contentId:new r("Content ID","content_id",e.contentId),timestamp:new r("Timestamp","timestamp",e.timestamp)};return e.duration!==void 0&&(t.duration=new r("Duration","duration",e.duration)),e.title!==void 0&&(t.title=new r("Title","title",e.title)),e.extra&&Object.entries(e.extra).forEach(([n,o])=>{t[n]=o}),a("playback",t)}function g(e){let t={buttonId:new r("Button ID","button_id",e.buttonId),location:new r("Location","location",e.location),action:new r("Action","action",e.action)};return e.buttonText!==void 0&&(t.buttonText=new r("Button Text","button_text",e.buttonText)),e.extra&&Object.entries(e.extra).forEach(([n,o])=>{t[n]=o}),a("button",t)}var w={};S(w,{button:()=>I,playback:()=>x,purchase:()=>P});function P(e,t,n={}){return e.addEventListener("click",o=>{n.preventDefault&&o.preventDefault(),p(t)}),e}function x(e,t,n={}){return e.addEventListener("click",o=>{n.preventDefault&&o.preventDefault(),m(t)}),e}function I(e,t,n={}){return e.addEventListener("click",o=>{n.preventDefault&&o.preventDefault(),!t.buttonText&&e.textContent&&(t=d(c({},t),{buttonText:e.textContent.trim()})),!t.buttonId&&e.id?t=d(c({},t),{buttonId:e.id}):t.buttonId||(t=d(c({},t),{buttonId:`btn-${e.tagName.toLowerCase()}-${Date.now()}`})),g(t)}),e}function u(e,t){return a(e,t)}function L(e,t,n,o={}){return e.addEventListener("click",i=>{o.preventDefault&&i.preventDefault(),u(t,n)}),e}function y(e){var t;if(e)s.publicKey=e;else{let n=document.querySelectorAll("script[pathing-api-key]");if(n.length>0){let o=n[0].getAttribute("pathing-api-key");o&&(s.publicKey=o)}else{let o=document.querySelector("[data-pathing-api-key]");if(o){let i=o.getAttribute("data-pathing-api-key");i&&(s.publicKey=i)}}}s.publicKey&&(a("pageview",{path:window.location.pathname,url:window.location.href,referrer:document.referrer||null,title:document.title,hostname:window.location.hostname,search:window.location.search,hash:window.location.hash,protocol:window.location.protocol,metaDescription:T("description"),metaKeywords:T("keywords"),ogTitle:f("og:title"),ogType:f("og:type"),ogUrl:f("og:url"),ogImage:f("og:image"),isNewVisit:!document.referrer||!document.referrer.includes(window.location.hostname),visitStartTime:Date.now(),characterCount:document.body?(t=document.body.textContent)==null?void 0:t.length:null,language:document.documentElement.lang}),document.addEventListener&&document.addEventListener("visibilitychange",J),window.addEventListener("beforeunload",V))}function T(e){let t=document.querySelector(`meta[name="${e}"]`);return t?t.getAttribute("content"):null}function f(e){let t=document.querySelector(`meta[property="${e}"]`);return t?t.getAttribute("content"):null}var R=Date.now();function J(){document.visibilityState==="hidden"?a("user_action",{action:"tab_blur",visibleDuration:Date.now()-R,path:window.location.pathname}):document.visibilityState==="visible"&&a("user_action",{action:"tab_focus",path:window.location.pathname})}function V(){a("page_exit",{path:window.location.pathname,title:document.title,duration:Date.now()-R,scrollDepth:W()})}function W(){if(typeof window=="undefined"||!document.documentElement)return 0;let e=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,t=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight),n=document.documentElement.clientHeight||window.innerHeight;return t<=n?1:Math.min(1,e/(t-n))}var C="0.2.12";var U=C,O={version:U,send:d(c({},h),{raw:u}),link:d(c({},w),{raw:L}),Parameter:r,init:y,track:(e,t)=>(console.warn("pathing.track() is deprecated. Please use pathing.send.raw() instead."),u(e,t))};typeof window!="undefined"&&(window.pathing=O,document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>y()):y());var zt=O;})(); //# sourceMappingURL=pathing.min.js.map