@behindthescenes/analytics 0.0.14 → 0.0.16
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/browser/browser.js +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/manifest.json +2 -2
- package/dist/types/index.d.ts +13 -0
- package/dist/types/types/BTSSDK.types.d.ts +10 -0
- package/dist/types/utils/linkedinInsight.util.d.ts +7 -0
- package/package.json +3 -3
- package/dist/types/utils/ghlLeadPayload.util.d.ts +0 -3
- package/dist/types/utils/jsonPayload.util.d.ts +0 -6
package/dist/browser/browser.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var M=["page_view","view_content","search","lead","sign_up","begin_checkout","add_payment_info","purchase","outbound_click","button_click","form_submit"],R="bts_analytics_vid",w="bts_analytics_sid",g="bts_analytics_jt",O="bts_analytics_jid",W="bts_analytics_attr",b="bts_site",T="bts_jt",o=64,s=300,r="https://api.bts.it.com/v2/website/analytics",v={pageviews:!0,history:!0,outboundLinks:!0,buttonClicks:!0,formSubmissions:!0,search:!0,viewContent:!0},U=["q","query","search"],x=["utm_source","utm_medium","utm_campaign","utm_term","utm_content","fbclid","gclid","gbraid","li_fat_id","msclkid","ttclid","wbraid"],I=["_fbp","_fbc"],l=7776000;var nf=new Set(M),Vf=new Set(M.map((f)=>f.toLowerCase())),zf=new Set(["lead","sign_up","begin_checkout","add_payment_info","purchase"]),Qf={$pageview:"page_view",checkout_started:"begin_checkout",lead_capture:"lead",purchase_completed:"purchase",registration_complete:"sign_up"};function i(f){let j=f.trim();if(j.length===0)return{eventName:j,canonicalEventName:j,isStandard:!1};let B=j.toLowerCase(),$=Qf[B];if($)return{eventName:$,canonicalEventName:$,aliasOf:$,isStandard:!0};if(Vf.has(B)){let F=B;return{eventName:F,canonicalEventName:F,isStandard:!0}}return{eventName:j,canonicalEventName:j,isStandard:!1}}function t(f,j){if(j)return j;if(f==="page_view")return"page_view";if(f==="identify")return"identify";if(zf.has(f))return"conversion";return"custom"}function S(){return[...M]}function Z(){return typeof window>"u"?null:window}function y(){return typeof document>"u"?null:document}function z(){return Z()?.localStorage??null}function Q(f){let j=y();if(!j?.cookie)return;let B=`${f}=`,$=j.cookie.split(";").map((q)=>q.trim()).find((q)=>q.startsWith(B));if(!$)return;let F=$.slice(B.length);if(F==="")return;try{return decodeURIComponent(F)}catch{return F}}function m(f,j){let B=y();if(!B)return;let $=Z()?.location.protocol==="https:"?"; Secure":"";B.cookie=`${f}=${encodeURIComponent(j)}; Max-Age=${l}; Path=/; SameSite=Lax${$}`}function cf(){let f=new Uint32Array(1);if(typeof crypto<"u"&&typeof crypto.getRandomValues==="function")return crypto.getRandomValues(f),String(f[0]);return String(Math.floor(Math.random()*10000000000))}function Gf(f=Date.now()){return`fb.1.${f}.${cf()}`}function Pf(f,j=Date.now()){return`fb.1.${j}.${f}`}function a(){let f=Z();if(!f)return;if(!Q("_fbp"))m("_fbp",Gf());let j=new URLSearchParams(f.location.search).get("fbclid");if(j&&!Q("_fbc"))m("_fbc",Pf(j))}function k(){let f=Z();if(!f)return;return`${f.location.pathname}${f.location.search}`}function K(){return Z()?.location.href}function Y(){return Z()?.location.origin??"https://behindthescenes.com"}function C(){return y()?.referrer||void 0}function J(f){let j=f?.trim();return j?j.slice(0,512):void 0}function N(f){return f!==null&&typeof f==="object"&&!Array.isArray(f)}function Df(f){if(!f)return null;try{let j=JSON.parse(f);if(!N(j))return null;let B=N(j.utm)?Object.fromEntries(Object.entries(j.utm).filter((F)=>typeof F[1]==="string")):{},$=N(j.clickIds)?Object.fromEntries(Object.entries(j.clickIds).filter((F)=>typeof F[1]==="string")):{};return{utm:B,clickIds:$,landingUrl:typeof j.landingUrl==="string"?j.landingUrl:void 0,lastSeenAt:typeof j.lastSeenAt==="string"?j.lastSeenAt:new Date().toISOString(),referrer:typeof j.referrer==="string"?j.referrer:void 0}}catch{return null}}function e(){let f=z();return Df(f?.getItem(W)??null)}function Mf(f){let j=z();if(!j)return;let B=JSON.stringify(f);if(j.getItem(W)===B)return;j.setItem(W,B)}var h=null,u=null;function ff(){h=null,u=null}function Wf(f){let j=new URLSearchParams(f.location.search),B=x.map((F)=>`${F}=${j.get(F)??""}`).join("&"),$=I.map((F)=>`${F}=${Q(F)??""}`).join("&");return`${f.location.href} ${B} ${$}`}function n(){let f=Z();if(!f)return e();let j=Wf(f);if(j===h&&u)return u;let B=new URLSearchParams(f.location.search),$={utm:{},clickIds:{},landingUrl:f.location.href,lastSeenAt:new Date().toISOString(),referrer:C()};for(let X of x){let L=B.get(X);if(!L)continue;if(X.startsWith("utm_")){$.utm[X]=L;continue}$.clickIds[X]=L}for(let X of I){let L=Q(X);if(L)$.clickIds[X.replace(/^_/,"")]=L}let F=e(),q={utm:{...F?.utm??{},...$.utm},clickIds:{...F?.clickIds??{},...$.clickIds},landingUrl:$.landingUrl??F?.landingUrl,lastSeenAt:$.lastSeenAt,referrer:$.referrer??F?.referrer};return Mf(q),h=j,u=q,q}function c(){return a(),n()}function jf(f){let j={...v};if(f.autoTrack===!1)return{pageviews:!1,history:!1,outboundLinks:!1,buttonClicks:!1,formSubmissions:!1,search:!1,viewContent:!1};if(f.autoTrack&&typeof f.autoTrack==="object")return{pageviews:f.autoTrack.pageviews??j.pageviews,history:f.autoTrack.pageviews===!1?!1:f.autoTrack.history??j.history,outboundLinks:f.autoTrack.outboundLinks??j.outboundLinks,buttonClicks:f.autoTrack.buttonClicks??j.buttonClicks,formSubmissions:f.autoTrack.formSubmissions??j.formSubmissions,search:f.autoTrack.search??j.search,viewContent:f.autoTrack.viewContent??j.viewContent};if(f.autoPageviews===!1)return{...j,pageviews:!1,history:!1};if(f.autoPageviews===!0)return{...j,pageviews:!0};return j}function Sf(){let f=Q("_ga");if(!f)return;let j=f.split(".");if(j.length>=4&&/^GA\d+$/i.test(j[0]??""))return j.slice(-2).join(".");return J(f)}function kf(){let j=y()?.querySelector?.('script[src*="googletagmanager.com/gtag/js?id="]'),B=j&&"src"in j&&typeof j.src==="string"?j.src:void 0;if(!B)return;try{return J(new URL(B).searchParams.get("id"))}catch{return}}function Bf(){let f=Z(),j=Sf(),B=kf(),$=typeof f?.gtag==="function"||!!B||!!j;if(!$&&!j&&!B)return;return{tagInstalled:$,clientId:j,measurementId:B}}function _(f){if(!f.googleAnalytics||typeof f.googleAnalytics==="boolean")return;return J(f.googleAnalytics.measurementId)}function $f(f){if(!f.googleAnalytics)return!1;if(f.googleAnalytics===!0)return!1;return f.googleAnalytics.loadTag!==!1&&!!_(f)}function Ff(f){let j=Z(),B=y();if(!j||!B)return;j.dataLayer=Array.isArray(j.dataLayer)?j.dataLayer:[],j.gtag??=(...F)=>{j.dataLayer?.push(F)};let $=`script[src*="googletagmanager.com/gtag/js?id=${f}"]`;if(!B.querySelector?.($)){let F=B.createElement("script");F.async=!0,F.src=`https://www.googletagmanager.com/gtag/js?id=${encodeURIComponent(f)}`,F.setAttribute("data-bts-ga-proxy","true"),(B.head??B.documentElement).appendChild(F)}j.gtag("js",new Date),j.gtag("config",f,{send_page_view:!1})}function Kf(){let f=Z();if(!f)return;let j=typeof Intl<"u"?J(Intl.DateTimeFormat().resolvedOptions().timeZone):void 0,B=f.navigator,$=J(B?.language),F=Array.isArray(B?.languages)?B.languages.filter((L)=>typeof L==="string").slice(0,10):[],q=J(B?.userAgent),X={timezone:j,language:$,languages:F.length>0?F:void 0,userAgent:q};return Object.values(X).some((L)=>L!==void 0)?X:void 0}function p(f){let j=c(),B=Bf();return{event_id:f,ga_client_id:typeof B?.clientId==="string"?B.clientId:void 0,ga_tag_installed:typeof B?.tagInstalled==="boolean"?B.tagInstalled:void 0,attribution:j?{utm:j.utm,clickIds:j.clickIds,...j.clickIds,landingUrl:j.landingUrl,referrer:j.referrer}:void 0,client:Kf(),googleAnalytics:B,page:{title:y()?.title,url:K()}}}function qf(f){if(!f)return{};if(f instanceof Headers){let j={};return f.forEach((B,$)=>{j[$]=B}),j}if(Array.isArray(f))return Object.fromEntries(f.map(([j,B])=>[j,String(B)]));return Object.fromEntries(Object.entries(f).map(([j,B])=>[j,String(B)]))}function Jf(f){return f!==null&&typeof f==="object"&&!Array.isArray(f)}function Yf(f,j){if(typeof j==="bigint")return j.toString();if(typeof j==="function"||typeof j==="symbol")return;if(j instanceof Date)return j.toISOString();if(ArrayBuffer.isView(j))return;return j}function G(f){try{return JSON.stringify(f,Yf)}catch(j){let B=j instanceof Error?j.message:"unknown";throw Error(`Failed to serialize request body: ${B}`)}}function H(f){let j=f?.trim();return j&&j.length>0?j:void 0}function E(f,j=0){if(j>8)return;if(f===null||f===void 0)return;if(typeof f==="string"||typeof f==="number"||typeof f==="boolean")return f;if(typeof f==="bigint")return f.toString();if(f instanceof Date)return f.toISOString();if(ArrayBuffer.isView(f)||typeof f==="function"||typeof f==="symbol")return;if(Array.isArray(f)){let $=f.map((F)=>E(F,j+1)).filter((F)=>F!==void 0);return $.length>0?$:void 0}if(!Jf(f))return;let B={};for(let[$,F]of Object.entries(f)){let q=E(F,j+1);if(q!==void 0)B[$]=q}return Object.keys(B).length>0?B:void 0}function Xf(f){if(!f)return;let j=E(f);return Jf(j)?j:void 0}function V(f,j,B){if(B===void 0)return;f[j]=B}function Zf(f,j,B){let $={siteKey:f,locationId:j.locationId};if(V($,"email",H(j.email)),V($,"phone",H(j.phone)),V($,"subject",H(j.subject)),V($,"body",H(j.body)),V($,"message",H(j.message)),V($,"name",H(j.name)),V($,"firstName",H(j.firstName)),V($,"lastName",H(j.lastName)),V($,"source",H(j.source)),j.tags&&j.tags.length>0)$.tags=j.tags;if(j.customFields&&Object.keys(j.customFields).length>0)$.customFields=j.customFields;let F=H(j.pipelineId),q=H(j.pipelineStageId);if(F&&q){if($.pipelineId=F,$.pipelineStageId=q,V($,"opportunityName",H(j.opportunityName)),typeof j.monetaryValue==="number"&&Number.isFinite(j.monetaryValue))$.monetaryValue=j.monetaryValue}let X=Xf({...j.metadata??{},...B});if(X)$.metadata=X;return $}function P(){if(typeof crypto<"u"&&typeof crypto.randomUUID==="function")return crypto.randomUUID();return`v_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`}class D{siteKey;endpoint;debug;flushIntervalMs;autoTrack;requestHeaders;queue=[];flushTimer=null;destroyed=!1;lastTrackedUrl=null;unpatchHistory=null;clickHandler=null;submitHandler=null;pagehideHandler=null;popstateHandler=null;viewContentObserver=null;viewContentMutationObserver=null;viewContentRescanTimer=null;viewContentListenersTornDown=!1;observedViewContentElements=new WeakSet;trackedViewContentElements=new WeakSet;constructor(f){if(this.siteKey=f.siteKey,this.endpoint=(f.endpoint??r).replace(/\/$/,""),this.debug=f.debug??!1,this.flushIntervalMs=f.flushIntervalMs??s,this.autoTrack=jf(f),this.requestHeaders=f.requestHeaders,$f(f)){let j=_(f);if(j)Ff(j)}if(Z())this.installAutoTracking()}static init(f){return new D(f)}getVisitorId(){let f=z(),j=f?.getItem(R);if(j)return j;let B=P();return f?.setItem(R,B),B}getSessionId(){let f=z(),j=f?.getItem(w);if(j)return j;let B=P();return f?.setItem(w,B),B}getPersistedJourneyId(){return z()?.getItem(O)??null}log(...f){if(this.debug)console.log("[@bts/analytics]",...f)}installAutoTracking(){let f=Z(),j=y();if(!f||!j)return;if(Object.values(this.autoTrack).some(Boolean))c();if(this.autoTrack.pageviews)this.recordPageView();if(this.autoTrack.history)this.unpatchHistory=this.patchHistory(f),this.popstateHandler=()=>{this.recordPageView(),this.rescanViewContentAfterNavigation()},f.addEventListener("popstate",this.popstateHandler);if(this.clickHandler=(B)=>{this.handleAutoClick(B)},this.submitHandler=(B)=>{this.handleAutoSubmit(B)},this.pagehideHandler=()=>{this.viewContentListenersTornDown=!0,this.flushWithBeacon(),this.viewContentObserver?.disconnect(),this.viewContentObserver=null,this.viewContentMutationObserver?.disconnect(),this.viewContentMutationObserver=null},this.autoTrack.outboundLinks||this.autoTrack.buttonClicks)j.addEventListener("click",this.clickHandler,!0);if(this.autoTrack.formSubmissions||this.autoTrack.search)j.addEventListener("submit",this.submitHandler,!0);if(this.autoTrack.viewContent)this.installViewContentTracking(j);f.addEventListener("pagehide",this.pagehideHandler)}getOrCreateViewContentIntersectionObserver(){if(typeof IntersectionObserver>"u"||this.viewContentListenersTornDown)return null;if(this.viewContentObserver)return this.viewContentObserver;return this.viewContentObserver=new IntersectionObserver((f,j)=>{for(let B of f){if(!B.isIntersecting||!(B.target instanceof Element))continue;this.trackViewContentElement(B.target),j.unobserve(B.target)}}),this.viewContentObserver}observeViewContentElements(f){if(this.viewContentListenersTornDown||this.destroyed)return;let j=this.getOrCreateViewContentIntersectionObserver();if(!j)return;for(let B of Array.from(f.querySelectorAll("[data-bts-view-content]"))){if(this.observedViewContentElements.has(B))continue;this.observedViewContentElements.add(B),j.observe(B)}}scheduleViewContentRescanFromMutations(){if(this.viewContentListenersTornDown)return;if(this.viewContentRescanTimer)return;this.viewContentRescanTimer=setTimeout(()=>{if(this.viewContentRescanTimer=null,this.viewContentListenersTornDown||this.destroyed)return;let f=y();if(f)this.observeViewContentElements(f)},o)}rescanViewContentAfterNavigation(){if(!this.autoTrack.viewContent)return;if(this.viewContentListenersTornDown)return;let f=y();if(f)this.observeViewContentElements(f)}installViewContentTracking(f){if(typeof IntersectionObserver>"u")return;if(this.observeViewContentElements(f),typeof MutationObserver>"u")return;let j=f.body??f.documentElement;if(!j)return;this.viewContentMutationObserver=new MutationObserver(()=>{this.scheduleViewContentRescanFromMutations()}),this.viewContentMutationObserver.observe(j,{childList:!0,subtree:!0})}trackViewContentElement(f){if(this.trackedViewContentElements.has(f))return;this.trackedViewContentElements.add(f);let j=J(f.getAttribute("data-bts-view-content")||f.getAttribute("data-bts-content-id")||f.id);this.trackStandard("view_content",{autoCaptured:!0,contentId:j,contentTitle:J(f.getAttribute("data-bts-content-title")||f.textContent),contentType:J(f.getAttribute("data-bts-content-type")),elementId:J(f.id)})}patchHistory(f){let j=f.history,B=j.pushState.bind(j),$=j.replaceState.bind(j),F=()=>{n(),this.recordPageView(),this.rescanViewContentAfterNavigation()};return j.pushState=(...q)=>{B(...q),F()},j.replaceState=(...q)=>{$(...q),F()},()=>{j.pushState=B,j.replaceState=$}}handleAutoClick(f){if(f.defaultPrevented)return;let j=f.target;if(!(j instanceof Element))return;if(this.autoTrack.outboundLinks){let $=j.closest("a[href]");if($ instanceof HTMLAnchorElement){let F=J($.href);if(!F)return;let q=new URL(F,Y());if(q.origin!==Y()){this.trackStandard("outbound_click",{elementHref:F,elementId:J($.id),elementText:J($.textContent),linkHost:q.hostname});return}}}if(!this.autoTrack.buttonClicks)return;let B=j.closest("button,[role='button'],[data-bts-track-click]");if(!(B instanceof Element))return;this.trackStandard("button_click",{elementId:J(B.id),elementName:J(B.getAttribute("name")),elementRole:J(B.getAttribute("role")),elementText:J(B.textContent)})}handleAutoSubmit(f){if(f.defaultPrevented||!this.autoTrack.formSubmissions&&!this.autoTrack.search)return;let j=f.target;if(!(j instanceof HTMLFormElement))return;if(this.autoTrack.search)this.trackSearchForm(j);if(!this.autoTrack.formSubmissions)return;this.trackStandard("form_submit",{formAction:J(j.action),formId:J(j.id),formMethod:J(j.method),formName:J(j.getAttribute("name"))})}trackSearchForm(f){if((f.method||"get").toLowerCase()!=="get")return;let B=this.extractSearchQuery(f);if(!B)return;this.trackStandard("search",{autoCaptured:!0,formAction:J(f.action),formId:J(f.id),formName:J(f.getAttribute("name")),queryKey:B.key,searchQuery:B.value})}extractSearchQuery(f){try{let B=new FormData(f);for(let $ of U){let F=B.get($);if(typeof F==="string"){let q=J(F);if(q)return{key:$,value:q}}}}catch{}let j=f.elements;for(let B of U){let $=j?.namedItem?.(B),F=$&&"value"in $?$.value:void 0;if(typeof F==="string"){let q=J(F);if(q)return{key:B,value:q}}}return null}buildEvent(f,j,B,$){let F=$?.path??k(),q=C(),X=P(),L=p(X);return{eventName:f,eventType:j,path:F,referrer:q,occurredAt:new Date().toISOString(),journeyId:this.getPersistedJourneyId()??void 0,visitorId:this.getVisitorId(),sessionId:this.getSessionId(),properties:{...B??{},...L,event_id:B?.event_id??B?.eventId??X}}}queueEvent(f,j,B){if(this.destroyed)return;let $=i(f),F=t($.canonicalEventName,B),q={...j??{}};if($.aliasOf)q.originalEventName=f;if(this.queue.push(this.buildEvent($.eventName,F,q)),this.queue.length>=50){this.flushNow();return}this.scheduleFlush()}scheduleFlush(){if(this.flushTimer)return;this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flushNow()},this.flushIntervalMs)}async postJson(f,j){let B=`${this.endpoint}${f}`;this.log("POST",B,j);let $=G(j),F=await this.resolveRequestHeaders(f,B,j,$,this.endpoint);return fetch(B,{method:"POST",headers:F,body:$})}async postWebsiteJson(f,j){let B=this.endpoint.replace(/\/analytics$/,""),$=`${B}${f}`;this.log("POST",$,j);let F=G(j),q=await this.resolveRequestHeaders(f,$,j,F,B);return fetch($,{method:"POST",headers:q,body:F})}async postJsonKeepalive(f,j){let B=`${this.endpoint}${f}`;this.log("POST keepalive",B,j);let $=G(j),F=await this.resolveRequestHeaders(f,B,j,$,this.endpoint);return fetch(B,{method:"POST",headers:F,body:$,keepalive:!0})}async resolveRequestHeaders(f,j,B,$,F=this.endpoint){let q={"Content-Type":"application/json"};if(!this.requestHeaders)return q;let X=typeof this.requestHeaders==="function"?await this.requestHeaders({body:B,bodyText:$,endpoint:F,headers:{...q},path:f,siteKey:this.siteKey,url:j}):this.requestHeaders;return{...q,...qf(X)}}async flushBatch(f,j=!1){try{let B=j?await this.postJsonKeepalive("/ingest/batch",{siteKey:this.siteKey,events:f}):await this.postJson("/ingest/batch",{siteKey:this.siteKey,events:f});if(!B.ok)return this.log("flush failed",B.status),!1;return!0}catch(B){return this.log("flush error",B),!1}}flushWithBeacon(){if(this.queue.length===0)return;if(this.requestHeaders){let L=[...this.queue];this.queue=[],this.flushBatch(L,!0).then((yf)=>{if(!yf&&!this.destroyed)this.queue.unshift(...L),this.scheduleFlush()});return}let f=Z(),j=f?.navigator?.sendBeacon?.bind(f.navigator);if(!j)return;let B=[...this.queue];this.queue=[];let $=`${this.endpoint}/ingest/batch`,F=G({siteKey:this.siteKey,events:B}),q=new Blob([F],{type:"application/json"});if(!j($,q))this.queue.unshift(...B)}async flushNow(){if(this.destroyed)return;if(this.queue.length===0)return;let f=[...this.queue];if(this.queue=[],!await this.flushBatch(f)&&!this.destroyed)this.queue.unshift(...f),this.scheduleFlush()}recordPageView(f){let j=f??k(),B=K()??j??"/";if(B===this.lastTrackedUrl)return;this.lastTrackedUrl=B,this.queue.push(this.buildEvent("page_view","page_view",{autoCaptured:!0},{path:j})),this.scheduleFlush()}page(f){this.lastTrackedUrl=null,this.recordPageView(f)}track(f,j){this.queueEvent(f,j)}trackStandard(f,j){this.queueEvent(f,j)}identify(f,j){if(this.destroyed)return;this.queue.push(this.buildEvent("identify","identify",{traits:j??{},userId:f})),this.scheduleFlush()}listStandardEvents(){return S()}async submitContactForm(f){let j=P(),B=p(j),$=await this.postWebsiteJson("/ghl/leads",Zf(this.siteKey,f,B));if(!$.ok)throw Error(`contact form submit failed: ${$.status}`);return await $.json()}async startFunnel(f){c();let j=await this.postJson("/journey/start",{siteKey:this.siteKey,entryPath:f??k()});if(!j.ok)throw Error(`journey/start failed: ${j.status}`);let B=await j.json();return z()?.setItem(g,B.journeyToken),z()?.setItem(O,B.journeyId),B}getPersistedJourneyToken(){return z()?.getItem(g)??null}decorateUrl(f,j){let B=j??this.getPersistedJourneyToken(),$=new URL(f,Y());if($.searchParams.set(b,this.siteKey),B)$.searchParams.set(T,B);let F=n();if(F){for(let[q,X]of Object.entries(F.utm??{}))if(X)$.searchParams.set(q,X);for(let[q,X]of Object.entries(F.clickIds??{}))if(X)$.searchParams.set(q,X)}return $.toString()}async notifyHandoff(f,j){let B=await this.postJson("/journey/handoff",{journeyToken:f,context:j});if(!B.ok)throw Error(`journey/handoff failed: ${B.status}`)}destroy(){if(this.viewContentListenersTornDown=!0,ff(),this.viewContentRescanTimer)clearTimeout(this.viewContentRescanTimer),this.viewContentRescanTimer=null;let f=Z(),j=y();if(j&&this.clickHandler&&(this.autoTrack.outboundLinks||this.autoTrack.buttonClicks))j.removeEventListener("click",this.clickHandler,!0);if(j&&this.submitHandler&&(this.autoTrack.formSubmissions||this.autoTrack.search))j.removeEventListener("submit",this.submitHandler,!0);if(this.viewContentObserver?.disconnect(),this.viewContentObserver=null,this.viewContentMutationObserver?.disconnect(),this.viewContentMutationObserver=null,f&&this.popstateHandler)f.removeEventListener("popstate",this.popstateHandler);if(f&&this.pagehideHandler)f.removeEventListener("pagehide",this.pagehideHandler);if(this.flushTimer)clearTimeout(this.flushTimer),this.flushTimer=null;this.unpatchHistory?.(),this.unpatchHistory=null,this.flushWithBeacon(),this.destroyed=!0}}function A(f){return D.init(f)}function d(f){return typeof f==="object"&&f!==null&&!Array.isArray(f)}function Cf(f){return Array.from(f)}function Lf(f){let j=typeof window>"u"?null:window;if(!j)return;let[B,$,F]=f;if(typeof B!=="string")return;if(B==="js")return;if(B==="config"){if(typeof $!=="string"||$.trim().length===0)return;let L=d(F)?F:{};j.btsAnalytics?.destroy?.(),j.btsAnalytics=A({...L,siteKey:$});return}let q=j.btsAnalytics;if(!q)return;let X=d(F)?F:void 0;if(B==="event"&&typeof $==="string"){q.track($,X);return}if(B==="identify"&&typeof $==="string"){q.identify($,X);return}if(B==="page"){q.page(typeof $==="string"?$:void 0);return}if(B==="flush"){q.flushNow();return}if(B==="contact"||B==="submitContactForm"){if(!d($))return;q.submitContactForm($)}}if(typeof window<"u"){let f=Array.isArray(window.btsDataLayer)?[...window.btsDataLayer]:[];window.btsDataLayer=Array.isArray(window.btsDataLayer)?window.btsDataLayer:[],window.BTSAnalytics={BTSAnalytics:D,createBTSAnalytics:A,listStandardWebEvents:S},window.createBTSAnalytics=A;for(let j of f)Lf(Cf(j));window.bts=(...j)=>{window.btsDataLayer?.push(j),Lf(j)}}export{S as listStandardWebEvents,A as createBTSAnalytics,D as BTSAnalytics};
|
|
1
|
+
var V=["page_view","view_content","search","lead","sign_up","begin_checkout","add_payment_info","purchase","outbound_click","button_click","form_submit"],U="bts_analytics_vid",A="bts_analytics_sid",D="bts_analytics_jt",R="bts_analytics_jid",P="bts_analytics_attr",O="bts_site",y="bts_jt",l=64,v=300,p="https://api.bts.it.com/v2/website/analytics",s={pageviews:!0,history:!0,outboundLinks:!0,buttonClicks:!0,formSubmissions:!0,search:!0,viewContent:!0},w=["q","query","search"],x=["utm_source","utm_medium","utm_campaign","utm_term","utm_content","fbclid","gclid","gbraid","li_fat_id","msclkid","ttclid","wbraid"],h=["_fbp","_fbc"],r=7776000;var If=new Set(V),kf=new Set(V.map((f)=>f.toLowerCase())),Qf=new Set(["lead","sign_up","begin_checkout","add_payment_info","purchase"]),Hf={$pageview:"page_view",checkout_started:"begin_checkout",lead_capture:"lead",purchase_completed:"purchase",registration_complete:"sign_up"};function n(f){let L=f.trim();if(L.length===0)return{eventName:L,canonicalEventName:L,isStandard:!1};let $=L.toLowerCase(),q=Hf[$];if(q)return{eventName:q,canonicalEventName:q,aliasOf:q,isStandard:!0};if(kf.has($)){let B=$;return{eventName:B,canonicalEventName:B,isStandard:!0}}return{eventName:L,canonicalEventName:L,isStandard:!1}}function o(f,L){if(L)return L;if(f==="page_view")return"page_view";if(f==="identify")return"identify";if(Qf.has(f))return"conversion";return"custom"}function C(){return[...V]}function J(){return typeof window>"u"?null:window}function k(){return typeof document>"u"?null:document}function Q(){return J()?.localStorage??null}function H(f){let L=k();if(!L?.cookie)return;let $=`${f}=`,q=L.cookie.split(";").map((j)=>j.trim()).find((j)=>j.startsWith($));if(!q)return;let B=q.slice($.length);if(B==="")return;try{return decodeURIComponent(B)}catch{return B}}function N(f,L){let $=k();if(!$)return;let q=J()?.location.protocol==="https:"?"; Secure":"";$.cookie=`${f}=${encodeURIComponent(L)}; Max-Age=${r}; Path=/; SameSite=Lax${q}`}function Wf(){let f=new Uint32Array(1);if(typeof crypto<"u"&&typeof crypto.getRandomValues==="function")return crypto.getRandomValues(f),String(f[0]);return String(Math.floor(Math.random()*10000000000))}function zf(f=Date.now()){return`fb.1.${f}.${Wf()}`}function Gf(f,L=Date.now()){return`fb.1.${L}.${f}`}function i(){let f=J();if(!f)return;if(!H("_fbp"))N("_fbp",zf());let L=new URLSearchParams(f.location.search).get("fbclid");if(L&&!H("_fbc"))N("_fbc",Gf(L))}function K(){let f=J();if(!f)return;return`${f.location.pathname}${f.location.search}`}function Y(){return J()?.location.href}function c(){return J()?.location.origin??"https://behindthescenes.com"}function _(){return k()?.referrer||void 0}function X(f){let L=f?.trim();return L?L.slice(0,512):void 0}function g(f){return f!==null&&typeof f==="object"&&!Array.isArray(f)}function Mf(f){if(!f)return null;try{let L=JSON.parse(f);if(!g(L))return null;let $=g(L.utm)?Object.fromEntries(Object.entries(L.utm).filter((B)=>typeof B[1]==="string")):{},q=g(L.clickIds)?Object.fromEntries(Object.entries(L.clickIds).filter((B)=>typeof B[1]==="string")):{};return{utm:$,clickIds:q,landingUrl:typeof L.landingUrl==="string"?L.landingUrl:void 0,lastSeenAt:typeof L.lastSeenAt==="string"?L.lastSeenAt:new Date().toISOString(),referrer:typeof L.referrer==="string"?L.referrer:void 0}}catch{return null}}function a(){let f=Q();return Mf(f?.getItem(P)??null)}function Vf(f){let L=Q();if(!L)return;let $=JSON.stringify(f);if(L.getItem(P)===$)return;L.setItem(P,$)}var u=null,I=null;function t(){u=null,I=null}function Df(f){let L=new URLSearchParams(f.location.search),$=x.map((B)=>`${B}=${L.get(B)??""}`).join("&"),q=h.map((B)=>`${B}=${H(B)??""}`).join("&");return`${f.location.href} ${$} ${q}`}function W(){let f=J();if(!f)return a();let L=Df(f);if(L===u&&I)return I;let $=new URLSearchParams(f.location.search),q={utm:{},clickIds:{},landingUrl:f.location.href,lastSeenAt:new Date().toISOString(),referrer:_()};for(let F of x){let Z=$.get(F);if(!Z)continue;if(F.startsWith("utm_")){q.utm[F]=Z;continue}q.clickIds[F]=Z}for(let F of h){let Z=H(F);if(Z)q.clickIds[F.replace(/^_/,"")]=Z}let B=a(),j={utm:{...B?.utm??{},...q.utm},clickIds:{...B?.clickIds??{},...q.clickIds},landingUrl:q.landingUrl??B?.landingUrl,lastSeenAt:q.lastSeenAt,referrer:q.referrer??B?.referrer};return Vf(j),u=L,I=j,j}function z(){return i(),W()}function e(f){let L={...s};if(f.autoTrack===!1)return{pageviews:!1,history:!1,outboundLinks:!1,buttonClicks:!1,formSubmissions:!1,search:!1,viewContent:!1};if(f.autoTrack&&typeof f.autoTrack==="object")return{pageviews:f.autoTrack.pageviews??L.pageviews,history:f.autoTrack.pageviews===!1?!1:f.autoTrack.history??L.history,outboundLinks:f.autoTrack.outboundLinks??L.outboundLinks,buttonClicks:f.autoTrack.buttonClicks??L.buttonClicks,formSubmissions:f.autoTrack.formSubmissions??L.formSubmissions,search:f.autoTrack.search??L.search,viewContent:f.autoTrack.viewContent??L.viewContent};if(f.autoPageviews===!1)return{...L,pageviews:!1,history:!1};if(f.autoPageviews===!0)return{...L,pageviews:!0};return L}function Pf(){let f=H("_ga");if(!f)return;let L=f.split(".");if(L.length>=4&&/^GA\d+$/i.test(L[0]??""))return L.slice(-2).join(".");return X(f)}function Cf(){let L=k()?.querySelector?.('script[src*="googletagmanager.com/gtag/js?id="]'),$=L&&"src"in L&&typeof L.src==="string"?L.src:void 0;if(!$)return;try{return X(new URL($).searchParams.get("id"))}catch{return}}function ff(){let f=J(),L=Pf(),$=Cf(),q=typeof f?.gtag==="function"||!!$||!!L;if(!q&&!L&&!$)return;return{tagInstalled:q,clientId:L,measurementId:$}}function E(f){if(!f.googleAnalytics||typeof f.googleAnalytics==="boolean")return;return X(f.googleAnalytics.measurementId)}function Lf(f){if(!f.googleAnalytics)return!1;if(f.googleAnalytics===!0)return!1;return f.googleAnalytics.loadTag!==!1&&!!E(f)}function $f(f){let L=J(),$=k();if(!L||!$)return;L.dataLayer=Array.isArray(L.dataLayer)?L.dataLayer:[],L.gtag??=(...B)=>{L.dataLayer?.push(B)};let q=`script[src*="googletagmanager.com/gtag/js?id=${f}"]`;if(!$.querySelector?.(q)){let B=$.createElement("script");B.async=!0,B.src=`https://www.googletagmanager.com/gtag/js?id=${encodeURIComponent(f)}`,B.setAttribute("data-bts-ga-proxy","true"),($.head??$.documentElement).appendChild(B)}L.gtag("js",new Date),L.gtag("config",f,{send_page_view:!1})}function Kf(){let f=J();if(!f)return;let L=typeof Intl<"u"?X(Intl.DateTimeFormat().resolvedOptions().timeZone):void 0,$=f.navigator,q=X($?.language),B=Array.isArray($?.languages)?$.languages.filter((Z)=>typeof Z==="string").slice(0,10):[],j=X($?.userAgent),F={timezone:L,language:q,languages:B.length>0?B:void 0,userAgent:j};return Object.values(F).some((Z)=>Z!==void 0)?F:void 0}function m(f){let L=z(),$=ff();return{event_id:f,ga_client_id:typeof $?.clientId==="string"?$.clientId:void 0,ga_tag_installed:typeof $?.tagInstalled==="boolean"?$.tagInstalled:void 0,attribution:L?{utm:L.utm,clickIds:L.clickIds,...L.clickIds,landingUrl:L.landingUrl,referrer:L.referrer}:void 0,client:Kf(),googleAnalytics:$,page:{title:k()?.title,url:Y()}}}function qf(f){if(!f)return{};if(f instanceof Headers){let L={};return f.forEach(($,q)=>{L[q]=$}),L}if(Array.isArray(f))return Object.fromEntries(f.map(([L,$])=>[L,String($)]));return Object.fromEntries(Object.entries(f).map(([L,$])=>[L,String($)]))}var Bf="https://snap.licdn.com/li.lms-analytics/insight.min.js";function T(f){if(typeof f==="number"&&Number.isFinite(f))return String(Math.floor(f));let L=typeof f==="string"?f.trim():void 0;return L&&L.length>0?L:void 0}function jf(f){if(f.lintrk)return f.lintrk;let L=($,q)=>{L.q?.push([$,q])};return L.q=[],f.lintrk=L,L}function Yf(f){return Boolean(f.querySelector(`script[src="${Bf}"]`))}function b(f){let L=T(f),$=J(),q=k();if(!L||!$||!q)return;if($._linkedin_partner_id=L,$._linkedin_data_partner_ids=$._linkedin_data_partner_ids??[],!$._linkedin_data_partner_ids.includes(L))$._linkedin_data_partner_ids.push(L);if(jf($),Yf(q))return;let B=q.createElement("script");B.type="text/javascript",B.async=!0,B.src=Bf;let j=q.getElementsByTagName("script")[0];if(j?.parentNode){j.parentNode.insertBefore(B,j);return}q.head?.appendChild(B)}function Ff(f){let L=T(f.conversionId),$=J();if(!L||!$)return;let q=jf($),B={conversion_id:L},j=T(f.eventId);if(j)B.event_id=j;if(typeof f.value==="number"&&Number.isFinite(f.value))B.value=f.value;else if(typeof f.value==="string"&&f.value.trim().length>0){let F=Number(f.value);if(Number.isFinite(F))B.value=F}if(typeof f.currency==="string"&&f.currency.trim().length>0)B.currency=f.currency.trim().toUpperCase();q("track",B)}function G(){if(typeof crypto<"u"&&typeof crypto.randomUUID==="function")return crypto.randomUUID();return`v_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`}class M{siteKey;endpoint;debug;flushIntervalMs;autoTrack;requestHeaders;queue=[];flushTimer=null;destroyed=!1;lastTrackedUrl=null;unpatchHistory=null;clickHandler=null;submitHandler=null;pagehideHandler=null;popstateHandler=null;viewContentObserver=null;viewContentMutationObserver=null;viewContentRescanTimer=null;viewContentListenersTornDown=!1;observedViewContentElements=new WeakSet;trackedViewContentElements=new WeakSet;linkedInInsight=null;linkedInInsightConfigLoaded=!1;pendingLinkedInInsightEvents=[];constructor(f){if(this.siteKey=f.siteKey,this.endpoint=(f.endpoint??p).replace(/\/$/,""),this.debug=f.debug??!1,this.flushIntervalMs=f.flushIntervalMs??v,this.autoTrack=e(f),this.requestHeaders=f.requestHeaders,Lf(f)){let L=E(f);if(L)$f(L)}if(this.linkedInInsight=this.createLinkedInInsightConfig(f.linkedinInsight),this.linkedInInsight?.partnerId)b(this.linkedInInsight.partnerId);if(this.linkedInInsight?.loadFromBts)setTimeout(()=>{if(!this.destroyed)this.loadRemoteTrackingConfig()},0);else this.linkedInInsightConfigLoaded=!0;if(J())this.installAutoTracking()}static init(f){return new M(f)}getVisitorId(){let f=Q(),L=f?.getItem(U);if(L)return L;let $=G();return f?.setItem(U,$),$}getSessionId(){let f=Q(),L=f?.getItem(A);if(L)return L;let $=G();return f?.setItem(A,$),$}getPersistedJourneyId(){return Q()?.getItem(R)??null}log(...f){if(this.debug)console.log("[@bts/analytics]",...f)}createLinkedInInsightConfig(f){if(f===!1)return null;if(f===void 0)return null;if(f===!0)return{conversions:{},loadFromBts:!0};return{partnerId:typeof f.partnerId==="string"?f.partnerId:void 0,conversions:f.conversions??{},loadFromBts:f.loadFromBts!==!1}}async loadRemoteTrackingConfig(){try{let f=`${this.endpoint}/config?siteKey=${encodeURIComponent(this.siteKey)}`,L=await fetch(f,{method:"GET"});if(!L.ok){this.linkedInInsightConfigLoaded=!0;return}let $=await L.json();if($.linkedinInsight){if(this.linkedInInsight={partnerId:$.linkedinInsight.partnerId??this.linkedInInsight?.partnerId,conversions:{...this.linkedInInsight?.conversions??{},...$.linkedinInsight.conversions??{}},loadFromBts:!0},this.linkedInInsight.partnerId)b(this.linkedInInsight.partnerId)}}catch(f){this.log("tracking config load failed",f)}finally{this.linkedInInsightConfigLoaded=!0,this.flushPendingLinkedInInsightEvents()}}installAutoTracking(){let f=J(),L=k();if(!f||!L)return;if(Object.values(this.autoTrack).some(Boolean))z();if(this.autoTrack.pageviews)this.recordPageView();if(this.autoTrack.history)this.unpatchHistory=this.patchHistory(f),this.popstateHandler=()=>{this.recordPageView(),this.rescanViewContentAfterNavigation()},f.addEventListener("popstate",this.popstateHandler);if(this.clickHandler=($)=>{this.handleAutoClick($)},this.submitHandler=($)=>{this.handleAutoSubmit($)},this.pagehideHandler=()=>{this.viewContentListenersTornDown=!0,this.flushWithBeacon(),this.viewContentObserver?.disconnect(),this.viewContentObserver=null,this.viewContentMutationObserver?.disconnect(),this.viewContentMutationObserver=null},this.autoTrack.outboundLinks||this.autoTrack.buttonClicks)L.addEventListener("click",this.clickHandler,!0);if(this.autoTrack.formSubmissions||this.autoTrack.search)L.addEventListener("submit",this.submitHandler,!0);if(this.autoTrack.viewContent)this.installViewContentTracking(L);f.addEventListener("pagehide",this.pagehideHandler)}getOrCreateViewContentIntersectionObserver(){if(typeof IntersectionObserver>"u"||this.viewContentListenersTornDown)return null;if(this.viewContentObserver)return this.viewContentObserver;return this.viewContentObserver=new IntersectionObserver((f,L)=>{for(let $ of f){if(!$.isIntersecting||!($.target instanceof Element))continue;this.trackViewContentElement($.target),L.unobserve($.target)}}),this.viewContentObserver}observeViewContentElements(f){if(this.viewContentListenersTornDown||this.destroyed)return;let L=this.getOrCreateViewContentIntersectionObserver();if(!L)return;for(let $ of Array.from(f.querySelectorAll("[data-bts-view-content]"))){if(this.observedViewContentElements.has($))continue;this.observedViewContentElements.add($),L.observe($)}}scheduleViewContentRescanFromMutations(){if(this.viewContentListenersTornDown)return;if(this.viewContentRescanTimer)return;this.viewContentRescanTimer=setTimeout(()=>{if(this.viewContentRescanTimer=null,this.viewContentListenersTornDown||this.destroyed)return;let f=k();if(f)this.observeViewContentElements(f)},l)}rescanViewContentAfterNavigation(){if(!this.autoTrack.viewContent)return;if(this.viewContentListenersTornDown)return;let f=k();if(f)this.observeViewContentElements(f)}installViewContentTracking(f){if(typeof IntersectionObserver>"u")return;if(this.observeViewContentElements(f),typeof MutationObserver>"u")return;let L=f.body??f.documentElement;if(!L)return;this.viewContentMutationObserver=new MutationObserver(()=>{this.scheduleViewContentRescanFromMutations()}),this.viewContentMutationObserver.observe(L,{childList:!0,subtree:!0})}trackViewContentElement(f){if(this.trackedViewContentElements.has(f))return;this.trackedViewContentElements.add(f);let L=X(f.getAttribute("data-bts-view-content")||f.getAttribute("data-bts-content-id")||f.id);this.trackStandard("view_content",{autoCaptured:!0,contentId:L,contentTitle:X(f.getAttribute("data-bts-content-title")||f.textContent),contentType:X(f.getAttribute("data-bts-content-type")),elementId:X(f.id)})}sourceEventKeyForLinkedInInsight(f){switch(f){case"page_view":return"page_view";case"lead":return"lead_capture";case"sign_up":return"registration_complete";case"begin_checkout":return"checkout_started";case"add_payment_info":return"add_payment_info";case"purchase":return"purchase_completed";default:return f}}flushPendingLinkedInInsightEvents(){if(this.pendingLinkedInInsightEvents.length===0)return;let f=[...this.pendingLinkedInInsightEvents];this.pendingLinkedInInsightEvents=[];for(let L of f)this.trackLinkedInInsightForEvent(L)}trackLinkedInInsightForEvent(f){if(!this.linkedInInsight)return;if(!this.linkedInInsightConfigLoaded){this.pendingLinkedInInsightEvents.push(f);return}let L=this.sourceEventKeyForLinkedInInsight(f.eventName),$=this.linkedInInsight.conversions[L]??this.linkedInInsight.conversions[f.eventName];if(!$)return;let q=f.properties??{};Ff({conversionId:$,eventId:typeof q.event_id==="string"?q.event_id:void 0,value:typeof q.monetaryValue==="number"||typeof q.monetaryValue==="string"?q.monetaryValue:typeof q.value==="number"||typeof q.value==="string"?q.value:void 0,currency:typeof q.currency==="string"?q.currency:void 0})}patchHistory(f){let L=f.history,$=L.pushState.bind(L),q=L.replaceState.bind(L),B=()=>{W(),this.recordPageView(),this.rescanViewContentAfterNavigation()};return L.pushState=(...j)=>{$(...j),B()},L.replaceState=(...j)=>{q(...j),B()},()=>{L.pushState=$,L.replaceState=q}}handleAutoClick(f){if(f.defaultPrevented)return;let L=f.target;if(!(L instanceof Element))return;if(this.autoTrack.outboundLinks){let q=L.closest("a[href]");if(q instanceof HTMLAnchorElement){let B=X(q.href);if(!B)return;let j=new URL(B,c());if(j.origin!==c()){let F=this.decorateHostedCheckoutUrl(j);if(F)q.href=F;this.trackStandard("outbound_click",{elementHref:F??B,elementId:X(q.id),elementText:X(q.textContent),linkHost:j.hostname});return}}}if(!this.autoTrack.buttonClicks)return;let $=L.closest("button,[role='button'],[data-bts-track-click]");if(!($ instanceof Element))return;this.trackStandard("button_click",{elementId:X($.id),elementName:X($.getAttribute("name")),elementRole:X($.getAttribute("role")),elementText:X($.textContent)})}decorateHostedCheckoutUrl(f){let L=f.hostname.toLowerCase();if(L!=="behindthescenes.com"&&!L.endsWith(".behindthescenes.com"))return null;let $=f.pathname.split("/").filter(Boolean);if($[0]!=="c"||!$[1])return null;let q=new URL(f.toString());q.searchParams.set(O,this.siteKey);let B=Q()?.getItem(D);if(B)q.searchParams.set(y,B);let j=W();if(j){for(let[F,Z]of Object.entries(j.utm??{}))if(Z)q.searchParams.set(F,Z);for(let[F,Z]of Object.entries(j.clickIds??{}))if(Z)q.searchParams.set(F,Z)}return q.toString()}handleAutoSubmit(f){if(f.defaultPrevented||!this.autoTrack.formSubmissions&&!this.autoTrack.search)return;let L=f.target;if(!(L instanceof HTMLFormElement))return;if(this.autoTrack.search)this.trackSearchForm(L);if(!this.autoTrack.formSubmissions)return;this.trackStandard("form_submit",{formAction:X(L.action),formId:X(L.id),formMethod:X(L.method),formName:X(L.getAttribute("name"))})}trackSearchForm(f){if((f.method||"get").toLowerCase()!=="get")return;let $=this.extractSearchQuery(f);if(!$)return;this.trackStandard("search",{autoCaptured:!0,formAction:X(f.action),formId:X(f.id),formName:X(f.getAttribute("name")),queryKey:$.key,searchQuery:$.value})}extractSearchQuery(f){try{let $=new FormData(f);for(let q of w){let B=$.get(q);if(typeof B==="string"){let j=X(B);if(j)return{key:q,value:j}}}}catch{}let L=f.elements;for(let $ of w){let q=L?.namedItem?.($),B=q&&"value"in q?q.value:void 0;if(typeof B==="string"){let j=X(B);if(j)return{key:$,value:j}}}return null}buildEvent(f,L,$,q){let B=q?.path??K(),j=_(),F=G(),Z=m(F);return{eventName:f,eventType:L,path:B,referrer:j,occurredAt:new Date().toISOString(),journeyId:this.getPersistedJourneyId()??void 0,visitorId:this.getVisitorId(),sessionId:this.getSessionId(),properties:{...$??{},...Z,event_id:$?.event_id??$?.eventId??F}}}queueEvent(f,L,$){if(this.destroyed)return;let q=n(f),B=o(q.canonicalEventName,$),j={...L??{}};if(q.aliasOf)j.originalEventName=f;let F=this.buildEvent(q.eventName,B,j);if(this.queue.push(F),this.trackLinkedInInsightForEvent(F),this.queue.length>=50){this.flushNow();return}this.scheduleFlush()}scheduleFlush(){if(this.flushTimer)return;this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flushNow()},this.flushIntervalMs)}async postJson(f,L){let $=`${this.endpoint}${f}`;this.log("POST",$,L);let q=JSON.stringify(L),B=await this.resolveRequestHeaders(f,$,L,q,this.endpoint);return fetch($,{method:"POST",headers:B,body:q})}async postWebsiteJson(f,L){let $=this.endpoint.replace(/\/analytics$/,""),q=`${$}${f}`;this.log("POST",q,L);let B=JSON.stringify(L),j=await this.resolveRequestHeaders(f,q,L,B,$);return fetch(q,{method:"POST",headers:j,body:B})}async postJsonKeepalive(f,L){let $=`${this.endpoint}${f}`;this.log("POST keepalive",$,L);let q=JSON.stringify(L),B=await this.resolveRequestHeaders(f,$,L,q,this.endpoint);return fetch($,{method:"POST",headers:B,body:q,keepalive:!0})}async resolveRequestHeaders(f,L,$,q,B=this.endpoint){let j={"Content-Type":"application/json"};if(!this.requestHeaders)return j;let F=typeof this.requestHeaders==="function"?await this.requestHeaders({body:$,bodyText:q,endpoint:B,headers:{...j},path:f,siteKey:this.siteKey,url:L}):this.requestHeaders;return{...j,...qf(F)}}async flushBatch(f,L=!1){try{let $=L?await this.postJsonKeepalive("/ingest/batch",{siteKey:this.siteKey,events:f}):await this.postJson("/ingest/batch",{siteKey:this.siteKey,events:f});if(!$.ok)return this.log("flush failed",$.status),!1;return!0}catch($){return this.log("flush error",$),!1}}flushWithBeacon(){if(this.queue.length===0)return;if(this.requestHeaders){let Z=[...this.queue];this.queue=[],this.flushBatch(Z,!0).then((Zf)=>{if(!Zf&&!this.destroyed)this.queue.unshift(...Z),this.scheduleFlush()});return}let f=J(),L=f?.navigator?.sendBeacon?.bind(f.navigator);if(!L)return;let $=[...this.queue];this.queue=[];let q=`${this.endpoint}/ingest/batch`,B=JSON.stringify({siteKey:this.siteKey,events:$}),j=new Blob([B],{type:"application/json"});if(!L(q,j))this.queue.unshift(...$)}async flushNow(){if(this.destroyed)return;if(this.queue.length===0)return;let f=[...this.queue];if(this.queue=[],!await this.flushBatch(f)&&!this.destroyed)this.queue.unshift(...f),this.scheduleFlush()}recordPageView(f){let L=f??K(),$=Y()??L??"/";if($===this.lastTrackedUrl)return;this.lastTrackedUrl=$;let q=this.buildEvent("page_view","page_view",{autoCaptured:!0},{path:L});this.queue.push(q),this.trackLinkedInInsightForEvent(q),this.scheduleFlush()}page(f){this.lastTrackedUrl=null,this.recordPageView(f)}track(f,L){this.queueEvent(f,L)}trackStandard(f,L){this.queueEvent(f,L)}identify(f,L){if(this.destroyed)return;this.queue.push(this.buildEvent("identify","identify",{traits:L??{},userId:f})),this.scheduleFlush()}listStandardEvents(){return C()}async submitContactForm(f){let L=G(),$=m(L),q=await this.postWebsiteJson("/ghl/leads",{siteKey:this.siteKey,locationId:f.locationId,email:f.email,phone:f.phone,subject:f.subject,body:f.body,message:f.message,name:f.name,firstName:f.firstName,lastName:f.lastName,source:f.source,tags:f.tags,customFields:f.customFields,pipelineId:f.pipelineId,pipelineStageId:f.pipelineStageId,opportunityName:f.opportunityName,monetaryValue:f.monetaryValue,metadata:{...f.metadata??{},...$}});if(!q.ok)throw Error(`contact form submit failed: ${q.status}`);return await q.json()}async startFunnel(f){z();let L=await this.postJson("/journey/start",{siteKey:this.siteKey,entryPath:f??K()});if(!L.ok)throw Error(`journey/start failed: ${L.status}`);let $=await L.json();return Q()?.setItem(D,$.journeyToken),Q()?.setItem(R,$.journeyId),$}getPersistedJourneyToken(){return Q()?.getItem(D)??null}decorateUrl(f,L){let $=L??this.getPersistedJourneyToken(),q=new URL(f,c());if(q.searchParams.set(O,this.siteKey),$)q.searchParams.set(y,$);let B=W();if(B){for(let[j,F]of Object.entries(B.utm??{}))if(F)q.searchParams.set(j,F);for(let[j,F]of Object.entries(B.clickIds??{}))if(F)q.searchParams.set(j,F)}return q.toString()}async notifyHandoff(f,L){let $=await this.postJson("/journey/handoff",{journeyToken:f,context:L});if(!$.ok)throw Error(`journey/handoff failed: ${$.status}`)}destroy(){if(this.viewContentListenersTornDown=!0,t(),this.viewContentRescanTimer)clearTimeout(this.viewContentRescanTimer),this.viewContentRescanTimer=null;let f=J(),L=k();if(L&&this.clickHandler&&(this.autoTrack.outboundLinks||this.autoTrack.buttonClicks))L.removeEventListener("click",this.clickHandler,!0);if(L&&this.submitHandler&&(this.autoTrack.formSubmissions||this.autoTrack.search))L.removeEventListener("submit",this.submitHandler,!0);if(this.viewContentObserver?.disconnect(),this.viewContentObserver=null,this.viewContentMutationObserver?.disconnect(),this.viewContentMutationObserver=null,f&&this.popstateHandler)f.removeEventListener("popstate",this.popstateHandler);if(f&&this.pagehideHandler)f.removeEventListener("pagehide",this.pagehideHandler);if(this.flushTimer)clearTimeout(this.flushTimer),this.flushTimer=null;this.unpatchHistory?.(),this.unpatchHistory=null,this.flushWithBeacon(),this.destroyed=!0}}function S(f){return M.init(f)}function d(f){return typeof f==="object"&&f!==null&&!Array.isArray(f)}function cf(f){return Array.from(f)}function Xf(f){let L=typeof window>"u"?null:window;if(!L)return;let[$,q,B]=f;if(typeof $!=="string")return;if($==="js")return;if($==="config"){if(typeof q!=="string"||q.trim().length===0)return;let Z=d(B)?B:{};L.btsAnalytics?.destroy?.(),L.btsAnalytics=S({...Z,linkedinInsight:"linkedinInsight"in Z?Z.linkedinInsight:!0,siteKey:q});return}let j=L.btsAnalytics;if(!j)return;let F=d(B)?B:void 0;if($==="event"&&typeof q==="string"){j.track(q,F);return}if($==="identify"&&typeof q==="string"){j.identify(q,F);return}if($==="page"){j.page(typeof q==="string"?q:void 0);return}if($==="flush"){j.flushNow();return}if($==="contact"||$==="submitContactForm"){if(!d(q))return;j.submitContactForm(q)}}if(typeof window<"u"){let f=Array.isArray(window.btsDataLayer)?[...window.btsDataLayer]:[];window.btsDataLayer=Array.isArray(window.btsDataLayer)?window.btsDataLayer:[],window.BTSAnalytics={BTSAnalytics:M,createBTSAnalytics:S,listStandardWebEvents:C},window.createBTSAnalytics=S;for(let L of f)Xf(cf(L));window.bts=(...L)=>{window.btsDataLayer?.push(L),Xf(L)}}export{C as listStandardWebEvents,S as createBTSAnalytics,M as BTSAnalytics};
|
package/dist/cjs/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var{defineProperty:g,getOwnPropertyNames:zf,getOwnPropertyDescriptor:Qf}=Object,Lf=Object.prototype.hasOwnProperty;function Gf(f){return this[f]}var Bf=(f)=>{var j=(p??=new WeakMap).get(f),$;if(j)return j;if(j=g({},"__esModule",{value:!0}),f&&typeof f==="object"||typeof f==="function"){for(var J of zf(f))if(!Lf.call(j,J))g(j,J,{get:Gf.bind(f,J),enumerable:!($=Qf(f,J))||$.enumerable})}return p.set(f,j),j},p;var Mf=(f)=>f;function Pf(f,j){this[f]=Mf.bind(null,j)}var Wf=(f,j)=>{for(var $ in j)g(f,$,{get:j[$],enumerable:!0,configurable:!0,set:Pf.bind(j,$)})};var Af={};Wf(Af,{listStandardWebEvents:()=>E,createBTSAnalytics:()=>hf,BTSAnalytics:()=>S});module.exports=Bf(Af);var K=["page_view","view_content","search","lead","sign_up","begin_checkout","add_payment_info","purchase","outbound_click","button_click","form_submit"],x="bts_analytics_vid",I="bts_analytics_sid",N="bts_analytics_jt",_="bts_analytics_jid",Y="bts_analytics_attr",d="bts_site",v="bts_jt",l=64,n=300,s="https://api.bts.it.com/v2/website/analytics",o={pageviews:!0,history:!0,outboundLinks:!0,buttonClicks:!0,formSubmissions:!0,search:!0,viewContent:!0},h=["q","query","search"],A=["utm_source","utm_medium","utm_campaign","utm_term","utm_content","fbclid","gclid","gbraid","li_fat_id","msclkid","ttclid","wbraid"],c=["_fbp","_fbc"],r=7776000;var wf=new Set(K),Yf=new Set(K.map((f)=>f.toLowerCase())),Df=new Set(["lead","sign_up","begin_checkout","add_payment_info","purchase"]),kf={$pageview:"page_view",checkout_started:"begin_checkout",lead_capture:"lead",purchase_completed:"purchase",registration_complete:"sign_up"};function i(f){let j=f.trim();if(j.length===0)return{eventName:j,canonicalEventName:j,isStandard:!1};let $=j.toLowerCase(),J=kf[$];if(J)return{eventName:J,canonicalEventName:J,aliasOf:J,isStandard:!0};if(Yf.has($)){let X=$;return{eventName:X,canonicalEventName:X,isStandard:!0}}return{eventName:j,canonicalEventName:j,isStandard:!1}}function a(f,j){if(j)return j;if(f==="page_view")return"page_view";if(f==="identify")return"identify";if(Df.has(f))return"conversion";return"custom"}function E(){return[...K]}function H(){return typeof window>"u"?null:window}function z(){return typeof document>"u"?null:document}function G(){return H()?.localStorage??null}function B(f){let j=z();if(!j?.cookie)return;let $=`${f}=`,J=j.cookie.split(";").map((Z)=>Z.trim()).find((Z)=>Z.startsWith($));if(!J)return;let X=J.slice($.length);if(X==="")return;try{return decodeURIComponent(X)}catch{return X}}function w(f,j){let $=z();if(!$)return;let J=H()?.location.protocol==="https:"?"; Secure":"";$.cookie=`${f}=${encodeURIComponent(j)}; Max-Age=${r}; Path=/; SameSite=Lax${J}`}function Of(){let f=new Uint32Array(1);if(typeof crypto<"u"&&typeof crypto.getRandomValues==="function")return crypto.getRandomValues(f),String(f[0]);return String(Math.floor(Math.random()*10000000000))}function Uf(f=Date.now()){return`fb.1.${f}.${Of()}`}function Cf(f,j=Date.now()){return`fb.1.${j}.${f}`}function t(){let f=H();if(!f)return;if(!B("_fbp"))w("_fbp",Uf());let j=new URLSearchParams(f.location.search).get("fbclid");if(j&&!B("_fbc"))w("_fbc",Cf(j))}function D(){let f=H();if(!f)return;return`${f.location.pathname}${f.location.search}`}function k(){return H()?.location.href}function O(){return H()?.location.origin??"https://behindthescenes.com"}function U(){return z()?.referrer||void 0}function q(f){let j=f?.trim();return j?j.slice(0,512):void 0}function y(f){return f!==null&&typeof f==="object"&&!Array.isArray(f)}function Rf(f){if(!f)return null;try{let j=JSON.parse(f);if(!y(j))return null;let $=y(j.utm)?Object.fromEntries(Object.entries(j.utm).filter((X)=>typeof X[1]==="string")):{},J=y(j.clickIds)?Object.fromEntries(Object.entries(j.clickIds).filter((X)=>typeof X[1]==="string")):{};return{utm:$,clickIds:J,landingUrl:typeof j.landingUrl==="string"?j.landingUrl:void 0,lastSeenAt:typeof j.lastSeenAt==="string"?j.lastSeenAt:new Date().toISOString(),referrer:typeof j.referrer==="string"?j.referrer:void 0}}catch{return null}}function e(){let f=G();return Rf(f?.getItem(Y)??null)}function Sf(f){let j=G();if(!j)return;let $=JSON.stringify(f);if(j.getItem(Y)===$)return;j.setItem(Y,$)}var u=null,C=null;function ff(){u=null,C=null}function gf(f){let j=new URLSearchParams(f.location.search),$=A.map((X)=>`${X}=${j.get(X)??""}`).join("&"),J=c.map((X)=>`${X}=${B(X)??""}`).join("&");return`${f.location.href} ${$} ${J}`}function R(){let f=H();if(!f)return e();let j=gf(f);if(j===u&&C)return C;let $=new URLSearchParams(f.location.search),J={utm:{},clickIds:{},landingUrl:f.location.href,lastSeenAt:new Date().toISOString(),referrer:U()};for(let F of A){let V=$.get(F);if(!V)continue;if(F.startsWith("utm_")){J.utm[F]=V;continue}J.clickIds[F]=V}for(let F of c){let V=B(F);if(V)J.clickIds[F.replace(/^_/,"")]=V}let X=e(),Z={utm:{...X?.utm??{},...J.utm},clickIds:{...X?.clickIds??{},...J.clickIds},landingUrl:J.landingUrl??X?.landingUrl,lastSeenAt:J.lastSeenAt,referrer:J.referrer??X?.referrer};return Sf(Z),u=j,C=Z,Z}function M(){return t(),R()}function jf(f){let j={...o};if(f.autoTrack===!1)return{pageviews:!1,history:!1,outboundLinks:!1,buttonClicks:!1,formSubmissions:!1,search:!1,viewContent:!1};if(f.autoTrack&&typeof f.autoTrack==="object")return{pageviews:f.autoTrack.pageviews??j.pageviews,history:f.autoTrack.pageviews===!1?!1:f.autoTrack.history??j.history,outboundLinks:f.autoTrack.outboundLinks??j.outboundLinks,buttonClicks:f.autoTrack.buttonClicks??j.buttonClicks,formSubmissions:f.autoTrack.formSubmissions??j.formSubmissions,search:f.autoTrack.search??j.search,viewContent:f.autoTrack.viewContent??j.viewContent};if(f.autoPageviews===!1)return{...j,pageviews:!1,history:!1};if(f.autoPageviews===!0)return{...j,pageviews:!0};return j}function xf(){let f=B("_ga");if(!f)return;let j=f.split(".");if(j.length>=4&&/^GA\d+$/i.test(j[0]??""))return j.slice(-2).join(".");return q(f)}function If(){let j=z()?.querySelector?.('script[src*="googletagmanager.com/gtag/js?id="]'),$=j&&"src"in j&&typeof j.src==="string"?j.src:void 0;if(!$)return;try{return q(new URL($).searchParams.get("id"))}catch{return}}function $f(){let f=H(),j=xf(),$=If(),J=typeof f?.gtag==="function"||!!$||!!j;if(!J&&!j&&!$)return;return{tagInstalled:J,clientId:j,measurementId:$}}function m(f){if(!f.googleAnalytics||typeof f.googleAnalytics==="boolean")return;return q(f.googleAnalytics.measurementId)}function Jf(f){if(!f.googleAnalytics)return!1;if(f.googleAnalytics===!0)return!1;return f.googleAnalytics.loadTag!==!1&&!!m(f)}function Xf(f){let j=H(),$=z();if(!j||!$)return;j.dataLayer=Array.isArray(j.dataLayer)?j.dataLayer:[],j.gtag??=(...X)=>{j.dataLayer?.push(X)};let J=`script[src*="googletagmanager.com/gtag/js?id=${f}"]`;if(!$.querySelector?.(J)){let X=$.createElement("script");X.async=!0,X.src=`https://www.googletagmanager.com/gtag/js?id=${encodeURIComponent(f)}`,X.setAttribute("data-bts-ga-proxy","true"),($.head??$.documentElement).appendChild(X)}j.gtag("js",new Date),j.gtag("config",f,{send_page_view:!1})}function Nf(){let f=H();if(!f)return;let j=typeof Intl<"u"?q(Intl.DateTimeFormat().resolvedOptions().timeZone):void 0,$=f.navigator,J=q($?.language),X=Array.isArray($?.languages)?$.languages.filter((V)=>typeof V==="string").slice(0,10):[],Z=q($?.userAgent),F={timezone:j,language:J,languages:X.length>0?X:void 0,userAgent:Z};return Object.values(F).some((V)=>V!==void 0)?F:void 0}function b(f){let j=M(),$=$f();return{event_id:f,ga_client_id:typeof $?.clientId==="string"?$.clientId:void 0,ga_tag_installed:typeof $?.tagInstalled==="boolean"?$.tagInstalled:void 0,attribution:j?{utm:j.utm,clickIds:j.clickIds,...j.clickIds,landingUrl:j.landingUrl,referrer:j.referrer}:void 0,client:Nf(),googleAnalytics:$,page:{title:z()?.title,url:k()}}}function Zf(f){if(!f)return{};if(f instanceof Headers){let j={};return f.forEach(($,J)=>{j[J]=$}),j}if(Array.isArray(f))return Object.fromEntries(f.map(([j,$])=>[j,String($)]));return Object.fromEntries(Object.entries(f).map(([j,$])=>[j,String($)]))}function qf(f){return f!==null&&typeof f==="object"&&!Array.isArray(f)}function _f(f,j){if(typeof j==="bigint")return j.toString();if(typeof j==="function"||typeof j==="symbol")return;if(j instanceof Date)return j.toISOString();if(ArrayBuffer.isView(j))return;return j}function P(f){try{return JSON.stringify(f,_f)}catch(j){let $=j instanceof Error?j.message:"unknown";throw Error(`Failed to serialize request body: ${$}`)}}function Q(f){let j=f?.trim();return j&&j.length>0?j:void 0}function T(f,j=0){if(j>8)return;if(f===null||f===void 0)return;if(typeof f==="string"||typeof f==="number"||typeof f==="boolean")return f;if(typeof f==="bigint")return f.toString();if(f instanceof Date)return f.toISOString();if(ArrayBuffer.isView(f)||typeof f==="function"||typeof f==="symbol")return;if(Array.isArray(f)){let J=f.map((X)=>T(X,j+1)).filter((X)=>X!==void 0);return J.length>0?J:void 0}if(!qf(f))return;let $={};for(let[J,X]of Object.entries(f)){let Z=T(X,j+1);if(Z!==void 0)$[J]=Z}return Object.keys($).length>0?$:void 0}function Ff(f){if(!f)return;let j=T(f);return qf(j)?j:void 0}function L(f,j,$){if($===void 0)return;f[j]=$}function Hf(f,j,$){let J={siteKey:f,locationId:j.locationId};if(L(J,"email",Q(j.email)),L(J,"phone",Q(j.phone)),L(J,"subject",Q(j.subject)),L(J,"body",Q(j.body)),L(J,"message",Q(j.message)),L(J,"name",Q(j.name)),L(J,"firstName",Q(j.firstName)),L(J,"lastName",Q(j.lastName)),L(J,"source",Q(j.source)),j.tags&&j.tags.length>0)J.tags=j.tags;if(j.customFields&&Object.keys(j.customFields).length>0)J.customFields=j.customFields;let X=Q(j.pipelineId),Z=Q(j.pipelineStageId);if(X&&Z){if(J.pipelineId=X,J.pipelineStageId=Z,L(J,"opportunityName",Q(j.opportunityName)),typeof j.monetaryValue==="number"&&Number.isFinite(j.monetaryValue))J.monetaryValue=j.monetaryValue}let F=Ff({...j.metadata??{},...$});if(F)J.metadata=F;return J}function W(){if(typeof crypto<"u"&&typeof crypto.randomUUID==="function")return crypto.randomUUID();return`v_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`}class S{siteKey;endpoint;debug;flushIntervalMs;autoTrack;requestHeaders;queue=[];flushTimer=null;destroyed=!1;lastTrackedUrl=null;unpatchHistory=null;clickHandler=null;submitHandler=null;pagehideHandler=null;popstateHandler=null;viewContentObserver=null;viewContentMutationObserver=null;viewContentRescanTimer=null;viewContentListenersTornDown=!1;observedViewContentElements=new WeakSet;trackedViewContentElements=new WeakSet;constructor(f){if(this.siteKey=f.siteKey,this.endpoint=(f.endpoint??s).replace(/\/$/,""),this.debug=f.debug??!1,this.flushIntervalMs=f.flushIntervalMs??n,this.autoTrack=jf(f),this.requestHeaders=f.requestHeaders,Jf(f)){let j=m(f);if(j)Xf(j)}if(H())this.installAutoTracking()}static init(f){return new S(f)}getVisitorId(){let f=G(),j=f?.getItem(x);if(j)return j;let $=W();return f?.setItem(x,$),$}getSessionId(){let f=G(),j=f?.getItem(I);if(j)return j;let $=W();return f?.setItem(I,$),$}getPersistedJourneyId(){return G()?.getItem(_)??null}log(...f){if(this.debug)console.log("[@bts/analytics]",...f)}installAutoTracking(){let f=H(),j=z();if(!f||!j)return;if(Object.values(this.autoTrack).some(Boolean))M();if(this.autoTrack.pageviews)this.recordPageView();if(this.autoTrack.history)this.unpatchHistory=this.patchHistory(f),this.popstateHandler=()=>{this.recordPageView(),this.rescanViewContentAfterNavigation()},f.addEventListener("popstate",this.popstateHandler);if(this.clickHandler=($)=>{this.handleAutoClick($)},this.submitHandler=($)=>{this.handleAutoSubmit($)},this.pagehideHandler=()=>{this.viewContentListenersTornDown=!0,this.flushWithBeacon(),this.viewContentObserver?.disconnect(),this.viewContentObserver=null,this.viewContentMutationObserver?.disconnect(),this.viewContentMutationObserver=null},this.autoTrack.outboundLinks||this.autoTrack.buttonClicks)j.addEventListener("click",this.clickHandler,!0);if(this.autoTrack.formSubmissions||this.autoTrack.search)j.addEventListener("submit",this.submitHandler,!0);if(this.autoTrack.viewContent)this.installViewContentTracking(j);f.addEventListener("pagehide",this.pagehideHandler)}getOrCreateViewContentIntersectionObserver(){if(typeof IntersectionObserver>"u"||this.viewContentListenersTornDown)return null;if(this.viewContentObserver)return this.viewContentObserver;return this.viewContentObserver=new IntersectionObserver((f,j)=>{for(let $ of f){if(!$.isIntersecting||!($.target instanceof Element))continue;this.trackViewContentElement($.target),j.unobserve($.target)}}),this.viewContentObserver}observeViewContentElements(f){if(this.viewContentListenersTornDown||this.destroyed)return;let j=this.getOrCreateViewContentIntersectionObserver();if(!j)return;for(let $ of Array.from(f.querySelectorAll("[data-bts-view-content]"))){if(this.observedViewContentElements.has($))continue;this.observedViewContentElements.add($),j.observe($)}}scheduleViewContentRescanFromMutations(){if(this.viewContentListenersTornDown)return;if(this.viewContentRescanTimer)return;this.viewContentRescanTimer=setTimeout(()=>{if(this.viewContentRescanTimer=null,this.viewContentListenersTornDown||this.destroyed)return;let f=z();if(f)this.observeViewContentElements(f)},l)}rescanViewContentAfterNavigation(){if(!this.autoTrack.viewContent)return;if(this.viewContentListenersTornDown)return;let f=z();if(f)this.observeViewContentElements(f)}installViewContentTracking(f){if(typeof IntersectionObserver>"u")return;if(this.observeViewContentElements(f),typeof MutationObserver>"u")return;let j=f.body??f.documentElement;if(!j)return;this.viewContentMutationObserver=new MutationObserver(()=>{this.scheduleViewContentRescanFromMutations()}),this.viewContentMutationObserver.observe(j,{childList:!0,subtree:!0})}trackViewContentElement(f){if(this.trackedViewContentElements.has(f))return;this.trackedViewContentElements.add(f);let j=q(f.getAttribute("data-bts-view-content")||f.getAttribute("data-bts-content-id")||f.id);this.trackStandard("view_content",{autoCaptured:!0,contentId:j,contentTitle:q(f.getAttribute("data-bts-content-title")||f.textContent),contentType:q(f.getAttribute("data-bts-content-type")),elementId:q(f.id)})}patchHistory(f){let j=f.history,$=j.pushState.bind(j),J=j.replaceState.bind(j),X=()=>{R(),this.recordPageView(),this.rescanViewContentAfterNavigation()};return j.pushState=(...Z)=>{$(...Z),X()},j.replaceState=(...Z)=>{J(...Z),X()},()=>{j.pushState=$,j.replaceState=J}}handleAutoClick(f){if(f.defaultPrevented)return;let j=f.target;if(!(j instanceof Element))return;if(this.autoTrack.outboundLinks){let J=j.closest("a[href]");if(J instanceof HTMLAnchorElement){let X=q(J.href);if(!X)return;let Z=new URL(X,O());if(Z.origin!==O()){this.trackStandard("outbound_click",{elementHref:X,elementId:q(J.id),elementText:q(J.textContent),linkHost:Z.hostname});return}}}if(!this.autoTrack.buttonClicks)return;let $=j.closest("button,[role='button'],[data-bts-track-click]");if(!($ instanceof Element))return;this.trackStandard("button_click",{elementId:q($.id),elementName:q($.getAttribute("name")),elementRole:q($.getAttribute("role")),elementText:q($.textContent)})}handleAutoSubmit(f){if(f.defaultPrevented||!this.autoTrack.formSubmissions&&!this.autoTrack.search)return;let j=f.target;if(!(j instanceof HTMLFormElement))return;if(this.autoTrack.search)this.trackSearchForm(j);if(!this.autoTrack.formSubmissions)return;this.trackStandard("form_submit",{formAction:q(j.action),formId:q(j.id),formMethod:q(j.method),formName:q(j.getAttribute("name"))})}trackSearchForm(f){if((f.method||"get").toLowerCase()!=="get")return;let $=this.extractSearchQuery(f);if(!$)return;this.trackStandard("search",{autoCaptured:!0,formAction:q(f.action),formId:q(f.id),formName:q(f.getAttribute("name")),queryKey:$.key,searchQuery:$.value})}extractSearchQuery(f){try{let $=new FormData(f);for(let J of h){let X=$.get(J);if(typeof X==="string"){let Z=q(X);if(Z)return{key:J,value:Z}}}}catch{}let j=f.elements;for(let $ of h){let J=j?.namedItem?.($),X=J&&"value"in J?J.value:void 0;if(typeof X==="string"){let Z=q(X);if(Z)return{key:$,value:Z}}}return null}buildEvent(f,j,$,J){let X=J?.path??D(),Z=U(),F=W(),V=b(F);return{eventName:f,eventType:j,path:X,referrer:Z,occurredAt:new Date().toISOString(),journeyId:this.getPersistedJourneyId()??void 0,visitorId:this.getVisitorId(),sessionId:this.getSessionId(),properties:{...$??{},...V,event_id:$?.event_id??$?.eventId??F}}}queueEvent(f,j,$){if(this.destroyed)return;let J=i(f),X=a(J.canonicalEventName,$),Z={...j??{}};if(J.aliasOf)Z.originalEventName=f;if(this.queue.push(this.buildEvent(J.eventName,X,Z)),this.queue.length>=50){this.flushNow();return}this.scheduleFlush()}scheduleFlush(){if(this.flushTimer)return;this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flushNow()},this.flushIntervalMs)}async postJson(f,j){let $=`${this.endpoint}${f}`;this.log("POST",$,j);let J=P(j),X=await this.resolveRequestHeaders(f,$,j,J,this.endpoint);return fetch($,{method:"POST",headers:X,body:J})}async postWebsiteJson(f,j){let $=this.endpoint.replace(/\/analytics$/,""),J=`${$}${f}`;this.log("POST",J,j);let X=P(j),Z=await this.resolveRequestHeaders(f,J,j,X,$);return fetch(J,{method:"POST",headers:Z,body:X})}async postJsonKeepalive(f,j){let $=`${this.endpoint}${f}`;this.log("POST keepalive",$,j);let J=P(j),X=await this.resolveRequestHeaders(f,$,j,J,this.endpoint);return fetch($,{method:"POST",headers:X,body:J,keepalive:!0})}async resolveRequestHeaders(f,j,$,J,X=this.endpoint){let Z={"Content-Type":"application/json"};if(!this.requestHeaders)return Z;let F=typeof this.requestHeaders==="function"?await this.requestHeaders({body:$,bodyText:J,endpoint:X,headers:{...Z},path:f,siteKey:this.siteKey,url:j}):this.requestHeaders;return{...Z,...Zf(F)}}async flushBatch(f,j=!1){try{let $=j?await this.postJsonKeepalive("/ingest/batch",{siteKey:this.siteKey,events:f}):await this.postJson("/ingest/batch",{siteKey:this.siteKey,events:f});if(!$.ok)return this.log("flush failed",$.status),!1;return!0}catch($){return this.log("flush error",$),!1}}flushWithBeacon(){if(this.queue.length===0)return;if(this.requestHeaders){let V=[...this.queue];this.queue=[],this.flushBatch(V,!0).then((Vf)=>{if(!Vf&&!this.destroyed)this.queue.unshift(...V),this.scheduleFlush()});return}let f=H(),j=f?.navigator?.sendBeacon?.bind(f.navigator);if(!j)return;let $=[...this.queue];this.queue=[];let J=`${this.endpoint}/ingest/batch`,X=P({siteKey:this.siteKey,events:$}),Z=new Blob([X],{type:"application/json"});if(!j(J,Z))this.queue.unshift(...$)}async flushNow(){if(this.destroyed)return;if(this.queue.length===0)return;let f=[...this.queue];if(this.queue=[],!await this.flushBatch(f)&&!this.destroyed)this.queue.unshift(...f),this.scheduleFlush()}recordPageView(f){let j=f??D(),$=k()??j??"/";if($===this.lastTrackedUrl)return;this.lastTrackedUrl=$,this.queue.push(this.buildEvent("page_view","page_view",{autoCaptured:!0},{path:j})),this.scheduleFlush()}page(f){this.lastTrackedUrl=null,this.recordPageView(f)}track(f,j){this.queueEvent(f,j)}trackStandard(f,j){this.queueEvent(f,j)}identify(f,j){if(this.destroyed)return;this.queue.push(this.buildEvent("identify","identify",{traits:j??{},userId:f})),this.scheduleFlush()}listStandardEvents(){return E()}async submitContactForm(f){let j=W(),$=b(j),J=await this.postWebsiteJson("/ghl/leads",Hf(this.siteKey,f,$));if(!J.ok)throw Error(`contact form submit failed: ${J.status}`);return await J.json()}async startFunnel(f){M();let j=await this.postJson("/journey/start",{siteKey:this.siteKey,entryPath:f??D()});if(!j.ok)throw Error(`journey/start failed: ${j.status}`);let $=await j.json();return G()?.setItem(N,$.journeyToken),G()?.setItem(_,$.journeyId),$}getPersistedJourneyToken(){return G()?.getItem(N)??null}decorateUrl(f,j){let $=j??this.getPersistedJourneyToken(),J=new URL(f,O());if(J.searchParams.set(d,this.siteKey),$)J.searchParams.set(v,$);let X=R();if(X){for(let[Z,F]of Object.entries(X.utm??{}))if(F)J.searchParams.set(Z,F);for(let[Z,F]of Object.entries(X.clickIds??{}))if(F)J.searchParams.set(Z,F)}return J.toString()}async notifyHandoff(f,j){let $=await this.postJson("/journey/handoff",{journeyToken:f,context:j});if(!$.ok)throw Error(`journey/handoff failed: ${$.status}`)}destroy(){if(this.viewContentListenersTornDown=!0,ff(),this.viewContentRescanTimer)clearTimeout(this.viewContentRescanTimer),this.viewContentRescanTimer=null;let f=H(),j=z();if(j&&this.clickHandler&&(this.autoTrack.outboundLinks||this.autoTrack.buttonClicks))j.removeEventListener("click",this.clickHandler,!0);if(j&&this.submitHandler&&(this.autoTrack.formSubmissions||this.autoTrack.search))j.removeEventListener("submit",this.submitHandler,!0);if(this.viewContentObserver?.disconnect(),this.viewContentObserver=null,this.viewContentMutationObserver?.disconnect(),this.viewContentMutationObserver=null,f&&this.popstateHandler)f.removeEventListener("popstate",this.popstateHandler);if(f&&this.pagehideHandler)f.removeEventListener("pagehide",this.pagehideHandler);if(this.flushTimer)clearTimeout(this.flushTimer),this.flushTimer=null;this.unpatchHistory?.(),this.unpatchHistory=null,this.flushWithBeacon(),this.destroyed=!0}}function hf(f){return S.init(f)}
|
|
1
|
+
var{defineProperty:I,getOwnPropertyNames:Q$,getOwnPropertyDescriptor:H$}=Object,W$=Object.prototype.hasOwnProperty;function z$($){return this[$]}var G$=($)=>{var q=(v??=new WeakMap).get($),L;if(q)return q;if(q=I({},"__esModule",{value:!0}),$&&typeof $==="object"||typeof $==="function"){for(var X of Q$($))if(!W$.call(q,X))I(q,X,{get:z$.bind($,X),enumerable:!(L=H$($,X))||L.enumerable})}return v.set($,q),q},v;var M$=($)=>$;function V$($,q){this[$]=M$.bind(null,q)}var f$=($,q)=>{for(var L in q)I($,L,{get:q[L],enumerable:!0,configurable:!0,set:V$.bind(q,L)})};var h$={};f$(h$,{listStandardWebEvents:()=>g,createBTSAnalytics:()=>N$,BTSAnalytics:()=>U});module.exports=G$(h$);var k=["page_view","view_content","search","lead","sign_up","begin_checkout","add_payment_info","purchase","outbound_click","button_click","form_submit"],O="bts_analytics_vid",R="bts_analytics_sid",B="bts_analytics_jt",S="bts_analytics_jid",K="bts_analytics_attr",x="bts_site",N="bts_jt",l=64,d=300,p="https://api.bts.it.com/v2/website/analytics",s={pageviews:!0,history:!0,outboundLinks:!0,buttonClicks:!0,formSubmissions:!0,search:!0,viewContent:!0},h=["q","query","search"],A=["utm_source","utm_medium","utm_campaign","utm_term","utm_content","fbclid","gclid","gbraid","li_fat_id","msclkid","ttclid","wbraid"],E=["_fbp","_fbc"],r=7776000;var g$=new Set(k),B$=new Set(k.map(($)=>$.toLowerCase())),K$=new Set(["lead","sign_up","begin_checkout","add_payment_info","purchase"]),P$={$pageview:"page_view",checkout_started:"begin_checkout",lead_capture:"lead",purchase_completed:"purchase",registration_complete:"sign_up"};function o($){let q=$.trim();if(q.length===0)return{eventName:q,canonicalEventName:q,isStandard:!1};let L=q.toLowerCase(),X=P$[L];if(X)return{eventName:X,canonicalEventName:X,aliasOf:X,isStandard:!0};if(B$.has(L)){let Z=L;return{eventName:Z,canonicalEventName:Z,isStandard:!0}}return{eventName:q,canonicalEventName:q,isStandard:!1}}function n($,q){if(q)return q;if($==="page_view")return"page_view";if($==="identify")return"identify";if(K$.has($))return"conversion";return"custom"}function g(){return[...k]}function Q(){return typeof window>"u"?null:window}function W(){return typeof document>"u"?null:document}function z(){return Q()?.localStorage??null}function G($){let q=W();if(!q?.cookie)return;let L=`${$}=`,X=q.cookie.split(";").map((j)=>j.trim()).find((j)=>j.startsWith(L));if(!X)return;let Z=X.slice(L.length);if(Z==="")return;try{return decodeURIComponent(Z)}catch{return Z}}function c($,q){let L=W();if(!L)return;let X=Q()?.location.protocol==="https:"?"; Secure":"";L.cookie=`${$}=${encodeURIComponent(q)}; Max-Age=${r}; Path=/; SameSite=Lax${X}`}function Y$(){let $=new Uint32Array(1);if(typeof crypto<"u"&&typeof crypto.getRandomValues==="function")return crypto.getRandomValues($),String($[0]);return String(Math.floor(Math.random()*10000000000))}function D$($=Date.now()){return`fb.1.${$}.${Y$()}`}function _$($,q=Date.now()){return`fb.1.${q}.${$}`}function a(){let $=Q();if(!$)return;if(!G("_fbp"))c("_fbp",D$());let q=new URLSearchParams($.location.search).get("fbclid");if(q&&!G("_fbc"))c("_fbc",_$(q))}function P(){let $=Q();if(!$)return;return`${$.location.pathname}${$.location.search}`}function Y(){return Q()?.location.href}function D(){return Q()?.location.origin??"https://behindthescenes.com"}function _(){return W()?.referrer||void 0}function F($){let q=$?.trim();return q?q.slice(0,512):void 0}function w($){return $!==null&&typeof $==="object"&&!Array.isArray($)}function C$($){if(!$)return null;try{let q=JSON.parse($);if(!w(q))return null;let L=w(q.utm)?Object.fromEntries(Object.entries(q.utm).filter((Z)=>typeof Z[1]==="string")):{},X=w(q.clickIds)?Object.fromEntries(Object.entries(q.clickIds).filter((Z)=>typeof Z[1]==="string")):{};return{utm:L,clickIds:X,landingUrl:typeof q.landingUrl==="string"?q.landingUrl:void 0,lastSeenAt:typeof q.lastSeenAt==="string"?q.lastSeenAt:new Date().toISOString(),referrer:typeof q.referrer==="string"?q.referrer:void 0}}catch{return null}}function i(){let $=z();return C$($?.getItem(K)??null)}function U$($){let q=z();if(!q)return;let L=JSON.stringify($);if(q.getItem(K)===L)return;q.setItem(K,L)}var m=null,C=null;function t(){m=null,C=null}function I$($){let q=new URLSearchParams($.location.search),L=A.map((Z)=>`${Z}=${q.get(Z)??""}`).join("&"),X=E.map((Z)=>`${Z}=${G(Z)??""}`).join("&");return`${$.location.href} ${L} ${X}`}function M(){let $=Q();if(!$)return i();let q=I$($);if(q===m&&C)return C;let L=new URLSearchParams($.location.search),X={utm:{},clickIds:{},landingUrl:$.location.href,lastSeenAt:new Date().toISOString(),referrer:_()};for(let J of A){let H=L.get(J);if(!H)continue;if(J.startsWith("utm_")){X.utm[J]=H;continue}X.clickIds[J]=H}for(let J of E){let H=G(J);if(H)X.clickIds[J.replace(/^_/,"")]=H}let Z=i(),j={utm:{...Z?.utm??{},...X.utm},clickIds:{...Z?.clickIds??{},...X.clickIds},landingUrl:X.landingUrl??Z?.landingUrl,lastSeenAt:X.lastSeenAt,referrer:X.referrer??Z?.referrer};return U$(j),m=q,C=j,j}function V(){return a(),M()}function e($){let q={...s};if($.autoTrack===!1)return{pageviews:!1,history:!1,outboundLinks:!1,buttonClicks:!1,formSubmissions:!1,search:!1,viewContent:!1};if($.autoTrack&&typeof $.autoTrack==="object")return{pageviews:$.autoTrack.pageviews??q.pageviews,history:$.autoTrack.pageviews===!1?!1:$.autoTrack.history??q.history,outboundLinks:$.autoTrack.outboundLinks??q.outboundLinks,buttonClicks:$.autoTrack.buttonClicks??q.buttonClicks,formSubmissions:$.autoTrack.formSubmissions??q.formSubmissions,search:$.autoTrack.search??q.search,viewContent:$.autoTrack.viewContent??q.viewContent};if($.autoPageviews===!1)return{...q,pageviews:!1,history:!1};if($.autoPageviews===!0)return{...q,pageviews:!0};return q}function O$(){let $=G("_ga");if(!$)return;let q=$.split(".");if(q.length>=4&&/^GA\d+$/i.test(q[0]??""))return q.slice(-2).join(".");return F($)}function R$(){let q=W()?.querySelector?.('script[src*="googletagmanager.com/gtag/js?id="]'),L=q&&"src"in q&&typeof q.src==="string"?q.src:void 0;if(!L)return;try{return F(new URL(L).searchParams.get("id"))}catch{return}}function $$(){let $=Q(),q=O$(),L=R$(),X=typeof $?.gtag==="function"||!!L||!!q;if(!X&&!q&&!L)return;return{tagInstalled:X,clientId:q,measurementId:L}}function T($){if(!$.googleAnalytics||typeof $.googleAnalytics==="boolean")return;return F($.googleAnalytics.measurementId)}function q$($){if(!$.googleAnalytics)return!1;if($.googleAnalytics===!0)return!1;return $.googleAnalytics.loadTag!==!1&&!!T($)}function L$($){let q=Q(),L=W();if(!q||!L)return;q.dataLayer=Array.isArray(q.dataLayer)?q.dataLayer:[],q.gtag??=(...Z)=>{q.dataLayer?.push(Z)};let X=`script[src*="googletagmanager.com/gtag/js?id=${$}"]`;if(!L.querySelector?.(X)){let Z=L.createElement("script");Z.async=!0,Z.src=`https://www.googletagmanager.com/gtag/js?id=${encodeURIComponent($)}`,Z.setAttribute("data-bts-ga-proxy","true"),(L.head??L.documentElement).appendChild(Z)}q.gtag("js",new Date),q.gtag("config",$,{send_page_view:!1})}function S$(){let $=Q();if(!$)return;let q=typeof Intl<"u"?F(Intl.DateTimeFormat().resolvedOptions().timeZone):void 0,L=$.navigator,X=F(L?.language),Z=Array.isArray(L?.languages)?L.languages.filter((H)=>typeof H==="string").slice(0,10):[],j=F(L?.userAgent),J={timezone:q,language:X,languages:Z.length>0?Z:void 0,userAgent:j};return Object.values(J).some((H)=>H!==void 0)?J:void 0}function b($){let q=V(),L=$$();return{event_id:$,ga_client_id:typeof L?.clientId==="string"?L.clientId:void 0,ga_tag_installed:typeof L?.tagInstalled==="boolean"?L.tagInstalled:void 0,attribution:q?{utm:q.utm,clickIds:q.clickIds,...q.clickIds,landingUrl:q.landingUrl,referrer:q.referrer}:void 0,client:S$(),googleAnalytics:L,page:{title:W()?.title,url:Y()}}}function X$($){if(!$)return{};if($ instanceof Headers){let q={};return $.forEach((L,X)=>{q[X]=L}),q}if(Array.isArray($))return Object.fromEntries($.map(([q,L])=>[q,String(L)]));return Object.fromEntries(Object.entries($).map(([q,L])=>[q,String(L)]))}var Z$="https://snap.licdn.com/li.lms-analytics/insight.min.js";function y($){if(typeof $==="number"&&Number.isFinite($))return String(Math.floor($));let q=typeof $==="string"?$.trim():void 0;return q&&q.length>0?q:void 0}function j$($){if($.lintrk)return $.lintrk;let q=(L,X)=>{q.q?.push([L,X])};return q.q=[],$.lintrk=q,q}function x$($){return Boolean($.querySelector(`script[src="${Z$}"]`))}function u($){let q=y($),L=Q(),X=W();if(!q||!L||!X)return;if(L._linkedin_partner_id=q,L._linkedin_data_partner_ids=L._linkedin_data_partner_ids??[],!L._linkedin_data_partner_ids.includes(q))L._linkedin_data_partner_ids.push(q);if(j$(L),x$(X))return;let Z=X.createElement("script");Z.type="text/javascript",Z.async=!0,Z.src=Z$;let j=X.getElementsByTagName("script")[0];if(j?.parentNode){j.parentNode.insertBefore(Z,j);return}X.head?.appendChild(Z)}function J$($){let q=y($.conversionId),L=Q();if(!q||!L)return;let X=j$(L),Z={conversion_id:q},j=y($.eventId);if(j)Z.event_id=j;if(typeof $.value==="number"&&Number.isFinite($.value))Z.value=$.value;else if(typeof $.value==="string"&&$.value.trim().length>0){let J=Number($.value);if(Number.isFinite(J))Z.value=J}if(typeof $.currency==="string"&&$.currency.trim().length>0)Z.currency=$.currency.trim().toUpperCase();X("track",Z)}function f(){if(typeof crypto<"u"&&typeof crypto.randomUUID==="function")return crypto.randomUUID();return`v_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`}class U{siteKey;endpoint;debug;flushIntervalMs;autoTrack;requestHeaders;queue=[];flushTimer=null;destroyed=!1;lastTrackedUrl=null;unpatchHistory=null;clickHandler=null;submitHandler=null;pagehideHandler=null;popstateHandler=null;viewContentObserver=null;viewContentMutationObserver=null;viewContentRescanTimer=null;viewContentListenersTornDown=!1;observedViewContentElements=new WeakSet;trackedViewContentElements=new WeakSet;linkedInInsight=null;linkedInInsightConfigLoaded=!1;pendingLinkedInInsightEvents=[];constructor($){if(this.siteKey=$.siteKey,this.endpoint=($.endpoint??p).replace(/\/$/,""),this.debug=$.debug??!1,this.flushIntervalMs=$.flushIntervalMs??d,this.autoTrack=e($),this.requestHeaders=$.requestHeaders,q$($)){let q=T($);if(q)L$(q)}if(this.linkedInInsight=this.createLinkedInInsightConfig($.linkedinInsight),this.linkedInInsight?.partnerId)u(this.linkedInInsight.partnerId);if(this.linkedInInsight?.loadFromBts)setTimeout(()=>{if(!this.destroyed)this.loadRemoteTrackingConfig()},0);else this.linkedInInsightConfigLoaded=!0;if(Q())this.installAutoTracking()}static init($){return new U($)}getVisitorId(){let $=z(),q=$?.getItem(O);if(q)return q;let L=f();return $?.setItem(O,L),L}getSessionId(){let $=z(),q=$?.getItem(R);if(q)return q;let L=f();return $?.setItem(R,L),L}getPersistedJourneyId(){return z()?.getItem(S)??null}log(...$){if(this.debug)console.log("[@bts/analytics]",...$)}createLinkedInInsightConfig($){if($===!1)return null;if($===void 0)return null;if($===!0)return{conversions:{},loadFromBts:!0};return{partnerId:typeof $.partnerId==="string"?$.partnerId:void 0,conversions:$.conversions??{},loadFromBts:$.loadFromBts!==!1}}async loadRemoteTrackingConfig(){try{let $=`${this.endpoint}/config?siteKey=${encodeURIComponent(this.siteKey)}`,q=await fetch($,{method:"GET"});if(!q.ok){this.linkedInInsightConfigLoaded=!0;return}let L=await q.json();if(L.linkedinInsight){if(this.linkedInInsight={partnerId:L.linkedinInsight.partnerId??this.linkedInInsight?.partnerId,conversions:{...this.linkedInInsight?.conversions??{},...L.linkedinInsight.conversions??{}},loadFromBts:!0},this.linkedInInsight.partnerId)u(this.linkedInInsight.partnerId)}}catch($){this.log("tracking config load failed",$)}finally{this.linkedInInsightConfigLoaded=!0,this.flushPendingLinkedInInsightEvents()}}installAutoTracking(){let $=Q(),q=W();if(!$||!q)return;if(Object.values(this.autoTrack).some(Boolean))V();if(this.autoTrack.pageviews)this.recordPageView();if(this.autoTrack.history)this.unpatchHistory=this.patchHistory($),this.popstateHandler=()=>{this.recordPageView(),this.rescanViewContentAfterNavigation()},$.addEventListener("popstate",this.popstateHandler);if(this.clickHandler=(L)=>{this.handleAutoClick(L)},this.submitHandler=(L)=>{this.handleAutoSubmit(L)},this.pagehideHandler=()=>{this.viewContentListenersTornDown=!0,this.flushWithBeacon(),this.viewContentObserver?.disconnect(),this.viewContentObserver=null,this.viewContentMutationObserver?.disconnect(),this.viewContentMutationObserver=null},this.autoTrack.outboundLinks||this.autoTrack.buttonClicks)q.addEventListener("click",this.clickHandler,!0);if(this.autoTrack.formSubmissions||this.autoTrack.search)q.addEventListener("submit",this.submitHandler,!0);if(this.autoTrack.viewContent)this.installViewContentTracking(q);$.addEventListener("pagehide",this.pagehideHandler)}getOrCreateViewContentIntersectionObserver(){if(typeof IntersectionObserver>"u"||this.viewContentListenersTornDown)return null;if(this.viewContentObserver)return this.viewContentObserver;return this.viewContentObserver=new IntersectionObserver(($,q)=>{for(let L of $){if(!L.isIntersecting||!(L.target instanceof Element))continue;this.trackViewContentElement(L.target),q.unobserve(L.target)}}),this.viewContentObserver}observeViewContentElements($){if(this.viewContentListenersTornDown||this.destroyed)return;let q=this.getOrCreateViewContentIntersectionObserver();if(!q)return;for(let L of Array.from($.querySelectorAll("[data-bts-view-content]"))){if(this.observedViewContentElements.has(L))continue;this.observedViewContentElements.add(L),q.observe(L)}}scheduleViewContentRescanFromMutations(){if(this.viewContentListenersTornDown)return;if(this.viewContentRescanTimer)return;this.viewContentRescanTimer=setTimeout(()=>{if(this.viewContentRescanTimer=null,this.viewContentListenersTornDown||this.destroyed)return;let $=W();if($)this.observeViewContentElements($)},l)}rescanViewContentAfterNavigation(){if(!this.autoTrack.viewContent)return;if(this.viewContentListenersTornDown)return;let $=W();if($)this.observeViewContentElements($)}installViewContentTracking($){if(typeof IntersectionObserver>"u")return;if(this.observeViewContentElements($),typeof MutationObserver>"u")return;let q=$.body??$.documentElement;if(!q)return;this.viewContentMutationObserver=new MutationObserver(()=>{this.scheduleViewContentRescanFromMutations()}),this.viewContentMutationObserver.observe(q,{childList:!0,subtree:!0})}trackViewContentElement($){if(this.trackedViewContentElements.has($))return;this.trackedViewContentElements.add($);let q=F($.getAttribute("data-bts-view-content")||$.getAttribute("data-bts-content-id")||$.id);this.trackStandard("view_content",{autoCaptured:!0,contentId:q,contentTitle:F($.getAttribute("data-bts-content-title")||$.textContent),contentType:F($.getAttribute("data-bts-content-type")),elementId:F($.id)})}sourceEventKeyForLinkedInInsight($){switch($){case"page_view":return"page_view";case"lead":return"lead_capture";case"sign_up":return"registration_complete";case"begin_checkout":return"checkout_started";case"add_payment_info":return"add_payment_info";case"purchase":return"purchase_completed";default:return $}}flushPendingLinkedInInsightEvents(){if(this.pendingLinkedInInsightEvents.length===0)return;let $=[...this.pendingLinkedInInsightEvents];this.pendingLinkedInInsightEvents=[];for(let q of $)this.trackLinkedInInsightForEvent(q)}trackLinkedInInsightForEvent($){if(!this.linkedInInsight)return;if(!this.linkedInInsightConfigLoaded){this.pendingLinkedInInsightEvents.push($);return}let q=this.sourceEventKeyForLinkedInInsight($.eventName),L=this.linkedInInsight.conversions[q]??this.linkedInInsight.conversions[$.eventName];if(!L)return;let X=$.properties??{};J$({conversionId:L,eventId:typeof X.event_id==="string"?X.event_id:void 0,value:typeof X.monetaryValue==="number"||typeof X.monetaryValue==="string"?X.monetaryValue:typeof X.value==="number"||typeof X.value==="string"?X.value:void 0,currency:typeof X.currency==="string"?X.currency:void 0})}patchHistory($){let q=$.history,L=q.pushState.bind(q),X=q.replaceState.bind(q),Z=()=>{M(),this.recordPageView(),this.rescanViewContentAfterNavigation()};return q.pushState=(...j)=>{L(...j),Z()},q.replaceState=(...j)=>{X(...j),Z()},()=>{q.pushState=L,q.replaceState=X}}handleAutoClick($){if($.defaultPrevented)return;let q=$.target;if(!(q instanceof Element))return;if(this.autoTrack.outboundLinks){let X=q.closest("a[href]");if(X instanceof HTMLAnchorElement){let Z=F(X.href);if(!Z)return;let j=new URL(Z,D());if(j.origin!==D()){let J=this.decorateHostedCheckoutUrl(j);if(J)X.href=J;this.trackStandard("outbound_click",{elementHref:J??Z,elementId:F(X.id),elementText:F(X.textContent),linkHost:j.hostname});return}}}if(!this.autoTrack.buttonClicks)return;let L=q.closest("button,[role='button'],[data-bts-track-click]");if(!(L instanceof Element))return;this.trackStandard("button_click",{elementId:F(L.id),elementName:F(L.getAttribute("name")),elementRole:F(L.getAttribute("role")),elementText:F(L.textContent)})}decorateHostedCheckoutUrl($){let q=$.hostname.toLowerCase();if(q!=="behindthescenes.com"&&!q.endsWith(".behindthescenes.com"))return null;let L=$.pathname.split("/").filter(Boolean);if(L[0]!=="c"||!L[1])return null;let X=new URL($.toString());X.searchParams.set(x,this.siteKey);let Z=z()?.getItem(B);if(Z)X.searchParams.set(N,Z);let j=M();if(j){for(let[J,H]of Object.entries(j.utm??{}))if(H)X.searchParams.set(J,H);for(let[J,H]of Object.entries(j.clickIds??{}))if(H)X.searchParams.set(J,H)}return X.toString()}handleAutoSubmit($){if($.defaultPrevented||!this.autoTrack.formSubmissions&&!this.autoTrack.search)return;let q=$.target;if(!(q instanceof HTMLFormElement))return;if(this.autoTrack.search)this.trackSearchForm(q);if(!this.autoTrack.formSubmissions)return;this.trackStandard("form_submit",{formAction:F(q.action),formId:F(q.id),formMethod:F(q.method),formName:F(q.getAttribute("name"))})}trackSearchForm($){if(($.method||"get").toLowerCase()!=="get")return;let L=this.extractSearchQuery($);if(!L)return;this.trackStandard("search",{autoCaptured:!0,formAction:F($.action),formId:F($.id),formName:F($.getAttribute("name")),queryKey:L.key,searchQuery:L.value})}extractSearchQuery($){try{let L=new FormData($);for(let X of h){let Z=L.get(X);if(typeof Z==="string"){let j=F(Z);if(j)return{key:X,value:j}}}}catch{}let q=$.elements;for(let L of h){let X=q?.namedItem?.(L),Z=X&&"value"in X?X.value:void 0;if(typeof Z==="string"){let j=F(Z);if(j)return{key:L,value:j}}}return null}buildEvent($,q,L,X){let Z=X?.path??P(),j=_(),J=f(),H=b(J);return{eventName:$,eventType:q,path:Z,referrer:j,occurredAt:new Date().toISOString(),journeyId:this.getPersistedJourneyId()??void 0,visitorId:this.getVisitorId(),sessionId:this.getSessionId(),properties:{...L??{},...H,event_id:L?.event_id??L?.eventId??J}}}queueEvent($,q,L){if(this.destroyed)return;let X=o($),Z=n(X.canonicalEventName,L),j={...q??{}};if(X.aliasOf)j.originalEventName=$;let J=this.buildEvent(X.eventName,Z,j);if(this.queue.push(J),this.trackLinkedInInsightForEvent(J),this.queue.length>=50){this.flushNow();return}this.scheduleFlush()}scheduleFlush(){if(this.flushTimer)return;this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flushNow()},this.flushIntervalMs)}async postJson($,q){let L=`${this.endpoint}${$}`;this.log("POST",L,q);let X=JSON.stringify(q),Z=await this.resolveRequestHeaders($,L,q,X,this.endpoint);return fetch(L,{method:"POST",headers:Z,body:X})}async postWebsiteJson($,q){let L=this.endpoint.replace(/\/analytics$/,""),X=`${L}${$}`;this.log("POST",X,q);let Z=JSON.stringify(q),j=await this.resolveRequestHeaders($,X,q,Z,L);return fetch(X,{method:"POST",headers:j,body:Z})}async postJsonKeepalive($,q){let L=`${this.endpoint}${$}`;this.log("POST keepalive",L,q);let X=JSON.stringify(q),Z=await this.resolveRequestHeaders($,L,q,X,this.endpoint);return fetch(L,{method:"POST",headers:Z,body:X,keepalive:!0})}async resolveRequestHeaders($,q,L,X,Z=this.endpoint){let j={"Content-Type":"application/json"};if(!this.requestHeaders)return j;let J=typeof this.requestHeaders==="function"?await this.requestHeaders({body:L,bodyText:X,endpoint:Z,headers:{...j},path:$,siteKey:this.siteKey,url:q}):this.requestHeaders;return{...j,...X$(J)}}async flushBatch($,q=!1){try{let L=q?await this.postJsonKeepalive("/ingest/batch",{siteKey:this.siteKey,events:$}):await this.postJson("/ingest/batch",{siteKey:this.siteKey,events:$});if(!L.ok)return this.log("flush failed",L.status),!1;return!0}catch(L){return this.log("flush error",L),!1}}flushWithBeacon(){if(this.queue.length===0)return;if(this.requestHeaders){let H=[...this.queue];this.queue=[],this.flushBatch(H,!0).then((F$)=>{if(!F$&&!this.destroyed)this.queue.unshift(...H),this.scheduleFlush()});return}let $=Q(),q=$?.navigator?.sendBeacon?.bind($.navigator);if(!q)return;let L=[...this.queue];this.queue=[];let X=`${this.endpoint}/ingest/batch`,Z=JSON.stringify({siteKey:this.siteKey,events:L}),j=new Blob([Z],{type:"application/json"});if(!q(X,j))this.queue.unshift(...L)}async flushNow(){if(this.destroyed)return;if(this.queue.length===0)return;let $=[...this.queue];if(this.queue=[],!await this.flushBatch($)&&!this.destroyed)this.queue.unshift(...$),this.scheduleFlush()}recordPageView($){let q=$??P(),L=Y()??q??"/";if(L===this.lastTrackedUrl)return;this.lastTrackedUrl=L;let X=this.buildEvent("page_view","page_view",{autoCaptured:!0},{path:q});this.queue.push(X),this.trackLinkedInInsightForEvent(X),this.scheduleFlush()}page($){this.lastTrackedUrl=null,this.recordPageView($)}track($,q){this.queueEvent($,q)}trackStandard($,q){this.queueEvent($,q)}identify($,q){if(this.destroyed)return;this.queue.push(this.buildEvent("identify","identify",{traits:q??{},userId:$})),this.scheduleFlush()}listStandardEvents(){return g()}async submitContactForm($){let q=f(),L=b(q),X=await this.postWebsiteJson("/ghl/leads",{siteKey:this.siteKey,locationId:$.locationId,email:$.email,phone:$.phone,subject:$.subject,body:$.body,message:$.message,name:$.name,firstName:$.firstName,lastName:$.lastName,source:$.source,tags:$.tags,customFields:$.customFields,pipelineId:$.pipelineId,pipelineStageId:$.pipelineStageId,opportunityName:$.opportunityName,monetaryValue:$.monetaryValue,metadata:{...$.metadata??{},...L}});if(!X.ok)throw Error(`contact form submit failed: ${X.status}`);return await X.json()}async startFunnel($){V();let q=await this.postJson("/journey/start",{siteKey:this.siteKey,entryPath:$??P()});if(!q.ok)throw Error(`journey/start failed: ${q.status}`);let L=await q.json();return z()?.setItem(B,L.journeyToken),z()?.setItem(S,L.journeyId),L}getPersistedJourneyToken(){return z()?.getItem(B)??null}decorateUrl($,q){let L=q??this.getPersistedJourneyToken(),X=new URL($,D());if(X.searchParams.set(x,this.siteKey),L)X.searchParams.set(N,L);let Z=M();if(Z){for(let[j,J]of Object.entries(Z.utm??{}))if(J)X.searchParams.set(j,J);for(let[j,J]of Object.entries(Z.clickIds??{}))if(J)X.searchParams.set(j,J)}return X.toString()}async notifyHandoff($,q){let L=await this.postJson("/journey/handoff",{journeyToken:$,context:q});if(!L.ok)throw Error(`journey/handoff failed: ${L.status}`)}destroy(){if(this.viewContentListenersTornDown=!0,t(),this.viewContentRescanTimer)clearTimeout(this.viewContentRescanTimer),this.viewContentRescanTimer=null;let $=Q(),q=W();if(q&&this.clickHandler&&(this.autoTrack.outboundLinks||this.autoTrack.buttonClicks))q.removeEventListener("click",this.clickHandler,!0);if(q&&this.submitHandler&&(this.autoTrack.formSubmissions||this.autoTrack.search))q.removeEventListener("submit",this.submitHandler,!0);if(this.viewContentObserver?.disconnect(),this.viewContentObserver=null,this.viewContentMutationObserver?.disconnect(),this.viewContentMutationObserver=null,$&&this.popstateHandler)$.removeEventListener("popstate",this.popstateHandler);if($&&this.pagehideHandler)$.removeEventListener("pagehide",this.pagehideHandler);if(this.flushTimer)clearTimeout(this.flushTimer),this.flushTimer=null;this.unpatchHistory?.(),this.unpatchHistory=null,this.flushWithBeacon(),this.destroyed=!0}}function N$($){return U.init($)}
|
package/dist/esm/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var K=["page_view","view_content","search","lead","sign_up","begin_checkout","add_payment_info","purchase","outbound_click","button_click","form_submit"],S="bts_analytics_vid",g="bts_analytics_sid",x="bts_analytics_jt",I="bts_analytics_jid",Y="bts_analytics_attr",b="bts_site",T="bts_jt",p=64,d=300,v="https://api.bts.it.com/v2/website/analytics",l={pageviews:!0,history:!0,outboundLinks:!0,buttonClicks:!0,formSubmissions:!0,search:!0,viewContent:!0},N=["q","query","search"],_=["utm_source","utm_medium","utm_campaign","utm_term","utm_content","fbclid","gclid","gbraid","li_fat_id","msclkid","ttclid","wbraid"],h=["_fbp","_fbc"],n=7776000;var Uf=new Set(K),Vf=new Set(K.map((f)=>f.toLowerCase())),zf=new Set(["lead","sign_up","begin_checkout","add_payment_info","purchase"]),Qf={$pageview:"page_view",checkout_started:"begin_checkout",lead_capture:"lead",purchase_completed:"purchase",registration_complete:"sign_up"};function s(f){let j=f.trim();if(j.length===0)return{eventName:j,canonicalEventName:j,isStandard:!1};let $=j.toLowerCase(),J=Qf[$];if(J)return{eventName:J,canonicalEventName:J,aliasOf:J,isStandard:!0};if(Vf.has($)){let X=$;return{eventName:X,canonicalEventName:X,isStandard:!0}}return{eventName:j,canonicalEventName:j,isStandard:!1}}function o(f,j){if(j)return j;if(f==="page_view")return"page_view";if(f==="identify")return"identify";if(zf.has(f))return"conversion";return"custom"}function r(){return[...K]}function H(){return typeof window>"u"?null:window}function z(){return typeof document>"u"?null:document}function G(){return H()?.localStorage??null}function B(f){let j=z();if(!j?.cookie)return;let $=`${f}=`,J=j.cookie.split(";").map((Z)=>Z.trim()).find((Z)=>Z.startsWith($));if(!J)return;let X=J.slice($.length);if(X==="")return;try{return decodeURIComponent(X)}catch{return X}}function A(f,j){let $=z();if(!$)return;let J=H()?.location.protocol==="https:"?"; Secure":"";$.cookie=`${f}=${encodeURIComponent(j)}; Max-Age=${n}; Path=/; SameSite=Lax${J}`}function Lf(){let f=new Uint32Array(1);if(typeof crypto<"u"&&typeof crypto.getRandomValues==="function")return crypto.getRandomValues(f),String(f[0]);return String(Math.floor(Math.random()*10000000000))}function Gf(f=Date.now()){return`fb.1.${f}.${Lf()}`}function Bf(f,j=Date.now()){return`fb.1.${j}.${f}`}function i(){let f=H();if(!f)return;if(!B("_fbp"))A("_fbp",Gf());let j=new URLSearchParams(f.location.search).get("fbclid");if(j&&!B("_fbc"))A("_fbc",Bf(j))}function D(){let f=H();if(!f)return;return`${f.location.pathname}${f.location.search}`}function k(){return H()?.location.href}function O(){return H()?.location.origin??"https://behindthescenes.com"}function U(){return z()?.referrer||void 0}function q(f){let j=f?.trim();return j?j.slice(0,512):void 0}function c(f){return f!==null&&typeof f==="object"&&!Array.isArray(f)}function Mf(f){if(!f)return null;try{let j=JSON.parse(f);if(!c(j))return null;let $=c(j.utm)?Object.fromEntries(Object.entries(j.utm).filter((X)=>typeof X[1]==="string")):{},J=c(j.clickIds)?Object.fromEntries(Object.entries(j.clickIds).filter((X)=>typeof X[1]==="string")):{};return{utm:$,clickIds:J,landingUrl:typeof j.landingUrl==="string"?j.landingUrl:void 0,lastSeenAt:typeof j.lastSeenAt==="string"?j.lastSeenAt:new Date().toISOString(),referrer:typeof j.referrer==="string"?j.referrer:void 0}}catch{return null}}function a(){let f=G();return Mf(f?.getItem(Y)??null)}function Pf(f){let j=G();if(!j)return;let $=JSON.stringify(f);if(j.getItem(Y)===$)return;j.setItem(Y,$)}var E=null,C=null;function t(){E=null,C=null}function Wf(f){let j=new URLSearchParams(f.location.search),$=_.map((X)=>`${X}=${j.get(X)??""}`).join("&"),J=h.map((X)=>`${X}=${B(X)??""}`).join("&");return`${f.location.href} ${$} ${J}`}function R(){let f=H();if(!f)return a();let j=Wf(f);if(j===E&&C)return C;let $=new URLSearchParams(f.location.search),J={utm:{},clickIds:{},landingUrl:f.location.href,lastSeenAt:new Date().toISOString(),referrer:U()};for(let F of _){let V=$.get(F);if(!V)continue;if(F.startsWith("utm_")){J.utm[F]=V;continue}J.clickIds[F]=V}for(let F of h){let V=B(F);if(V)J.clickIds[F.replace(/^_/,"")]=V}let X=a(),Z={utm:{...X?.utm??{},...J.utm},clickIds:{...X?.clickIds??{},...J.clickIds},landingUrl:J.landingUrl??X?.landingUrl,lastSeenAt:J.lastSeenAt,referrer:J.referrer??X?.referrer};return Pf(Z),E=j,C=Z,Z}function M(){return i(),R()}function e(f){let j={...l};if(f.autoTrack===!1)return{pageviews:!1,history:!1,outboundLinks:!1,buttonClicks:!1,formSubmissions:!1,search:!1,viewContent:!1};if(f.autoTrack&&typeof f.autoTrack==="object")return{pageviews:f.autoTrack.pageviews??j.pageviews,history:f.autoTrack.pageviews===!1?!1:f.autoTrack.history??j.history,outboundLinks:f.autoTrack.outboundLinks??j.outboundLinks,buttonClicks:f.autoTrack.buttonClicks??j.buttonClicks,formSubmissions:f.autoTrack.formSubmissions??j.formSubmissions,search:f.autoTrack.search??j.search,viewContent:f.autoTrack.viewContent??j.viewContent};if(f.autoPageviews===!1)return{...j,pageviews:!1,history:!1};if(f.autoPageviews===!0)return{...j,pageviews:!0};return j}function Kf(){let f=B("_ga");if(!f)return;let j=f.split(".");if(j.length>=4&&/^GA\d+$/i.test(j[0]??""))return j.slice(-2).join(".");return q(f)}function Yf(){let j=z()?.querySelector?.('script[src*="googletagmanager.com/gtag/js?id="]'),$=j&&"src"in j&&typeof j.src==="string"?j.src:void 0;if(!$)return;try{return q(new URL($).searchParams.get("id"))}catch{return}}function ff(){let f=H(),j=Kf(),$=Yf(),J=typeof f?.gtag==="function"||!!$||!!j;if(!J&&!j&&!$)return;return{tagInstalled:J,clientId:j,measurementId:$}}function w(f){if(!f.googleAnalytics||typeof f.googleAnalytics==="boolean")return;return q(f.googleAnalytics.measurementId)}function jf(f){if(!f.googleAnalytics)return!1;if(f.googleAnalytics===!0)return!1;return f.googleAnalytics.loadTag!==!1&&!!w(f)}function $f(f){let j=H(),$=z();if(!j||!$)return;j.dataLayer=Array.isArray(j.dataLayer)?j.dataLayer:[],j.gtag??=(...X)=>{j.dataLayer?.push(X)};let J=`script[src*="googletagmanager.com/gtag/js?id=${f}"]`;if(!$.querySelector?.(J)){let X=$.createElement("script");X.async=!0,X.src=`https://www.googletagmanager.com/gtag/js?id=${encodeURIComponent(f)}`,X.setAttribute("data-bts-ga-proxy","true"),($.head??$.documentElement).appendChild(X)}j.gtag("js",new Date),j.gtag("config",f,{send_page_view:!1})}function Df(){let f=H();if(!f)return;let j=typeof Intl<"u"?q(Intl.DateTimeFormat().resolvedOptions().timeZone):void 0,$=f.navigator,J=q($?.language),X=Array.isArray($?.languages)?$.languages.filter((V)=>typeof V==="string").slice(0,10):[],Z=q($?.userAgent),F={timezone:j,language:J,languages:X.length>0?X:void 0,userAgent:Z};return Object.values(F).some((V)=>V!==void 0)?F:void 0}function y(f){let j=M(),$=ff();return{event_id:f,ga_client_id:typeof $?.clientId==="string"?$.clientId:void 0,ga_tag_installed:typeof $?.tagInstalled==="boolean"?$.tagInstalled:void 0,attribution:j?{utm:j.utm,clickIds:j.clickIds,...j.clickIds,landingUrl:j.landingUrl,referrer:j.referrer}:void 0,client:Df(),googleAnalytics:$,page:{title:z()?.title,url:k()}}}function Jf(f){if(!f)return{};if(f instanceof Headers){let j={};return f.forEach(($,J)=>{j[J]=$}),j}if(Array.isArray(f))return Object.fromEntries(f.map(([j,$])=>[j,String($)]));return Object.fromEntries(Object.entries(f).map(([j,$])=>[j,String($)]))}function Xf(f){return f!==null&&typeof f==="object"&&!Array.isArray(f)}function kf(f,j){if(typeof j==="bigint")return j.toString();if(typeof j==="function"||typeof j==="symbol")return;if(j instanceof Date)return j.toISOString();if(ArrayBuffer.isView(j))return;return j}function P(f){try{return JSON.stringify(f,kf)}catch(j){let $=j instanceof Error?j.message:"unknown";throw Error(`Failed to serialize request body: ${$}`)}}function Q(f){let j=f?.trim();return j&&j.length>0?j:void 0}function u(f,j=0){if(j>8)return;if(f===null||f===void 0)return;if(typeof f==="string"||typeof f==="number"||typeof f==="boolean")return f;if(typeof f==="bigint")return f.toString();if(f instanceof Date)return f.toISOString();if(ArrayBuffer.isView(f)||typeof f==="function"||typeof f==="symbol")return;if(Array.isArray(f)){let J=f.map((X)=>u(X,j+1)).filter((X)=>X!==void 0);return J.length>0?J:void 0}if(!Xf(f))return;let $={};for(let[J,X]of Object.entries(f)){let Z=u(X,j+1);if(Z!==void 0)$[J]=Z}return Object.keys($).length>0?$:void 0}function Zf(f){if(!f)return;let j=u(f);return Xf(j)?j:void 0}function L(f,j,$){if($===void 0)return;f[j]=$}function qf(f,j,$){let J={siteKey:f,locationId:j.locationId};if(L(J,"email",Q(j.email)),L(J,"phone",Q(j.phone)),L(J,"subject",Q(j.subject)),L(J,"body",Q(j.body)),L(J,"message",Q(j.message)),L(J,"name",Q(j.name)),L(J,"firstName",Q(j.firstName)),L(J,"lastName",Q(j.lastName)),L(J,"source",Q(j.source)),j.tags&&j.tags.length>0)J.tags=j.tags;if(j.customFields&&Object.keys(j.customFields).length>0)J.customFields=j.customFields;let X=Q(j.pipelineId),Z=Q(j.pipelineStageId);if(X&&Z){if(J.pipelineId=X,J.pipelineStageId=Z,L(J,"opportunityName",Q(j.opportunityName)),typeof j.monetaryValue==="number"&&Number.isFinite(j.monetaryValue))J.monetaryValue=j.monetaryValue}let F=Zf({...j.metadata??{},...$});if(F)J.metadata=F;return J}function W(){if(typeof crypto<"u"&&typeof crypto.randomUUID==="function")return crypto.randomUUID();return`v_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`}class m{siteKey;endpoint;debug;flushIntervalMs;autoTrack;requestHeaders;queue=[];flushTimer=null;destroyed=!1;lastTrackedUrl=null;unpatchHistory=null;clickHandler=null;submitHandler=null;pagehideHandler=null;popstateHandler=null;viewContentObserver=null;viewContentMutationObserver=null;viewContentRescanTimer=null;viewContentListenersTornDown=!1;observedViewContentElements=new WeakSet;trackedViewContentElements=new WeakSet;constructor(f){if(this.siteKey=f.siteKey,this.endpoint=(f.endpoint??v).replace(/\/$/,""),this.debug=f.debug??!1,this.flushIntervalMs=f.flushIntervalMs??d,this.autoTrack=e(f),this.requestHeaders=f.requestHeaders,jf(f)){let j=w(f);if(j)$f(j)}if(H())this.installAutoTracking()}static init(f){return new m(f)}getVisitorId(){let f=G(),j=f?.getItem(S);if(j)return j;let $=W();return f?.setItem(S,$),$}getSessionId(){let f=G(),j=f?.getItem(g);if(j)return j;let $=W();return f?.setItem(g,$),$}getPersistedJourneyId(){return G()?.getItem(I)??null}log(...f){if(this.debug)console.log("[@bts/analytics]",...f)}installAutoTracking(){let f=H(),j=z();if(!f||!j)return;if(Object.values(this.autoTrack).some(Boolean))M();if(this.autoTrack.pageviews)this.recordPageView();if(this.autoTrack.history)this.unpatchHistory=this.patchHistory(f),this.popstateHandler=()=>{this.recordPageView(),this.rescanViewContentAfterNavigation()},f.addEventListener("popstate",this.popstateHandler);if(this.clickHandler=($)=>{this.handleAutoClick($)},this.submitHandler=($)=>{this.handleAutoSubmit($)},this.pagehideHandler=()=>{this.viewContentListenersTornDown=!0,this.flushWithBeacon(),this.viewContentObserver?.disconnect(),this.viewContentObserver=null,this.viewContentMutationObserver?.disconnect(),this.viewContentMutationObserver=null},this.autoTrack.outboundLinks||this.autoTrack.buttonClicks)j.addEventListener("click",this.clickHandler,!0);if(this.autoTrack.formSubmissions||this.autoTrack.search)j.addEventListener("submit",this.submitHandler,!0);if(this.autoTrack.viewContent)this.installViewContentTracking(j);f.addEventListener("pagehide",this.pagehideHandler)}getOrCreateViewContentIntersectionObserver(){if(typeof IntersectionObserver>"u"||this.viewContentListenersTornDown)return null;if(this.viewContentObserver)return this.viewContentObserver;return this.viewContentObserver=new IntersectionObserver((f,j)=>{for(let $ of f){if(!$.isIntersecting||!($.target instanceof Element))continue;this.trackViewContentElement($.target),j.unobserve($.target)}}),this.viewContentObserver}observeViewContentElements(f){if(this.viewContentListenersTornDown||this.destroyed)return;let j=this.getOrCreateViewContentIntersectionObserver();if(!j)return;for(let $ of Array.from(f.querySelectorAll("[data-bts-view-content]"))){if(this.observedViewContentElements.has($))continue;this.observedViewContentElements.add($),j.observe($)}}scheduleViewContentRescanFromMutations(){if(this.viewContentListenersTornDown)return;if(this.viewContentRescanTimer)return;this.viewContentRescanTimer=setTimeout(()=>{if(this.viewContentRescanTimer=null,this.viewContentListenersTornDown||this.destroyed)return;let f=z();if(f)this.observeViewContentElements(f)},p)}rescanViewContentAfterNavigation(){if(!this.autoTrack.viewContent)return;if(this.viewContentListenersTornDown)return;let f=z();if(f)this.observeViewContentElements(f)}installViewContentTracking(f){if(typeof IntersectionObserver>"u")return;if(this.observeViewContentElements(f),typeof MutationObserver>"u")return;let j=f.body??f.documentElement;if(!j)return;this.viewContentMutationObserver=new MutationObserver(()=>{this.scheduleViewContentRescanFromMutations()}),this.viewContentMutationObserver.observe(j,{childList:!0,subtree:!0})}trackViewContentElement(f){if(this.trackedViewContentElements.has(f))return;this.trackedViewContentElements.add(f);let j=q(f.getAttribute("data-bts-view-content")||f.getAttribute("data-bts-content-id")||f.id);this.trackStandard("view_content",{autoCaptured:!0,contentId:j,contentTitle:q(f.getAttribute("data-bts-content-title")||f.textContent),contentType:q(f.getAttribute("data-bts-content-type")),elementId:q(f.id)})}patchHistory(f){let j=f.history,$=j.pushState.bind(j),J=j.replaceState.bind(j),X=()=>{R(),this.recordPageView(),this.rescanViewContentAfterNavigation()};return j.pushState=(...Z)=>{$(...Z),X()},j.replaceState=(...Z)=>{J(...Z),X()},()=>{j.pushState=$,j.replaceState=J}}handleAutoClick(f){if(f.defaultPrevented)return;let j=f.target;if(!(j instanceof Element))return;if(this.autoTrack.outboundLinks){let J=j.closest("a[href]");if(J instanceof HTMLAnchorElement){let X=q(J.href);if(!X)return;let Z=new URL(X,O());if(Z.origin!==O()){this.trackStandard("outbound_click",{elementHref:X,elementId:q(J.id),elementText:q(J.textContent),linkHost:Z.hostname});return}}}if(!this.autoTrack.buttonClicks)return;let $=j.closest("button,[role='button'],[data-bts-track-click]");if(!($ instanceof Element))return;this.trackStandard("button_click",{elementId:q($.id),elementName:q($.getAttribute("name")),elementRole:q($.getAttribute("role")),elementText:q($.textContent)})}handleAutoSubmit(f){if(f.defaultPrevented||!this.autoTrack.formSubmissions&&!this.autoTrack.search)return;let j=f.target;if(!(j instanceof HTMLFormElement))return;if(this.autoTrack.search)this.trackSearchForm(j);if(!this.autoTrack.formSubmissions)return;this.trackStandard("form_submit",{formAction:q(j.action),formId:q(j.id),formMethod:q(j.method),formName:q(j.getAttribute("name"))})}trackSearchForm(f){if((f.method||"get").toLowerCase()!=="get")return;let $=this.extractSearchQuery(f);if(!$)return;this.trackStandard("search",{autoCaptured:!0,formAction:q(f.action),formId:q(f.id),formName:q(f.getAttribute("name")),queryKey:$.key,searchQuery:$.value})}extractSearchQuery(f){try{let $=new FormData(f);for(let J of N){let X=$.get(J);if(typeof X==="string"){let Z=q(X);if(Z)return{key:J,value:Z}}}}catch{}let j=f.elements;for(let $ of N){let J=j?.namedItem?.($),X=J&&"value"in J?J.value:void 0;if(typeof X==="string"){let Z=q(X);if(Z)return{key:$,value:Z}}}return null}buildEvent(f,j,$,J){let X=J?.path??D(),Z=U(),F=W(),V=y(F);return{eventName:f,eventType:j,path:X,referrer:Z,occurredAt:new Date().toISOString(),journeyId:this.getPersistedJourneyId()??void 0,visitorId:this.getVisitorId(),sessionId:this.getSessionId(),properties:{...$??{},...V,event_id:$?.event_id??$?.eventId??F}}}queueEvent(f,j,$){if(this.destroyed)return;let J=s(f),X=o(J.canonicalEventName,$),Z={...j??{}};if(J.aliasOf)Z.originalEventName=f;if(this.queue.push(this.buildEvent(J.eventName,X,Z)),this.queue.length>=50){this.flushNow();return}this.scheduleFlush()}scheduleFlush(){if(this.flushTimer)return;this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flushNow()},this.flushIntervalMs)}async postJson(f,j){let $=`${this.endpoint}${f}`;this.log("POST",$,j);let J=P(j),X=await this.resolveRequestHeaders(f,$,j,J,this.endpoint);return fetch($,{method:"POST",headers:X,body:J})}async postWebsiteJson(f,j){let $=this.endpoint.replace(/\/analytics$/,""),J=`${$}${f}`;this.log("POST",J,j);let X=P(j),Z=await this.resolveRequestHeaders(f,J,j,X,$);return fetch(J,{method:"POST",headers:Z,body:X})}async postJsonKeepalive(f,j){let $=`${this.endpoint}${f}`;this.log("POST keepalive",$,j);let J=P(j),X=await this.resolveRequestHeaders(f,$,j,J,this.endpoint);return fetch($,{method:"POST",headers:X,body:J,keepalive:!0})}async resolveRequestHeaders(f,j,$,J,X=this.endpoint){let Z={"Content-Type":"application/json"};if(!this.requestHeaders)return Z;let F=typeof this.requestHeaders==="function"?await this.requestHeaders({body:$,bodyText:J,endpoint:X,headers:{...Z},path:f,siteKey:this.siteKey,url:j}):this.requestHeaders;return{...Z,...Jf(F)}}async flushBatch(f,j=!1){try{let $=j?await this.postJsonKeepalive("/ingest/batch",{siteKey:this.siteKey,events:f}):await this.postJson("/ingest/batch",{siteKey:this.siteKey,events:f});if(!$.ok)return this.log("flush failed",$.status),!1;return!0}catch($){return this.log("flush error",$),!1}}flushWithBeacon(){if(this.queue.length===0)return;if(this.requestHeaders){let V=[...this.queue];this.queue=[],this.flushBatch(V,!0).then((Ff)=>{if(!Ff&&!this.destroyed)this.queue.unshift(...V),this.scheduleFlush()});return}let f=H(),j=f?.navigator?.sendBeacon?.bind(f.navigator);if(!j)return;let $=[...this.queue];this.queue=[];let J=`${this.endpoint}/ingest/batch`,X=P({siteKey:this.siteKey,events:$}),Z=new Blob([X],{type:"application/json"});if(!j(J,Z))this.queue.unshift(...$)}async flushNow(){if(this.destroyed)return;if(this.queue.length===0)return;let f=[...this.queue];if(this.queue=[],!await this.flushBatch(f)&&!this.destroyed)this.queue.unshift(...f),this.scheduleFlush()}recordPageView(f){let j=f??D(),$=k()??j??"/";if($===this.lastTrackedUrl)return;this.lastTrackedUrl=$,this.queue.push(this.buildEvent("page_view","page_view",{autoCaptured:!0},{path:j})),this.scheduleFlush()}page(f){this.lastTrackedUrl=null,this.recordPageView(f)}track(f,j){this.queueEvent(f,j)}trackStandard(f,j){this.queueEvent(f,j)}identify(f,j){if(this.destroyed)return;this.queue.push(this.buildEvent("identify","identify",{traits:j??{},userId:f})),this.scheduleFlush()}listStandardEvents(){return r()}async submitContactForm(f){let j=W(),$=y(j),J=await this.postWebsiteJson("/ghl/leads",qf(this.siteKey,f,$));if(!J.ok)throw Error(`contact form submit failed: ${J.status}`);return await J.json()}async startFunnel(f){M();let j=await this.postJson("/journey/start",{siteKey:this.siteKey,entryPath:f??D()});if(!j.ok)throw Error(`journey/start failed: ${j.status}`);let $=await j.json();return G()?.setItem(x,$.journeyToken),G()?.setItem(I,$.journeyId),$}getPersistedJourneyToken(){return G()?.getItem(x)??null}decorateUrl(f,j){let $=j??this.getPersistedJourneyToken(),J=new URL(f,O());if(J.searchParams.set(b,this.siteKey),$)J.searchParams.set(T,$);let X=R();if(X){for(let[Z,F]of Object.entries(X.utm??{}))if(F)J.searchParams.set(Z,F);for(let[Z,F]of Object.entries(X.clickIds??{}))if(F)J.searchParams.set(Z,F)}return J.toString()}async notifyHandoff(f,j){let $=await this.postJson("/journey/handoff",{journeyToken:f,context:j});if(!$.ok)throw Error(`journey/handoff failed: ${$.status}`)}destroy(){if(this.viewContentListenersTornDown=!0,t(),this.viewContentRescanTimer)clearTimeout(this.viewContentRescanTimer),this.viewContentRescanTimer=null;let f=H(),j=z();if(j&&this.clickHandler&&(this.autoTrack.outboundLinks||this.autoTrack.buttonClicks))j.removeEventListener("click",this.clickHandler,!0);if(j&&this.submitHandler&&(this.autoTrack.formSubmissions||this.autoTrack.search))j.removeEventListener("submit",this.submitHandler,!0);if(this.viewContentObserver?.disconnect(),this.viewContentObserver=null,this.viewContentMutationObserver?.disconnect(),this.viewContentMutationObserver=null,f&&this.popstateHandler)f.removeEventListener("popstate",this.popstateHandler);if(f&&this.pagehideHandler)f.removeEventListener("pagehide",this.pagehideHandler);if(this.flushTimer)clearTimeout(this.flushTimer),this.flushTimer=null;this.unpatchHistory?.(),this.unpatchHistory=null,this.flushWithBeacon(),this.destroyed=!0}}function Bj(f){return m.init(f)}export{r as listStandardWebEvents,Bj as createBTSAnalytics,m as BTSAnalytics};
|
|
1
|
+
var k=["page_view","view_content","search","lead","sign_up","begin_checkout","add_payment_info","purchase","outbound_click","button_click","form_submit"],U="bts_analytics_vid",I="bts_analytics_sid",B="bts_analytics_jt",O="bts_analytics_jid",K="bts_analytics_attr",R="bts_site",S="bts_jt",y=64,u=300,v="https://api.bts.it.com/v2/website/analytics",l={pageviews:!0,history:!0,outboundLinks:!0,buttonClicks:!0,formSubmissions:!0,search:!0,viewContent:!0},x=["q","query","search"],N=["utm_source","utm_medium","utm_campaign","utm_term","utm_content","fbclid","gclid","gbraid","li_fat_id","msclkid","ttclid","wbraid"],h=["_fbp","_fbc"],d=7776000;var D$=new Set(k),F$=new Set(k.map(($)=>$.toLowerCase())),Q$=new Set(["lead","sign_up","begin_checkout","add_payment_info","purchase"]),H$={$pageview:"page_view",checkout_started:"begin_checkout",lead_capture:"lead",purchase_completed:"purchase",registration_complete:"sign_up"};function p($){let q=$.trim();if(q.length===0)return{eventName:q,canonicalEventName:q,isStandard:!1};let L=q.toLowerCase(),X=H$[L];if(X)return{eventName:X,canonicalEventName:X,aliasOf:X,isStandard:!0};if(F$.has(L)){let Z=L;return{eventName:Z,canonicalEventName:Z,isStandard:!0}}return{eventName:q,canonicalEventName:q,isStandard:!1}}function s($,q){if(q)return q;if($==="page_view")return"page_view";if($==="identify")return"identify";if(Q$.has($))return"conversion";return"custom"}function r(){return[...k]}function Q(){return typeof window>"u"?null:window}function W(){return typeof document>"u"?null:document}function z(){return Q()?.localStorage??null}function G($){let q=W();if(!q?.cookie)return;let L=`${$}=`,X=q.cookie.split(";").map((j)=>j.trim()).find((j)=>j.startsWith(L));if(!X)return;let Z=X.slice(L.length);if(Z==="")return;try{return decodeURIComponent(Z)}catch{return Z}}function A($,q){let L=W();if(!L)return;let X=Q()?.location.protocol==="https:"?"; Secure":"";L.cookie=`${$}=${encodeURIComponent(q)}; Max-Age=${d}; Path=/; SameSite=Lax${X}`}function W$(){let $=new Uint32Array(1);if(typeof crypto<"u"&&typeof crypto.getRandomValues==="function")return crypto.getRandomValues($),String($[0]);return String(Math.floor(Math.random()*10000000000))}function z$($=Date.now()){return`fb.1.${$}.${W$()}`}function G$($,q=Date.now()){return`fb.1.${q}.${$}`}function o(){let $=Q();if(!$)return;if(!G("_fbp"))A("_fbp",z$());let q=new URLSearchParams($.location.search).get("fbclid");if(q&&!G("_fbc"))A("_fbc",G$(q))}function P(){let $=Q();if(!$)return;return`${$.location.pathname}${$.location.search}`}function Y(){return Q()?.location.href}function D(){return Q()?.location.origin??"https://behindthescenes.com"}function _(){return W()?.referrer||void 0}function F($){let q=$?.trim();return q?q.slice(0,512):void 0}function E($){return $!==null&&typeof $==="object"&&!Array.isArray($)}function M$($){if(!$)return null;try{let q=JSON.parse($);if(!E(q))return null;let L=E(q.utm)?Object.fromEntries(Object.entries(q.utm).filter((Z)=>typeof Z[1]==="string")):{},X=E(q.clickIds)?Object.fromEntries(Object.entries(q.clickIds).filter((Z)=>typeof Z[1]==="string")):{};return{utm:L,clickIds:X,landingUrl:typeof q.landingUrl==="string"?q.landingUrl:void 0,lastSeenAt:typeof q.lastSeenAt==="string"?q.lastSeenAt:new Date().toISOString(),referrer:typeof q.referrer==="string"?q.referrer:void 0}}catch{return null}}function n(){let $=z();return M$($?.getItem(K)??null)}function V$($){let q=z();if(!q)return;let L=JSON.stringify($);if(q.getItem(K)===L)return;q.setItem(K,L)}var g=null,C=null;function a(){g=null,C=null}function f$($){let q=new URLSearchParams($.location.search),L=N.map((Z)=>`${Z}=${q.get(Z)??""}`).join("&"),X=h.map((Z)=>`${Z}=${G(Z)??""}`).join("&");return`${$.location.href} ${L} ${X}`}function M(){let $=Q();if(!$)return n();let q=f$($);if(q===g&&C)return C;let L=new URLSearchParams($.location.search),X={utm:{},clickIds:{},landingUrl:$.location.href,lastSeenAt:new Date().toISOString(),referrer:_()};for(let J of N){let H=L.get(J);if(!H)continue;if(J.startsWith("utm_")){X.utm[J]=H;continue}X.clickIds[J]=H}for(let J of h){let H=G(J);if(H)X.clickIds[J.replace(/^_/,"")]=H}let Z=n(),j={utm:{...Z?.utm??{},...X.utm},clickIds:{...Z?.clickIds??{},...X.clickIds},landingUrl:X.landingUrl??Z?.landingUrl,lastSeenAt:X.lastSeenAt,referrer:X.referrer??Z?.referrer};return V$(j),g=q,C=j,j}function V(){return o(),M()}function i($){let q={...l};if($.autoTrack===!1)return{pageviews:!1,history:!1,outboundLinks:!1,buttonClicks:!1,formSubmissions:!1,search:!1,viewContent:!1};if($.autoTrack&&typeof $.autoTrack==="object")return{pageviews:$.autoTrack.pageviews??q.pageviews,history:$.autoTrack.pageviews===!1?!1:$.autoTrack.history??q.history,outboundLinks:$.autoTrack.outboundLinks??q.outboundLinks,buttonClicks:$.autoTrack.buttonClicks??q.buttonClicks,formSubmissions:$.autoTrack.formSubmissions??q.formSubmissions,search:$.autoTrack.search??q.search,viewContent:$.autoTrack.viewContent??q.viewContent};if($.autoPageviews===!1)return{...q,pageviews:!1,history:!1};if($.autoPageviews===!0)return{...q,pageviews:!0};return q}function k$(){let $=G("_ga");if(!$)return;let q=$.split(".");if(q.length>=4&&/^GA\d+$/i.test(q[0]??""))return q.slice(-2).join(".");return F($)}function B$(){let q=W()?.querySelector?.('script[src*="googletagmanager.com/gtag/js?id="]'),L=q&&"src"in q&&typeof q.src==="string"?q.src:void 0;if(!L)return;try{return F(new URL(L).searchParams.get("id"))}catch{return}}function t(){let $=Q(),q=k$(),L=B$(),X=typeof $?.gtag==="function"||!!L||!!q;if(!X&&!q&&!L)return;return{tagInstalled:X,clientId:q,measurementId:L}}function c($){if(!$.googleAnalytics||typeof $.googleAnalytics==="boolean")return;return F($.googleAnalytics.measurementId)}function e($){if(!$.googleAnalytics)return!1;if($.googleAnalytics===!0)return!1;return $.googleAnalytics.loadTag!==!1&&!!c($)}function $$($){let q=Q(),L=W();if(!q||!L)return;q.dataLayer=Array.isArray(q.dataLayer)?q.dataLayer:[],q.gtag??=(...Z)=>{q.dataLayer?.push(Z)};let X=`script[src*="googletagmanager.com/gtag/js?id=${$}"]`;if(!L.querySelector?.(X)){let Z=L.createElement("script");Z.async=!0,Z.src=`https://www.googletagmanager.com/gtag/js?id=${encodeURIComponent($)}`,Z.setAttribute("data-bts-ga-proxy","true"),(L.head??L.documentElement).appendChild(Z)}q.gtag("js",new Date),q.gtag("config",$,{send_page_view:!1})}function K$(){let $=Q();if(!$)return;let q=typeof Intl<"u"?F(Intl.DateTimeFormat().resolvedOptions().timeZone):void 0,L=$.navigator,X=F(L?.language),Z=Array.isArray(L?.languages)?L.languages.filter((H)=>typeof H==="string").slice(0,10):[],j=F(L?.userAgent),J={timezone:q,language:X,languages:Z.length>0?Z:void 0,userAgent:j};return Object.values(J).some((H)=>H!==void 0)?J:void 0}function w($){let q=V(),L=t();return{event_id:$,ga_client_id:typeof L?.clientId==="string"?L.clientId:void 0,ga_tag_installed:typeof L?.tagInstalled==="boolean"?L.tagInstalled:void 0,attribution:q?{utm:q.utm,clickIds:q.clickIds,...q.clickIds,landingUrl:q.landingUrl,referrer:q.referrer}:void 0,client:K$(),googleAnalytics:L,page:{title:W()?.title,url:Y()}}}function q$($){if(!$)return{};if($ instanceof Headers){let q={};return $.forEach((L,X)=>{q[X]=L}),q}if(Array.isArray($))return Object.fromEntries($.map(([q,L])=>[q,String(L)]));return Object.fromEntries(Object.entries($).map(([q,L])=>[q,String(L)]))}var L$="https://snap.licdn.com/li.lms-analytics/insight.min.js";function m($){if(typeof $==="number"&&Number.isFinite($))return String(Math.floor($));let q=typeof $==="string"?$.trim():void 0;return q&&q.length>0?q:void 0}function X$($){if($.lintrk)return $.lintrk;let q=(L,X)=>{q.q?.push([L,X])};return q.q=[],$.lintrk=q,q}function P$($){return Boolean($.querySelector(`script[src="${L$}"]`))}function T($){let q=m($),L=Q(),X=W();if(!q||!L||!X)return;if(L._linkedin_partner_id=q,L._linkedin_data_partner_ids=L._linkedin_data_partner_ids??[],!L._linkedin_data_partner_ids.includes(q))L._linkedin_data_partner_ids.push(q);if(X$(L),P$(X))return;let Z=X.createElement("script");Z.type="text/javascript",Z.async=!0,Z.src=L$;let j=X.getElementsByTagName("script")[0];if(j?.parentNode){j.parentNode.insertBefore(Z,j);return}X.head?.appendChild(Z)}function Z$($){let q=m($.conversionId),L=Q();if(!q||!L)return;let X=X$(L),Z={conversion_id:q},j=m($.eventId);if(j)Z.event_id=j;if(typeof $.value==="number"&&Number.isFinite($.value))Z.value=$.value;else if(typeof $.value==="string"&&$.value.trim().length>0){let J=Number($.value);if(Number.isFinite(J))Z.value=J}if(typeof $.currency==="string"&&$.currency.trim().length>0)Z.currency=$.currency.trim().toUpperCase();X("track",Z)}function f(){if(typeof crypto<"u"&&typeof crypto.randomUUID==="function")return crypto.randomUUID();return`v_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`}class b{siteKey;endpoint;debug;flushIntervalMs;autoTrack;requestHeaders;queue=[];flushTimer=null;destroyed=!1;lastTrackedUrl=null;unpatchHistory=null;clickHandler=null;submitHandler=null;pagehideHandler=null;popstateHandler=null;viewContentObserver=null;viewContentMutationObserver=null;viewContentRescanTimer=null;viewContentListenersTornDown=!1;observedViewContentElements=new WeakSet;trackedViewContentElements=new WeakSet;linkedInInsight=null;linkedInInsightConfigLoaded=!1;pendingLinkedInInsightEvents=[];constructor($){if(this.siteKey=$.siteKey,this.endpoint=($.endpoint??v).replace(/\/$/,""),this.debug=$.debug??!1,this.flushIntervalMs=$.flushIntervalMs??u,this.autoTrack=i($),this.requestHeaders=$.requestHeaders,e($)){let q=c($);if(q)$$(q)}if(this.linkedInInsight=this.createLinkedInInsightConfig($.linkedinInsight),this.linkedInInsight?.partnerId)T(this.linkedInInsight.partnerId);if(this.linkedInInsight?.loadFromBts)setTimeout(()=>{if(!this.destroyed)this.loadRemoteTrackingConfig()},0);else this.linkedInInsightConfigLoaded=!0;if(Q())this.installAutoTracking()}static init($){return new b($)}getVisitorId(){let $=z(),q=$?.getItem(U);if(q)return q;let L=f();return $?.setItem(U,L),L}getSessionId(){let $=z(),q=$?.getItem(I);if(q)return q;let L=f();return $?.setItem(I,L),L}getPersistedJourneyId(){return z()?.getItem(O)??null}log(...$){if(this.debug)console.log("[@bts/analytics]",...$)}createLinkedInInsightConfig($){if($===!1)return null;if($===void 0)return null;if($===!0)return{conversions:{},loadFromBts:!0};return{partnerId:typeof $.partnerId==="string"?$.partnerId:void 0,conversions:$.conversions??{},loadFromBts:$.loadFromBts!==!1}}async loadRemoteTrackingConfig(){try{let $=`${this.endpoint}/config?siteKey=${encodeURIComponent(this.siteKey)}`,q=await fetch($,{method:"GET"});if(!q.ok){this.linkedInInsightConfigLoaded=!0;return}let L=await q.json();if(L.linkedinInsight){if(this.linkedInInsight={partnerId:L.linkedinInsight.partnerId??this.linkedInInsight?.partnerId,conversions:{...this.linkedInInsight?.conversions??{},...L.linkedinInsight.conversions??{}},loadFromBts:!0},this.linkedInInsight.partnerId)T(this.linkedInInsight.partnerId)}}catch($){this.log("tracking config load failed",$)}finally{this.linkedInInsightConfigLoaded=!0,this.flushPendingLinkedInInsightEvents()}}installAutoTracking(){let $=Q(),q=W();if(!$||!q)return;if(Object.values(this.autoTrack).some(Boolean))V();if(this.autoTrack.pageviews)this.recordPageView();if(this.autoTrack.history)this.unpatchHistory=this.patchHistory($),this.popstateHandler=()=>{this.recordPageView(),this.rescanViewContentAfterNavigation()},$.addEventListener("popstate",this.popstateHandler);if(this.clickHandler=(L)=>{this.handleAutoClick(L)},this.submitHandler=(L)=>{this.handleAutoSubmit(L)},this.pagehideHandler=()=>{this.viewContentListenersTornDown=!0,this.flushWithBeacon(),this.viewContentObserver?.disconnect(),this.viewContentObserver=null,this.viewContentMutationObserver?.disconnect(),this.viewContentMutationObserver=null},this.autoTrack.outboundLinks||this.autoTrack.buttonClicks)q.addEventListener("click",this.clickHandler,!0);if(this.autoTrack.formSubmissions||this.autoTrack.search)q.addEventListener("submit",this.submitHandler,!0);if(this.autoTrack.viewContent)this.installViewContentTracking(q);$.addEventListener("pagehide",this.pagehideHandler)}getOrCreateViewContentIntersectionObserver(){if(typeof IntersectionObserver>"u"||this.viewContentListenersTornDown)return null;if(this.viewContentObserver)return this.viewContentObserver;return this.viewContentObserver=new IntersectionObserver(($,q)=>{for(let L of $){if(!L.isIntersecting||!(L.target instanceof Element))continue;this.trackViewContentElement(L.target),q.unobserve(L.target)}}),this.viewContentObserver}observeViewContentElements($){if(this.viewContentListenersTornDown||this.destroyed)return;let q=this.getOrCreateViewContentIntersectionObserver();if(!q)return;for(let L of Array.from($.querySelectorAll("[data-bts-view-content]"))){if(this.observedViewContentElements.has(L))continue;this.observedViewContentElements.add(L),q.observe(L)}}scheduleViewContentRescanFromMutations(){if(this.viewContentListenersTornDown)return;if(this.viewContentRescanTimer)return;this.viewContentRescanTimer=setTimeout(()=>{if(this.viewContentRescanTimer=null,this.viewContentListenersTornDown||this.destroyed)return;let $=W();if($)this.observeViewContentElements($)},y)}rescanViewContentAfterNavigation(){if(!this.autoTrack.viewContent)return;if(this.viewContentListenersTornDown)return;let $=W();if($)this.observeViewContentElements($)}installViewContentTracking($){if(typeof IntersectionObserver>"u")return;if(this.observeViewContentElements($),typeof MutationObserver>"u")return;let q=$.body??$.documentElement;if(!q)return;this.viewContentMutationObserver=new MutationObserver(()=>{this.scheduleViewContentRescanFromMutations()}),this.viewContentMutationObserver.observe(q,{childList:!0,subtree:!0})}trackViewContentElement($){if(this.trackedViewContentElements.has($))return;this.trackedViewContentElements.add($);let q=F($.getAttribute("data-bts-view-content")||$.getAttribute("data-bts-content-id")||$.id);this.trackStandard("view_content",{autoCaptured:!0,contentId:q,contentTitle:F($.getAttribute("data-bts-content-title")||$.textContent),contentType:F($.getAttribute("data-bts-content-type")),elementId:F($.id)})}sourceEventKeyForLinkedInInsight($){switch($){case"page_view":return"page_view";case"lead":return"lead_capture";case"sign_up":return"registration_complete";case"begin_checkout":return"checkout_started";case"add_payment_info":return"add_payment_info";case"purchase":return"purchase_completed";default:return $}}flushPendingLinkedInInsightEvents(){if(this.pendingLinkedInInsightEvents.length===0)return;let $=[...this.pendingLinkedInInsightEvents];this.pendingLinkedInInsightEvents=[];for(let q of $)this.trackLinkedInInsightForEvent(q)}trackLinkedInInsightForEvent($){if(!this.linkedInInsight)return;if(!this.linkedInInsightConfigLoaded){this.pendingLinkedInInsightEvents.push($);return}let q=this.sourceEventKeyForLinkedInInsight($.eventName),L=this.linkedInInsight.conversions[q]??this.linkedInInsight.conversions[$.eventName];if(!L)return;let X=$.properties??{};Z$({conversionId:L,eventId:typeof X.event_id==="string"?X.event_id:void 0,value:typeof X.monetaryValue==="number"||typeof X.monetaryValue==="string"?X.monetaryValue:typeof X.value==="number"||typeof X.value==="string"?X.value:void 0,currency:typeof X.currency==="string"?X.currency:void 0})}patchHistory($){let q=$.history,L=q.pushState.bind(q),X=q.replaceState.bind(q),Z=()=>{M(),this.recordPageView(),this.rescanViewContentAfterNavigation()};return q.pushState=(...j)=>{L(...j),Z()},q.replaceState=(...j)=>{X(...j),Z()},()=>{q.pushState=L,q.replaceState=X}}handleAutoClick($){if($.defaultPrevented)return;let q=$.target;if(!(q instanceof Element))return;if(this.autoTrack.outboundLinks){let X=q.closest("a[href]");if(X instanceof HTMLAnchorElement){let Z=F(X.href);if(!Z)return;let j=new URL(Z,D());if(j.origin!==D()){let J=this.decorateHostedCheckoutUrl(j);if(J)X.href=J;this.trackStandard("outbound_click",{elementHref:J??Z,elementId:F(X.id),elementText:F(X.textContent),linkHost:j.hostname});return}}}if(!this.autoTrack.buttonClicks)return;let L=q.closest("button,[role='button'],[data-bts-track-click]");if(!(L instanceof Element))return;this.trackStandard("button_click",{elementId:F(L.id),elementName:F(L.getAttribute("name")),elementRole:F(L.getAttribute("role")),elementText:F(L.textContent)})}decorateHostedCheckoutUrl($){let q=$.hostname.toLowerCase();if(q!=="behindthescenes.com"&&!q.endsWith(".behindthescenes.com"))return null;let L=$.pathname.split("/").filter(Boolean);if(L[0]!=="c"||!L[1])return null;let X=new URL($.toString());X.searchParams.set(R,this.siteKey);let Z=z()?.getItem(B);if(Z)X.searchParams.set(S,Z);let j=M();if(j){for(let[J,H]of Object.entries(j.utm??{}))if(H)X.searchParams.set(J,H);for(let[J,H]of Object.entries(j.clickIds??{}))if(H)X.searchParams.set(J,H)}return X.toString()}handleAutoSubmit($){if($.defaultPrevented||!this.autoTrack.formSubmissions&&!this.autoTrack.search)return;let q=$.target;if(!(q instanceof HTMLFormElement))return;if(this.autoTrack.search)this.trackSearchForm(q);if(!this.autoTrack.formSubmissions)return;this.trackStandard("form_submit",{formAction:F(q.action),formId:F(q.id),formMethod:F(q.method),formName:F(q.getAttribute("name"))})}trackSearchForm($){if(($.method||"get").toLowerCase()!=="get")return;let L=this.extractSearchQuery($);if(!L)return;this.trackStandard("search",{autoCaptured:!0,formAction:F($.action),formId:F($.id),formName:F($.getAttribute("name")),queryKey:L.key,searchQuery:L.value})}extractSearchQuery($){try{let L=new FormData($);for(let X of x){let Z=L.get(X);if(typeof Z==="string"){let j=F(Z);if(j)return{key:X,value:j}}}}catch{}let q=$.elements;for(let L of x){let X=q?.namedItem?.(L),Z=X&&"value"in X?X.value:void 0;if(typeof Z==="string"){let j=F(Z);if(j)return{key:L,value:j}}}return null}buildEvent($,q,L,X){let Z=X?.path??P(),j=_(),J=f(),H=w(J);return{eventName:$,eventType:q,path:Z,referrer:j,occurredAt:new Date().toISOString(),journeyId:this.getPersistedJourneyId()??void 0,visitorId:this.getVisitorId(),sessionId:this.getSessionId(),properties:{...L??{},...H,event_id:L?.event_id??L?.eventId??J}}}queueEvent($,q,L){if(this.destroyed)return;let X=p($),Z=s(X.canonicalEventName,L),j={...q??{}};if(X.aliasOf)j.originalEventName=$;let J=this.buildEvent(X.eventName,Z,j);if(this.queue.push(J),this.trackLinkedInInsightForEvent(J),this.queue.length>=50){this.flushNow();return}this.scheduleFlush()}scheduleFlush(){if(this.flushTimer)return;this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flushNow()},this.flushIntervalMs)}async postJson($,q){let L=`${this.endpoint}${$}`;this.log("POST",L,q);let X=JSON.stringify(q),Z=await this.resolveRequestHeaders($,L,q,X,this.endpoint);return fetch(L,{method:"POST",headers:Z,body:X})}async postWebsiteJson($,q){let L=this.endpoint.replace(/\/analytics$/,""),X=`${L}${$}`;this.log("POST",X,q);let Z=JSON.stringify(q),j=await this.resolveRequestHeaders($,X,q,Z,L);return fetch(X,{method:"POST",headers:j,body:Z})}async postJsonKeepalive($,q){let L=`${this.endpoint}${$}`;this.log("POST keepalive",L,q);let X=JSON.stringify(q),Z=await this.resolveRequestHeaders($,L,q,X,this.endpoint);return fetch(L,{method:"POST",headers:Z,body:X,keepalive:!0})}async resolveRequestHeaders($,q,L,X,Z=this.endpoint){let j={"Content-Type":"application/json"};if(!this.requestHeaders)return j;let J=typeof this.requestHeaders==="function"?await this.requestHeaders({body:L,bodyText:X,endpoint:Z,headers:{...j},path:$,siteKey:this.siteKey,url:q}):this.requestHeaders;return{...j,...q$(J)}}async flushBatch($,q=!1){try{let L=q?await this.postJsonKeepalive("/ingest/batch",{siteKey:this.siteKey,events:$}):await this.postJson("/ingest/batch",{siteKey:this.siteKey,events:$});if(!L.ok)return this.log("flush failed",L.status),!1;return!0}catch(L){return this.log("flush error",L),!1}}flushWithBeacon(){if(this.queue.length===0)return;if(this.requestHeaders){let H=[...this.queue];this.queue=[],this.flushBatch(H,!0).then((j$)=>{if(!j$&&!this.destroyed)this.queue.unshift(...H),this.scheduleFlush()});return}let $=Q(),q=$?.navigator?.sendBeacon?.bind($.navigator);if(!q)return;let L=[...this.queue];this.queue=[];let X=`${this.endpoint}/ingest/batch`,Z=JSON.stringify({siteKey:this.siteKey,events:L}),j=new Blob([Z],{type:"application/json"});if(!q(X,j))this.queue.unshift(...L)}async flushNow(){if(this.destroyed)return;if(this.queue.length===0)return;let $=[...this.queue];if(this.queue=[],!await this.flushBatch($)&&!this.destroyed)this.queue.unshift(...$),this.scheduleFlush()}recordPageView($){let q=$??P(),L=Y()??q??"/";if(L===this.lastTrackedUrl)return;this.lastTrackedUrl=L;let X=this.buildEvent("page_view","page_view",{autoCaptured:!0},{path:q});this.queue.push(X),this.trackLinkedInInsightForEvent(X),this.scheduleFlush()}page($){this.lastTrackedUrl=null,this.recordPageView($)}track($,q){this.queueEvent($,q)}trackStandard($,q){this.queueEvent($,q)}identify($,q){if(this.destroyed)return;this.queue.push(this.buildEvent("identify","identify",{traits:q??{},userId:$})),this.scheduleFlush()}listStandardEvents(){return r()}async submitContactForm($){let q=f(),L=w(q),X=await this.postWebsiteJson("/ghl/leads",{siteKey:this.siteKey,locationId:$.locationId,email:$.email,phone:$.phone,subject:$.subject,body:$.body,message:$.message,name:$.name,firstName:$.firstName,lastName:$.lastName,source:$.source,tags:$.tags,customFields:$.customFields,pipelineId:$.pipelineId,pipelineStageId:$.pipelineStageId,opportunityName:$.opportunityName,monetaryValue:$.monetaryValue,metadata:{...$.metadata??{},...L}});if(!X.ok)throw Error(`contact form submit failed: ${X.status}`);return await X.json()}async startFunnel($){V();let q=await this.postJson("/journey/start",{siteKey:this.siteKey,entryPath:$??P()});if(!q.ok)throw Error(`journey/start failed: ${q.status}`);let L=await q.json();return z()?.setItem(B,L.journeyToken),z()?.setItem(O,L.journeyId),L}getPersistedJourneyToken(){return z()?.getItem(B)??null}decorateUrl($,q){let L=q??this.getPersistedJourneyToken(),X=new URL($,D());if(X.searchParams.set(R,this.siteKey),L)X.searchParams.set(S,L);let Z=M();if(Z){for(let[j,J]of Object.entries(Z.utm??{}))if(J)X.searchParams.set(j,J);for(let[j,J]of Object.entries(Z.clickIds??{}))if(J)X.searchParams.set(j,J)}return X.toString()}async notifyHandoff($,q){let L=await this.postJson("/journey/handoff",{journeyToken:$,context:q});if(!L.ok)throw Error(`journey/handoff failed: ${L.status}`)}destroy(){if(this.viewContentListenersTornDown=!0,a(),this.viewContentRescanTimer)clearTimeout(this.viewContentRescanTimer),this.viewContentRescanTimer=null;let $=Q(),q=W();if(q&&this.clickHandler&&(this.autoTrack.outboundLinks||this.autoTrack.buttonClicks))q.removeEventListener("click",this.clickHandler,!0);if(q&&this.submitHandler&&(this.autoTrack.formSubmissions||this.autoTrack.search))q.removeEventListener("submit",this.submitHandler,!0);if(this.viewContentObserver?.disconnect(),this.viewContentObserver=null,this.viewContentMutationObserver?.disconnect(),this.viewContentMutationObserver=null,$&&this.popstateHandler)$.removeEventListener("popstate",this.popstateHandler);if($&&this.pagehideHandler)$.removeEventListener("pagehide",this.pagehideHandler);if(this.flushTimer)clearTimeout(this.flushTimer),this.flushTimer=null;this.unpatchHistory?.(),this.unpatchHistory=null,this.flushWithBeacon(),this.destroyed=!0}}function H0($){return b.init($)}export{r as listStandardWebEvents,H0 as createBTSAnalytics,b as BTSAnalytics};
|
package/dist/manifest.json
CHANGED
package/dist/types/index.d.ts
CHANGED
|
@@ -23,12 +23,17 @@ export declare class BTSAnalytics {
|
|
|
23
23
|
private viewContentListenersTornDown;
|
|
24
24
|
private observedViewContentElements;
|
|
25
25
|
private trackedViewContentElements;
|
|
26
|
+
private linkedInInsight;
|
|
27
|
+
private linkedInInsightConfigLoaded;
|
|
28
|
+
private pendingLinkedInInsightEvents;
|
|
26
29
|
constructor(init: BTSSDKTypes.BTSAnalyticsInit);
|
|
27
30
|
static init(opts: BTSSDKTypes.BTSAnalyticsInit): BTSAnalytics;
|
|
28
31
|
getVisitorId(): string;
|
|
29
32
|
getSessionId(): string;
|
|
30
33
|
private getPersistedJourneyId;
|
|
31
34
|
private log;
|
|
35
|
+
private createLinkedInInsightConfig;
|
|
36
|
+
private loadRemoteTrackingConfig;
|
|
32
37
|
private installAutoTracking;
|
|
33
38
|
private getOrCreateViewContentIntersectionObserver;
|
|
34
39
|
/** Re-query `[data-bts-view-content]` and register any new elements with the intersection observer. */
|
|
@@ -37,8 +42,16 @@ export declare class BTSAnalytics {
|
|
|
37
42
|
private rescanViewContentAfterNavigation;
|
|
38
43
|
private installViewContentTracking;
|
|
39
44
|
private trackViewContentElement;
|
|
45
|
+
private sourceEventKeyForLinkedInInsight;
|
|
46
|
+
private flushPendingLinkedInInsightEvents;
|
|
47
|
+
private trackLinkedInInsightForEvent;
|
|
40
48
|
private patchHistory;
|
|
41
49
|
private handleAutoClick;
|
|
50
|
+
/**
|
|
51
|
+
* Plain external-site anchors to hosted BTS checkout bypass `decorateUrl()` / the cart SDK.
|
|
52
|
+
* Decorate them synchronously on click so ad click IDs survive the cross-domain handoff.
|
|
53
|
+
*/
|
|
54
|
+
private decorateHostedCheckoutUrl;
|
|
42
55
|
private handleAutoSubmit;
|
|
43
56
|
private trackSearchForm;
|
|
44
57
|
private extractSearchQuery;
|
|
@@ -34,6 +34,14 @@ export type BTSAnalyticsRequestContext = {
|
|
|
34
34
|
};
|
|
35
35
|
/** Static headers or a callback used to sign/augment SDK network requests. */
|
|
36
36
|
export type BTSAnalyticsRequestHeaders = HeadersInit | ((request: BTSAnalyticsRequestContext) => HeadersInit | Promise<HeadersInit>);
|
|
37
|
+
export type LinkedInInsightConfig = {
|
|
38
|
+
/** LinkedIn Insight Tag partner ID. If omitted, the SDK tries to load the saved BTS Settings config. */
|
|
39
|
+
partnerId?: string;
|
|
40
|
+
/** LinkedIn Campaign Manager conversion IDs keyed by BTS event key. */
|
|
41
|
+
conversions?: Partial<Record<string, string | number>>;
|
|
42
|
+
/** Defaults to true so Settings changes apply without changing the installed snippet. */
|
|
43
|
+
loadFromBts?: boolean;
|
|
44
|
+
};
|
|
37
45
|
/** Options accepted by `createBTSAnalytics` and the `BTSAnalytics` constructor. */
|
|
38
46
|
export type BTSAnalyticsInit = {
|
|
39
47
|
/** Public site key from the BTS website integration settings. */
|
|
@@ -58,6 +66,8 @@ export type BTSAnalyticsInit = {
|
|
|
58
66
|
/** GA4 measurement ID, e.g. `G-XXXXXXXXXX`. */
|
|
59
67
|
measurementId?: string;
|
|
60
68
|
};
|
|
69
|
+
/** LinkedIn Insight Tag fallback for browser-side conversion tracking. */
|
|
70
|
+
linkedinInsight?: boolean | LinkedInInsightConfig;
|
|
61
71
|
/** Optional static headers or async resolver for signing SDK requests. */
|
|
62
72
|
requestHeaders?: BTSAnalyticsRequestHeaders;
|
|
63
73
|
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function installLinkedInInsight(partnerIdInput: string | undefined): void;
|
|
2
|
+
export declare function trackLinkedInInsightConversion(input: {
|
|
3
|
+
conversionId: string | number | undefined;
|
|
4
|
+
eventId: string | undefined;
|
|
5
|
+
value?: string | number | null;
|
|
6
|
+
currency?: string | null;
|
|
7
|
+
}): void;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@behindthescenes/analytics",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.16",
|
|
4
4
|
"description": "Browser analytics SDK for BTS external-site event tracking and attribution.",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"type": "module",
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
"repository": {
|
|
11
11
|
"type": "git",
|
|
12
12
|
"url": "git+https://github.com/gwop-company/bts-backend.git",
|
|
13
|
-
"directory": "
|
|
13
|
+
"directory": "sdks/analytics"
|
|
14
14
|
},
|
|
15
|
-
"homepage": "https://github.com/gwop-company/bts-backend/tree/main/
|
|
15
|
+
"homepage": "https://github.com/gwop-company/bts-backend/tree/main/sdks/analytics#readme",
|
|
16
16
|
"bugs": {
|
|
17
17
|
"url": "https://github.com/gwop-company/bts-backend/issues"
|
|
18
18
|
},
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
declare function safeJsonStringify(value: unknown): string;
|
|
2
|
-
declare function nonEmptyString(value: string | undefined): string | undefined;
|
|
3
|
-
declare function sanitizeJsonValue(value: unknown, depth?: number): unknown;
|
|
4
|
-
declare function sanitizeJsonRecord(value: Record<string, unknown> | undefined): Record<string, unknown> | undefined;
|
|
5
|
-
declare function appendIfDefined(target: Record<string, unknown>, key: string, value: unknown): void;
|
|
6
|
-
export { appendIfDefined, nonEmptyString, safeJsonStringify, sanitizeJsonRecord, sanitizeJsonValue, };
|