@webority/analytics 0.7.0 → 0.9.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 T=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var st=Object.getOwnPropertyNames;var ct=Object.prototype.hasOwnProperty;var ut=(t,e)=>{for(var n in e)T(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&&T(t,r,{get:()=>e[r],enumerable:!(o=at(e,r))||o.enumerable});return t};var lt=t=>dt(T({},"__esModule",{value:!0}),t);var Ft={};ut(Ft,{CONSENT_CHANGE_EVENT:()=>h,CONSENT_COOKIE_NAME:()=>_,captureAttribution:()=>Q,channels:()=>s,events:()=>a,getAttribution:()=>I,getConsent:()=>d,initConsent:()=>q,loadTags:()=>rt,onConsentChange:()=>f,requiresOptIn:()=>H,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 H(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",h="webority-consent-change",$=365,i={initialized:!1,requiresOptIn:!0,strictOptIn:!1,adStorage:!0,cookieDays:$,cookieDomain:null,saved:null},A=new Set;function q(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??$,i.cookieDomain=t.cookieDomain?.trim()??null;let{saved:n,entryCount:o}=Tt();i.saved=n,i.cookieDomain&&o>1&&n&&W(n),wt(),It(),i.saved&&V(i.saved)}function E(){return i.initialized}function K(){return i.strictOptIn}function N(){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()};W(e),i.saved=e,V(e),yt(d())}function f(t){return A.add(t),()=>A.delete(t)}function yt(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(h,{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 wt(){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 V(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 Tt(){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 W(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&&B(`${_}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;max-age=0;path=/;SameSite=Lax${o}`);let r=i.cookieDomain?`;domain=${i.cookieDomain}`:"";B(`${_}=${encodeURIComponent(JSON.stringify(t))};expires=${new Date(n).toUTCString()};path=/${r};SameSite=Lax${o}`)}function B(t){document.cookie=t}var w="webority_attribution",ht=2160*60*60*1e3,Nt=200,b=500,bt=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"),Rt();let t=Lt();if(!t)return;let e=R(D());Z(D(),{firstTouch:e?.firstTouch??t,lastTouch:t}),Dt(t)}function Dt(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"),R(D())}function Lt(){let t=new URLSearchParams(window.location.search),e={};for(let[r,c]of Object.entries(bt)){let m=y(t.get(r),Nt);m&&(e[c]=m)}let n=y(t.get("referrer"),b)||kt();if(n&&(e.referrer=n),Object.keys(e).length===0)return null;let o=S(e);return o&&(e.aiSource=o),e.landingPage=y(window.location.pathname,b),e.capturedDateTimeUtc=new Date().toISOString(),e}function kt(){let t=document.referrer;if(!t)return"";try{return new URL(t).hostname===window.location.hostname?"":y(t,b)}catch{return""}}function Rt(){J||(J=!0,f(t=>{let e=t.marketing?k():L(),n=t.marketing?L():k(),o=R(e);vt(e),o&&Z(n,o)}))}function D(){return d().marketing?L():k()}function L(){try{return window.localStorage}catch{return null}}function k(){try{return window.sessionStorage}catch{return null}}function R(t){try{let e=t?.getItem(w);if(!e)return null;let n=JSON.parse(e),o=X(n?.firstTouch),r=X(n?.lastTouch);return!o&&!r?(t.removeItem(w),null):{firstTouch:o??r,lastTouch:r??o}}catch{return null}}function Z(t,e){try{t?.setItem(w,JSON.stringify(e))}catch{}}function vt(t){try{t?.removeItem(w)}catch{}}function X(t){if(!t||typeof t!="object")return null;let e=Date.parse(t.capturedDateTimeUtc);return Number.isFinite(e)&&Date.now()-e<=ht?t:null}function y(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"}),Wt=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});var xt=new Set(Object.values(a));function et(t,e={}){if(!xt.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 Ut=["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=K();if(o){let c=()=>x("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"}),x(`https://www.googletagmanager.com/gtm.js?id=${encodeURIComponent(e)}`)});if(r){let m=N();ot(U=>U.analytics||U.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 Ut)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()),x(`https://www.clarity.ms/tag/${encodeURIComponent(l.clarityId)}`,{crossorigin:"anonymous"}))}function it(t){window.clarity("consentv2",{ad_Storage:t.marketing&&N()?"granted":"denied",analytics_Storage:t.analytics?"granted":"denied"})}function x(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 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 zt={};ut(zt,{CONSENT_CHANGE_EVENT:()=>N,CONSENT_COOKIE_NAME:()=>_,captureAttribution:()=>Q,channels:()=>s,events:()=>i,getAttribution:()=>y,getConsent:()=>d,initConsent:()=>q,loadTags:()=>rt,onConsentChange:()=>f,requiresOptIn:()=>B,resolveAiSource:()=>E,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"],Et=["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=z(t.referrer);return o?G(o)?s.AI_ASSISTANT:St(o)?s.ORGANIC_SEARCH:Et.some(r=>F(o,r))?s.ORGANIC_SOCIAL:s.REFERRAL:s.DIRECT}function E(t){if(!t)return"";let e=P(u(t.utmSource));if(e)return e;let n=z(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=>F(t,o)))return e;return""}function St(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 F(t,e){return t===e||t.endsWith(`.${e}`)}function z(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,a={initialized:!1,requiresOptIn:!0,strictOptIn:!1,adStorage:!0,cookieDays:K,cookieDomain:null,saved:null},A=new Set;function q(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??K,a.cookieDomain=t.cookieDomain?.trim()??null;let{saved:n,entryCount:o}=wt();a.saved=n,a.cookieDomain&&o>1&&n&&V(n),It(),yt(),a.saved&&W(a.saved)}function S(){return a.initialized}function $(){return a.strictOptIn}function D(){return a.adStorage}function d(){Y("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 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),a.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(!a.initialized)throw new Error(`@webority/analytics: call initConsent before ${t}.`)}function g(){window.dataLayer=window.dataLayer||[],window.dataLayer.push(arguments)}function It(){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:[...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 yt(){g("set","ads_data_redaction",!0),g("set","url_passthrough",!0)}function W(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 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)+a.cookieDays*24*60*60*1e3,o=window.location?.protocol==="https:"?";Secure":"";a.cookieDomain&&H(`${_}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;max-age=0;path=/;SameSite=Lax${o}`);let r=a.cookieDomain?`;domain=${a.cookieDomain}`:"";H(`${_}=${encodeURIComponent(JSON.stringify(t))};expires=${new Date(n).toUTCString()};path=/${r};SameSite=Lax${o}`)}function H(t){document.cookie=t}var I="webority_attribution",Nt=2160*60*60*1e3,Dt=200,h=500,ht=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 y(){return tt("getAttribution"),k(L())}function bt(){let t=new URLSearchParams(window.location.search),e={};for(let[r,c]of Object.entries(ht)){let m=T(t.get(r),Dt);m&&(e[c]=m)}let n=T(t.get("referrer"),h)||Rt();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,h),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,h)}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(I);if(!e)return null;let n=JSON.parse(e),o=X(n?.firstTouch),r=X(n?.lastTouch);return!o&&!r?(t.removeItem(I),null):{firstTouch:o??r,lastTouch:r??o}}catch{return null}}function Z(t,e){try{t?.setItem(I,JSON.stringify(e))}catch{}}function vt(t){try{t?.removeItem(I)}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(!S())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"}),Vt=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 Ut=new Set(Object.values(i));function et(t,e={}){if(!Ut.has(t)||!d().analytics)return!1;let n=y(),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(!S())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=$();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=D();ot(x=>x.analytics||x.marketing&&m,c)}else c()}n&&(l.clarityId=n,d().analytics&&Ft(),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 Ft(){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&&D()?"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(zt);})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webority/analytics",
3
- "version": "0.7.0",
3
+ "version": "0.9.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
package/src/analytics.js CHANGED
@@ -104,6 +104,25 @@ export function identify(publicId, props = {}) {
104
104
  });
