@outlit/browser 1.4.1 → 1.4.5
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.
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +96 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +99 -8
- package/dist/index.mjs.map +1 -1
- package/dist/outlit.global.js +1 -1
- package/dist/outlit.global.js.map +1 -1
- package/dist/react/index.d.mts +116 -116
- package/dist/react/index.d.ts +116 -116
- package/dist/react/index.js +100 -8
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +103 -10
- package/dist/react/index.mjs.map +1 -1
- package/dist/{tracker-OMgVDwlV.d.mts → tracker-DlHUyaah.d.mts} +5 -6
- package/dist/{tracker-OMgVDwlV.d.ts → tracker-DlHUyaah.d.ts} +5 -6
- package/dist/vue/index.d.mts +47 -47
- package/dist/vue/index.d.ts +47 -47
- package/dist/vue/index.js +99 -7
- package/dist/vue/index.js.map +1 -1
- package/dist/vue/index.mjs +102 -9
- package/dist/vue/index.mjs.map +1 -1
- package/package.json +32 -32
- package/LICENSE +0 -201
package/dist/outlit.global.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var Outlit=(()=>{var A=Object.defineProperty;var be=Object.getOwnPropertyDescriptor;var Te=Object.getOwnPropertyNames;var ke=Object.prototype.hasOwnProperty;var Ee=(t,e)=>{for(var i in e)A(t,i,{get:e[i],enumerable:!0})},Ie=(t,e,i,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Te(e))!ke.call(t,r)&&r!==i&&A(t,r,{get:()=>e[r],enumerable:!(n=be(e,r))||n.enumerable});return t};var we=t=>Ie(A({},"__esModule",{value:!0}),t);var Xe={};Ee(Xe,{outlit:()=>a});var V="https://app.outlit.ai",_e=["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(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 f(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 Se(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 xe(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 z(t,e){if(!t)return;let i=e??_e,n={};for(let[r,s]of Object.entries(t))Se(r,i)||xe(s)||(n[r]=s);return Object.keys(n).length>0?n:void 0}function D(t){return!t||typeof t!="string"?!1:/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t.trim())}var Ce=[/^e?-?mail$/i,/^email[_-]?address$/i,/^user[_-]?email$/i,/^work[_-]?email$/i,/^contact[_-]?email$/i,/^primary[_-]?email$/i,/^business[_-]?email$/i],Oe=[/^name$/i,/^full[_-]?name$/i,/^your[_-]?name$/i,/^customer[_-]?name$/i,/^contact[_-]?name$/i,/^display[_-]?name$/i],Ue=[/^first[_-]?name$/i,/^firstname$/i,/^first$/i,/^fname$/i,/^given[_-]?name$/i,/^forename$/i],Ae=[/^last[_-]?name$/i,/^lastname$/i,/^last$/i,/^lname$/i,/^surname$/i,/^family[_-]?name$/i];function I(t,e){let i=t.trim();return e.some(n=>n.test(i))}function De(t,e){if(e){for(let[i,n]of e.entries())if(n==="email"){let r=t[i];if(r&&D(r))return r.trim()}}for(let[i,n]of Object.entries(t))if(I(i,Ce)&&D(n))return n.trim();for(let i of Object.values(t))if(D(i))return i.trim()}function Be(t){let e,i,n;for(let[s,o]of Object.entries(t)){let l=o?.trim();l&&(!e&&I(s,Oe)&&(e=l),!i&&I(s,Ue)&&(i=l),!n&&I(s,Ae)&&(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 H(t,e){let i=De(t,e);if(!i)return;let n=Be(t);return{email:i,...n}}function j(t){let{url:e,referrer:i,timestamp:n,title:r}=t;return{type:"pageview",timestamp:n??Date.now(),url:e,path:f(e),referrer:i,utm:m(e),title:r}}function K(t){let{url:e,referrer:i,timestamp:n,formId:r,formFields:s}=t;return{type:"form",timestamp:n??Date.now(),url:e,path:f(e),referrer:i,utm:m(e),formId:r,formFields:s}}function Q(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:f(e),referrer:i,utm:m(e),email:r,userId:s,fingerprint:o,traits:l}}function Y(t){let{url:e,referrer:i,timestamp:n,eventName:r,properties:s}=t;return{type:"custom",timestamp:n??Date.now(),url:e,path:f(e),referrer:i,utm:m(e),eventName:r,properties:s}}function G(t){let{url:e,referrer:i,timestamp:n,provider:r,eventType:s,startTime:o,endTime:l,duration:d,isRecurring:u,inviteeEmail:c,inviteeName:k}=t;return{type:"calendar",timestamp:n??Date.now(),url:e,path:f(e),referrer:i,utm:m(e),provider:r,eventType:s,startTime:o,endTime:l,duration:d,isRecurring:u,inviteeEmail:c,inviteeName:k}}function J(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:f(e),referrer:i,utm:m(e),activeTimeMs:r,totalTimeMs:s,sessionId:o}}function B(t){let{url:e,referrer:i,timestamp:n,stage:r,properties:s}=t;return{type:"stage",timestamp:n??Date.now(),url:e,path:f(e),referrer:i,utm:m(e),stage:r,properties:s}}function X(t){let{url:e,referrer:i,timestamp:n,status:r,customerId:s,stripeCustomerId:o,domain:l,properties:d}=t;return{type:"billing",timestamp:n??Date.now(),url:e,path:f(e),referrer:i,utm:m(e),status:r,customerId:s,stripeCustomerId:o,domain:l,properties:d}}function W(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 w=null,Z=null;function ee(t){w=t,te(),Ne()}function te(){if(!w)return;let t=window.location.href,e=document.referrer,i=document.title;t!==Z&&(Z=t,w(t,e,i))}function N(){setTimeout(te,10)}function Ne(){window.addEventListener("popstate",()=>{N()});let t=history.pushState,e=history.replaceState;history.pushState=function(...i){t.apply(this,i),N()},history.replaceState=function(...i){e.apply(this,i),N()}}var _=null,ie,S=null;function ne(t,e,i){_=t,ie=e,S=i??null,document.addEventListener("submit",re,!0)}function re(t){if(!_)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 c=u.getAttribute("name");c&&u instanceof HTMLInputElement&&o.set(c,u.type)}r.forEach((u,c)=>{typeof u=="string"&&(s[c]=u)});let d=z(s,ie);if(S){let u={...s},c=new Map(o);for(let E=0;E<l.length;E++){let h=l[E];if(h instanceof HTMLInputElement&&!h.name&&h.value){let q=`_unnamed_${E}`;u[q]=h.value,c.set(q,h.type)}}let k=H(u,c);k&&S(k)}d&&Object.keys(d).length>0&&_(i,n,d)}function P(){w=null,_=null,S=null,document.removeEventListener("submit",re,!0)}var g=null,x=!1,v=0,L=!1,y=null,Pe=10,Le=200,Me=2e3;function se(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 ae(){if(!(typeof window>"u")&&!L){if(v++,"Cal"in window){let t=window.Cal;if(typeof t=="function")try{t("on",{action:"bookingSuccessfulV2",callback:Fe}),L=!0;return}catch{}}if(v<Pe){let t=Math.min(Le*v,Me);setTimeout(ae,t)}}}function Fe(t){if(!g)return;let e=t.detail?.data;if(!e||e.uid&&e.uid===y)return;y=e.uid||null;let i=se(e);g.onCalendarBooked(i)}function oe(t){if(g){if(qe(t)){if(t.data.event==="calendly.event_scheduled"){let e=Ve(t.data.payload);g.onCalendarBooked(e)}return}if(Re(t)){let e=$e(t.data);if(e){if(e.uid&&e.uid===y)return;y=e.uid||null;let i=se(e);g.onCalendarBooked(i)}}}}function Re(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 $e(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 qe(t){return t.origin==="https://calendly.com"&&t.data&&typeof t.data.event=="string"&&t.data.event.startsWith("calendly.")}function Ve(t){return{provider:"calendly"}}function le(t){x||(g=t,x=!0,v=0,window.addEventListener("message",oe),ae())}function M(){x&&(window.removeEventListener("message",oe),g=null,x=!1,L=!1,v=0,y=null)}var ze=3e4,ue=1800*1e3,He=1e3,ce=50,je=500,F="outlit_session_id",b="outlit_session_last_activity",R=class{state;options;idleTimeout;timeUpdateInterval=null;boundHandleActivity;boundHandleVisibilityChange;constructor(e){this.options=e,this.idleTimeout=e.idleTimeout??ze,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<ce&&e<ce,n=e<je;if(!i&&!n){let r=J({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(F),i=sessionStorage.getItem(b),n=i?Number.parseInt(i,10):0,r=Date.now();if(e&&n&&r-n<ue)return this.updateSessionActivity(),e;let s=this.generateSessionId();return sessionStorage.setItem(F,s),sessionStorage.setItem(b,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(b,Date.now().toString())}catch{}}checkSessionExpiry(){if(!(typeof sessionStorage>"u"))try{let e=sessionStorage.getItem(b),i=e?Number.parseInt(e,10):0,n=Date.now();if(n-i>=ue){let r=this.generateSessionId();sessionStorage.setItem(F,r),this.state.sessionId=r}sessionStorage.setItem(b,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()},He))}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"/"}}},p=null;function de(t){return p?(console.warn("[Outlit] Session tracking already initialized"),p):(p=new R(t),p)}function $(){p&&(p.stop(),p=null)}var T="outlit_visitor_id";function Ke(){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 fe(){try{let i=localStorage.getItem(T);if(i&&me(i))return i}catch{}let t=ge(T);if(t&&me(t)){try{localStorage.setItem(T,t)}catch{}return t}let e=Ke();return Qe(e),e}function Qe(t){try{localStorage.setItem(T,t)}catch{}pe(T,t,365)}function me(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 ge(t){if(typeof document>"u")return null;let i=`; ${document.cookie}`.split(`; ${t}=`);return i.length===2?i.pop()?.split(";").shift()??null:null}function Ye(){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 pe(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=Ye();s&&(r+=`;domain=${s}`),document.cookie=r}var C="outlit_consent";function he(){try{let e=localStorage.getItem(C);if(e==="1")return!0;if(e==="0")return!1}catch{}let t=ge(C);return t==="1"?!0:t==="0"?!1:null}function O(t){let e=t?"1":"0";try{localStorage.setItem(C,e)}catch{}pe(C,e,365)}var ve=10,U=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??V,this.flushInterval=e.flushInterval??5e3,this.options=e,typeof window<"u"){let n=()=>{this.hasHandledExit||(this.hasHandledExit=!0,this.sessionTracker?.emitEngagement(),this.flush())};document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"?n():this.hasHandledExit=!1}),window.addEventListener("pagehide",n),window.addEventListener("beforeunload",n)}this.isInitialized=!0;let i=he();(i===!0||i===null&&e.autoTrack!==!1)&&this.enableTracking()}enableTracking(){this.isTrackingEnabled||(this.visitorId=fe(),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,O(!0),this.pendingUser&&(this.applyUser(this.pendingUser),this.pendingUser=null))}async disableTracking(){if(!this.isTrackingEnabled){O(!1);return}this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),P(),M(),$(),await this.flush(),this.sessionTracker=null,this.isTrackingEnabled=!1,O(!1)}isEnabled(){return this.isTrackingEnabled}track(e,i){if(!this.isTrackingEnabled){console.warn("[Outlit] Tracking not enabled. Call enableTracking() first.");return}let n=Y({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=Q({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=B({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>=ve){console.warn(`[Outlit] Pending stage event queue full (${ve}). Call setUser() or identify() to flush queued events.`);return}this.pendingStageEvents.push({stage:e,properties:i});return}let n=B({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=X({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),P(),M(),$(),this.sessionTracker=null,await this.flush()}initSessionTracking(){this.sessionTracker=de({onEngagement:this.options.trackEngagement!==!1?e=>this.enqueue(e):()=>{},idleTimeout:this.options.idleTimeout})}initPageviewTracking(){ee((e,i,n)=>{this.sessionTracker?.onNavigation(e);let r=j({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;ne((n,r,s)=>{let o=K({url:n,referrer:document.referrer,formId:r,formFields:s});this.enqueue(o)},e,i)}initCalendarTracking(){le({onCalendarBooked:e=>{let i=G({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=W(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 Ge=typeof window<"u"?window.outlit:void 0,Je=Ge?._q||[],a={_initialized:!1,_instance:null,_queue:[],_loaded:!0,init(t){if(this._initialized){console.warn("[Outlit] Already initialized");return}this._instance=new U(t),this._initialized=!0;for(let[e,i]of Je){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()},async disableTracking(){if(!this._initialized||!this._instance){this._queue.push(()=>this.disableTracking());return}await this._instance.disableTracking()},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 ye(){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",ye):ye());return we(Xe);})();
|
|
1
|
+
"use strict";var Outlit=(()=>{var A=Object.defineProperty;var xe=Object.getOwnPropertyDescriptor;var we=Object.getOwnPropertyNames;var Se=Object.prototype.hasOwnProperty;var Ce=(t,e)=>{for(var i in e)A(t,i,{get:e[i],enumerable:!0})},_e=(t,e,i,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of we(e))!Se.call(t,r)&&r!==i&&A(t,r,{get:()=>e[r],enumerable:!(n=xe(e,r))||n.enumerable});return t};var Oe=t=>_e(A({},"__esModule",{value:!0}),t);var We={};Ce(We,{outlit:()=>a});var B="https://app.outlit.ai",R=["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(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 g(t){try{let e=new URL(t),i=e.pathname,n=e.hash;return n&&n.length>1&&(!e.hostname||e.protocol==="file:")?i=n.replace(/^#/,""):n.startsWith("#/")&&(e.pathname==="/"||e.pathname.endsWith("/index.html"))&&(i=n.slice(1)),i?i.startsWith("/")?i:`/${i}`:"/"}catch(e){return console.warn(`[Outlit] Failed to parse URL for path extraction: "${t}", defaulting to "/"`,e),"/"}}function te(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 Ue(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 F(t,e){if(!t)return;let i=e??R,n={};for(let[r,s]of Object.entries(t))te(r,i)||Ue(s)||(n[r]=s);return Object.keys(n).length>0?n:void 0}function N(t,e,i,n){let r=t&&t.trim().length>0,s=e&&e.trim().length>0,u=i&&i.trim().length>0,o=n&&n.trim().length>0;if(!r&&!s&&!u&&!o)throw new Error("Billing methods require customerId or customerDomain. Use customerId for your system-owned account ID and customerDomain for the public account domain.")}function k(t){return!t||typeof t!="string"?!1:/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t.trim())}var De=[/^e?-?mail$/i,/^email[_-]?address$/i,/^user[_-]?email$/i,/^work[_-]?email$/i,/^contact[_-]?email$/i,/^primary[_-]?email$/i,/^business[_-]?email$/i],Pe=[/^name$/i,/^full[_-]?name$/i,/^your[_-]?name$/i,/^customer[_-]?name$/i,/^contact[_-]?name$/i,/^display[_-]?name$/i],Ae=[/^first[_-]?name$/i,/^firstname$/i,/^first$/i,/^fname$/i,/^given[_-]?name$/i,/^forename$/i],Be=[/^last[_-]?name$/i,/^lastname$/i,/^last$/i,/^lname$/i,/^surname$/i,/^family[_-]?name$/i];function x(t,e){let i=t.trim();return e.some(n=>n.test(i))}function ie(t,e){if(e){for(let[i,n]of e.entries())if(n==="email"){let r=t[i];if(r&&k(r))return r.trim()}}for(let[i,n]of Object.entries(t))if(x(i,De)&&k(n))return n.trim();for(let i of Object.values(t))if(k(i))return i.trim()}function ne(t){let e,i,n;for(let[s,u]of Object.entries(t)){let o=u?.trim();o&&(!e&&x(s,Pe)&&(e=o),!i&&x(s,Ae)&&(i=o),!n&&x(s,Be)&&(n=o))}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 M(t,e){let i=ie(t,e);if(!i)return;let n=ne(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:g(e),referrer:i,utm:m(e),title:r}}function $(t){let{url:e,referrer:i,timestamp:n,formId:r,formFields:s}=t;return{type:"form",timestamp:n??Date.now(),url:e,path:g(e),referrer:i,utm:m(e),formId:r,formFields:s}}function q(t){let{url:e,referrer:i,timestamp:n,email:r,userId:s,fingerprint:u,traits:o,customerId:c,customerDomain:l,customerTraits:d}=t;return{type:"identify",timestamp:n??Date.now(),url:e,path:g(e),referrer:i,utm:m(e),email:r,userId:s,fingerprint:u,customerId:c,customerDomain:l,customerTraits:d,traits:o}}function V(t){let{url:e,referrer:i,timestamp:n,eventName:r,properties:s,email:u,userId:o,fingerprint:c,customerId:l,customerDomain:d}=t;return{type:"custom",timestamp:n??Date.now(),url:e,path:g(e),referrer:i,utm:m(e),eventName:r,email:u,userId:o,fingerprint:c,customerId:l,customerDomain:d,properties:s}}function H(t){let{url:e,referrer:i,timestamp:n,provider:r,eventType:s,startTime:u,endTime:o,duration:c,isRecurring:l,inviteeEmail:d,inviteeName:b}=t;return{type:"calendar",timestamp:n??Date.now(),url:e,path:g(e),referrer:i,utm:m(e),provider:r,eventType:s,startTime:u,endTime:o,duration:c,isRecurring:l,inviteeEmail:d,inviteeName:b}}function z(t){let{url:e,referrer:i,timestamp:n,activeTimeMs:r,totalTimeMs:s,sessionId:u}=t;return{type:"engagement",timestamp:n??Date.now(),url:e,path:g(e),referrer:i,utm:m(e),activeTimeMs:r,totalTimeMs:s,sessionId:u}}function w(t){let{url:e,referrer:i,timestamp:n,stage:r,properties:s}=t;return{type:"stage",timestamp:n??Date.now(),url:e,path:g(e),referrer:i,utm:m(e),stage:r,properties:s}}function j(t){let{url:e,referrer:i,timestamp:n,status:r,customerId:s,customerDomain:u,stripeCustomerId:o,domain:c,properties:l}=t;return{type:"billing",timestamp:n??Date.now(),url:e,path:g(e),referrer:i,utm:m(e),status:r,customerId:s,customerDomain:u??c,domain:c??u,stripeCustomerId:o,properties:l}}function K(t,e,i,n,r,s,u){let o={visitorId:t,source:e,events:i},c=u===void 0&&n&&(n.customerId||n.customerDomain||n.customerTraits)?{...n.customerId&&{customerId:n.customerId},...n.customerDomain&&{customerDomain:n.customerDomain},...n.customerTraits&&{customerTraits:n.customerTraits}}:void 0,l=u??c;return s&&(o.fingerprint=s),r&&(o.sessionId=r),n&&(n.email||n.userId||n.traits)&&(o.userIdentity={...n.email&&{email:n.email},...n.userId&&{userId:n.userId},...n.traits&&{traits:n.traits}}),l&&(l.customerId||l.customerDomain||l.customerTraits)&&(o.customerIdentity={...l.customerId&&{customerId:l.customerId},...l.customerDomain&&{customerDomain:l.customerDomain},...l.customerTraits&&{customerTraits:l.customerTraits}}),o}var S=null,re=null;function se(t){S=t,ae(),Re()}function ae(){if(!S)return;let t=window.location.href,e=document.referrer,i=document.title;t!==re&&(re=t,S(t,e,i))}function J(){setTimeout(ae,10)}function Re(){window.addEventListener("popstate",()=>{J()});let t=history.pushState,e=history.replaceState;history.pushState=function(...i){t.apply(this,i),J()},history.replaceState=function(...i){e.apply(this,i),J()}}var C=null,oe,_=null;function le(t,e,i){C=t,oe=e,_=i??null,document.addEventListener("submit",ue,!0)}function ue(t){if(!C)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={},u=new Map,o=e.querySelectorAll("input, select, textarea");for(let l of o){let d=l.getAttribute("name");d&&l instanceof HTMLInputElement&&u.set(d,l.type)}r.forEach((l,d)=>{typeof l=="string"&&(s[d]=l)});let c=F(s,oe);if(_){let l={...s},d=new Map(u);for(let I=0;I<o.length;I++){let v=o[I];if(v instanceof HTMLInputElement&&!v.name&&v.value){let ee=`_unnamed_${I}`;l[ee]=v.value,d.set(ee,v.type)}}let b=M(l,d);b&&_(b)}c&&Object.keys(c).length>0&&C(i,n,c)}function Q(){S=null,C=null,_=null,document.removeEventListener("submit",ue,!0)}var f=null,O=!1,h=0,Y=!1,y=null,Fe=10,Ne=200,Me=2e3;function ce(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 de(){if(!(typeof window>"u")&&!Y){if(h++,"Cal"in window){let t=window.Cal;if(typeof t=="function")try{t("on",{action:"bookingSuccessfulV2",callback:Le}),Y=!0;return}catch{}}if(h<Fe){let t=Math.min(Ne*h,Me);setTimeout(de,t)}}}function Le(t){if(!f)return;let e=t.detail?.data;if(!e||e.uid&&e.uid===y)return;y=e.uid||null;let i=ce(e);f.onCalendarBooked(i)}function me(t){if(f){if(Ve(t)){if(t.data.event==="calendly.event_scheduled"){let e=He(t.data.payload);f.onCalendarBooked(e)}return}if($e(t)){let e=qe(t.data);if(e){if(e.uid&&e.uid===y)return;y=e.uid||null;let i=ce(e);f.onCalendarBooked(i)}}}}function $e(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 qe(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 Ve(t){return t.origin==="https://calendly.com"&&t.data&&typeof t.data.event=="string"&&t.data.event.startsWith("calendly.")}function He(t){return{provider:"calendly"}}function ge(t){O||(f=t,O=!0,h=0,window.addEventListener("message",me),de())}function G(){O&&(window.removeEventListener("message",me),f=null,O=!1,Y=!1,h=0,y=null)}var ze=3e4,fe=1800*1e3,je=1e3,pe=50,Ke=500,X="outlit_session_id",T="outlit_session_last_activity",W=class{state;options;idleTimeout;timeUpdateInterval=null;boundHandleActivity;boundHandleVisibilityChange;constructor(e){this.options=e,this.idleTimeout=e.idleTimeout??ze,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<pe&&e<pe,n=e<Ke;if(!i&&!n){let r=z({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(X),i=sessionStorage.getItem(T),n=i?Number.parseInt(i,10):0,r=Date.now();if(e&&n&&r-n<fe)return this.updateSessionActivity(),e;let s=this.generateSessionId();return sessionStorage.setItem(X,s),sessionStorage.setItem(T,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(T,Date.now().toString())}catch{}}checkSessionExpiry(){if(!(typeof sessionStorage>"u"))try{let e=sessionStorage.getItem(T),i=e?Number.parseInt(e,10):0,n=Date.now();if(n-i>=fe){let r=this.generateSessionId();sessionStorage.setItem(X,r),this.state.sessionId=r}sessionStorage.setItem(T,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()},je))}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"/"}}},p=null;function ve(t){return p?(console.warn("[Outlit] Session tracking already initialized"),p):(p=new W(t),p)}function Z(){p&&(p.stop(),p=null)}var E="outlit_visitor_id";function Je(){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 ye(){try{let i=localStorage.getItem(E);if(i&&he(i))return i}catch{}let t=Te(E);if(t&&he(t)){try{localStorage.setItem(E,t)}catch{}return t}let e=Je();return Qe(e),e}function Qe(t){try{localStorage.setItem(E,t)}catch{}Ee(E,t,365)}function he(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 Te(t){if(typeof document>"u")return null;let i=`; ${document.cookie}`.split(`; ${t}=`);return i.length===2?i.pop()?.split(";").shift()??null:null}function Ye(){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 Ee(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=Ye();s&&(r+=`;domain=${s}`),document.cookie=r}var U="outlit_consent";function be(){try{let e=localStorage.getItem(U);if(e==="1")return!0;if(e==="0")return!1}catch{}let t=Te(U);return t==="1"?!0:t==="0"?!1:null}function D(t){let e=t?"1":"0";try{localStorage.setItem(U,e)}catch{}Ee(U,e,365)}var Ie=10,P=class{publicKey;apiHost;visitorId=null;eventQueue=[];flushTimer=null;flushInterval;isInitialized=!1;isTrackingEnabled=!1;options;hasHandledExit=!1;sessionTracker=null;currentUser=null;pendingUser=null;pendingStageEvents=[];exitCleanups=[];constructor(e){if(this.publicKey=e.publicKey,this.apiHost=e.apiHost??B,this.flushInterval=e.flushInterval??5e3,this.options=e,typeof window<"u"&&typeof process<"u"&&process.env?.NODE_ENV!=="production"){let r=`__outlit_${e.publicKey}`;window[r]&&console.warn("[Outlit] Multiple instances created with the same key. If using HMR, this is expected. Otherwise, use init() for singleton behavior or call shutdown() on the previous instance."),window[r]=!0}if(typeof window<"u"){let r=()=>{this.hasHandledExit||(this.hasHandledExit=!0,this.sessionTracker?.emitEngagement(),this.flush())},s=()=>{document.visibilityState==="hidden"?r():this.hasHandledExit=!1};document.addEventListener("visibilitychange",s),window.addEventListener("pagehide",r),window.addEventListener("beforeunload",r),this.exitCleanups=[()=>document.removeEventListener("visibilitychange",s),()=>window.removeEventListener("pagehide",r),()=>window.removeEventListener("beforeunload",r)]}this.isInitialized=!0;let n=be();(n===!0||n===null&&e.autoTrack!==!1)&&this.enableTracking()}enableTracking(){this.isTrackingEnabled||(this.visitorId=ye(),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,D(!0),this.pendingUser&&(this.applyUser(this.pendingUser),this.pendingUser=null))}async disableTracking(){if(!this.isTrackingEnabled){D(!1);return}this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),Q(),G(),Z(),await this.flush(),this.sessionTracker=null,this.isTrackingEnabled=!1,D(!1)}isEnabled(){return this.isTrackingEnabled}track(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,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){console.warn("[Outlit] identify requires email or userId");return}if(e.email||e.userId){let n=!this.currentUser;this.currentUser={email:e.email,userId:e.userId,customerId:e.customerId,customerDomain:e.customerDomain,customerTraits:e.customerTraits,traits:e.traits},n&&this.flushPendingStageEvents()}let i=q({url:window.location.href,referrer:document.referrer,email:e.email,userId:e.userId,customerId:e.customerId,customerDomain:e.customerDomain,customerTraits:e.customerTraits,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,customerId:e.customerId,customerDomain:e.customerDomain,customerTraits:e.customerTraits}),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=w({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>=Ie){console.warn(`[Outlit] Pending stage event queue full (${Ie}). Call setUser() or identify() to flush queued events.`);return}this.pendingStageEvents.push({stage:e,properties:i});return}let n=w({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}try{N(i.customerId,i.customerDomain,i.domain,i.stripeCustomerId)}catch(r){console.warn("[Outlit]",r instanceof Error?r.message:r);return}let n=j({url:window.location.href,referrer:document.referrer,status:e,customerId:i.customerId,customerDomain:i.customerDomain,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),Q(),G(),Z(),this.sessionTracker=null;for(let e of this.exitCleanups)e();this.exitCleanups=[],typeof window<"u"&&typeof process<"u"&&process.env?.NODE_ENV!=="production"&&delete window[`__outlit_${this.publicKey}`],await this.flush()}initSessionTracking(){this.sessionTracker=ve({onEngagement:this.options.trackEngagement!==!1?e=>this.enqueue(e):()=>{},idleTimeout:this.options.idleTimeout})}initPageviewTracking(){se((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;le((n,r,s)=>{let u=$({url:n,referrer:document.referrer,formId:r,formFields:s});this.enqueue(u)},e,i)}initCalendarTracking(){ge({onCalendarBooked:e=>{let i=H({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))}getPayloadUserIdentity(){if(!this.currentUser)return;let{email:e,userId:i}=this.currentUser;if(!(!e&&!i))return{...e&&{email:e},...i&&{userId:i}}}getPayloadCustomerIdentity(){if(!this.currentUser)return;let{customerId:e,customerDomain:i}=this.currentUser;if(!(!e&&!i))return{...e&&{customerId:e},...i&&{customerDomain:i}}}async sendEvents(e){if(e.length===0||!this.visitorId)return;let i=this.getPayloadUserIdentity(),n=this.getPayloadCustomerIdentity(),r=this.sessionTracker?.getSessionId(),s=K(this.visitorId,"client",e,i,r,void 0,n),u=`${this.apiHost}/api/i/v1/${this.publicKey}/events`;try{if(typeof navigator<"u"&&navigator.sendBeacon){let c=new Blob([JSON.stringify(s)],{type:"application/json"});if(navigator.sendBeacon(u,c))return;console.warn(`[Outlit] sendBeacon failed for ${e.length} events, falling back to fetch`)}let o=await fetch(u,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s),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 Ge=typeof window<"u"?window.outlit:void 0,Xe=Ge?._q||[],a={_initialized:!1,_instance:null,_queue:[],_loaded:!0,init(t){if(this._initialized){console.warn("[Outlit] Already initialized");return}this._instance=new P(t),this._initialized=!0;for(let[e,i]of Xe){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()},async disableTracking(){if(!this._initialized||!this._instance){this._queue.push(()=>this.disableTracking());return}await this._instance.disableTracking()},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 ke(){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",u=t.getAttribute("data-auto-identify")!=="false",o=t.getAttribute("data-track-calendar-embeds")!=="false";a.init({publicKey:e,apiHost:i,trackPageviews:n,trackForms:r,autoTrack:s,autoIdentify:u,trackCalendarEmbeds:o})}typeof window<"u"&&(window.outlit=a,document.readyState==="loading"?document.addEventListener("DOMContentLoaded",ke):ke());return Oe(We);})();
|
|
2
2
|
//# sourceMappingURL=outlit.global.js.map
|