@webority/analytics 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- var WeborityAnalytics=(()=>{var O=Object.defineProperty;var lt=Object.getOwnPropertyDescriptor;var ft=Object.getOwnPropertyNames;var mt=Object.prototype.hasOwnProperty;var pt=(t,e)=>{for(var n in e)O(t,n,{get:e[n],enumerable:!0})},gt=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of ft(e))!mt.call(t,r)&&r!==n&&O(t,r,{get:()=>e[r],enumerable:!(o=lt(e,r))||o.enumerable});return t};var _t=t=>gt(O({},"__esModule",{value:!0}),t);var Yt={};pt(Yt,{CONSENT_CHANGE_EVENT:()=>N,CONSENT_COOKIE_NAME:()=>_,captureAttribution:()=>et,channels:()=>s,events:()=>i,getAttribution:()=>w,getConsent:()=>u,initConsent:()=>Y,loadTags:()=>st,onConsentChange:()=>m,requiresOptIn:()=>$,resolveAiSource:()=>S,resolveChannel:()=>p,saveConsent:()=>V,trackSiteEvent:()=>rt});var Et=["google","googleads","adwords","youtube"],Ct=["meta","facebook","fb","instagram","ig","messenger"],St=["linkedin","lnkd"],yt=["bing","microsoft","microsoftads","msn"],F=Object.freeze([["chatgpt",["chatgpt.com","chat.openai.com"]],["perplexity",["perplexity.ai"]],["gemini",["gemini.google.com"]],["copilot",["copilot.microsoft.com"]],["claude",["claude.ai"]],["you",["you.com"]],["phind",["phind.com"]],["deepseek",["deepseek.com"]],["grok",["grok.com"]],["meta_ai",["meta.ai"]],["poe",["poe.com"]]]),Tt=["bing.com","duckduckgo.com","search.yahoo.com","ecosia.org","search.brave.com"],It=["google","yandex"],wt=["facebook.com","fb.com","instagram.com","linkedin.com","lnkd.in","twitter.com","t.co","x.com","reddit.com","pinterest.com","youtube.com","youtu.be","tiktok.com","whatsapp.com","threads.net","t.me","telegram.org"],s=Object.freeze({DIRECT:"direct",GOOGLE:"google",META:"meta",LINKEDIN:"linkedin",MICROSOFT:"microsoft",OTHER:"other",AI_ASSISTANT:"ai_assistant",ORGANIC_SEARCH:"organic_search",ORGANIC_SOCIAL:"organic_social",REFERRAL:"referral"});function p(t){if(!t)return s.DIRECT;let e=c(t.utmSource);if(e){let r=C(e);if(Et.includes(r))return s.GOOGLE;if(Ct.includes(r))return s.META;if(St.includes(r))return s.LINKEDIN;if(yt.includes(r))return s.MICROSOFT}if(c(t.fbclid))return s.META;if(c(t.gclid)||c(t.gbraid)||c(t.wbraid))return s.GOOGLE;if(c(t.liFatId))return s.LINKEDIN;if(c(t.msclkid))return s.MICROSOFT;if(z(e))return s.AI_ASSISTANT;if(e||c(t.utmMedium)||c(t.utmCampaign)||c(t.utmContent)||c(t.utmTerm))return s.OTHER;let o=K(t.referrer);return o?B(o)?s.AI_ASSISTANT:Ot(o)?s.ORGANIC_SEARCH:wt.some(r=>H(o,r))?s.ORGANIC_SOCIAL:s.REFERRAL:s.DIRECT}function S(t){if(!t)return"";let e=z(c(t.utmSource));if(e)return e;let n=K(t.referrer);return n?B(n):""}function z(t){if(!t)return"";let e=C(t);for(let[n,o]of F)if(C(n)===e||o.some(r=>C(r)===e))return n;return""}function B(t){for(let[e,n]of F)if(n.some(o=>H(t,o)))return e;return""}function Ot(t){return Tt.includes(t)?!0:It.some(e=>{if(!t.startsWith(`${e}.`))return!1;let n=t.slice(e.length+1).split(".");return n.length===1||n.length===2&&(n[0]==="co"||n[0]==="com")})}function H(t,e){return t===e||t.endsWith(`.${e}`)}function K(t){let e=c(t);if(!e)return"";try{let n=new URL(/^[a-z][a-z0-9+.-]*:\/\//i.test(e)?e:`https://${e}`).hostname.toLowerCase();return n.startsWith("www.")?n.slice(4):n}catch{return""}}function C(t){return String(t).toLowerCase().replace(/[^\p{L}\p{N}]/gu,"")}function c(t){return String(t??"").trim()}var A=Object.freeze(["AT","BE","BG","HR","CY","CZ","DK","EE","FI","FR","DE","GR","HU","IE","IT","LV","LT","LU","MT","NL","PL","PT","RO","SK","SI","ES","SE","IS","LI","NO","GB","CH"]);function $(t){let e=typeof t=="string"?t.trim().toUpperCase():"";return e.length!==2||e==="XX"||e==="T1"?!0:A.includes(e)}var _="webority_cookie_consent",N="webority-consent-change",j=365,a={initialized:!1,requiresOptIn:!0,strictOptIn:!1,adStorage:!0,cookieDays:j,cookieDomain:null,saved:null},D=new Set;function Y(t){let e=t?.strictOptIn??!1;if(typeof e!="boolean")throw new Error("@webority/analytics: initConsent strictOptIn must be true or false, or left out.");if(e){if(t.requiresOptIn!==void 0&&t.requiresOptIn!==!0)throw new Error("@webority/analytics: initConsent strictOptIn asks every visitor to opt in, so requiresOptIn must be true or left out.")}else if(typeof t?.requiresOptIn!="boolean")throw new Error("@webority/analytics: initConsent needs requiresOptIn (true or false), decided from the visitor's country.");if(t.cookieDomain!==void 0&&(typeof t.cookieDomain!="string"||!t.cookieDomain.trim()))throw new Error('@webority/analytics: initConsent cookieDomain must be a domain such as ".example.com", or left out.');if(t.cookieDays!==void 0&&!(Number.isInteger(t.cookieDays)&&t.cookieDays>0))throw new Error("@webority/analytics: initConsent cookieDays must be a whole number of days above zero, or left out.");if(t.adStorage!==void 0&&typeof t.adStorage!="boolean")throw new Error("@webority/analytics: initConsent adStorage must be true or false, or left out.");a.initialized=!0,a.strictOptIn=e,a.requiresOptIn=e||t.requiresOptIn,a.adStorage=t.adStorage??!e,a.cookieDays=t.cookieDays??j,a.cookieDomain=t.cookieDomain?.trim()??null;let{saved:n,entryCount:o}=ht();a.saved=n,a.cookieDomain&&o>1&&n&&Q(n),Dt(),Nt(),a.saved&&X(a.saved)}function y(){return a.initialized}function W(){return a.strictOptIn}function h(){return a.adStorage}function u(){J("getConsent");let t=a.saved;if(t)return{essential:!0,analytics:t.analytics,functional:t.functional,marketing:t.marketing,decided:!0};let e=!a.requiresOptIn;return{essential:!0,analytics:e,functional:e,marketing:e,decided:!1}}function V(t){J("saveConsent");let e={essential:!0,analytics:t?.analytics===!0,functional:t?.functional===!0,marketing:t?.marketing===!0,timestamp:new Date().toISOString()};Q(e),a.saved=e,X(e),At(u())}function m(t){return D.add(t),()=>D.delete(t)}function At(t){for(let e of D)try{e(t)}catch(n){queueMicrotask(()=>{throw n})}typeof window?.dispatchEvent=="function"&&typeof CustomEvent=="function"&&window.dispatchEvent(new CustomEvent(N,{detail:t}))}function J(t){if(!a.initialized)throw new Error(`@webority/analytics: call initConsent before ${t}.`)}function g(){window.dataLayer=window.dataLayer||[],window.dataLayer.push(arguments)}function Dt(){if(a.strictOptIn){g("consent","default",{ad_storage:"denied",ad_user_data:"denied",ad_personalization:"denied",analytics_storage:"denied",functionality_storage:"denied",personalization_storage:"denied",security_storage:"granted",wait_for_update:500});return}g("consent","default",{ad_storage:"denied",ad_user_data:"denied",ad_personalization:"denied",analytics_storage:"denied",functionality_storage:"denied",personalization_storage:"denied",security_storage:"granted",wait_for_update:500,region:[...A]}),g("consent","default",{ad_storage:"granted",ad_user_data:"granted",ad_personalization:"granted",analytics_storage:"granted",functionality_storage:"granted",personalization_storage:"granted",security_storage:"granted"})}function Nt(){g("set","ads_data_redaction",!0),g("set","url_passthrough",!0)}function X(t){let e=o=>o?"granted":"denied",n=t.marketing&&a.adStorage;g("consent","update",{analytics_storage:e(t.analytics),functionality_storage:e(t.functional),personalization_storage:e(t.functional),ad_storage:e(n),ad_user_data:e(n),ad_personalization:e(n)})}function ht(){let t=`${_}=`,e=(document.cookie||"").split(";").map(o=>o.trim()).filter(o=>o.startsWith(t)),n=e.map(o=>Lt(o.slice(t.length))).filter(Boolean);return{saved:bt(n),entryCount:e.length}}function Lt(t){try{let e=JSON.parse(decodeURIComponent(t));return!e||typeof e!="object"?null:{essential:!0,analytics:e.analytics===!0,functional:e.functional===!0,marketing:e.marketing===!0,timestamp:e.timestamp??null}}catch{return null}}function bt(t){if(t.length===0)return null;let e=t.map(o=>typeof o.timestamp=="string"?Date.parse(o.timestamp):Number.NaN);if(e.some(Number.isNaN))return t.at(-1);let n=0;for(let o=1;o<t.length;o++)e[o]>=e[n]&&(n=o);return t[n]}function Q(t){let e=typeof t.timestamp=="string"?Date.parse(t.timestamp):Number.NaN,n=(Number.isNaN(e)?Date.now():e)+a.cookieDays*24*60*60*1e3,o=window.location?.protocol==="https:"?";Secure":"";a.cookieDomain&&q(`${_}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;max-age=0;path=/;SameSite=Lax${o}`);let r=a.cookieDomain?`;domain=${a.cookieDomain}`:"";q(`${_}=${encodeURIComponent(JSON.stringify(t))};expires=${new Date(n).toUTCString()};path=/${r};SameSite=Lax${o}`)}function q(t){document.cookie=t}var I="webority_attribution",Rt=2160*60*60*1e3,kt=200,L=500,vt=Object.freeze({utm_source:"utmSource",utm_medium:"utmMedium",utm_campaign:"utmCampaign",utm_content:"utmContent",utm_term:"utmTerm",gclid:"gclid",gbraid:"gbraid",wbraid:"wbraid",fbclid:"fbclid",msclkid:"msclkid",li_fat_id:"liFatId"}),Z=!1;function et(){ot("captureAttribution"),Pt();let t=Mt();if(!t)return;let e=v(b());nt(b(),{firstTouch:e?.firstTouch??t,lastTouch:t}),Ut(t)}function Ut(t){let e={event:"acquisition_touch",acquisition_channel:p(t)};t.aiSource&&(e.ai_source=t.aiSource),window.dataLayer=window.dataLayer||[],window.dataLayer.push(e)}function w(){return ot("getAttribution"),v(b())}function Mt(){let t=new URLSearchParams(window.location.search),e={};for(let[r,l]of Object.entries(vt)){let d=T(t.get(r),kt);d&&(e[l]=d)}let n=T(t.get("referrer"),L)||xt();if(n&&(e.referrer=n),Object.keys(e).length===0)return null;let o=S(e);return o&&(e.aiSource=o),e.landingPage=T(window.location.pathname,L),e.capturedDateTimeUtc=new Date().toISOString(),e}function xt(){let t=document.referrer;if(!t)return"";try{return new URL(t).hostname===window.location.hostname?"":T(t,L)}catch{return""}}function Pt(){Z||(Z=!0,m(t=>{let e=t.marketing?k():R(),n=t.marketing?R():k(),o=v(e);Gt(e),o&&nt(n,o)}))}function b(){return u().marketing?R():k()}function R(){try{return window.localStorage}catch{return null}}function k(){try{return window.sessionStorage}catch{return null}}function v(t){try{let e=t?.getItem(I);if(!e)return null;let n=JSON.parse(e),o=tt(n?.firstTouch),r=tt(n?.lastTouch);return!o&&!r?(t.removeItem(I),null):{firstTouch:o??r,lastTouch:r??o}}catch{return null}}function nt(t,e){try{t?.setItem(I,JSON.stringify(e))}catch{}}function Gt(t){try{t?.removeItem(I)}catch{}}function tt(t){if(!t||typeof t!="object")return null;let e=Date.parse(t.capturedDateTimeUtc);return Number.isFinite(e)&&Date.now()-e<=Rt?t:null}function T(t,e){let n=String(t??"").trim();return n?n.slice(0,e):""}function ot(t){if(!y())throw new Error(`@webority/analytics: call initConsent before ${t}.`)}var i=Object.freeze({SIGNUP_STARTED:"signup_started",SIGNUP_COMPLETED:"signup_completed",LOGIN_SUCCEEDED:"login_succeeded",ONBOARDING_STARTED:"onboarding_started",ONBOARDING_STEP_COMPLETED:"onboarding_step_completed",ONBOARDING_COMPLETED:"onboarding_completed",SUBSCRIPTION_ACTIVATED:"subscription_activated",SUBSCRIPTION_CANCELLED:"subscription_cancelled",PAYMENT_SUCCEEDED:"payment_succeeded",PAYMENT_FAILED:"payment_failed",FEEDBACK_SUBMITTED:"feedback_submitted",LEAD_SUBMITTED:"lead_submitted",LEAD_QUALIFIED:"lead_qualified",WHATSAPP_CLICK:"whatsapp_click",CALCULATOR_USE:"calculator_use",PHONE_CLICK:"phone_click",DEMO_BOOKED:"demo_booked",CONTACT_SUBMITTED:"contact_submitted",TRIAL_START_CLICK:"trial_start_click",SAMPLE_REPORT_DOWNLOAD:"sample_report_download"}),ne=Object.freeze({signupStarted:i.SIGNUP_STARTED,signupCompleted:i.SIGNUP_COMPLETED,loginSucceeded:i.LOGIN_SUCCEEDED,onboardingStarted:i.ONBOARDING_STARTED,onboardingStepCompleted:i.ONBOARDING_STEP_COMPLETED,onboardingCompleted:i.ONBOARDING_COMPLETED,subscriptionActivated:i.SUBSCRIPTION_ACTIVATED,subscriptionCancelled:i.SUBSCRIPTION_CANCELLED,paymentSucceeded:i.PAYMENT_SUCCEEDED,paymentFailed:i.PAYMENT_FAILED,feedbackSubmitted:i.FEEDBACK_SUBMITTED,leadSubmitted:i.LEAD_SUBMITTED,leadQualified:i.LEAD_QUALIFIED,whatsappClick:i.WHATSAPP_CLICK,calculatorUse:i.CALCULATOR_USE,phoneClick:i.PHONE_CLICK,demoBooked:i.DEMO_BOOKED,contactSubmitted:i.CONTACT_SUBMITTED,trialStartClick:i.TRIAL_START_CLICK,sampleReportDownload:i.SAMPLE_REPORT_DOWNLOAD});var Ft=new Set(Object.values(i));function rt(t,e={}){if(!Ft.has(t)||!u().analytics)return!1;let n=w(),o={...e,event:t};for(let[r,l]of[["first",n?.firstTouch],["last",n?.lastTouch]])l&&(o[`${r}_touch_channel`]=p(l),l.aiSource&&(o[`${r}_touch_ai_source`]=l.aiSource));return window.dataLayer=window.dataLayer||[],window.dataLayer.push(o),!0}var zt=["scroll","mousemove","touchstart","keydown","pointerdown"],Bt="https://www.googletagmanager.com/gtm.js",it=1500,Ht=3e3,Kt=100,f={loaded:!1,clarityId:null,clarityLoaded:!1};function st(t={}){if(!y())throw new Error("@webority/analytics: call initConsent before loadTags.");if(f.loaded)return;f.loaded=!0;let{gtmId:e,gtmUrl:n=Bt,clarityId:o,ahrefsKey:r}=t;if(typeof n!="string"||n.trim()==="")throw new Error("@webority/analytics: gtmUrl must be a non-empty string.");let l=W();if(r){let d=()=>M("https://analytics.ahrefs.com/analytics.js",{"data-key":r});l?at(E=>E.analytics,d):d()}if(e){let d=h(),E=G=>G.analytics||G.marketing&&d,ut=()=>{window.dataLayer=window.dataLayer||[],window.dataLayer.push({"gtm.start":Date.now(),event:"gtm.js"}),M(`${n}${n.includes("?")?"&":"?"}id=${encodeURIComponent(e)}`)},x=u(),dt=x.decided&&E(x)?$t:qt,P=()=>dt(ut);l?at(E,P):P()}o&&(f.clarityId=o,u().analytics&&jt(),m(d=>{d.analytics&&!f.clarityLoaded?U():f.clarityLoaded&&ct(d)}))}function at(t,e){if(t(u())){e();return}let n=m(o=>{t(o)&&(n(),e())})}function $t(t){document.readyState==="loading"?document.addEventListener("DOMContentLoaded",t,{once:!0}):t()}function qt(t){let e=!1,n=()=>{e||(e=!0,t())};for(let o of zt)window.addEventListener(o,n,{once:!0,passive:!0});document.readyState==="complete"?setTimeout(n,it):window.addEventListener("load",()=>setTimeout(n,it),{once:!0})}function jt(){let t=()=>{window.scrollY>Kt&&(window.removeEventListener("scroll",t),U())};window.addEventListener("scroll",t,{passive:!0}),setTimeout(U,Ht)}function U(){f.clarityLoaded||!f.clarityId||(f.clarityLoaded=!0,window.clarity=window.clarity||function(){window.clarity.q=window.clarity.q||[],window.clarity.q.push(arguments)},ct(u()),M(`https://www.clarity.ms/tag/${encodeURIComponent(f.clarityId)}`,{crossorigin:"anonymous"}))}function ct(t){window.clarity("consentv2",{ad_Storage:t.marketing&&h()?"granted":"denied",analytics_Storage:t.analytics?"granted":"denied"})}function M(t,e={}){let n=document.createElement("script");n.async=!0,n.src=t;for(let[o,r]of Object.entries(e))n.setAttribute(o,r);document.head.appendChild(n)}return _t(Yt);})();
1
+ var WeborityAnalytics=(()=>{var O=Object.defineProperty;var lt=Object.getOwnPropertyDescriptor;var ft=Object.getOwnPropertyNames;var mt=Object.prototype.hasOwnProperty;var pt=(t,e)=>{for(var n in e)O(t,n,{get:e[n],enumerable:!0})},gt=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of ft(e))!mt.call(t,r)&&r!==n&&O(t,r,{get:()=>e[r],enumerable:!(o=lt(e,r))||o.enumerable});return t};var _t=t=>gt(O({},"__esModule",{value:!0}),t);var Yt={};pt(Yt,{CONSENT_CHANGE_EVENT:()=>D,CONSENT_COOKIE_NAME:()=>_,captureAttribution:()=>et,channels:()=>s,events:()=>i,getAttribution:()=>w,getConsent:()=>u,initConsent:()=>Y,loadTags:()=>st,onConsentChange:()=>m,requiresOptIn:()=>$,resolveAiSource:()=>E,resolveChannel:()=>p,saveConsent:()=>V,trackSiteEvent:()=>rt});var Ct=["google","googleads","adwords","youtube"],St=["meta","facebook","fb","instagram","ig","messenger"],Et=["linkedin","lnkd"],yt=["bing","microsoft","microsoftads","msn"],F=Object.freeze([["chatgpt",["chatgpt.com","chat.openai.com"]],["perplexity",["perplexity.ai"]],["gemini",["gemini.google.com"]],["copilot",["copilot.microsoft.com"]],["claude",["claude.ai"]],["you",["you.com"]],["phind",["phind.com"]],["deepseek",["deepseek.com"]],["grok",["grok.com"]],["meta_ai",["meta.ai"]],["poe",["poe.com"]]]),Tt=["bing.com","duckduckgo.com","search.yahoo.com","ecosia.org","search.brave.com"],It=["google","yandex"],wt=["facebook.com","fb.com","instagram.com","linkedin.com","lnkd.in","twitter.com","t.co","x.com","reddit.com","pinterest.com","youtube.com","youtu.be","tiktok.com","whatsapp.com","threads.net","t.me","telegram.org"],s=Object.freeze({DIRECT:"direct",GOOGLE:"google",META:"meta",LINKEDIN:"linkedin",MICROSOFT:"microsoft",OTHER:"other",AI_ASSISTANT:"ai_assistant",ORGANIC_SEARCH:"organic_search",ORGANIC_SOCIAL:"organic_social",REFERRAL:"referral"});function p(t){if(!t)return s.DIRECT;let e=c(t.utmSource);if(e){let r=S(e);if(Ct.includes(r))return s.GOOGLE;if(St.includes(r))return s.META;if(Et.includes(r))return s.LINKEDIN;if(yt.includes(r))return s.MICROSOFT}if(c(t.fbclid))return s.META;if(c(t.gclid)||c(t.gbraid)||c(t.wbraid))return s.GOOGLE;if(c(t.liFatId))return s.LINKEDIN;if(c(t.msclkid))return s.MICROSOFT;if(z(e))return s.AI_ASSISTANT;if(e||c(t.utmMedium)||c(t.utmCampaign)||c(t.utmContent)||c(t.utmTerm))return s.OTHER;let o=K(t.referrer);return o?B(o)?s.AI_ASSISTANT:Ot(o)?s.ORGANIC_SEARCH:wt.some(r=>H(o,r))?s.ORGANIC_SOCIAL:s.REFERRAL:s.DIRECT}function E(t){if(!t)return"";let e=z(c(t.utmSource));if(e)return e;let n=K(t.referrer);return n?B(n):""}function z(t){if(!t)return"";let e=S(t);for(let[n,o]of F)if(S(n)===e||o.some(r=>S(r)===e))return n;return""}function B(t){for(let[e,n]of F)if(n.some(o=>H(t,o)))return e;return""}function Ot(t){return Tt.includes(t)?!0:It.some(e=>{if(!t.startsWith(`${e}.`))return!1;let n=t.slice(e.length+1).split(".");return n.length===1||n.length===2&&(n[0]==="co"||n[0]==="com")})}function H(t,e){return t===e||t.endsWith(`.${e}`)}function K(t){let e=c(t);if(!e)return"";try{let n=new URL(/^[a-z][a-z0-9+.-]*:\/\//i.test(e)?e:`https://${e}`).hostname.toLowerCase();return n.startsWith("www.")?n.slice(4):n}catch{return""}}function S(t){return String(t).toLowerCase().replace(/[^\p{L}\p{N}]/gu,"")}function c(t){return String(t??"").trim()}var A=Object.freeze(["AT","BE","BG","HR","CY","CZ","DK","EE","FI","FR","DE","GR","HU","IE","IT","LV","LT","LU","MT","NL","PL","PT","RO","SK","SI","ES","SE","IS","LI","NO","GB","CH"]);function $(t){let e=typeof t=="string"?t.trim().toUpperCase():"";return e.length!==2||e==="XX"||e==="T1"?!0:A.includes(e)}var _="webority_cookie_consent",D="webority-consent-change",j=365,a={initialized:!1,requiresOptIn:!0,strictOptIn:!1,adStorage:!0,cookieDays:j,cookieDomain:null,saved:null},h=new Set;function Y(t){let e=t?.strictOptIn??!1;if(typeof e!="boolean")throw new Error("@webority/analytics: initConsent strictOptIn must be true or false, or left out.");if(e){if(t.requiresOptIn!==void 0&&t.requiresOptIn!==!0)throw new Error("@webority/analytics: initConsent strictOptIn asks every visitor to opt in, so requiresOptIn must be true or left out.")}else if(typeof t?.requiresOptIn!="boolean")throw new Error("@webority/analytics: initConsent needs requiresOptIn (true or false), decided from the visitor's country.");if(t.cookieDomain!==void 0&&(typeof t.cookieDomain!="string"||!t.cookieDomain.trim()))throw new Error('@webority/analytics: initConsent cookieDomain must be a domain such as ".example.com", or left out.');if(t.cookieDays!==void 0&&!(Number.isInteger(t.cookieDays)&&t.cookieDays>0))throw new Error("@webority/analytics: initConsent cookieDays must be a whole number of days above zero, or left out.");if(t.adStorage!==void 0&&typeof t.adStorage!="boolean")throw new Error("@webority/analytics: initConsent adStorage must be true or false, or left out.");a.initialized=!0,a.strictOptIn=e,a.requiresOptIn=e||t.requiresOptIn,a.adStorage=t.adStorage??!e,a.cookieDays=t.cookieDays??j,a.cookieDomain=t.cookieDomain?.trim()??null;let{saved:n,entryCount:o}=Nt();a.saved=n,a.cookieDomain&&o>1&&n&&Q(n),ht(),Dt(),a.saved&&X(a.saved)}function y(){return a.initialized}function W(){return a.strictOptIn}function N(){return a.adStorage}function u(){J("getConsent");let t=a.saved;if(t)return{essential:!0,analytics:t.analytics,functional:t.functional,marketing:t.marketing,decided:!0};let e=!a.requiresOptIn;return{essential:!0,analytics:e,functional:e,marketing:e,decided:!1}}function V(t){J("saveConsent");let e={essential:!0,analytics:t?.analytics===!0,functional:t?.functional===!0,marketing:t?.marketing===!0,timestamp:new Date().toISOString()};Q(e),a.saved=e,X(e),At(u())}function m(t){return h.add(t),()=>h.delete(t)}function At(t){for(let e of h)try{e(t)}catch(n){queueMicrotask(()=>{throw n})}typeof window?.dispatchEvent=="function"&&typeof CustomEvent=="function"&&window.dispatchEvent(new CustomEvent(D,{detail:t}))}function J(t){if(!a.initialized)throw new Error(`@webority/analytics: call initConsent before ${t}.`)}function g(){window.dataLayer=window.dataLayer||[],window.dataLayer.push(arguments)}function ht(){if(a.strictOptIn){g("consent","default",{ad_storage:"denied",ad_user_data:"denied",ad_personalization:"denied",analytics_storage:"denied",functionality_storage:"denied",personalization_storage:"denied",security_storage:"granted",wait_for_update:500});return}g("consent","default",{ad_storage:"denied",ad_user_data:"denied",ad_personalization:"denied",analytics_storage:"denied",functionality_storage:"denied",personalization_storage:"denied",security_storage:"granted",wait_for_update:500,region:[...A]}),g("consent","default",{ad_storage:"granted",ad_user_data:"granted",ad_personalization:"granted",analytics_storage:"granted",functionality_storage:"granted",personalization_storage:"granted",security_storage:"granted"})}function Dt(){g("set","ads_data_redaction",!0),g("set","url_passthrough",!0)}function X(t){let e=o=>o?"granted":"denied",n=t.marketing&&a.adStorage;g("consent","update",{analytics_storage:e(t.analytics),functionality_storage:e(t.functional),personalization_storage:e(t.functional),ad_storage:e(n),ad_user_data:e(n),ad_personalization:e(n)})}function Nt(){let t=`${_}=`,e=(document.cookie||"").split(";").map(o=>o.trim()).filter(o=>o.startsWith(t)),n=e.map(o=>Lt(o.slice(t.length))).filter(Boolean);return{saved:bt(n),entryCount:e.length}}function Lt(t){try{let e=JSON.parse(decodeURIComponent(t));return!e||typeof e!="object"?null:{essential:!0,analytics:e.analytics===!0,functional:e.functional===!0,marketing:e.marketing===!0,timestamp:e.timestamp??null}}catch{return null}}function bt(t){if(t.length===0)return null;let e=t.map(o=>typeof o.timestamp=="string"?Date.parse(o.timestamp):Number.NaN);if(e.some(Number.isNaN))return t.at(-1);let n=0;for(let o=1;o<t.length;o++)e[o]>=e[n]&&(n=o);return t[n]}function Q(t){let e=typeof t.timestamp=="string"?Date.parse(t.timestamp):Number.NaN,n=(Number.isNaN(e)?Date.now():e)+a.cookieDays*24*60*60*1e3,o=window.location?.protocol==="https:"?";Secure":"";a.cookieDomain&&q(`${_}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;max-age=0;path=/;SameSite=Lax${o}`);let r=a.cookieDomain?`;domain=${a.cookieDomain}`:"";q(`${_}=${encodeURIComponent(JSON.stringify(t))};expires=${new Date(n).toUTCString()};path=/${r};SameSite=Lax${o}`)}function q(t){document.cookie=t}var I="webority_attribution",Rt=2160*60*60*1e3,kt=200,L=500,vt=Object.freeze({utm_source:"utmSource",utm_medium:"utmMedium",utm_campaign:"utmCampaign",utm_content:"utmContent",utm_term:"utmTerm",gclid:"gclid",gbraid:"gbraid",wbraid:"wbraid",fbclid:"fbclid",msclkid:"msclkid",li_fat_id:"liFatId"}),Z=!1;function et(){ot("captureAttribution"),Pt();let t=Mt();if(!t)return;let e=v(b());nt(b(),{firstTouch:e?.firstTouch??t,lastTouch:t}),Ut(t)}function Ut(t){let e={event:"acquisition_touch",acquisition_channel:p(t)};t.aiSource&&(e.ai_source=t.aiSource),window.dataLayer=window.dataLayer||[],window.dataLayer.push(e)}function w(){return ot("getAttribution"),v(b())}function Mt(){let t=new URLSearchParams(window.location.search),e={};for(let[r,f]of Object.entries(vt)){let l=T(t.get(r),kt);l&&(e[f]=l)}let n=T(t.get("referrer"),L)||xt();if(n&&(e.referrer=n),Object.keys(e).length===0)return null;let o=E(e);return o&&(e.aiSource=o),e.landingPage=T(window.location.pathname,L),e.capturedDateTimeUtc=new Date().toISOString(),e}function xt(){let t=document.referrer;if(!t)return"";try{return new URL(t).hostname===window.location.hostname?"":T(t,L)}catch{return""}}function Pt(){Z||(Z=!0,m(t=>{let e=t.marketing?k():R(),n=t.marketing?R():k(),o=v(e);Gt(e),o&&nt(n,o)}))}function b(){return u().marketing?R():k()}function R(){try{return window.localStorage}catch{return null}}function k(){try{return window.sessionStorage}catch{return null}}function v(t){try{let e=t?.getItem(I);if(!e)return null;let n=JSON.parse(e),o=tt(n?.firstTouch),r=tt(n?.lastTouch);return!o&&!r?(t.removeItem(I),null):{firstTouch:o??r,lastTouch:r??o}}catch{return null}}function nt(t,e){try{t?.setItem(I,JSON.stringify(e))}catch{}}function Gt(t){try{t?.removeItem(I)}catch{}}function tt(t){if(!t||typeof t!="object")return null;let e=Date.parse(t.capturedDateTimeUtc);return Number.isFinite(e)&&Date.now()-e<=Rt?t:null}function T(t,e){let n=String(t??"").trim();return n?n.slice(0,e):""}function ot(t){if(!y())throw new Error(`@webority/analytics: call initConsent before ${t}.`)}var i=Object.freeze({SIGNUP_STARTED:"signup_started",SIGNUP_COMPLETED:"signup_completed",LOGIN_SUCCEEDED:"login_succeeded",ONBOARDING_STARTED:"onboarding_started",ONBOARDING_STEP_COMPLETED:"onboarding_step_completed",ONBOARDING_COMPLETED:"onboarding_completed",SUBSCRIPTION_ACTIVATED:"subscription_activated",SUBSCRIPTION_CANCELLED:"subscription_cancelled",PAYMENT_SUCCEEDED:"payment_succeeded",PAYMENT_FAILED:"payment_failed",FEEDBACK_SUBMITTED:"feedback_submitted",LEAD_SUBMITTED:"lead_submitted",LEAD_QUALIFIED:"lead_qualified",WHATSAPP_CLICK:"whatsapp_click",CALCULATOR_USE:"calculator_use",PHONE_CLICK:"phone_click",DEMO_BOOKED:"demo_booked",CONTACT_SUBMITTED:"contact_submitted",TRIAL_START_CLICK:"trial_start_click",SAMPLE_REPORT_DOWNLOAD:"sample_report_download"}),ne=Object.freeze({signupStarted:i.SIGNUP_STARTED,signupCompleted:i.SIGNUP_COMPLETED,loginSucceeded:i.LOGIN_SUCCEEDED,onboardingStarted:i.ONBOARDING_STARTED,onboardingStepCompleted:i.ONBOARDING_STEP_COMPLETED,onboardingCompleted:i.ONBOARDING_COMPLETED,subscriptionActivated:i.SUBSCRIPTION_ACTIVATED,subscriptionCancelled:i.SUBSCRIPTION_CANCELLED,paymentSucceeded:i.PAYMENT_SUCCEEDED,paymentFailed:i.PAYMENT_FAILED,feedbackSubmitted:i.FEEDBACK_SUBMITTED,leadSubmitted:i.LEAD_SUBMITTED,leadQualified:i.LEAD_QUALIFIED,whatsappClick:i.WHATSAPP_CLICK,calculatorUse:i.CALCULATOR_USE,phoneClick:i.PHONE_CLICK,demoBooked:i.DEMO_BOOKED,contactSubmitted:i.CONTACT_SUBMITTED,trialStartClick:i.TRIAL_START_CLICK,sampleReportDownload:i.SAMPLE_REPORT_DOWNLOAD});var Ft=new Set(Object.values(i));function rt(t,e={}){if(!Ft.has(t)||!u().analytics)return!1;let n=w(),o={...e,event:t};for(let[r,f]of[["first",n?.firstTouch],["last",n?.lastTouch]])f&&(o[`${r}_touch_channel`]=p(f),f.aiSource&&(o[`${r}_touch_ai_source`]=f.aiSource));return window.dataLayer=window.dataLayer||[],window.dataLayer.push(o),!0}var zt=["scroll","mousemove","touchstart","keydown","pointerdown"],Bt="https://www.googletagmanager.com/gtm.js",it=1500,Ht=3e3,Kt=100,d={loaded:!1,clarityId:null,clarityLoaded:!1,cancelClaritySchedule:null};function st(t={}){if(!y())throw new Error("@webority/analytics: call initConsent before loadTags.");if(d.loaded)return;d.loaded=!0;let{gtmId:e,gtmUrl:n=Bt,clarityId:o,ahrefsKey:r}=t;if(typeof n!="string"||n.trim()==="")throw new Error("@webority/analytics: gtmUrl must be a non-empty string.");let f=W();if(r){let l=()=>M("https://analytics.ahrefs.com/analytics.js",{"data-key":r});f?at(C=>C.analytics,l):l()}if(e){let l=N(),C=G=>G.analytics||G.marketing&&l,ut=()=>{window.dataLayer=window.dataLayer||[],window.dataLayer.push({"gtm.start":Date.now(),event:"gtm.js"}),M(`${n}${n.includes("?")?"&":"?"}id=${encodeURIComponent(e)}`)},x=u(),dt=x.decided&&C(x)?$t:qt,P=()=>dt(ut);f?at(C,P):P()}o&&(d.clarityId=o,u().analytics&&jt(),m(l=>{l.analytics&&!d.clarityLoaded?U():d.clarityLoaded&&ct(l)}))}function at(t,e){if(t(u())){e();return}let n=m(o=>{t(o)&&(n(),e())})}function $t(t){document.readyState==="loading"?document.addEventListener("DOMContentLoaded",t,{once:!0}):t()}function qt(t){let e=!1,n=()=>{e||(e=!0,t())};for(let o of zt)window.addEventListener(o,n,{once:!0,passive:!0});document.readyState==="complete"?setTimeout(n,it):window.addEventListener("load",()=>setTimeout(n,it),{once:!0})}function jt(){let t=()=>{window.scrollY>Kt&&U()};window.addEventListener("scroll",t,{passive:!0});let e=setTimeout(U,Ht);d.cancelClaritySchedule=()=>{window.removeEventListener("scroll",t),clearTimeout(e)}}function U(){d.cancelClaritySchedule?.(),d.cancelClaritySchedule=null,!(d.clarityLoaded||!d.clarityId)&&(d.clarityLoaded=!0,window.clarity=window.clarity||function(){window.clarity.q=window.clarity.q||[],window.clarity.q.push(arguments)},ct(u()),M(`https://www.clarity.ms/tag/${encodeURIComponent(d.clarityId)}`,{crossorigin:"anonymous"}))}function ct(t){window.clarity("consentv2",{ad_Storage:t.marketing&&N()?"granted":"denied",analytics_Storage:t.analytics?"granted":"denied"})}function M(t,e={}){let n=document.createElement("script");n.async=!0,n.src=t;for(let[o,r]of Object.entries(e))n.setAttribute(o,r);document.head.appendChild(n)}return _t(Yt);})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webority/analytics",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
4
  "license": "SEE LICENSE IN LICENSE",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
@@ -9,6 +9,9 @@
9
9
  "./site": "./src/site.js",
10
10
  "./dist/webority-analytics-site.global.js": "./dist/webority-analytics-site.global.js"
11
11
  },
12
+ "sideEffects": [
13
+ "./dist/*.global.js"
14
+ ],
12
15
  "files": [
13
16
  "src",
14
17
  "dist"
package/src/analytics.js CHANGED
@@ -36,7 +36,22 @@ export function initAnalytics(config) {
36
36
  });
37
37
 
38
38
  if (isActive()) {
39
- warmUp();
39
+ warmUpWhenIdle();
40
+ }
41
+ }
42
+
43
+ // Keeps the PostHog download off the portal's start-up path. Events tracked before then start
44
+ // the load themselves, so nothing is lost.
45
+ function warmUpWhenIdle() {
46
+ const start = () => {
47
+ if (isActive()) {
48
+ warmUp();
49
+ }
50
+ };
51
+ if (typeof requestIdleCallback === "function") {
52
+ requestIdleCallback(start, { timeout: 3000 });
53
+ } else {
54
+ setTimeout(start, 0);
40
55
  }
41
56
  }
42
57
 
@@ -59,6 +59,12 @@ export function buildInitOptions(config) {
59
59
  capture_pageview: true,
60
60
  persistence: "localStorage",
61
61
  disable_session_recording: !recording.enabled,
62
+ // The package exposes none of these, so each is only extra scripts and requests per page.
63
+ disable_surveys: true,
64
+ disable_product_tours: true,
65
+ disable_conversations: true,
66
+ // Replay can be gated on a linked flag, so flags stay on whenever replay is.
67
+ advanced_disable_feature_flags: !recording.enabled,
62
68
  };
63
69
  if (recording.enabled) {
64
70
  options.session_recording = {
package/src/tags.js CHANGED
@@ -10,6 +10,7 @@ const tagState = {
10
10
  loaded: false,
11
11
  clarityId: null,
12
12
  clarityLoaded: false,
13
+ cancelClaritySchedule: null,
13
14
  };
14
15
 
15
16
  /**
@@ -131,15 +132,21 @@ function runAfterFirstInteraction(callback) {
131
132
  function scheduleClarity() {
132
133
  const onScroll = () => {
133
134
  if (window.scrollY > CLARITY_SCROLL_PX) {
134
- window.removeEventListener("scroll", onScroll);
135
135
  loadClarity();
136
136
  }
137
137
  };
138
138
  window.addEventListener("scroll", onScroll, { passive: true });
139
- setTimeout(loadClarity, CLARITY_FALLBACK_MS);
139
+ const timer = setTimeout(loadClarity, CLARITY_FALLBACK_MS);
140
+ tagState.cancelClaritySchedule = () => {
141
+ window.removeEventListener("scroll", onScroll);
142
+ clearTimeout(timer);
143
+ };
140
144
  }
141
145
 
142
146
  function loadClarity() {
147
+ // Whichever path loads Clarity first (scroll, timer or a consent grant) retires the others.
148
+ tagState.cancelClaritySchedule?.();
149
+ tagState.cancelClaritySchedule = null;
143
150
  if (tagState.clarityLoaded || !tagState.clarityId) {
144
151
  return;
145
152
  }
@@ -180,4 +187,5 @@ export function resetTagsForTests() {
180
187
  tagState.loaded = false;
181
188
  tagState.clarityId = null;
182
189
  tagState.clarityLoaded = false;
190
+ tagState.cancelClaritySchedule = null;
183
191
  }