@webority/analytics 0.8.0 → 0.10.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.
- package/dist/webority-analytics-site.global.js +1 -1
- package/package.json +2 -2
- package/src/tags.js +28 -9
- package/src/vocabulary.js +2 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
var WeborityAnalytics=(()=>{var w=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var st=Object.getOwnPropertyNames;var ct=Object.prototype.hasOwnProperty;var ut=(t,e)=>{for(var n in e)w(t,n,{get:e[n],enumerable:!0})},dt=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of st(e))!ct.call(t,r)&&r!==n&&w(t,r,{get:()=>e[r],enumerable:!(o=at(e,r))||o.enumerable});return t};var lt=t=>dt(w({},"__esModule",{value:!0}),t);var Ft={};ut(Ft,{CONSENT_CHANGE_EVENT:()=>N,CONSENT_COOKIE_NAME:()=>_,captureAttribution:()=>Q,channels:()=>s,events:()=>a,getAttribution:()=>I,getConsent:()=>d,initConsent:()=>$,loadTags:()=>rt,onConsentChange:()=>f,requiresOptIn:()=>B,resolveAiSource:()=>S,resolveChannel:()=>p,saveConsent:()=>j,trackSiteEvent:()=>et});var ft=["google","googleads","adwords","youtube"],mt=["meta","facebook","fb","instagram","ig","messenger"],pt=["linkedin","lnkd"],gt=["bing","microsoft","microsoftads","msn"],M=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"]]]),_t=["bing.com","duckduckgo.com","search.yahoo.com","ecosia.org","search.brave.com"],Ct=["google","yandex"],St=["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=u(t.utmSource);if(e){let r=C(e);if(ft.includes(r))return s.GOOGLE;if(mt.includes(r))return s.META;if(pt.includes(r))return s.LINKEDIN;if(gt.includes(r))return s.MICROSOFT}if(u(t.fbclid))return s.META;if(u(t.gclid)||u(t.gbraid)||u(t.wbraid))return s.GOOGLE;if(u(t.liFatId))return s.LINKEDIN;if(u(t.msclkid))return s.MICROSOFT;if(P(e))return s.AI_ASSISTANT;if(e||u(t.utmMedium)||u(t.utmCampaign)||u(t.utmContent)||u(t.utmTerm))return s.OTHER;let o=F(t.referrer);return o?G(o)?s.AI_ASSISTANT:Et(o)?s.ORGANIC_SEARCH:St.some(r=>z(o,r))?s.ORGANIC_SOCIAL:s.REFERRAL:s.DIRECT}function S(t){if(!t)return"";let e=P(u(t.utmSource));if(e)return e;let n=F(t.referrer);return n?G(n):""}function P(t){if(!t)return"";let e=C(t);for(let[n,o]of M)if(C(n)===e||o.some(r=>C(r)===e))return n;return""}function G(t){for(let[e,n]of M)if(n.some(o=>z(t,o)))return e;return""}function Et(t){return _t.includes(t)?!0:Ct.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 z(t,e){return t===e||t.endsWith(`.${e}`)}function F(t){let e=u(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 u(t){return String(t??"").trim()}var O=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 B(t){let e=typeof t=="string"?t.trim().toUpperCase():"";return e.length!==2||e==="XX"||e==="T1"?!0:O.includes(e)}var _="webority_cookie_consent",N="webority-consent-change",K=365,i={initialized:!1,requiresOptIn:!0,strictOptIn:!1,adStorage:!0,cookieDays:K,cookieDomain:null,saved:null},A=new Set;function $(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.");i.initialized=!0,i.strictOptIn=e,i.requiresOptIn=e||t.requiresOptIn,i.adStorage=t.adStorage??!e,i.cookieDays=t.cookieDays??K,i.cookieDomain=t.cookieDomain?.trim()??null;let{saved:n,entryCount:o}=wt();i.saved=n,i.cookieDomain&&o>1&&n&&V(n),yt(),It(),i.saved&&W(i.saved)}function E(){return i.initialized}function q(){return i.strictOptIn}function h(){return i.adStorage}function d(){Y("getConsent");let t=i.saved;if(t)return{essential:!0,analytics:t.analytics,functional:t.functional,marketing:t.marketing,decided:!0};let e=!i.requiresOptIn;return{essential:!0,analytics:e,functional:e,marketing:e,decided:!1}}function j(t){Y("saveConsent");let e={essential:!0,analytics:t?.analytics===!0,functional:t?.functional===!0,marketing:t?.marketing===!0,timestamp:new Date().toISOString()};V(e),i.saved=e,W(e),Tt(d())}function f(t){return A.add(t),()=>A.delete(t)}function Tt(t){for(let e of A)try{e(t)}catch(n){queueMicrotask(()=>{throw n})}typeof window?.dispatchEvent=="function"&&typeof CustomEvent=="function"&&window.dispatchEvent(new CustomEvent(N,{detail:t}))}function Y(t){if(!i.initialized)throw new Error(`@webority/analytics: call initConsent before ${t}.`)}function g(){window.dataLayer=window.dataLayer||[],window.dataLayer.push(arguments)}function yt(){if(i.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:[...O]}),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 It(){g("set","ads_data_redaction",!0),g("set","url_passthrough",!0)}function W(t){let e=o=>o?"granted":"denied",n=t.marketing&&i.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 wt(){let t=`${_}=`,e=(document.cookie||"").split(";").map(o=>o.trim()).filter(o=>o.startsWith(t)),n=e.map(o=>Ot(o.slice(t.length))).filter(Boolean);return{saved:At(n),entryCount:e.length}}function Ot(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 At(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 V(t){let e=typeof t.timestamp=="string"?Date.parse(t.timestamp):Number.NaN,n=(Number.isNaN(e)?Date.now():e)+i.cookieDays*24*60*60*1e3,o=window.location?.protocol==="https:"?";Secure":"";i.cookieDomain&&H(`${_}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;max-age=0;path=/;SameSite=Lax${o}`);let r=i.cookieDomain?`;domain=${i.cookieDomain}`:"";H(`${_}=${encodeURIComponent(JSON.stringify(t))};expires=${new Date(n).toUTCString()};path=/${r};SameSite=Lax${o}`)}function H(t){document.cookie=t}var y="webority_attribution",Nt=2160*60*60*1e3,ht=200,D=500,Dt=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"}),J=!1;function Q(){tt("captureAttribution"),kt();let t=bt();if(!t)return;let e=k(L());Z(L(),{firstTouch:e?.firstTouch??t,lastTouch:t}),Lt(t)}function Lt(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 I(){return tt("getAttribution"),k(L())}function bt(){let t=new URLSearchParams(window.location.search),e={};for(let[r,c]of Object.entries(Dt)){let m=T(t.get(r),ht);m&&(e[c]=m)}let n=T(t.get("referrer"),D)||Rt();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,D),e.capturedDateTimeUtc=new Date().toISOString(),e}function Rt(){let t=document.referrer;if(!t)return"";try{return new URL(t).hostname===window.location.hostname?"":T(t,D)}catch{return""}}function kt(){J||(J=!0,f(t=>{let e=t.marketing?R():b(),n=t.marketing?b():R(),o=k(e);vt(e),o&&Z(n,o)}))}function L(){return d().marketing?b():R()}function b(){try{return window.localStorage}catch{return null}}function R(){try{return window.sessionStorage}catch{return null}}function k(t){try{let e=t?.getItem(y);if(!e)return null;let n=JSON.parse(e),o=X(n?.firstTouch),r=X(n?.lastTouch);return!o&&!r?(t.removeItem(y),null):{firstTouch:o??r,lastTouch:r??o}}catch{return null}}function Z(t,e){try{t?.setItem(y,JSON.stringify(e))}catch{}}function vt(t){try{t?.removeItem(y)}catch{}}function X(t){if(!t||typeof t!="object")return null;let e=Date.parse(t.capturedDateTimeUtc);return Number.isFinite(e)&&Date.now()-e<=Nt?t:null}function T(t,e){let n=String(t??"").trim();return n?n.slice(0,e):""}function tt(t){if(!E())throw new Error(`@webority/analytics: call initConsent before ${t}.`)}var a=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",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"}),Vt=Object.freeze({signupStarted:a.SIGNUP_STARTED,signupCompleted:a.SIGNUP_COMPLETED,loginSucceeded:a.LOGIN_SUCCEEDED,onboardingStarted:a.ONBOARDING_STARTED,onboardingStepCompleted:a.ONBOARDING_STEP_COMPLETED,onboardingCompleted:a.ONBOARDING_COMPLETED,subscriptionActivated:a.SUBSCRIPTION_ACTIVATED,subscriptionCancelled:a.SUBSCRIPTION_CANCELLED,paymentSucceeded:a.PAYMENT_SUCCEEDED,paymentFailed:a.PAYMENT_FAILED,feedbackSubmitted:a.FEEDBACK_SUBMITTED,leadSubmitted:a.LEAD_SUBMITTED,whatsappClick:a.WHATSAPP_CLICK,calculatorUse:a.CALCULATOR_USE,phoneClick:a.PHONE_CLICK,demoBooked:a.DEMO_BOOKED,contactSubmitted:a.CONTACT_SUBMITTED,trialStartClick:a.TRIAL_START_CLICK,sampleReportDownload:a.SAMPLE_REPORT_DOWNLOAD});var Ut=new Set(Object.values(a));function et(t,e={}){if(!Ut.has(t)||!d().analytics)return!1;let n=I(),o={...e,event:t};for(let[r,c]of[["first",n?.firstTouch],["last",n?.lastTouch]])c&&(o[`${r}_touch_channel`]=p(c),c.aiSource&&(o[`${r}_touch_ai_source`]=c.aiSource));return window.dataLayer=window.dataLayer||[],window.dataLayer.push(o),!0}var xt=["scroll","mousemove","touchstart","keydown","pointerdown"],nt=1500,Mt=3e3,Pt=100,l={loaded:!1,clarityId:null,clarityLoaded:!1};function rt(t={}){if(!E())throw new Error("@webority/analytics: call initConsent before loadTags.");if(l.loaded)return;l.loaded=!0;let{gtmId:e,clarityId:n,ahrefsKey:o}=t,r=q();if(o){let c=()=>U("https://analytics.ahrefs.com/analytics.js",{"data-key":o});r?ot(m=>m.analytics,c):c()}if(e){let c=()=>Gt(()=>{window.dataLayer=window.dataLayer||[],window.dataLayer.push({"gtm.start":Date.now(),event:"gtm.js"}),U(`https://www.googletagmanager.com/gtm.js?id=${encodeURIComponent(e)}`)});if(r){let m=h();ot(x=>x.analytics||x.marketing&&m,c)}else c()}n&&(l.clarityId=n,d().analytics&&zt(),f(c=>{c.analytics&&!l.clarityLoaded?v():l.clarityLoaded&&it(c)}))}function ot(t,e){if(t(d())){e();return}let n=f(o=>{t(o)&&(n(),e())})}function Gt(t){let e=!1,n=()=>{e||(e=!0,t())};for(let o of xt)window.addEventListener(o,n,{once:!0,passive:!0});document.readyState==="complete"?setTimeout(n,nt):window.addEventListener("load",()=>setTimeout(n,nt),{once:!0})}function zt(){let t=()=>{window.scrollY>Pt&&(window.removeEventListener("scroll",t),v())};window.addEventListener("scroll",t,{passive:!0}),setTimeout(v,Mt)}function v(){l.clarityLoaded||!l.clarityId||(l.clarityLoaded=!0,window.clarity=window.clarity||function(){window.clarity.q=window.clarity.q||[],window.clarity.q.push(arguments)},it(d()),U(`https://www.clarity.ms/tag/${encodeURIComponent(l.clarityId)}`,{crossorigin:"anonymous"}))}function it(t){window.clarity("consentv2",{ad_Storage:t.marketing&&h()?"granted":"denied",analytics_Storage:t.analytics?"granted":"denied"})}function U(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 lt(Ft);})();
|
|
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);})();
|
package/package.json
CHANGED
package/src/tags.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { getConsent, isAdStorageEnabled, isConsentInitialized, isStrictOptIn, onConsentChange } from "./consent.js";
|
|
2
2
|
|
|
3
3
|
const INTERACTION_EVENTS = ["scroll", "mousemove", "touchstart", "keydown", "pointerdown"];
|
|
4
|
+
const GOOGLE_GTM_URL = "https://www.googletagmanager.com/gtm.js";
|
|
4
5
|
const DEFER_AFTER_LOAD_MS = 1500;
|
|
5
6
|
const CLARITY_FALLBACK_MS = 3000;
|
|
6
7
|
const CLARITY_SCROLL_PX = 100;
|
|
@@ -20,6 +21,10 @@ const tagState = {
|
|
|
20
21
|
* loads straight away. GA4 is deliberately absent: it runs inside the Tag Manager container,
|
|
21
22
|
* and loading it here as well counts every page view twice.
|
|
22
23
|
*
|
|
24
|
+
* gtmUrl replaces Google's loader address with the site's own (a proxy path or domain serving
|
|
25
|
+
* gtm.js); the container id is appended as the id query parameter. A visitor whose saved choice
|
|
26
|
+
* already grants Tag Manager gets it at DOM-ready, without the interaction wait.
|
|
27
|
+
*
|
|
23
28
|
* Under initConsent's strictOptIn nothing loads before consent: Ahrefs waits for analytics, and
|
|
24
29
|
* Tag Manager for analytics, or for marketing when adStorage lets marketing grant ad signals,
|
|
25
30
|
* whether granted on this page or saved on an earlier one. Marketing alone without adStorage
|
|
@@ -34,7 +39,10 @@ export function loadTags(options = {}) {
|
|
|
34
39
|
}
|
|
35
40
|
tagState.loaded = true;
|
|
36
41
|
|
|
37
|
-
const { gtmId, clarityId, ahrefsKey } = options;
|
|
42
|
+
const { gtmId, gtmUrl = GOOGLE_GTM_URL, clarityId, ahrefsKey } = options;
|
|
43
|
+
if (typeof gtmUrl !== "string" || gtmUrl.trim() === "") {
|
|
44
|
+
throw new Error("@webority/analytics: gtmUrl must be a non-empty string.");
|
|
45
|
+
}
|
|
38
46
|
const strict = isStrictOptIn();
|
|
39
47
|
|
|
40
48
|
if (ahrefsKey) {
|
|
@@ -47,15 +55,18 @@ export function loadTags(options = {}) {
|
|
|
47
55
|
}
|
|
48
56
|
|
|
49
57
|
if (gtmId) {
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
});
|
|
58
|
+
const ads = isAdStorageEnabled();
|
|
59
|
+
const tagManagerGranted = (consent) => consent.analytics || (consent.marketing && ads);
|
|
60
|
+
const injectTagManager = () => {
|
|
61
|
+
window.dataLayer = window.dataLayer || [];
|
|
62
|
+
window.dataLayer.push({ "gtm.start": Date.now(), event: "gtm.js" });
|
|
63
|
+
appendScript(`${gtmUrl}${gtmUrl.includes("?") ? "&" : "?"}id=${encodeURIComponent(gtmId)}`);
|
|
64
|
+
};
|
|
65
|
+
const saved = getConsent();
|
|
66
|
+
const schedule = saved.decided && tagManagerGranted(saved) ? runAtDomReady : runAfterFirstInteraction;
|
|
67
|
+
const loadTagManager = () => schedule(injectTagManager);
|
|
56
68
|
if (strict) {
|
|
57
|
-
|
|
58
|
-
whenConsented((consent) => consent.analytics || (consent.marketing && ads), loadTagManager);
|
|
69
|
+
whenConsented(tagManagerGranted, loadTagManager);
|
|
59
70
|
} else {
|
|
60
71
|
loadTagManager();
|
|
61
72
|
}
|
|
@@ -89,6 +100,14 @@ function whenConsented(granted, callback) {
|
|
|
89
100
|
});
|
|
90
101
|
}
|
|
91
102
|
|
|
103
|
+
function runAtDomReady(callback) {
|
|
104
|
+
if (document.readyState === "loading") {
|
|
105
|
+
document.addEventListener("DOMContentLoaded", callback, { once: true });
|
|
106
|
+
} else {
|
|
107
|
+
callback();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
92
111
|
function runAfterFirstInteraction(callback) {
|
|
93
112
|
let ran = false;
|
|
94
113
|
const run = () => {
|
package/src/vocabulary.js
CHANGED
|
@@ -11,6 +11,7 @@ export const events = Object.freeze({
|
|
|
11
11
|
PAYMENT_FAILED: "payment_failed",
|
|
12
12
|
FEEDBACK_SUBMITTED: "feedback_submitted",
|
|
13
13
|
LEAD_SUBMITTED: "lead_submitted",
|
|
14
|
+
LEAD_QUALIFIED: "lead_qualified",
|
|
14
15
|
WHATSAPP_CLICK: "whatsapp_click",
|
|
15
16
|
CALCULATOR_USE: "calculator_use",
|
|
16
17
|
PHONE_CLICK: "phone_click",
|
|
@@ -33,6 +34,7 @@ export const trackHelperNames = Object.freeze({
|
|
|
33
34
|
paymentFailed: events.PAYMENT_FAILED,
|
|
34
35
|
feedbackSubmitted: events.FEEDBACK_SUBMITTED,
|
|
35
36
|
leadSubmitted: events.LEAD_SUBMITTED,
|
|
37
|
+
leadQualified: events.LEAD_QUALIFIED,
|
|
36
38
|
whatsappClick: events.WHATSAPP_CLICK,
|
|
37
39
|
calculatorUse: events.CALCULATOR_USE,
|
|
38
40
|
phoneClick: events.PHONE_CLICK,
|