@outlit/browser 0.2.1 → 0.3.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 lt=Object.getOwnPropertyDescriptor;var ut=Object.getOwnPropertyNames;var ct=Object.prototype.hasOwnProperty;var dt=(e,t)=>{for(var i in t)S(e,i,{get:t[i],enumerable:!0})},mt=(e,t,i,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ut(t))!ct.call(e,r)&&r!==i&&S(e,r,{get:()=>t[r],enumerable:!(n=lt(t,r))||n.enumerable});return e};var ft=e=>mt(S({},"__esModule",{value:!0}),e);var Vt={};dt(Vt,{outlit:()=>D});var L="https://app.outlit.ai",pt=["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 m(e){try{let i=new URL(e).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{return}}function f(e){try{return new URL(e).pathname}catch{return"/"}}function gt(e,t){let i=e.toLowerCase().replace(/[-_\s]/g,"");return t.some(n=>{let r=n.toLowerCase().replace(/[-_\s]/g,"");return i.includes(r)})}function vt(e){let t=e.replace(/[\s-]/g,"");return!!(/^\d{13,19}$/.test(t)||/^\d{9}$/.test(t)||/^\d{3}-\d{2}-\d{4}$/.test(e))}function P(e,t){if(!e)return;let i=t??pt,n={};for(let[r,s]of Object.entries(e))gt(r,i)||vt(s)||(n[r]=s);return Object.keys(n).length>0?n:void 0}function x(e){return!e||typeof e!="string"?!1:/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e.trim())}var ht=[/^e?-?mail$/i,/^email[_-]?address$/i,/^user[_-]?email$/i,/^work[_-]?email$/i,/^contact[_-]?email$/i,/^primary[_-]?email$/i,/^business[_-]?email$/i],yt=[/^name$/i,/^full[_-]?name$/i,/^your[_-]?name$/i,/^customer[_-]?name$/i,/^contact[_-]?name$/i,/^display[_-]?name$/i],Tt=[/^first[_-]?name$/i,/^firstname$/i,/^first$/i,/^fname$/i,/^given[_-]?name$/i,/^forename$/i],bt=[/^last[_-]?name$/i,/^lastname$/i,/^last$/i,/^lname$/i,/^surname$/i,/^family[_-]?name$/i];function T(e,t){let i=e.trim();return t.some(n=>n.test(i))}function kt(e,t){if(t){for(let[i,n]of t.entries())if(n==="email"){let r=e[i];if(r&&x(r))return r.trim()}}for(let[i,n]of Object.entries(e))if(T(i,ht)&&x(n))return n.trim();for(let i of Object.values(e))if(x(i))return i.trim()}function wt(e){let t,i,n;for(let[s,a]of Object.entries(e)){let l=a?.trim();l&&(!t&&T(s,yt)&&(t=l),!i&&T(s,Tt)&&(i=l),!n&&T(s,bt)&&(n=l))}let r={};return t?r.name=t:i&&n?(r.name=`${i} ${n}`,r.firstName=i,r.lastName=n):i?r.firstName=i:n&&(r.lastName=n),r}function F(e,t){let i=kt(e,t);if(!i)return;let n=wt(e);return{email:i,...n}}function N(e){let{url:t,referrer:i,timestamp:n,title:r}=e;return{type:"pageview",timestamp:n??Date.now(),url:t,path:f(t),referrer:i,utm:m(t),title:r}}function M(e){let{url:t,referrer:i,timestamp:n,formId:r,formFields:s}=e;return{type:"form",timestamp:n??Date.now(),url:t,path:f(t),referrer:i,utm:m(t),formId:r,formFields:s}}function U(e){let{url:t,referrer:i,timestamp:n,email:r,userId:s,traits:a}=e;return{type:"identify",timestamp:n??Date.now(),url:t,path:f(t),referrer:i,utm:m(t),email:r,userId:s,traits:a}}function $(e){let{url:t,referrer:i,timestamp:n,eventName:r,properties:s}=e;return{type:"custom",timestamp:n??Date.now(),url:t,path:f(t),referrer:i,utm:m(t),eventName:r,properties:s}}function B(e){let{url:t,referrer:i,timestamp:n,provider:r,eventType:s,startTime:a,endTime:l,duration:p,isRecurring:o,inviteeEmail:d,inviteeName:ot}=e;return{type:"calendar",timestamp:n??Date.now(),url:t,path:f(t),referrer:i,utm:m(t),provider:r,eventType:s,startTime:a,endTime:l,duration:p,isRecurring:o,inviteeEmail:d,inviteeName:ot}}function R(e){let{url:t,referrer:i,timestamp:n,activeTimeMs:r,totalTimeMs:s,sessionId:a}=e;return{type:"engagement",timestamp:n??Date.now(),url:t,path:f(t),referrer:i,utm:m(t),activeTimeMs:r,totalTimeMs:s,sessionId:a}}function V(e,t,i){return{visitorId:e,source:t,events:i}}var b=null,H=null;function j(e){b=e,q(),Et()}function q(){if(!b)return;let e=window.location.href,t=document.referrer,i=document.title;e!==H&&(H=e,b(e,t,i))}function C(){setTimeout(q,10)}function Et(){window.addEventListener("popstate",()=>{C()});let e=history.pushState,t=history.replaceState;history.pushState=function(...i){e.apply(this,i),C()},history.replaceState=function(...i){t.apply(this,i),C()}}var k=null,z,w=null;function K(e,t,i){k=e,z=t,w=i??null,document.addEventListener("submit",Q,!0)}function Q(e){if(!k)return;let t=e.target;if(!(t instanceof HTMLFormElement))return;let i=window.location.href,n=t.id||t.name||void 0,r=new FormData(t),s={},a=new Map,l=t.querySelectorAll("input, select, textarea");for(let o of l){let d=o.getAttribute("name");d&&o instanceof HTMLInputElement&&a.set(d,o.type)}r.forEach((o,d)=>{typeof o=="string"&&(s[d]=o)});let p=P(s,z);if(w){let o=F(s,a);o&&w(o)}p&&Object.keys(p).length>0&&k(i,n,p)}function Y(){b=null,k=null,w=null,document.removeEventListener("submit",Q,!0)}var u=null,E=!1,g=0,_=!1,v=null,It=10,St=200,xt=2e3;function X(e){let t={provider:"cal.com"};if(e.title){t.eventType=e.title;let i=e.title.match(/between .+ and (.+)$/i);i?.[1]&&(t.inviteeName=i[1].trim())}if(e.startTime&&(t.startTime=e.startTime),e.endTime&&(t.endTime=e.endTime),e.startTime&&e.endTime){let i=new Date(e.startTime),n=new Date(e.endTime);t.duration=Math.round((n.getTime()-i.getTime())/6e4)}return e.isRecurring!==void 0&&(t.isRecurring=e.isRecurring),t}function G(){if(!(typeof window>"u")&&!_){if(g++,"Cal"in window){let e=window.Cal;if(typeof e=="function")try{e("on",{action:"bookingSuccessfulV2",callback:Ct}),_=!0;return}catch{}}if(g<It){let e=Math.min(St*g,xt);setTimeout(G,e)}}}function Ct(e){if(!u)return;let t=e.detail?.data;if(!t||t.uid&&t.uid===v)return;v=t.uid||null;let i=X(t);u.onCalendarBooked(i)}function J(e){if(u){if(Ot(e)){if(e.data.event==="calendly.event_scheduled"){let t=Dt(e.data.payload);u.onCalendarBooked(t)}return}if(_t(e)){let t=At(e.data);if(t){if(t.uid&&t.uid===v)return;v=t.uid||null;let i=X(t);u.onCalendarBooked(i)}}}}function _t(e){if(!e.origin.includes("cal.com"))return!1;let t=e.data;if(!t||typeof t!="object")return!1;let i=t.type||t.action;return i==="bookingSuccessfulV2"||i==="bookingSuccessful"||i==="booking_successful"}function At(e){if(!e||typeof e!="object")return null;let t=e;return t.data&&typeof t.data=="object"?t.data:t.booking&&typeof t.booking=="object"?t.booking:null}function Ot(e){return e.origin==="https://calendly.com"&&e.data&&typeof e.data.event=="string"&&e.data.event.startsWith("calendly.")}function Dt(e){return{provider:"calendly"}}function W(e){E||(u=e,E=!0,g=0,window.addEventListener("message",J),G())}function Z(){E&&(window.removeEventListener("message",J),u=null,E=!1,_=!1,g=0,v=null)}var Lt=3e4,tt=1800*1e3,Pt=1e3,et=50,A="outlit_session_id",h="outlit_session_last_activity",O=class{state;options;idleTimeout;timeUpdateInterval=null;boundHandleActivity;boundHandleVisibilityChange;constructor(t){this.options=t,this.idleTimeout=t.idleTimeout??Lt,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 t=Date.now()-this.state.pageEntryTime;if(!(this.state.activeTimeMs<et&&t<et)){let n=R({url:this.state.currentUrl,referrer:document.referrer,activeTimeMs:this.state.activeTimeMs,totalTimeMs:t,sessionId:this.state.sessionId});this.options.onEngagement(n)}this.resetState()}onNavigation(t){this.emitEngagement(),this.state.currentUrl=t,this.state.currentPath=this.extractPath(t),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 t=Date.now();return{currentUrl:typeof window<"u"?window.location.href:"",currentPath:typeof window<"u"?window.location.pathname:"/",pageEntryTime:t,lastActiveTime:t,activeTimeMs:0,isPageVisible:typeof document<"u"?document.visibilityState==="visible":!0,isUserActive:!0,idleTimeoutId:null,sessionId:this.getOrCreateSessionId(),hasEmittedEngagement:!1}}resetState(){let t=Date.now();this.state.pageEntryTime=t,this.state.lastActiveTime=t,this.state.activeTimeMs=0,this.state.isUserActive=!0,this.resetIdleTimer()}getOrCreateSessionId(){if(typeof sessionStorage>"u")return this.generateSessionId();try{let t=sessionStorage.getItem(A),i=sessionStorage.getItem(h),n=i?Number.parseInt(i,10):0,r=Date.now();if(t&&n&&r-n<tt)return this.updateSessionActivity(),t;let s=this.generateSessionId();return sessionStorage.setItem(A,s),sessionStorage.setItem(h,r.toString()),s}catch{return this.generateSessionId()}}generateSessionId(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{let i=Math.random()*16|0;return(t==="x"?i:i&3|8).toString(16)})}updateSessionActivity(){if(!(typeof sessionStorage>"u"))try{sessionStorage.setItem(h,Date.now().toString())}catch{}}checkSessionExpiry(){if(!(typeof sessionStorage>"u"))try{let t=sessionStorage.getItem(h),i=t?Number.parseInt(t,10):0,n=Date.now();if(n-i>=tt){let r=this.generateSessionId();sessionStorage.setItem(A,r),this.state.sessionId=r}sessionStorage.setItem(h,n.toString())}catch{}}setupEventListeners(){if(typeof window>"u"||typeof document>"u")return;let t=["mousemove","keydown","click","scroll","touchstart"];for(let i of t)document.addEventListener(i,this.boundHandleActivity,{passive:!0});document.addEventListener("visibilitychange",this.boundHandleVisibilityChange),this.resetIdleTimer()}removeEventListeners(){if(typeof window>"u"||typeof document>"u")return;let t=["mousemove","keydown","click","scroll","touchstart"];for(let i of t)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 t=this.state.isPageVisible,i=document.visibilityState==="visible";t&&!i&&this.updateActiveTime(),this.state.isPageVisible=i,!t&&i&&(this.checkSessionExpiry(),this.state.lastActiveTime=Date.now(),this.state.hasEmittedEngagement=!1)}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()},Pt))}updateActiveTime(){if(this.state.isPageVisible&&this.state.isUserActive){let t=Date.now();this.state.activeTimeMs+=t-this.state.lastActiveTime,this.state.lastActiveTime=t}}extractPath(t){try{return new URL(t).pathname}catch{return"/"}}},c=null;function it(e){return c?(console.warn("[Outlit] Session tracking already initialized"),c):(c=new O(e),c)}function nt(){c&&(c.stop(),c=null)}var y="outlit_visitor_id";function Ft(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}function st(){try{let i=localStorage.getItem(y);if(i&&rt(i))return i}catch{}let e=Mt(y);if(e&&rt(e)){try{localStorage.setItem(y,e)}catch{}return e}let t=Ft();return Nt(t),t}function Nt(e){try{localStorage.setItem(y,e)}catch{}$t(y,e,365)}function rt(e){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(e)}function Mt(e){if(typeof document>"u")return null;let i=`; ${document.cookie}`.split(`; ${e}=`);return i.length===2?i.pop()?.split(";").shift()??null:null}function Ut(){if(typeof window>"u")return null;let e=window.location.hostname;if(e==="localhost"||/^(\d{1,3}\.){3}\d{1,3}$/.test(e))return null;let t=e.split(".");if(t.length>=2){let i=["co.uk","com.au","co.nz","org.uk","net.au","com.br"],n=t.slice(-2).join(".");return i.includes(n)&&t.length>=3?t.slice(-3).join("."):t.slice(-2).join(".")}return null}function $t(e,t,i){if(typeof document>"u")return;let n=new Date;n.setTime(n.getTime()+i*24*60*60*1e3);let r=`${e}=${t};expires=${n.toUTCString()};path=/;SameSite=Lax`,s=Ut();s&&(r+=`;domain=${s}`),document.cookie=r}var I=class{publicKey;apiHost;visitorId=null;eventQueue=[];flushTimer=null;flushInterval;isInitialized=!1;isTrackingEnabled=!1;options;hasHandledExit=!1;sessionTracker=null;constructor(t){if(this.publicKey=t.publicKey,this.apiHost=t.apiHost??L,this.flushInterval=t.flushInterval??5e3,this.options=t,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,t.autoTrack!==!1&&this.enableTracking()}enableTracking(){this.isTrackingEnabled||(this.visitorId=st(),this.startFlushTimer(),this.options.trackEngagement!==!1&&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)}isEnabled(){return this.isTrackingEnabled}track(t,i){if(!this.isTrackingEnabled){console.warn("[Outlit] Tracking not enabled. Call enableTracking() first.");return}let n=$({url:window.location.href,referrer:document.referrer,eventName:t,properties:i});this.enqueue(n)}identify(t){if(!this.isTrackingEnabled){console.warn("[Outlit] Tracking not enabled. Call enableTracking() first.");return}let i=U({url:window.location.href,referrer:document.referrer,email:t.email,userId:t.userId,traits:t.traits});this.enqueue(i)}getVisitorId(){return this.visitorId}async flush(){if(this.eventQueue.length===0)return;let t=[...this.eventQueue];this.eventQueue=[],await this.sendEvents(t)}async shutdown(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),Y(),Z(),nt(),this.sessionTracker=null,await this.flush()}initSessionTracking(){this.sessionTracker=it({onEngagement:t=>{this.enqueue(t)},idleTimeout:this.options.idleTimeout})}initPageviewTracking(){j((t,i,n)=>{this.sessionTracker?.onNavigation(t);let r=N({url:t,referrer:i,title:n});this.enqueue(r)})}initFormTracking(t){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;K((n,r,s)=>{let a=M({url:n,referrer:document.referrer,formId:r,formFields:s});this.enqueue(a)},t,i)}initCalendarTracking(){W({onCalendarBooked:t=>{let i=B({url:window.location.href,referrer:document.referrer,provider:t.provider,eventType:t.eventType,startTime:t.startTime,endTime:t.endTime,duration:t.duration,isRecurring:t.isRecurring,inviteeEmail:t.inviteeEmail,inviteeName:t.inviteeName});this.enqueue(i)}})}enqueue(t){this.eventQueue.push(t),this.eventQueue.length>=10&&this.flush()}startFlushTimer(){this.flushTimer||(this.flushTimer=setInterval(()=>{this.flush()},this.flushInterval))}async sendEvents(t){if(t.length===0||!this.visitorId)return;let i=V(this.visitorId,"client",t),n=`${this.apiHost}/api/i/v1/${this.publicKey}/events`;try{if(typeof navigator<"u"&&navigator.sendBeacon){let r=new Blob([JSON.stringify(i)],{type:"application/json"});if(navigator.sendBeacon(n,r))return}await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i),keepalive:!0})}catch(r){console.warn("[Outlit] Failed to send events:",r)}}};var Bt=typeof window<"u"?window.outlit:void 0,Rt=Bt?._q||[],D={_initialized:!1,_instance:null,_queue:[],_loaded:!0,init(e){if(this._initialized){console.warn("[Outlit] Already initialized");return}this._instance=new I(e),this._initialized=!0;for(let[t,i]of Rt){let n=this;t in n&&typeof n[t]=="function"&&n[t](...i)}for(;this._queue.length>0;)this._queue.shift()?.()},track(e,t){if(!this._initialized||!this._instance){this._queue.push(()=>this.track(e,t));return}this._instance.track(e,t)},identify(e){if(!this._initialized||!this._instance){this._queue.push(()=>this.identify(e));return}this._instance.identify(e)},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}};function at(){let e=document.currentScript;if(e||(e=document.querySelector("script[data-public-key]")),!e){console.warn("[Outlit] No script tag found with data-public-key attribute");return}let t=e.getAttribute("data-public-key");if(!t){console.warn("[Outlit] Missing data-public-key attribute on script tag");return}let i=e.getAttribute("data-api-host")??void 0,n=e.getAttribute("data-track-pageviews")!=="false",r=e.getAttribute("data-track-forms")!=="false",s=e.getAttribute("data-auto-track")!=="false",a=e.getAttribute("data-auto-identify")!=="false",l=e.getAttribute("data-track-calendar-embeds")!=="false";D.init({publicKey:t,apiHost:i,trackPageviews:n,trackForms:r,autoTrack:s,autoIdentify:a,trackCalendarEmbeds:l})}typeof window<"u"&&(window.outlit=D,document.readyState==="loading"?document.addEventListener("DOMContentLoaded",at):at());return ft(Vt);})();
1
+ "use strict";var Outlit=(()=>{var _=Object.defineProperty;var ue=Object.getOwnPropertyDescriptor;var ce=Object.getOwnPropertyNames;var de=Object.prototype.hasOwnProperty;var me=(t,e)=>{for(var i in e)_(t,i,{get:e[i],enumerable:!0})},fe=(t,e,i,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of ce(e))!de.call(t,r)&&r!==i&&_(t,r,{get:()=>e[r],enumerable:!(n=ue(e,r))||n.enumerable});return t};var ge=t=>fe(_({},"__esModule",{value:!0}),t);var ze={};me(ze,{outlit:()=>O});var D="https://app.outlit.ai",pe=["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 u(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{return}}function c(t){try{return new URL(t).pathname}catch{return"/"}}function he(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 ve(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 R(t,e){if(!t)return;let i=e??pe,n={};for(let[r,s]of Object.entries(t))he(r,i)||ve(s)||(n[r]=s);return Object.keys(n).length>0?n:void 0}function S(t){return!t||typeof t!="string"?!1:/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t.trim())}var ye=[/^e?-?mail$/i,/^email[_-]?address$/i,/^user[_-]?email$/i,/^work[_-]?email$/i,/^contact[_-]?email$/i,/^primary[_-]?email$/i,/^business[_-]?email$/i],be=[/^name$/i,/^full[_-]?name$/i,/^your[_-]?name$/i,/^customer[_-]?name$/i,/^contact[_-]?name$/i,/^display[_-]?name$/i],Te=[/^first[_-]?name$/i,/^firstname$/i,/^first$/i,/^fname$/i,/^given[_-]?name$/i,/^forename$/i],ke=[/^last[_-]?name$/i,/^lastname$/i,/^last$/i,/^lname$/i,/^surname$/i,/^family[_-]?name$/i];function b(t,e){let i=t.trim();return e.some(n=>n.test(i))}function Ee(t,e){if(e){for(let[i,n]of e.entries())if(n==="email"){let r=t[i];if(r&&S(r))return r.trim()}}for(let[i,n]of Object.entries(t))if(b(i,ye)&&S(n))return n.trim();for(let i of Object.values(t))if(S(i))return i.trim()}function Ie(t){let e,i,n;for(let[s,a]of Object.entries(t)){let l=a?.trim();l&&(!e&&b(s,be)&&(e=l),!i&&b(s,Te)&&(i=l),!n&&b(s,ke)&&(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 L(t,e){let i=Ee(t,e);if(!i)return;let n=Ie(t);return{email:i,...n}}function N(t){let{url:e,referrer:i,timestamp:n,title:r}=t;return{type:"pageview",timestamp:n??Date.now(),url:e,path:c(e),referrer:i,utm:u(e),title:r}}function P(t){let{url:e,referrer:i,timestamp:n,formId:r,formFields:s}=t;return{type:"form",timestamp:n??Date.now(),url:e,path:c(e),referrer:i,utm:u(e),formId:r,formFields:s}}function M(t){let{url:e,referrer:i,timestamp:n,email:r,userId:s,traits:a}=t;return{type:"identify",timestamp:n??Date.now(),url:e,path:c(e),referrer:i,utm:u(e),email:r,userId:s,traits:a}}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:c(e),referrer:i,utm:u(e),eventName:r,properties:s}}function $(t){let{url:e,referrer:i,timestamp:n,provider:r,eventType:s,startTime:a,endTime:l,duration:g,isRecurring:o,inviteeEmail:f,inviteeName:le}=t;return{type:"calendar",timestamp:n??Date.now(),url:e,path:c(e),referrer:i,utm:u(e),provider:r,eventType:s,startTime:a,endTime:l,duration:g,isRecurring:o,inviteeEmail:f,inviteeName:le}}function B(t){let{url:e,referrer:i,timestamp:n,activeTimeMs:r,totalTimeMs:s,sessionId:a}=t;return{type:"engagement",timestamp:n??Date.now(),url:e,path:c(e),referrer:i,utm:u(e),activeTimeMs:r,totalTimeMs:s,sessionId:a}}function V(t){let{url:e,referrer:i,timestamp:n,stage:r,properties:s}=t;return{type:"stage",timestamp:n??Date.now(),url:e,path:c(e),referrer:i,utm:u(e),stage:r,properties:s}}function q(t,e,i,n){let r={visitorId:t,source:e,events:i};return n&&(n.email||n.userId)&&(r.userIdentity={...n.email&&{email:n.email},...n.userId&&{userId:n.userId}}),r}var T=null,z=null;function H(t){T=t,j(),we()}function j(){if(!T)return;let t=window.location.href,e=document.referrer,i=document.title;t!==z&&(z=t,T(t,e,i))}function x(){setTimeout(j,10)}function we(){window.addEventListener("popstate",()=>{x()});let t=history.pushState,e=history.replaceState;history.pushState=function(...i){t.apply(this,i),x()},history.replaceState=function(...i){e.apply(this,i),x()}}var k=null,K,E=null;function Q(t,e,i){k=t,K=e,E=i??null,document.addEventListener("submit",Y,!0)}function Y(t){if(!k)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={},a=new Map,l=e.querySelectorAll("input, select, textarea");for(let o of l){let f=o.getAttribute("name");f&&o instanceof HTMLInputElement&&a.set(f,o.type)}r.forEach((o,f)=>{typeof o=="string"&&(s[f]=o)});let g=R(s,K);if(E){let o=L(s,a);o&&E(o)}g&&Object.keys(g).length>0&&k(i,n,g)}function G(){T=null,k=null,E=null,document.removeEventListener("submit",Y,!0)}var d=null,I=!1,p=0,C=!1,h=null,_e=10,Se=200,xe=2e3;function J(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 X(){if(!(typeof window>"u")&&!C){if(p++,"Cal"in window){let t=window.Cal;if(typeof t=="function")try{t("on",{action:"bookingSuccessfulV2",callback:Ce}),C=!0;return}catch{}}if(p<_e){let t=Math.min(Se*p,xe);setTimeout(X,t)}}}function Ce(t){if(!d)return;let e=t.detail?.data;if(!e||e.uid&&e.uid===h)return;h=e.uid||null;let i=J(e);d.onCalendarBooked(i)}function W(t){if(d){if(Oe(t)){if(t.data.event==="calendly.event_scheduled"){let e=De(t.data.payload);d.onCalendarBooked(e)}return}if(Ue(t)){let e=Ae(t.data);if(e){if(e.uid&&e.uid===h)return;h=e.uid||null;let i=J(e);d.onCalendarBooked(i)}}}}function Ue(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 Ae(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 Oe(t){return t.origin==="https://calendly.com"&&t.data&&typeof t.data.event=="string"&&t.data.event.startsWith("calendly.")}function De(t){return{provider:"calendly"}}function Z(t){I||(d=t,I=!0,p=0,window.addEventListener("message",W),X())}function ee(){I&&(window.removeEventListener("message",W),d=null,I=!1,C=!1,p=0,h=null)}var Re=3e4,te=1800*1e3,Le=1e3,ie=50,Ne=500,U="outlit_session_id",v="outlit_session_last_activity",A=class{state;options;idleTimeout;timeUpdateInterval=null;boundHandleActivity;boundHandleVisibilityChange;constructor(e){this.options=e,this.idleTimeout=e.idleTimeout??Re,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<ie&&e<ie,n=e<Ne;if(!i&&!n){let r=B({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(U),i=sessionStorage.getItem(v),n=i?Number.parseInt(i,10):0,r=Date.now();if(e&&n&&r-n<te)return this.updateSessionActivity(),e;let s=this.generateSessionId();return sessionStorage.setItem(U,s),sessionStorage.setItem(v,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(v,Date.now().toString())}catch{}}checkSessionExpiry(){if(!(typeof sessionStorage>"u"))try{let e=sessionStorage.getItem(v),i=e?Number.parseInt(e,10):0,n=Date.now();if(n-i>=te){let r=this.generateSessionId();sessionStorage.setItem(U,r),this.state.sessionId=r}sessionStorage.setItem(v,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)}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"/"}}},m=null;function ne(t){return m?(console.warn("[Outlit] Session tracking already initialized"),m):(m=new A(t),m)}function re(){m&&(m.stop(),m=null)}var y="outlit_visitor_id";function Pe(){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 ae(){try{let i=localStorage.getItem(y);if(i&&se(i))return i}catch{}let t=Fe(y);if(t&&se(t)){try{localStorage.setItem(y,t)}catch{}return t}let e=Pe();return Me(e),e}function Me(t){try{localStorage.setItem(y,t)}catch{}Be(y,t,365)}function se(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 Fe(t){if(typeof document>"u")return null;let i=`; ${document.cookie}`.split(`; ${t}=`);return i.length===2?i.pop()?.split(";").shift()??null:null}function $e(){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 Be(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=$e();s&&(r+=`;domain=${s}`),document.cookie=r}var w=class{publicKey;apiHost;visitorId=null;eventQueue=[];flushTimer=null;flushInterval;isInitialized=!1;isTrackingEnabled=!1;options;hasHandledExit=!1;sessionTracker=null;currentUser=null;pendingUser=null;constructor(e){if(this.publicKey=e.publicKey,this.apiHost=e.apiHost??D,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=ae(),this.startFlushTimer(),this.options.trackEngagement!==!1&&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}(e.email||e.userId)&&(this.currentUser={email:e.email,userId:e.userId});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}applyUser(e){this.currentUser=e,this.identify({email:e.email,userId:e.userId,traits:e.traits})}activate(e){this.sendStageEvent("activated",e)}engaged(e){this.sendStageEvent("engaged",e)}paid(e){this.sendStageEvent("paid",e)}churned(e){this.sendStageEvent("churned",e)}sendStageEvent(e,i){if(!this.isTrackingEnabled){console.warn("[Outlit] Tracking not enabled. Call enableTracking() first.");return}if(!this.currentUser){console.warn(`[Outlit] Cannot call ${e}() without setting user identity. Call setUser() or identify() first.`);return}let n=V({url:window.location.href,referrer:document.referrer,stage:e,properties:i});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),G(),ee(),re(),this.sessionTracker=null,await this.flush()}initSessionTracking(){this.sessionTracker=ne({onEngagement:e=>{this.enqueue(e)},idleTimeout:this.options.idleTimeout})}initPageviewTracking(){H((e,i,n)=>{this.sessionTracker?.onNavigation(e);let r=N({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;Q((n,r,s)=>{let a=P({url:n,referrer:document.referrer,formId:r,formFields:s});this.enqueue(a)},e,i)}initCalendarTracking(){Z({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=q(this.visitorId,"client",e,i),r=`${this.apiHost}/api/i/v1/${this.publicKey}/events`;try{if(typeof navigator<"u"&&navigator.sendBeacon){let s=new Blob([JSON.stringify(n)],{type:"application/json"});if(navigator.sendBeacon(r,s))return}await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n),keepalive:!0})}catch(s){console.warn("[Outlit] Failed to send events:",s)}}};var Ve=typeof window<"u"?window.outlit:void 0,qe=Ve?._q||[],O={_initialized:!1,_instance:null,_queue:[],_loaded:!0,init(t){if(this._initialized){console.warn("[Outlit] Already initialized");return}this._instance=new w(t),this._initialized=!0;for(let[e,i]of qe){let n=this;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()},activate(t){if(!this._initialized||!this._instance){this._queue.push(()=>this.activate(t));return}this._instance.activate(t)},engaged(t){if(!this._initialized||!this._instance){this._queue.push(()=>this.engaged(t));return}this._instance.engaged(t)},paid(t){if(!this._initialized||!this._instance){this._queue.push(()=>this.paid(t));return}this._instance.paid(t)},churned(t){if(!this._initialized||!this._instance){this._queue.push(()=>this.churned(t));return}this._instance.churned(t)}};function oe(){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",a=t.getAttribute("data-auto-identify")!=="false",l=t.getAttribute("data-track-calendar-embeds")!=="false";O.init({publicKey:e,apiHost:i,trackPageviews:n,trackForms:r,autoTrack:s,autoIdentify:a,trackCalendarEmbeds:l})}typeof window<"u"&&(window.outlit=O,document.readyState==="loading"?document.addEventListener("DOMContentLoaded",oe):oe());return ge(ze);})();
2
2
  //# sourceMappingURL=outlit.global.js.map