105
105
  }
106
106
 
107
+ // PostHog group analytics (a paid add-on). Same gate as identify: nothing is sent without consent.
108
+ export function group(type, key, props = {}) {
109
+ if (!isActive()) {
110
+ logInactive("group", { type, key, ...props });
111
+ return;
112
+ }
113
+
114
+ ensurePosthogInitialized()
115
+ .then((posthog) => {
116
+ if (!posthog || !hasConsent()) {
117
+ return;
118
+ }
119
+ posthog.group(type, key, props);
120
+ })
121
+ .catch(() => {
122
+ // Load failure is retried on the next call. Do not surface it as an unhandled rejection.
123
+ });
124
+ }
125
+
107
126
  export function resetIdentity() {
108
127
  if (!state.posthogInstance) {
109
128
  return;
package/src/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { identify, initAnalytics, registerEvents, resetIdentity, trackEvent } from "./analytics.js";
1
+ export { group, identify, initAnalytics, registerEvents, resetIdentity, trackEvent } from "./analytics.js";
2
2
  export {
3
3
  CONSENT_CHANGE_EVENT,
4
4
  CONSENT_COOKIE_NAME,
package/src/vocabulary.js CHANGED
@@ -11,9 +11,14 @@ 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",
18
+ DEMO_BOOKED: "demo_booked",
19
+ CONTACT_SUBMITTED: "contact_submitted",
20
+ TRIAL_START_CLICK: "trial_start_click",
21
+ SAMPLE_REPORT_DOWNLOAD: "sample_report_download",
17
22
  });
18
23
 
19
24
  export const trackHelperNames = Object.freeze({
@@ -29,9 +34,14 @@ export const trackHelperNames = Object.freeze({
29
34
  paymentFailed: events.PAYMENT_FAILED,
30
35
  feedbackSubmitted: events.FEEDBACK_SUBMITTED,
31
36
  leadSubmitted: events.LEAD_SUBMITTED,
37
+ leadQualified: events.LEAD_QUALIFIED,
32
38
  whatsappClick: events.WHATSAPP_CLICK,
33
39
  calculatorUse: events.CALCULATOR_USE,
34
40
  phoneClick: events.PHONE_CLICK,
41
+ demoBooked: events.DEMO_BOOKED,
42
+ contactSubmitted: events.CONTACT_SUBMITTED,
43
+ trialStartClick: events.TRIAL_START_CLICK,
44
+ sampleReportDownload: events.SAMPLE_REPORT_DOWNLOAD,
35
45
  });
36
46
 
37
47
  export const EVENT_NAME_PATTERN = /^[a-z][a-z0-9]*(_[a-z0-9]+)*$/;