@outlit/browser 1.0.4 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- "use strict";var Outlit=(()=>{var S=Object.defineProperty;var de=Object.getOwnPropertyDescriptor;var me=Object.getOwnPropertyNames;var fe=Object.prototype.hasOwnProperty;var ge=(t,e)=>{for(var i in e)S(t,i,{get:e[i],enumerable:!0})},pe=(t,e,i,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of me(e))!fe.call(t,r)&&r!==i&&S(t,r,{get:()=>e[r],enumerable:!(n=de(e,r))||n.enumerable});return t};var ve=t=>pe(S({},"__esModule",{value:!0}),t);var je={};ge(je,{outlit:()=>a});var B="https://app.outlit.ai",he=["password","passwd","pass","pwd","token","secret","api_key","apikey","api-key","credit_card","creditcard","credit-card","cc_number","ccnumber","card_number","cardnumber","cvv","cvc","ssn","social_security","socialsecurity","bank_account","bankaccount","routing_number","routingnumber"];function d(t){try{let i=new URL(t).searchParams,n={};return i.has("utm_source")&&(n.source=i.get("utm_source")??void 0),i.has("utm_medium")&&(n.medium=i.get("utm_medium")??void 0),i.has("utm_campaign")&&(n.campaign=i.get("utm_campaign")??void 0),i.has("utm_term")&&(n.term=i.get("utm_term")??void 0),i.has("utm_content")&&(n.content=i.get("utm_content")??void 0),Object.keys(n).length>0?n:void 0}catch(e){console.warn(`[Outlit] Failed to parse URL for UTM extraction: "${t}"`,e);return}}function m(t){try{return new URL(t).pathname}catch(e){return console.warn(`[Outlit] Failed to parse URL for path extraction: "${t}", defaulting to "/"`,e),"/"}}function ye(t,e){let i=t.toLowerCase().replace(/[-_\s]/g,"");return e.some(n=>{let r=n.toLowerCase().replace(/[-_\s]/g,"");return i.includes(r)})}function be(t){let e=t.replace(/[\s-]/g,"");return!!(/^\d{13,19}$/.test(e)||/^\d{9}$/.test(e)||/^\d{3}-\d{2}-\d{4}$/.test(t))}function N(t,e){if(!t)return;let i=e??he,n={};for(let[r,s]of Object.entries(t))ye(r,i)||be(s)||(n[r]=s);return Object.keys(n).length>0?n:void 0}function x(t){return!t||typeof t!="string"?!1:/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t.trim())}var Te=[/^e?-?mail$/i,/^email[_-]?address$/i,/^user[_-]?email$/i,/^work[_-]?email$/i,/^contact[_-]?email$/i,/^primary[_-]?email$/i,/^business[_-]?email$/i],ke=[/^name$/i,/^full[_-]?name$/i,/^your[_-]?name$/i,/^customer[_-]?name$/i,/^contact[_-]?name$/i,/^display[_-]?name$/i],Ee=[/^first[_-]?name$/i,/^firstname$/i,/^first$/i,/^fname$/i,/^given[_-]?name$/i,/^forename$/i],Ie=[/^last[_-]?name$/i,/^lastname$/i,/^last$/i,/^lname$/i,/^surname$/i,/^family[_-]?name$/i];function T(t,e){let i=t.trim();return e.some(n=>n.test(i))}function we(t,e){if(e){for(let[i,n]of e.entries())if(n==="email"){let r=t[i];if(r&&x(r))return r.trim()}}for(let[i,n]of Object.entries(t))if(T(i,Te)&&x(n))return n.trim();for(let i of Object.values(t))if(x(i))return i.trim()}function _e(t){let e,i,n;for(let[s,o]of Object.entries(t)){let l=o?.trim();l&&(!e&&T(s,ke)&&(e=l),!i&&T(s,Ee)&&(i=l),!n&&T(s,Ie)&&(n=l))}let r={};return e?r.name=e:i&&n?(r.name=`${i} ${n}`,r.firstName=i,r.lastName=n):i?r.firstName=i:n&&(r.lastName=n),r}function P(t,e){let i=we(t,e);if(!i)return;let n=_e(t);return{email:i,...n}}function L(t){let{url:e,referrer:i,timestamp:n,title:r}=t;return{type:"pageview",timestamp:n??Date.now(),url:e,path:m(e),referrer:i,utm:d(e),title:r}}function R(t){let{url:e,referrer:i,timestamp:n,formId:r,formFields:s}=t;return{type:"form",timestamp:n??Date.now(),url:e,path:m(e),referrer:i,utm:d(e),formId:r,formFields:s}}function M(t){let{url:e,referrer:i,timestamp:n,email:r,userId:s,traits:o}=t;return{type:"identify",timestamp:n??Date.now(),url:e,path:m(e),referrer:i,utm:d(e),email:r,userId:s,traits:o}}function F(t){let{url:e,referrer:i,timestamp:n,eventName:r,properties:s}=t;return{type:"custom",timestamp:n??Date.now(),url:e,path:m(e),referrer:i,utm:d(e),eventName:r,properties:s}}function $(t){let{url:e,referrer:i,timestamp:n,provider:r,eventType:s,startTime:o,endTime:l,duration:c,isRecurring:u,inviteeEmail:p,inviteeName:ce}=t;return{type:"calendar",timestamp:n??Date.now(),url:e,path:m(e),referrer:i,utm:d(e),provider:r,eventType:s,startTime:o,endTime:l,duration:c,isRecurring:u,inviteeEmail:p,inviteeName:ce}}function q(t){let{url:e,referrer:i,timestamp:n,activeTimeMs:r,totalTimeMs:s,sessionId:o}=t;return{type:"engagement",timestamp:n??Date.now(),url:e,path:m(e),referrer:i,utm:d(e),activeTimeMs:r,totalTimeMs:s,sessionId:o}}function C(t){let{url:e,referrer:i,timestamp:n,stage:r,properties:s}=t;return{type:"stage",timestamp:n??Date.now(),url:e,path:m(e),referrer:i,utm:d(e),stage:r,properties:s}}function V(t){let{url:e,referrer:i,timestamp:n,status:r,customerId:s,stripeCustomerId:o,domain:l,properties:c}=t;return{type:"billing",timestamp:n??Date.now(),url:e,path:m(e),referrer:i,utm:d(e),status:r,customerId:s,stripeCustomerId:o,domain:l,properties:c}}function z(t,e,i,n,r){let s={visitorId:t,source:e,events:i};return r&&(s.sessionId=r),n&&(n.email||n.userId)&&(s.userIdentity={...n.email&&{email:n.email},...n.userId&&{userId:n.userId}}),s}var k=null,H=null;function j(t){k=t,K(),Se()}function K(){if(!k)return;let t=window.location.href,e=document.referrer,i=document.title;t!==H&&(H=t,k(t,e,i))}function O(){setTimeout(K,10)}function Se(){window.addEventListener("popstate",()=>{O()});let t=history.pushState,e=history.replaceState;history.pushState=function(...i){t.apply(this,i),O()},history.replaceState=function(...i){e.apply(this,i),O()}}var E=null,Q,I=null;function G(t,e,i){E=t,Q=e,I=i??null,document.addEventListener("submit",Y,!0)}function Y(t){if(!E)return;let e=t.target;if(!(e instanceof HTMLFormElement))return;let i=window.location.href,n=e.id||e.name||void 0,r=new FormData(e),s={},o=new Map,l=e.querySelectorAll("input, select, textarea");for(let u of l){let p=u.getAttribute("name");p&&u instanceof HTMLInputElement&&o.set(p,u.type)}r.forEach((u,p)=>{typeof u=="string"&&(s[p]=u)});let c=N(s,Q);if(I){let u=P(s,o);u&&I(u)}c&&Object.keys(c).length>0&&E(i,n,c)}function J(){k=null,E=null,I=null,document.removeEventListener("submit",Y,!0)}var f=null,w=!1,v=0,U=!1,h=null,xe=10,Ce=200,Oe=2e3;function X(t){let e={provider:"cal.com"};if(t.title){e.eventType=t.title;let i=t.title.match(/between .+ and (.+)$/i);i?.[1]&&(e.inviteeName=i[1].trim())}if(t.startTime&&(e.startTime=t.startTime),t.endTime&&(e.endTime=t.endTime),t.startTime&&t.endTime){let i=new Date(t.startTime),n=new Date(t.endTime);e.duration=Math.round((n.getTime()-i.getTime())/6e4)}return t.isRecurring!==void 0&&(e.isRecurring=t.isRecurring),e}function W(){if(!(typeof window>"u")&&!U){if(v++,"Cal"in window){let t=window.Cal;if(typeof t=="function")try{t("on",{action:"bookingSuccessfulV2",callback:Ue}),U=!0;return}catch{}}if(v<xe){let t=Math.min(Ce*v,Oe);setTimeout(W,t)}}}function Ue(t){if(!f)return;let e=t.detail?.data;if(!e||e.uid&&e.uid===h)return;h=e.uid||null;let i=X(e);f.onCalendarBooked(i)}function Z(t){if(f){if(Be(t)){if(t.data.event==="calendly.event_scheduled"){let e=Ne(t.data.payload);f.onCalendarBooked(e)}return}if(Ae(t)){let e=De(t.data);if(e){if(e.uid&&e.uid===h)return;h=e.uid||null;let i=X(e);f.onCalendarBooked(i)}}}}function Ae(t){if(!t.origin.includes("cal.com"))return!1;let e=t.data;if(!e||typeof e!="object")return!1;let i=e.type||e.action;return i==="bookingSuccessfulV2"||i==="bookingSuccessful"||i==="booking_successful"}function De(t){if(!t||typeof t!="object")return null;let e=t;return e.data&&typeof e.data=="object"?e.data:e.booking&&typeof e.booking=="object"?e.booking:null}function Be(t){return t.origin==="https://calendly.com"&&t.data&&typeof t.data.event=="string"&&t.data.event.startsWith("calendly.")}function Ne(t){return{provider:"calendly"}}function ee(t){w||(f=t,w=!0,v=0,window.addEventListener("message",Z),W())}function te(){w&&(window.removeEventListener("message",Z),f=null,w=!1,U=!1,v=0,h=null)}var Pe=3e4,ie=1800*1e3,Le=1e3,ne=50,Re=500,A="outlit_session_id",y="outlit_session_last_activity",D=class{state;options;idleTimeout;timeUpdateInterval=null;boundHandleActivity;boundHandleVisibilityChange;constructor(e){this.options=e,this.idleTimeout=e.idleTimeout??Pe,this.state=this.createInitialState(),this.boundHandleActivity=this.handleActivity.bind(this),this.boundHandleVisibilityChange=this.handleVisibilityChange.bind(this),this.setupEventListeners(),this.startTimeUpdateInterval()}getSessionId(){return this.state.sessionId}emitEngagement(){if(this.state.hasEmittedEngagement)return;this.state.hasEmittedEngagement=!0,this.updateActiveTime();let e=Date.now()-this.state.pageEntryTime,i=this.state.activeTimeMs<ne&&e<ne,n=e<Re;if(!i&&!n){let r=q({url:this.state.currentUrl,referrer:document.referrer,activeTimeMs:this.state.activeTimeMs,totalTimeMs:e,sessionId:this.state.sessionId});this.options.onEngagement(r)}this.resetState()}onNavigation(e){this.emitEngagement(),this.state.currentUrl=e,this.state.currentPath=this.extractPath(e),this.state.pageEntryTime=Date.now(),this.state.activeTimeMs=0,this.state.lastActiveTime=Date.now(),this.state.isUserActive=!0,this.state.hasEmittedEngagement=!1,this.resetIdleTimer()}stop(){this.removeEventListeners(),this.timeUpdateInterval&&(clearInterval(this.timeUpdateInterval),this.timeUpdateInterval=null),this.state.idleTimeoutId&&(clearTimeout(this.state.idleTimeoutId),this.state.idleTimeoutId=null)}createInitialState(){let e=Date.now();return{currentUrl:typeof window<"u"?window.location.href:"",currentPath:typeof window<"u"?window.location.pathname:"/",pageEntryTime:e,lastActiveTime:e,activeTimeMs:0,isPageVisible:typeof document<"u"?document.visibilityState==="visible":!0,isUserActive:!0,idleTimeoutId:null,sessionId:this.getOrCreateSessionId(),hasEmittedEngagement:!1}}resetState(){let e=Date.now();this.state.pageEntryTime=e,this.state.lastActiveTime=e,this.state.activeTimeMs=0,this.state.isUserActive=!0,this.resetIdleTimer()}getOrCreateSessionId(){if(typeof sessionStorage>"u")return this.generateSessionId();try{let e=sessionStorage.getItem(A),i=sessionStorage.getItem(y),n=i?Number.parseInt(i,10):0,r=Date.now();if(e&&n&&r-n<ie)return this.updateSessionActivity(),e;let s=this.generateSessionId();return sessionStorage.setItem(A,s),sessionStorage.setItem(y,r.toString()),s}catch{return this.generateSessionId()}}generateSessionId(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let i=Math.random()*16|0;return(e==="x"?i:i&3|8).toString(16)})}updateSessionActivity(){if(!(typeof sessionStorage>"u"))try{sessionStorage.setItem(y,Date.now().toString())}catch{}}checkSessionExpiry(){if(!(typeof sessionStorage>"u"))try{let e=sessionStorage.getItem(y),i=e?Number.parseInt(e,10):0,n=Date.now();if(n-i>=ie){let r=this.generateSessionId();sessionStorage.setItem(A,r),this.state.sessionId=r}sessionStorage.setItem(y,n.toString())}catch{}}setupEventListeners(){if(typeof window>"u"||typeof document>"u")return;let e=["mousemove","keydown","click","scroll","touchstart"];for(let i of e)document.addEventListener(i,this.boundHandleActivity,{passive:!0});document.addEventListener("visibilitychange",this.boundHandleVisibilityChange),this.resetIdleTimer()}removeEventListeners(){if(typeof window>"u"||typeof document>"u")return;let e=["mousemove","keydown","click","scroll","touchstart"];for(let i of e)document.removeEventListener(i,this.boundHandleActivity);document.removeEventListener("visibilitychange",this.boundHandleVisibilityChange)}handleActivity(){this.state.isUserActive||(this.checkSessionExpiry(),this.state.lastActiveTime=Date.now()),this.state.isUserActive=!0,this.resetIdleTimer(),this.updateSessionActivity()}handleVisibilityChange(){let e=this.state.isPageVisible,i=document.visibilityState==="visible";e&&!i&&this.updateActiveTime(),this.state.isPageVisible=i,!e&&i&&(this.checkSessionExpiry(),this.state.lastActiveTime=Date.now(),this.state.hasEmittedEngagement=!1,this.updateSessionActivity())}resetIdleTimer(){this.state.idleTimeoutId&&clearTimeout(this.state.idleTimeoutId),this.state.idleTimeoutId=setTimeout(()=>{this.updateActiveTime(),this.state.isUserActive=!1},this.idleTimeout)}startTimeUpdateInterval(){this.timeUpdateInterval||(this.timeUpdateInterval=setInterval(()=>{this.updateActiveTime()},Le))}updateActiveTime(){if(this.state.isPageVisible&&this.state.isUserActive){let e=Date.now();this.state.activeTimeMs+=e-this.state.lastActiveTime,this.state.lastActiveTime=e}}extractPath(e){try{return new URL(e).pathname}catch{return"/"}}},g=null;function re(t){return g?(console.warn("[Outlit] Session tracking already initialized"),g):(g=new D(t),g)}function se(){g&&(g.stop(),g=null)}var b="outlit_visitor_id";function Me(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{let e=Math.random()*16|0;return(t==="x"?e:e&3|8).toString(16)})}function oe(){try{let i=localStorage.getItem(b);if(i&&ae(i))return i}catch{}let t=$e(b);if(t&&ae(t)){try{localStorage.setItem(b,t)}catch{}return t}let e=Me();return Fe(e),e}function Fe(t){try{localStorage.setItem(b,t)}catch{}Ve(b,t,365)}function ae(t){return/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(t)}function $e(t){if(typeof document>"u")return null;let i=`; ${document.cookie}`.split(`; ${t}=`);return i.length===2?i.pop()?.split(";").shift()??null:null}function qe(){if(typeof window>"u")return null;let t=window.location.hostname;if(t==="localhost"||/^(\d{1,3}\.){3}\d{1,3}$/.test(t))return null;let e=t.split(".");if(e.length>=2){let i=["co.uk","com.au","co.nz","org.uk","net.au","com.br"],n=e.slice(-2).join(".");return i.includes(n)&&e.length>=3?e.slice(-3).join("."):e.slice(-2).join(".")}return null}function Ve(t,e,i){if(typeof document>"u")return;let n=new Date;n.setTime(n.getTime()+i*24*60*60*1e3);let r=`${t}=${e};expires=${n.toUTCString()};path=/;SameSite=Lax`,s=qe();s&&(r+=`;domain=${s}`),document.cookie=r}var le=10,_=class{publicKey;apiHost;visitorId=null;eventQueue=[];flushTimer=null;flushInterval;isInitialized=!1;isTrackingEnabled=!1;options;hasHandledExit=!1;sessionTracker=null;currentUser=null;pendingUser=null;pendingStageEvents=[];constructor(e){if(this.publicKey=e.publicKey,this.apiHost=e.apiHost??B,this.flushInterval=e.flushInterval??5e3,this.options=e,typeof window<"u"){let i=()=>{this.hasHandledExit||(this.hasHandledExit=!0,this.sessionTracker?.emitEngagement(),this.flush())};document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"?i():this.hasHandledExit=!1}),window.addEventListener("pagehide",i),window.addEventListener("beforeunload",i)}this.isInitialized=!0,e.autoTrack!==!1&&this.enableTracking()}enableTracking(){this.isTrackingEnabled||(this.visitorId=oe(),this.startFlushTimer(),this.initSessionTracking(),this.options.trackPageviews!==!1&&this.initPageviewTracking(),this.options.trackForms!==!1&&this.initFormTracking(this.options.formFieldDenylist),this.options.trackCalendarEmbeds!==!1&&this.initCalendarTracking(),this.isTrackingEnabled=!0,this.pendingUser&&(this.applyUser(this.pendingUser),this.pendingUser=null))}isEnabled(){return this.isTrackingEnabled}track(e,i){if(!this.isTrackingEnabled){console.warn("[Outlit] Tracking not enabled. Call enableTracking() first.");return}let n=F({url:window.location.href,referrer:document.referrer,eventName:e,properties:i});this.enqueue(n)}identify(e){if(!this.isTrackingEnabled){console.warn("[Outlit] Tracking not enabled. Call enableTracking() first.");return}if(e.email||e.userId){let n=!this.currentUser;this.currentUser={email:e.email,userId:e.userId},n&&this.flushPendingStageEvents()}let i=M({url:window.location.href,referrer:document.referrer,email:e.email,userId:e.userId,traits:e.traits});this.enqueue(i)}setUser(e){if(!e.email&&!e.userId){console.warn("[Outlit] setUser requires at least email or userId");return}if(!this.isTrackingEnabled){this.pendingUser=e;return}this.applyUser(e)}clearUser(){this.currentUser=null,this.pendingUser=null,this.pendingStageEvents=[]}applyUser(e){this.currentUser=e,this.identify({email:e.email,userId:e.userId,traits:e.traits}),this.flushPendingStageEvents()}flushPendingStageEvents(){if(this.pendingStageEvents.length===0)return;let e=[...this.pendingStageEvents];this.pendingStageEvents=[];for(let{stage:i,properties:n}of e){let r=C({url:window.location.href,referrer:document.referrer,stage:i,properties:n});this.enqueue(r)}}user={identify:e=>this.identify(e),activate:e=>this.sendStageEvent("activated",e),engaged:e=>this.sendStageEvent("engaged",e),inactive:e=>this.sendStageEvent("inactive",e)};customer={trialing:e=>this.sendBillingEvent("trialing",e),paid:e=>this.sendBillingEvent("paid",e),churned:e=>this.sendBillingEvent("churned",e)};sendStageEvent(e,i){if(!this.isTrackingEnabled){console.warn("[Outlit] Tracking not enabled. Call enableTracking() first.");return}if(!this.currentUser){if(this.pendingStageEvents.length>=le){console.warn(`[Outlit] Pending stage event queue full (${le}). Call setUser() or identify() to flush queued events.`);return}this.pendingStageEvents.push({stage:e,properties:i});return}let n=C({url:window.location.href,referrer:document.referrer,stage:e,properties:i});this.enqueue(n)}sendBillingEvent(e,i){if(!this.isTrackingEnabled){console.warn("[Outlit] Tracking not enabled. Call enableTracking() first.");return}let n=V({url:window.location.href,referrer:document.referrer,status:e,customerId:i.customerId,stripeCustomerId:i.stripeCustomerId,domain:i.domain,properties:i.properties});this.enqueue(n)}getVisitorId(){return this.visitorId}async flush(){if(this.eventQueue.length===0)return;let e=[...this.eventQueue];this.eventQueue=[],await this.sendEvents(e)}async shutdown(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),J(),te(),se(),this.sessionTracker=null,await this.flush()}initSessionTracking(){this.sessionTracker=re({onEngagement:this.options.trackEngagement!==!1?e=>this.enqueue(e):()=>{},idleTimeout:this.options.idleTimeout})}initPageviewTracking(){j((e,i,n)=>{this.sessionTracker?.onNavigation(e);let r=L({url:e,referrer:i,title:n});this.enqueue(r)})}initFormTracking(e){let i=this.options.autoIdentify!==!1?n=>{let r={};n.name&&(r.name=n.name),n.firstName&&(r.firstName=n.firstName),n.lastName&&(r.lastName=n.lastName),this.identify({email:n.email,traits:Object.keys(r).length>0?r:void 0})}:void 0;G((n,r,s)=>{let o=R({url:n,referrer:document.referrer,formId:r,formFields:s});this.enqueue(o)},e,i)}initCalendarTracking(){ee({onCalendarBooked:e=>{let i=$({url:window.location.href,referrer:document.referrer,provider:e.provider,eventType:e.eventType,startTime:e.startTime,endTime:e.endTime,duration:e.duration,isRecurring:e.isRecurring,inviteeEmail:e.inviteeEmail,inviteeName:e.inviteeName});this.enqueue(i)}})}enqueue(e){this.eventQueue.push(e),this.eventQueue.length>=10&&this.flush()}startFlushTimer(){this.flushTimer||(this.flushTimer=setInterval(()=>{this.flush()},this.flushInterval))}async sendEvents(e){if(e.length===0||!this.visitorId)return;let i=this.currentUser??void 0,n=this.sessionTracker?.getSessionId(),r=z(this.visitorId,"client",e,i,n),s=`${this.apiHost}/api/i/v1/${this.publicKey}/events`;try{if(typeof navigator<"u"&&navigator.sendBeacon){let l=new Blob([JSON.stringify(r)],{type:"application/json"});if(navigator.sendBeacon(s,l))return;console.warn(`[Outlit] sendBeacon failed for ${e.length} events, falling back to fetch`)}let o=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r),keepalive:!0});o.ok||console.warn(`[Outlit] Server returned ${o.status} when sending ${e.length} events`)}catch(o){console.warn(`[Outlit] Failed to send ${e.length} events:`,o)}}};var ze=typeof window<"u"?window.outlit:void 0,He=ze?._q||[],a={_initialized:!1,_instance:null,_queue:[],_loaded:!0,init(t){if(this._initialized){console.warn("[Outlit] Already initialized");return}this._instance=new _(t),this._initialized=!0;for(let[e,i]of He){let n=this;if(e.includes(".")){let[r,s]=e.split(".");r&&s&&r in n&&typeof n[r][s]=="function"&&n[r][s](...i)}else e in n&&typeof n[e]=="function"&&n[e](...i)}for(;this._queue.length>0;)this._queue.shift()?.()},track(t,e){if(!this._initialized||!this._instance){this._queue.push(()=>this.track(t,e));return}this._instance.track(t,e)},identify(t){if(!this._initialized||!this._instance){this._queue.push(()=>this.identify(t));return}this._instance.identify(t)},getVisitorId(){return this._instance?this._instance.getVisitorId():null},enableTracking(){if(!this._initialized||!this._instance){this._queue.push(()=>this.enableTracking());return}this._instance.enableTracking()},isTrackingEnabled(){return this._instance?this._instance.isEnabled():!1},setUser(t){if(!this._initialized||!this._instance){this._queue.push(()=>this.setUser(t));return}this._instance.setUser(t)},clearUser(){if(!this._initialized||!this._instance){this._queue.push(()=>this.clearUser());return}this._instance.clearUser()},user:{identify(t){if(!a._initialized||!a._instance){a._queue.push(()=>a.user.identify(t));return}a._instance.user.identify(t)},activate(t){if(!a._initialized||!a._instance){a._queue.push(()=>a.user.activate(t));return}a._instance.user.activate(t)},engaged(t){if(!a._initialized||!a._instance){a._queue.push(()=>a.user.engaged(t));return}a._instance.user.engaged(t)},inactive(t){if(!a._initialized||!a._instance){a._queue.push(()=>a.user.inactive(t));return}a._instance.user.inactive(t)}},customer:{trialing(t){if(!a._initialized||!a._instance){a._queue.push(()=>a.customer.trialing(t));return}a._instance.customer.trialing(t)},paid(t){if(!a._initialized||!a._instance){a._queue.push(()=>a.customer.paid(t));return}a._instance.customer.paid(t)},churned(t){if(!a._initialized||!a._instance){a._queue.push(()=>a.customer.churned(t));return}a._instance.customer.churned(t)}}};function ue(){let t=document.currentScript;if(t||(t=document.querySelector("script[data-public-key]")),!t){console.warn("[Outlit] No script tag found with data-public-key attribute");return}let e=t.getAttribute("data-public-key");if(!e){console.warn("[Outlit] Missing data-public-key attribute on script tag");return}let i=t.getAttribute("data-api-host")??void 0,n=t.getAttribute("data-track-pageviews")!=="false",r=t.getAttribute("data-track-forms")!=="false",s=t.getAttribute("data-auto-track")!=="false",o=t.getAttribute("data-auto-identify")!=="false",l=t.getAttribute("data-track-calendar-embeds")!=="false";a.init({publicKey:e,apiHost:i,trackPageviews:n,trackForms:r,autoTrack:s,autoIdentify:o,trackCalendarEmbeds:l})}typeof window<"u"&&(window.outlit=a,document.readyState==="loading"?document.addEventListener("DOMContentLoaded",ue):ue());return ve(je);})();
1
+ "use strict";var Outlit=(()=>{var S=Object.defineProperty;var de=Object.getOwnPropertyDescriptor;var me=Object.getOwnPropertyNames;var fe=Object.prototype.hasOwnProperty;var ge=(t,e)=>{for(var i in e)S(t,i,{get:e[i],enumerable:!0})},pe=(t,e,i,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of me(e))!fe.call(t,r)&&r!==i&&S(t,r,{get:()=>e[r],enumerable:!(n=de(e,r))||n.enumerable});return t};var ve=t=>pe(S({},"__esModule",{value:!0}),t);var je={};ge(je,{outlit:()=>a});var B="https://app.outlit.ai",he=["password","passwd","pass","pwd","token","secret","api_key","apikey","api-key","credit_card","creditcard","credit-card","cc_number","ccnumber","card_number","cardnumber","cvv","cvc","ssn","social_security","socialsecurity","bank_account","bankaccount","routing_number","routingnumber"];function d(t){try{let i=new URL(t).searchParams,n={};return i.has("utm_source")&&(n.source=i.get("utm_source")??void 0),i.has("utm_medium")&&(n.medium=i.get("utm_medium")??void 0),i.has("utm_campaign")&&(n.campaign=i.get("utm_campaign")??void 0),i.has("utm_term")&&(n.term=i.get("utm_term")??void 0),i.has("utm_content")&&(n.content=i.get("utm_content")??void 0),Object.keys(n).length>0?n:void 0}catch(e){console.warn(`[Outlit] Failed to parse URL for UTM extraction: "${t}"`,e);return}}function m(t){try{return new URL(t).pathname}catch(e){return console.warn(`[Outlit] Failed to parse URL for path extraction: "${t}", defaulting to "/"`,e),"/"}}function ye(t,e){let i=t.toLowerCase().replace(/[-_\s]/g,"");return e.some(n=>{let r=n.toLowerCase().replace(/[-_\s]/g,"");return i.includes(r)})}function be(t){let e=t.replace(/[\s-]/g,"");return!!(/^\d{13,19}$/.test(e)||/^\d{9}$/.test(e)||/^\d{3}-\d{2}-\d{4}$/.test(t))}function N(t,e){if(!t)return;let i=e??he,n={};for(let[r,s]of Object.entries(t))ye(r,i)||be(s)||(n[r]=s);return Object.keys(n).length>0?n:void 0}function x(t){return!t||typeof t!="string"?!1:/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t.trim())}var Te=[/^e?-?mail$/i,/^email[_-]?address$/i,/^user[_-]?email$/i,/^work[_-]?email$/i,/^contact[_-]?email$/i,/^primary[_-]?email$/i,/^business[_-]?email$/i],ke=[/^name$/i,/^full[_-]?name$/i,/^your[_-]?name$/i,/^customer[_-]?name$/i,/^contact[_-]?name$/i,/^display[_-]?name$/i],Ee=[/^first[_-]?name$/i,/^firstname$/i,/^first$/i,/^fname$/i,/^given[_-]?name$/i,/^forename$/i],Ie=[/^last[_-]?name$/i,/^lastname$/i,/^last$/i,/^lname$/i,/^surname$/i,/^family[_-]?name$/i];function T(t,e){let i=t.trim();return e.some(n=>n.test(i))}function we(t,e){if(e){for(let[i,n]of e.entries())if(n==="email"){let r=t[i];if(r&&x(r))return r.trim()}}for(let[i,n]of Object.entries(t))if(T(i,Te)&&x(n))return n.trim();for(let i of Object.values(t))if(x(i))return i.trim()}function _e(t){let e,i,n;for(let[s,o]of Object.entries(t)){let l=o?.trim();l&&(!e&&T(s,ke)&&(e=l),!i&&T(s,Ee)&&(i=l),!n&&T(s,Ie)&&(n=l))}let r={};return e?r.name=e:i&&n?(r.name=`${i} ${n}`,r.firstName=i,r.lastName=n):i?r.firstName=i:n&&(r.lastName=n),r}function P(t,e){let i=we(t,e);if(!i)return;let n=_e(t);return{email:i,...n}}function L(t){let{url:e,referrer:i,timestamp:n,title:r}=t;return{type:"pageview",timestamp:n??Date.now(),url:e,path:m(e),referrer:i,utm:d(e),title:r}}function R(t){let{url:e,referrer:i,timestamp:n,formId:r,formFields:s}=t;return{type:"form",timestamp:n??Date.now(),url:e,path:m(e),referrer:i,utm:d(e),formId:r,formFields:s}}function F(t){let{url:e,referrer:i,timestamp:n,email:r,userId:s,fingerprint:o,traits:l}=t;return{type:"identify",timestamp:n??Date.now(),url:e,path:m(e),referrer:i,utm:d(e),email:r,userId:s,fingerprint:o,traits:l}}function M(t){let{url:e,referrer:i,timestamp:n,eventName:r,properties:s}=t;return{type:"custom",timestamp:n??Date.now(),url:e,path:m(e),referrer:i,utm:d(e),eventName:r,properties:s}}function $(t){let{url:e,referrer:i,timestamp:n,provider:r,eventType:s,startTime:o,endTime:l,duration:c,isRecurring:u,inviteeEmail:p,inviteeName:ce}=t;return{type:"calendar",timestamp:n??Date.now(),url:e,path:m(e),referrer:i,utm:d(e),provider:r,eventType:s,startTime:o,endTime:l,duration:c,isRecurring:u,inviteeEmail:p,inviteeName:ce}}function q(t){let{url:e,referrer:i,timestamp:n,activeTimeMs:r,totalTimeMs:s,sessionId:o}=t;return{type:"engagement",timestamp:n??Date.now(),url:e,path:m(e),referrer:i,utm:d(e),activeTimeMs:r,totalTimeMs:s,sessionId:o}}function C(t){let{url:e,referrer:i,timestamp:n,stage:r,properties:s}=t;return{type:"stage",timestamp:n??Date.now(),url:e,path:m(e),referrer:i,utm:d(e),stage:r,properties:s}}function V(t){let{url:e,referrer:i,timestamp:n,status:r,customerId:s,stripeCustomerId:o,domain:l,properties:c}=t;return{type:"billing",timestamp:n??Date.now(),url:e,path:m(e),referrer:i,utm:d(e),status:r,customerId:s,stripeCustomerId:o,domain:l,properties:c}}function z(t,e,i,n,r,s){let o={visitorId:t,source:e,events:i};return s&&(o.fingerprint=s),r&&(o.sessionId=r),n&&(n.email||n.userId)&&(o.userIdentity={...n.email&&{email:n.email},...n.userId&&{userId:n.userId}}),o}var k=null,H=null;function j(t){k=t,Q(),Se()}function Q(){if(!k)return;let t=window.location.href,e=document.referrer,i=document.title;t!==H&&(H=t,k(t,e,i))}function O(){setTimeout(Q,10)}function Se(){window.addEventListener("popstate",()=>{O()});let t=history.pushState,e=history.replaceState;history.pushState=function(...i){t.apply(this,i),O()},history.replaceState=function(...i){e.apply(this,i),O()}}var E=null,K,I=null;function G(t,e,i){E=t,K=e,I=i??null,document.addEventListener("submit",Y,!0)}function Y(t){if(!E)return;let e=t.target;if(!(e instanceof HTMLFormElement))return;let i=window.location.href,n=e.id||e.name||void 0,r=new FormData(e),s={},o=new Map,l=e.querySelectorAll("input, select, textarea");for(let u of l){let p=u.getAttribute("name");p&&u instanceof HTMLInputElement&&o.set(p,u.type)}r.forEach((u,p)=>{typeof u=="string"&&(s[p]=u)});let c=N(s,K);if(I){let u=P(s,o);u&&I(u)}c&&Object.keys(c).length>0&&E(i,n,c)}function J(){k=null,E=null,I=null,document.removeEventListener("submit",Y,!0)}var f=null,w=!1,v=0,U=!1,h=null,xe=10,Ce=200,Oe=2e3;function X(t){let e={provider:"cal.com"};if(t.title){e.eventType=t.title;let i=t.title.match(/between .+ and (.+)$/i);i?.[1]&&(e.inviteeName=i[1].trim())}if(t.startTime&&(e.startTime=t.startTime),t.endTime&&(e.endTime=t.endTime),t.startTime&&t.endTime){let i=new Date(t.startTime),n=new Date(t.endTime);e.duration=Math.round((n.getTime()-i.getTime())/6e4)}return t.isRecurring!==void 0&&(e.isRecurring=t.isRecurring),e}function W(){if(!(typeof window>"u")&&!U){if(v++,"Cal"in window){let t=window.Cal;if(typeof t=="function")try{t("on",{action:"bookingSuccessfulV2",callback:Ue}),U=!0;return}catch{}}if(v<xe){let t=Math.min(Ce*v,Oe);setTimeout(W,t)}}}function Ue(t){if(!f)return;let e=t.detail?.data;if(!e||e.uid&&e.uid===h)return;h=e.uid||null;let i=X(e);f.onCalendarBooked(i)}function Z(t){if(f){if(Be(t)){if(t.data.event==="calendly.event_scheduled"){let e=Ne(t.data.payload);f.onCalendarBooked(e)}return}if(Ae(t)){let e=De(t.data);if(e){if(e.uid&&e.uid===h)return;h=e.uid||null;let i=X(e);f.onCalendarBooked(i)}}}}function Ae(t){if(!t.origin.includes("cal.com"))return!1;let e=t.data;if(!e||typeof e!="object")return!1;let i=e.type||e.action;return i==="bookingSuccessfulV2"||i==="bookingSuccessful"||i==="booking_successful"}function De(t){if(!t||typeof t!="object")return null;let e=t;return e.data&&typeof e.data=="object"?e.data:e.booking&&typeof e.booking=="object"?e.booking:null}function Be(t){return t.origin==="https://calendly.com"&&t.data&&typeof t.data.event=="string"&&t.data.event.startsWith("calendly.")}function Ne(t){return{provider:"calendly"}}function ee(t){w||(f=t,w=!0,v=0,window.addEventListener("message",Z),W())}function te(){w&&(window.removeEventListener("message",Z),f=null,w=!1,U=!1,v=0,h=null)}var Pe=3e4,ie=1800*1e3,Le=1e3,ne=50,Re=500,A="outlit_session_id",y="outlit_session_last_activity",D=class{state;options;idleTimeout;timeUpdateInterval=null;boundHandleActivity;boundHandleVisibilityChange;constructor(e){this.options=e,this.idleTimeout=e.idleTimeout??Pe,this.state=this.createInitialState(),this.boundHandleActivity=this.handleActivity.bind(this),this.boundHandleVisibilityChange=this.handleVisibilityChange.bind(this),this.setupEventListeners(),this.startTimeUpdateInterval()}getSessionId(){return this.state.sessionId}emitEngagement(){if(this.state.hasEmittedEngagement)return;this.state.hasEmittedEngagement=!0,this.updateActiveTime();let e=Date.now()-this.state.pageEntryTime,i=this.state.activeTimeMs<ne&&e<ne,n=e<Re;if(!i&&!n){let r=q({url:this.state.currentUrl,referrer:document.referrer,activeTimeMs:this.state.activeTimeMs,totalTimeMs:e,sessionId:this.state.sessionId});this.options.onEngagement(r)}this.resetState()}onNavigation(e){this.emitEngagement(),this.state.currentUrl=e,this.state.currentPath=this.extractPath(e),this.state.pageEntryTime=Date.now(),this.state.activeTimeMs=0,this.state.lastActiveTime=Date.now(),this.state.isUserActive=!0,this.state.hasEmittedEngagement=!1,this.resetIdleTimer()}stop(){this.removeEventListeners(),this.timeUpdateInterval&&(clearInterval(this.timeUpdateInterval),this.timeUpdateInterval=null),this.state.idleTimeoutId&&(clearTimeout(this.state.idleTimeoutId),this.state.idleTimeoutId=null)}createInitialState(){let e=Date.now();return{currentUrl:typeof window<"u"?window.location.href:"",currentPath:typeof window<"u"?window.location.pathname:"/",pageEntryTime:e,lastActiveTime:e,activeTimeMs:0,isPageVisible:typeof document<"u"?document.visibilityState==="visible":!0,isUserActive:!0,idleTimeoutId:null,sessionId:this.getOrCreateSessionId(),hasEmittedEngagement:!1}}resetState(){let e=Date.now();this.state.pageEntryTime=e,this.state.lastActiveTime=e,this.state.activeTimeMs=0,this.state.isUserActive=!0,this.resetIdleTimer()}getOrCreateSessionId(){if(typeof sessionStorage>"u")return this.generateSessionId();try{let e=sessionStorage.getItem(A),i=sessionStorage.getItem(y),n=i?Number.parseInt(i,10):0,r=Date.now();if(e&&n&&r-n<ie)return this.updateSessionActivity(),e;let s=this.generateSessionId();return sessionStorage.setItem(A,s),sessionStorage.setItem(y,r.toString()),s}catch{return this.generateSessionId()}}generateSessionId(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let i=Math.random()*16|0;return(e==="x"?i:i&3|8).toString(16)})}updateSessionActivity(){if(!(typeof sessionStorage>"u"))try{sessionStorage.setItem(y,Date.now().toString())}catch{}}checkSessionExpiry(){if(!(typeof sessionStorage>"u"))try{let e=sessionStorage.getItem(y),i=e?Number.parseInt(e,10):0,n=Date.now();if(n-i>=ie){let r=this.generateSessionId();sessionStorage.setItem(A,r),this.state.sessionId=r}sessionStorage.setItem(y,n.toString())}catch{}}setupEventListeners(){if(typeof window>"u"||typeof document>"u")return;let e=["mousemove","keydown","click","scroll","touchstart"];for(let i of e)document.addEventListener(i,this.boundHandleActivity,{passive:!0});document.addEventListener("visibilitychange",this.boundHandleVisibilityChange),this.resetIdleTimer()}removeEventListeners(){if(typeof window>"u"||typeof document>"u")return;let e=["mousemove","keydown","click","scroll","touchstart"];for(let i of e)document.removeEventListener(i,this.boundHandleActivity);document.removeEventListener("visibilitychange",this.boundHandleVisibilityChange)}handleActivity(){this.state.isUserActive||(this.checkSessionExpiry(),this.state.lastActiveTime=Date.now()),this.state.isUserActive=!0,this.resetIdleTimer(),this.updateSessionActivity()}handleVisibilityChange(){let e=this.state.isPageVisible,i=document.visibilityState==="visible";e&&!i&&this.updateActiveTime(),this.state.isPageVisible=i,!e&&i&&(this.checkSessionExpiry(),this.state.lastActiveTime=Date.now(),this.state.hasEmittedEngagement=!1,this.updateSessionActivity())}resetIdleTimer(){this.state.idleTimeoutId&&clearTimeout(this.state.idleTimeoutId),this.state.idleTimeoutId=setTimeout(()=>{this.updateActiveTime(),this.state.isUserActive=!1},this.idleTimeout)}startTimeUpdateInterval(){this.timeUpdateInterval||(this.timeUpdateInterval=setInterval(()=>{this.updateActiveTime()},Le))}updateActiveTime(){if(this.state.isPageVisible&&this.state.isUserActive){let e=Date.now();this.state.activeTimeMs+=e-this.state.lastActiveTime,this.state.lastActiveTime=e}}extractPath(e){try{return new URL(e).pathname}catch{return"/"}}},g=null;function re(t){return g?(console.warn("[Outlit] Session tracking already initialized"),g):(g=new D(t),g)}function se(){g&&(g.stop(),g=null)}var b="outlit_visitor_id";function Fe(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{let e=Math.random()*16|0;return(t==="x"?e:e&3|8).toString(16)})}function oe(){try{let i=localStorage.getItem(b);if(i&&ae(i))return i}catch{}let t=$e(b);if(t&&ae(t)){try{localStorage.setItem(b,t)}catch{}return t}let e=Fe();return Me(e),e}function Me(t){try{localStorage.setItem(b,t)}catch{}Ve(b,t,365)}function ae(t){return/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(t)}function $e(t){if(typeof document>"u")return null;let i=`; ${document.cookie}`.split(`; ${t}=`);return i.length===2?i.pop()?.split(";").shift()??null:null}function qe(){if(typeof window>"u")return null;let t=window.location.hostname;if(t==="localhost"||/^(\d{1,3}\.){3}\d{1,3}$/.test(t))return null;let e=t.split(".");if(e.length>=2){let i=["co.uk","com.au","co.nz","org.uk","net.au","com.br"],n=e.slice(-2).join(".");return i.includes(n)&&e.length>=3?e.slice(-3).join("."):e.slice(-2).join(".")}return null}function Ve(t,e,i){if(typeof document>"u")return;let n=new Date;n.setTime(n.getTime()+i*24*60*60*1e3);let r=`${t}=${e};expires=${n.toUTCString()};path=/;SameSite=Lax`,s=qe();s&&(r+=`;domain=${s}`),document.cookie=r}var le=10,_=class{publicKey;apiHost;visitorId=null;eventQueue=[];flushTimer=null;flushInterval;isInitialized=!1;isTrackingEnabled=!1;options;hasHandledExit=!1;sessionTracker=null;currentUser=null;pendingUser=null;pendingStageEvents=[];constructor(e){if(this.publicKey=e.publicKey,this.apiHost=e.apiHost??B,this.flushInterval=e.flushInterval??5e3,this.options=e,typeof window<"u"){let i=()=>{this.hasHandledExit||(this.hasHandledExit=!0,this.sessionTracker?.emitEngagement(),this.flush())};document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"?i():this.hasHandledExit=!1}),window.addEventListener("pagehide",i),window.addEventListener("beforeunload",i)}this.isInitialized=!0,e.autoTrack!==!1&&this.enableTracking()}enableTracking(){this.isTrackingEnabled||(this.visitorId=oe(),this.startFlushTimer(),this.initSessionTracking(),this.options.trackPageviews!==!1&&this.initPageviewTracking(),this.options.trackForms!==!1&&this.initFormTracking(this.options.formFieldDenylist),this.options.trackCalendarEmbeds!==!1&&this.initCalendarTracking(),this.isTrackingEnabled=!0,this.pendingUser&&(this.applyUser(this.pendingUser),this.pendingUser=null))}isEnabled(){return this.isTrackingEnabled}track(e,i){if(!this.isTrackingEnabled){console.warn("[Outlit] Tracking not enabled. Call enableTracking() first.");return}let n=M({url:window.location.href,referrer:document.referrer,eventName:e,properties:i});this.enqueue(n)}identify(e){if(!this.isTrackingEnabled){console.warn("[Outlit] Tracking not enabled. Call enableTracking() first.");return}if(e.email||e.userId){let n=!this.currentUser;this.currentUser={email:e.email,userId:e.userId},n&&this.flushPendingStageEvents()}let i=F({url:window.location.href,referrer:document.referrer,email:e.email,userId:e.userId,traits:e.traits});this.enqueue(i)}setUser(e){if(!e.email&&!e.userId){console.warn("[Outlit] setUser requires at least email or userId");return}if(!this.isTrackingEnabled){this.pendingUser=e;return}this.applyUser(e)}clearUser(){this.currentUser=null,this.pendingUser=null,this.pendingStageEvents=[]}applyUser(e){this.currentUser=e,this.identify({email:e.email,userId:e.userId,traits:e.traits}),this.flushPendingStageEvents()}flushPendingStageEvents(){if(this.pendingStageEvents.length===0)return;let e=[...this.pendingStageEvents];this.pendingStageEvents=[];for(let{stage:i,properties:n}of e){let r=C({url:window.location.href,referrer:document.referrer,stage:i,properties:n});this.enqueue(r)}}user={identify:e=>this.identify(e),activate:e=>this.sendStageEvent("activated",e),engaged:e=>this.sendStageEvent("engaged",e),inactive:e=>this.sendStageEvent("inactive",e)};customer={trialing:e=>this.sendBillingEvent("trialing",e),paid:e=>this.sendBillingEvent("paid",e),churned:e=>this.sendBillingEvent("churned",e)};sendStageEvent(e,i){if(!this.isTrackingEnabled){console.warn("[Outlit] Tracking not enabled. Call enableTracking() first.");return}if(!this.currentUser){if(this.pendingStageEvents.length>=le){console.warn(`[Outlit] Pending stage event queue full (${le}). Call setUser() or identify() to flush queued events.`);return}this.pendingStageEvents.push({stage:e,properties:i});return}let n=C({url:window.location.href,referrer:document.referrer,stage:e,properties:i});this.enqueue(n)}sendBillingEvent(e,i){if(!this.isTrackingEnabled){console.warn("[Outlit] Tracking not enabled. Call enableTracking() first.");return}let n=V({url:window.location.href,referrer:document.referrer,status:e,customerId:i.customerId,stripeCustomerId:i.stripeCustomerId,domain:i.domain,properties:i.properties});this.enqueue(n)}getVisitorId(){return this.visitorId}async flush(){if(this.eventQueue.length===0)return;let e=[...this.eventQueue];this.eventQueue=[],await this.sendEvents(e)}async shutdown(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),J(),te(),se(),this.sessionTracker=null,await this.flush()}initSessionTracking(){this.sessionTracker=re({onEngagement:this.options.trackEngagement!==!1?e=>this.enqueue(e):()=>{},idleTimeout:this.options.idleTimeout})}initPageviewTracking(){j((e,i,n)=>{this.sessionTracker?.onNavigation(e);let r=L({url:e,referrer:i,title:n});this.enqueue(r)})}initFormTracking(e){let i=this.options.autoIdentify!==!1?n=>{let r={};n.name&&(r.name=n.name),n.firstName&&(r.firstName=n.firstName),n.lastName&&(r.lastName=n.lastName),this.identify({email:n.email,traits:Object.keys(r).length>0?r:void 0})}:void 0;G((n,r,s)=>{let o=R({url:n,referrer:document.referrer,formId:r,formFields:s});this.enqueue(o)},e,i)}initCalendarTracking(){ee({onCalendarBooked:e=>{let i=$({url:window.location.href,referrer:document.referrer,provider:e.provider,eventType:e.eventType,startTime:e.startTime,endTime:e.endTime,duration:e.duration,isRecurring:e.isRecurring,inviteeEmail:e.inviteeEmail,inviteeName:e.inviteeName});this.enqueue(i)}})}enqueue(e){this.eventQueue.push(e),this.eventQueue.length>=10&&this.flush()}startFlushTimer(){this.flushTimer||(this.flushTimer=setInterval(()=>{this.flush()},this.flushInterval))}async sendEvents(e){if(e.length===0||!this.visitorId)return;let i=this.currentUser??void 0,n=this.sessionTracker?.getSessionId(),r=z(this.visitorId,"client",e,i,n),s=`${this.apiHost}/api/i/v1/${this.publicKey}/events`;try{if(typeof navigator<"u"&&navigator.sendBeacon){let l=new Blob([JSON.stringify(r)],{type:"application/json"});if(navigator.sendBeacon(s,l))return;console.warn(`[Outlit] sendBeacon failed for ${e.length} events, falling back to fetch`)}let o=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r),keepalive:!0});o.ok||console.warn(`[Outlit] Server returned ${o.status} when sending ${e.length} events`)}catch(o){console.warn(`[Outlit] Failed to send ${e.length} events:`,o)}}};var ze=typeof window<"u"?window.outlit:void 0,He=ze?._q||[],a={_initialized:!1,_instance:null,_queue:[],_loaded:!0,init(t){if(this._initialized){console.warn("[Outlit] Already initialized");return}this._instance=new _(t),this._initialized=!0;for(let[e,i]of He){let n=this;if(e.includes(".")){let[r,s]=e.split(".");r&&s&&r in n&&typeof n[r][s]=="function"&&n[r][s](...i)}else e in n&&typeof n[e]=="function"&&n[e](...i)}for(;this._queue.length>0;)this._queue.shift()?.()},track(t,e){if(!this._initialized||!this._instance){this._queue.push(()=>this.track(t,e));return}this._instance.track(t,e)},identify(t){if(!this._initialized||!this._instance){this._queue.push(()=>this.identify(t));return}this._instance.identify(t)},getVisitorId(){return this._instance?this._instance.getVisitorId():null},enableTracking(){if(!this._initialized||!this._instance){this._queue.push(()=>this.enableTracking());return}this._instance.enableTracking()},isTrackingEnabled(){return this._instance?this._instance.isEnabled():!1},setUser(t){if(!this._initialized||!this._instance){this._queue.push(()=>this.setUser(t));return}this._instance.setUser(t)},clearUser(){if(!this._initialized||!this._instance){this._queue.push(()=>this.clearUser());return}this._instance.clearUser()},user:{identify(t){if(!a._initialized||!a._instance){a._queue.push(()=>a.user.identify(t));return}a._instance.user.identify(t)},activate(t){if(!a._initialized||!a._instance){a._queue.push(()=>a.user.activate(t));return}a._instance.user.activate(t)},engaged(t){if(!a._initialized||!a._instance){a._queue.push(()=>a.user.engaged(t));return}a._instance.user.engaged(t)},inactive(t){if(!a._initialized||!a._instance){a._queue.push(()=>a.user.inactive(t));return}a._instance.user.inactive(t)}},customer:{trialing(t){if(!a._initialized||!a._instance){a._queue.push(()=>a.customer.trialing(t));return}a._instance.customer.trialing(t)},paid(t){if(!a._initialized||!a._instance){a._queue.push(()=>a.customer.paid(t));return}a._instance.customer.paid(t)},churned(t){if(!a._initialized||!a._instance){a._queue.push(()=>a.customer.churned(t));return}a._instance.customer.churned(t)}}};function ue(){let t=document.currentScript;if(t||(t=document.querySelector("script[data-public-key]")),!t){console.warn("[Outlit] No script tag found with data-public-key attribute");return}let e=t.getAttribute("data-public-key");if(!e){console.warn("[Outlit] Missing data-public-key attribute on script tag");return}let i=t.getAttribute("data-api-host")??void 0,n=t.getAttribute("data-track-pageviews")!=="false",r=t.getAttribute("data-track-forms")!=="false",s=t.getAttribute("data-auto-track")!=="false",o=t.getAttribute("data-auto-identify")!=="false",l=t.getAttribute("data-track-calendar-embeds")!=="false";a.init({publicKey:e,apiHost:i,trackPageviews:n,trackForms:r,autoTrack:s,autoIdentify:o,trackCalendarEmbeds:l})}typeof window<"u"&&(window.outlit=a,document.readyState==="loading"?document.addEventListener("DOMContentLoaded",ue):ue());return ve(je);})();
2
2
  //# sourceMappingURL=outlit.global.js.map