@webority/analytics 0.25.0 → 0.26.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,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
- import{readFileSync as ze}from"node:fs";import{resolve as le}from"node:path";import{parseArgs as Ve}from"node:util";import{existsSync as z,readdirSync as $e,readFileSync as V}from"node:fs";import{basename as ye,dirname as Y,join as Se,relative as W,resolve as x,sep as Ae}from"node:path";var u=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",REPORT_VERIFIED:"report_verified",CONTENT_ENGAGED:"content_engaged",EMAIL_CLICK:"email_click",PAGE_NOT_FOUND:"page_not_found",CHAT_OPENED:"chat_opened",TOUR_STARTED:"tour_started",TOUR_STEP_VIEWED:"tour_step_viewed",TOUR_COMPLETED:"tour_completed",TOUR_SKIPPED:"tour_skipped"}),He=Object.freeze({signupStarted:u.SIGNUP_STARTED,signupCompleted:u.SIGNUP_COMPLETED,loginSucceeded:u.LOGIN_SUCCEEDED,onboardingStarted:u.ONBOARDING_STARTED,onboardingStepCompleted:u.ONBOARDING_STEP_COMPLETED,onboardingCompleted:u.ONBOARDING_COMPLETED,subscriptionActivated:u.SUBSCRIPTION_ACTIVATED,subscriptionCancelled:u.SUBSCRIPTION_CANCELLED,paymentSucceeded:u.PAYMENT_SUCCEEDED,paymentFailed:u.PAYMENT_FAILED,feedbackSubmitted:u.FEEDBACK_SUBMITTED,leadSubmitted:u.LEAD_SUBMITTED,leadQualified:u.LEAD_QUALIFIED,whatsappClick:u.WHATSAPP_CLICK,calculatorUse:u.CALCULATOR_USE,phoneClick:u.PHONE_CLICK,demoBooked:u.DEMO_BOOKED,contactSubmitted:u.CONTACT_SUBMITTED,trialStartClick:u.TRIAL_START_CLICK,sampleReportDownload:u.SAMPLE_REPORT_DOWNLOAD,reportVerified:u.REPORT_VERIFIED,contentEngaged:u.CONTENT_ENGAGED,emailClick:u.EMAIL_CLICK,pageNotFound:u.PAGE_NOT_FOUND,chatOpened:u.CHAT_OPENED,tourStarted:u.TOUR_STARTED,tourStepViewed:u.TOUR_STEP_VIEWED,tourCompleted:u.TOUR_COMPLETED,tourSkipped:u.TOUR_SKIPPED}),v=/^[a-z][a-z0-9]*(_[a-z0-9]+)*$/;var D={"(":")","[":"]","{":"}"},P=new Set([")","]","}"]),ue=/[A-Za-z_$]/,de=/[A-Za-z0-9_$]/;function w(e,n=new Map){let s=C(e,"csharp"),o=N(s),t=[],r=/\bconst\s+string\s+(\w+)\s*=\s*(?:"((?:[^"\\]|\\.)*)"|([A-Za-z_][\w.]*))\s*;/g;for(let i of s.matchAll(r)){let a=i[2]??null;if(a===null){let c=i[3].split(".");a=c.length>=2&&c.at(-2)==="AnalyticsEvents"?n.get(c.at(-1))??null:null}t.push({name:i[1],value:a,line:o(i.index)})}return t}function U(e){let n=C(e,"javascript"),s=N(n),o=[],t=/([A-Za-z_$][\w$]*)\s*:\s*(?:"((?:[^"\\]|\\.)*)"|'((?:[^'\\]|\\.)*)')/g;for(let r of n.matchAll(t))o.push({name:r[1],value:r[2]??r[3],line:s(r.index)});return o}function M(e,n,s){if(n.length===0)return[];let o=C(e,s),t=n.map(G).join("|"),r=new RegExp(`(?<![\\w$.])(?:${t})((?:\\.[A-Za-z_$][\\w$]*)+)`,"g"),i=N(o),a=[];for(let c of o.matchAll(r)){if(B(o,c.index,s))continue;let l=c[1].split(".").at(-1),f=c.index+c[0].length;/^\s*\(/.test(o.slice(f,f+8))||a.push({constant:l,line:i(c.index),properties:K(o,f,s)})}return a}function F(e,n,s){if(n.length===0)return[];let o=C(e,s),t=n.map(G).join("|"),r=new RegExp(`(?<![\\w$])(${t})\\s*\\(`,"g"),i=N(o),a=[];for(let c of o.matchAll(r)){if(B(o,c.index,s))continue;let{names:l,end:f}=me(o,c.index+c[0].length,s);if(l.length===0)continue;let d=K(o,f,s),_=i(c.index);for(let $ of l)a.push({call:c[1],name:$,line:_,properties:d})}return a}function me(e,n,s){let o=[],t=n,r="(",i=0;for(let a=n;a<e.length;a++){let c=b(e,a,s);if(c!==a){if(i===0&&he(e,a,c,s)){let f=e.slice(c).trimStart().charAt(0);((r==="("||r===":")&&(f===","||f===")")||r==="?"&&f===":")&&(o.push(e.slice(a+1,c-1)),t=c)}r="literal",a=c-1;continue}let l=e[a];if(!/\s/.test(l)){if(D[l])i++;else if(P.has(l)){if(i===0)break;i--}else if(i===0&&l===",")break;if(l==="?"&&(e[a+1]==="?"||e[a+1]===".")){r="operator",a++;continue}r=l}}return{names:o,end:t}}function he(e,n,s,o){let t=e[n];return s-n<2||e[s-1]!==t?!1:t==="`"?!e.slice(n,s).includes("${"):o==="javascript"||t==='"'}function K(e,n,s){let o=0,t=null;for(let r=n;r<e.length;r++){let i=b(e,r,s);if(i!==r){r=i-1;continue}let a=e[r];if(o===0){if(a===";"||a==="="&&e[r+1]===">")break;if(a==="{"){let c=ge(e,r,s),l=s==="csharp"?_e(e,r,c):Ee(e,r,c,s);l.length>0&&(t=[...t??[],...l]),r=c;continue}}if(D[a])o++;else if(P.has(a)){if(o===0)break;o--}}return t}function Ee(e,n,s,o){let t=[],r=!0,i=0;for(let a=n+1;a<s;a++){let c=b(e,a,o);if(c!==a){if(r&&i===0&&(e[a]==='"'||e[a]==="'")){let f=e.slice(a+1,c-1);/^\s*:/.test(e.slice(c,s))&&t.push(f)}r=!1,a=c-1;continue}let l=e[a];if(D[l]){i++,r=!1;continue}if(P.has(l)){i--;continue}if(!(i>0)){if(l===","){r=!0;continue}if(!(!r||/\s/.test(l))){if(ue.test(l)){let f=a;for(;f<s&&de.test(e[f]);)f++;let d=e.slice(f,s).trimStart();(d.startsWith(":")||d.startsWith(",")||d==="")&&t.push(e.slice(a,f)),a=f-1}r=!1}}}return t}function _e(e,n,s){let o=e.slice(n,s+1),t=[];for(let r of o.matchAll(/\[\s*"((?:[^"\\]|\\.)*)"\s*\]\s*=(?!=)/g))t.push(r[1]);for(let r of o.matchAll(/\{\s*"((?:[^"\\]|\\.)*)"\s*,/g))r.index>0&&t.push(r[1]);return t}function ge(e,n,s){let o=0;for(let t=n;t<e.length;t++){let r=b(e,t,s);if(r!==t){t=r-1;continue}if(D[e[t]])o++;else if(P.has(e[t])&&--o===0)return t}return e.length-1}function b(e,n,s){let o=e[n];if(s==="csharp"&&o==="@"&&e[n+1]==='"'){let r=n+2;for(;r<e.length;){if(e[r]==='"'&&e[r+1]==='"'){r+=2;continue}if(e[r]==='"')return r+1;r++}return e.length}if(o!=='"'&&o!=="'"&&!(o==="`"&&s==="javascript"))return n;let t=n+1;for(;t<e.length&&e[t]!==o;){if(e[t]==="\\")t++;else if(e[t]===`
2
+ import{readFileSync as ze}from"node:fs";import{resolve as le}from"node:path";import{parseArgs as We}from"node:util";import{existsSync as z,readdirSync as $e,readFileSync as W}from"node:fs";import{basename as ye,dirname as V,join as Se,relative as Y,resolve as x,sep as Ae}from"node:path";var u=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",LEAD_WON:"lead_won",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",REPORT_VERIFIED:"report_verified",CONTENT_ENGAGED:"content_engaged",EMAIL_CLICK:"email_click",PAGE_NOT_FOUND:"page_not_found",CHAT_OPENED:"chat_opened",TOUR_STARTED:"tour_started",TOUR_STEP_VIEWED:"tour_step_viewed",TOUR_COMPLETED:"tour_completed",TOUR_SKIPPED:"tour_skipped"}),He=Object.freeze({signupStarted:u.SIGNUP_STARTED,signupCompleted:u.SIGNUP_COMPLETED,loginSucceeded:u.LOGIN_SUCCEEDED,onboardingStarted:u.ONBOARDING_STARTED,onboardingStepCompleted:u.ONBOARDING_STEP_COMPLETED,onboardingCompleted:u.ONBOARDING_COMPLETED,subscriptionActivated:u.SUBSCRIPTION_ACTIVATED,subscriptionCancelled:u.SUBSCRIPTION_CANCELLED,paymentSucceeded:u.PAYMENT_SUCCEEDED,paymentFailed:u.PAYMENT_FAILED,feedbackSubmitted:u.FEEDBACK_SUBMITTED,leadSubmitted:u.LEAD_SUBMITTED,leadQualified:u.LEAD_QUALIFIED,leadWon:u.LEAD_WON,whatsappClick:u.WHATSAPP_CLICK,calculatorUse:u.CALCULATOR_USE,phoneClick:u.PHONE_CLICK,demoBooked:u.DEMO_BOOKED,contactSubmitted:u.CONTACT_SUBMITTED,trialStartClick:u.TRIAL_START_CLICK,sampleReportDownload:u.SAMPLE_REPORT_DOWNLOAD,reportVerified:u.REPORT_VERIFIED,contentEngaged:u.CONTENT_ENGAGED,emailClick:u.EMAIL_CLICK,pageNotFound:u.PAGE_NOT_FOUND,chatOpened:u.CHAT_OPENED,tourStarted:u.TOUR_STARTED,tourStepViewed:u.TOUR_STEP_VIEWED,tourCompleted:u.TOUR_COMPLETED,tourSkipped:u.TOUR_SKIPPED}),v=/^[a-z][a-z0-9]*(_[a-z0-9]+)*$/;var D={"(":")","[":"]","{":"}"},N=new Set([")","]","}"]),ue=/[A-Za-z_$]/,de=/[A-Za-z0-9_$]/;function w(e,n=new Map){let s=P(e,"csharp"),o=C(s),t=[],r=/\bconst\s+string\s+(\w+)\s*=\s*(?:"((?:[^"\\]|\\.)*)"|([A-Za-z_][\w.]*))\s*;/g;for(let i of s.matchAll(r)){let a=i[2]??null;if(a===null){let c=i[3].split(".");a=c.length>=2&&c.at(-2)==="AnalyticsEvents"?n.get(c.at(-1))??null:null}t.push({name:i[1],value:a,line:o(i.index)})}return t}function U(e){let n=P(e,"javascript"),s=C(n),o=[],t=/([A-Za-z_$][\w$]*)\s*:\s*(?:"((?:[^"\\]|\\.)*)"|'((?:[^'\\]|\\.)*)')/g;for(let r of n.matchAll(t))o.push({name:r[1],value:r[2]??r[3],line:s(r.index)});return o}function M(e,n,s){if(n.length===0)return[];let o=P(e,s),t=n.map(G).join("|"),r=new RegExp(`(?<![\\w$.])(?:${t})((?:\\.[A-Za-z_$][\\w$]*)+)`,"g"),i=C(o),a=[];for(let c of o.matchAll(r)){if(B(o,c.index,s))continue;let l=c[1].split(".").at(-1),f=c.index+c[0].length;/^\s*\(/.test(o.slice(f,f+8))||a.push({constant:l,line:i(c.index),properties:K(o,f,s)})}return a}function F(e,n,s){if(n.length===0)return[];let o=P(e,s),t=n.map(G).join("|"),r=new RegExp(`(?<![\\w$])(${t})\\s*\\(`,"g"),i=C(o),a=[];for(let c of o.matchAll(r)){if(B(o,c.index,s))continue;let{names:l,end:f}=me(o,c.index+c[0].length,s);if(l.length===0)continue;let d=K(o,f,s),_=i(c.index);for(let $ of l)a.push({call:c[1],name:$,line:_,properties:d})}return a}function me(e,n,s){let o=[],t=n,r="(",i=0;for(let a=n;a<e.length;a++){let c=b(e,a,s);if(c!==a){if(i===0&&he(e,a,c,s)){let f=e.slice(c).trimStart().charAt(0);((r==="("||r===":")&&(f===","||f===")")||r==="?"&&f===":")&&(o.push(e.slice(a+1,c-1)),t=c)}r="literal",a=c-1;continue}let l=e[a];if(!/\s/.test(l)){if(D[l])i++;else if(N.has(l)){if(i===0)break;i--}else if(i===0&&l===",")break;if(l==="?"&&(e[a+1]==="?"||e[a+1]===".")){r="operator",a++;continue}r=l}}return{names:o,end:t}}function he(e,n,s,o){let t=e[n];return s-n<2||e[s-1]!==t?!1:t==="`"?!e.slice(n,s).includes("${"):o==="javascript"||t==='"'}function K(e,n,s){let o=0,t=null;for(let r=n;r<e.length;r++){let i=b(e,r,s);if(i!==r){r=i-1;continue}let a=e[r];if(o===0){if(a===";"||a==="="&&e[r+1]===">")break;if(a==="{"){let c=ge(e,r,s),l=s==="csharp"?_e(e,r,c):Ee(e,r,c,s);l.length>0&&(t=[...t??[],...l]),r=c;continue}}if(D[a])o++;else if(N.has(a)){if(o===0)break;o--}}return t}function Ee(e,n,s,o){let t=[],r=!0,i=0;for(let a=n+1;a<s;a++){let c=b(e,a,o);if(c!==a){if(r&&i===0&&(e[a]==='"'||e[a]==="'")){let f=e.slice(a+1,c-1);/^\s*:/.test(e.slice(c,s))&&t.push(f)}r=!1,a=c-1;continue}let l=e[a];if(D[l]){i++,r=!1;continue}if(N.has(l)){i--;continue}if(!(i>0)){if(l===","){r=!0;continue}if(!(!r||/\s/.test(l))){if(ue.test(l)){let f=a;for(;f<s&&de.test(e[f]);)f++;let d=e.slice(f,s).trimStart();(d.startsWith(":")||d.startsWith(",")||d==="")&&t.push(e.slice(a,f)),a=f-1}r=!1}}}return t}function _e(e,n,s){let o=e.slice(n,s+1),t=[];for(let r of o.matchAll(/\[\s*"((?:[^"\\]|\\.)*)"\s*\]\s*=(?!=)/g))t.push(r[1]);for(let r of o.matchAll(/\{\s*"((?:[^"\\]|\\.)*)"\s*,/g))r.index>0&&t.push(r[1]);return t}function ge(e,n,s){let o=0;for(let t=n;t<e.length;t++){let r=b(e,t,s);if(r!==t){t=r-1;continue}if(D[e[t]])o++;else if(N.has(e[t])&&--o===0)return t}return e.length-1}function b(e,n,s){let o=e[n];if(s==="csharp"&&o==="@"&&e[n+1]==='"'){let r=n+2;for(;r<e.length;){if(e[r]==='"'&&e[r+1]==='"'){r+=2;continue}if(e[r]==='"')return r+1;r++}return e.length}if(o!=='"'&&o!=="'"&&!(o==="`"&&s==="javascript"))return n;let t=n+1;for(;t<e.length&&e[t]!==o;){if(e[t]==="\\")t++;else if(e[t]===`
3
3
  `&&o!=="`")return t;t++}return t+1}function B(e,n,s){let o=e.lastIndexOf(`
4
- `,n)+1;for(let t=o;t<n;t++){let r=b(e,t,s);if(r!==t){if(r>n)return!0;t=r-1}}return!1}function C(e,n){let s=e.replace(/\r\n?/g,`
4
+ `,n)+1;for(let t=o;t<n;t++){let r=b(e,t,s);if(r!==t){if(r>n)return!0;t=r-1}}return!1}function P(e,n){let s=e.replace(/\r\n?/g,`
5
5
  `),o="";for(let t=0;t<s.length;t++){let r=b(s,t,n);if(r!==t){o+=s.slice(t,r),t=r-1;continue}if(s[t]==="/"&&s[t+1]==="/"){let i=s.indexOf(`
6
- `,t),a=i===-1?s.length:i;o+=" ".repeat(a-t),t=a-1;continue}if(s[t]==="/"&&s[t+1]==="*"){let i=s.indexOf("*/",t+2),a=i===-1?s.length:i+2;o+=s.slice(t,a).replace(/[^\n]/g," "),t=a-1;continue}o+=s[t]}return o}function N(e){let n=[];for(let s=e.indexOf(`
6
+ `,t),a=i===-1?s.length:i;o+=" ".repeat(a-t),t=a-1;continue}if(s[t]==="/"&&s[t+1]==="*"){let i=s.indexOf("*/",t+2),a=i===-1?s.length:i+2;o+=s.slice(t,a).replace(/[^\n]/g," "),t=a-1;continue}o+=s[t]}return o}function C(e){let n=[];for(let s=e.indexOf(`
7
7
  `);s!==-1;s=e.indexOf(`
8
- `,s+1))n.push(s);return s=>{let o=0,t=n.length;for(;o<t;){let r=o+t>>>1;n[r]<s?o=r+1:t=r}return o+1}}function G(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var be={csharp:new Set([".cs"]),javascript:new Set([".js",".jsx",".mjs",".cjs",".ts",".tsx",".html",".cshtml",".razor"])},Te="trackSiteEvent",Oe=/^(node_modules|bin|obj|dist|build|coverage|\.git|\.expo|__tests__|__mocks__|tests?)$|\.Tests?$/i,ve=/\.(test|spec)\.[cm]?[jt]sx?$|\.d\.ts$/i;function De(e){let n=new Map;for(let[s,o]of e.events)o.origin==="fleet"&&n.set(Ce(s),s);return n}function H(e,n){let s=[],o=(i,a,c)=>s.push({file:i?q(W(n,i)):null,line:a,message:c}),t=De(e),r={constants:0,callSites:0,files:0};for(let i of e.sources){let a=new Map,c=new Set(i.ignoreConstants??[]),l=new Set;for(let y of i.constants??[]){let h=x(n,y);if(l.add(h),!z(h)){o(null,null,`${i.sender}: constants file ${y} does not exist`);continue}let E=V(h,"utf8"),A=i.language==="csharp"?w(E,t):U(E);for(let p of A){if(c.has(p.name))continue;if(r.constants++,p.value===null){o(h,p.line,`${p.name} is not a string literal or an AnalyticsEvents constant, so its event name cannot be read`);continue}if(!v.test(p.value)){o(h,p.line,`${p.name} = "${p.value}" is not a snake_case event name (list it in ignoreConstants if it is not an event)`);continue}e.events.has(p.value)||o(h,p.line,`event "${p.value}" (${p.name}) is not in the ${e.product} tracking plan`);let g=a.get(p.name);g!==void 0&&g!==p.value&&o(h,p.line,`${p.name} is declared twice with different events ("${g}" and "${p.value}")`),a.set(p.name,p.value)}}let f=i.references??[],d=i.language==="csharp",_=d?[...new Set([...f,"AnalyticsEvents"])]:f,$=i.language==="javascript"?[...new Set([...i.calls??[],Te])]:i.calls??[];if(_.length===0&&$.length===0)continue;let L=(y,h,E,A)=>{let p=e.events.get(E);if(p){p.senders.includes(i.sender)||o(y,h,`event "${E}" is sent by ${i.sender}, which its plan entry does not list as a sender`);for(let g of A??[])!p.properties.has(g)&&!e.commonProperties.has(g)&&o(y,h,`event "${E}" sends property "${g}", which the plan does not declare`)}};for(let y of i.scan??[]){let h=x(n,y);if(!z(h)){o(null,null,`${i.sender}: scan folder ${y} does not exist`);continue}for(let E of J(h,be[i.language],i.exclude??[],n)){if(l.has(E))continue;r.files++;let A=V(E,"utf8");for(let p of M(A,_,i.language)){if(c.has(p.constant))continue;let g=a.get(p.constant)??(d?t.get(p.constant):void 0);if(g===void 0){i.language==="javascript"&&o(E,p.line,`${p.constant} is not an event constant in ${i.constants.join(", ")}`);continue}r.callSites++,L(E,p.line,g,p.properties)}for(let p of F(A,$,i.language)){if(r.callSites++,!e.events.has(p.name)){o(E,p.line,`event "${p.name}" (sent through ${p.call}) is not in the ${e.product} tracking plan`);continue}L(E,p.line,p.name,p.properties)}}}}return{problems:s,summary:r}}function*J(e,n,s,o){let t=$e(e,{withFileTypes:!0}).sort((r,i)=>r.name<i.name?-1:r.name>i.name?1:0);for(let r of t){let i=Se(e,r.name),a=q(W(o,i));s.some(c=>a===c||a.startsWith(`${c}/`)||r.name===c)||(r.isDirectory()?Oe.test(r.name)||(yield*J(i,n,s,o)):r.isFile()&&n.has(Pe(r.name))&&!ve.test(r.name)&&(yield i))}}function Pe(e){let n=e.lastIndexOf(".");return n===-1?"":e.slice(n).toLowerCase()}function Z(e){let n=Y(x(e));return ye(n)===".webority"?Y(n):n}function Ce(e){return e.split("_").map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join("")}function q(e){return e.split(Ae).join("/")}import{readFileSync as Ne}from"node:fs";import{dirname as Ie,resolve as te}from"node:path";var ne="@webority/analytics/fleet",X=Object.freeze(["acquisition","activation","engagement","retention","revenue","referral","support","quality"]),I=Object.freeze(["none","pseudonymous","personal"]),Q=Object.freeze(["string","integer","number","boolean","array","object"]),se=/^[a-z][a-z0-9]*(_[a-z0-9]+)*$/,oe=new Set(["properties","senders"]),Re=new Set(["$schema","product","extends","description","commonProperties","events","sources"]),xe=new Set(["description","stage","owner","personalData","senders","properties"]),ke=new Set(["type","description","values","nullable","personalData"]),je=new Set(["sender","language","constants","references","calls","ignoreConstants","scan","exclude"]),Le=/^[A-Za-z_$][\w$]*$/,we=new Set(["csharp","javascript"]),ee=4,Ue=new URL("./fleet-tracking-plan.json",import.meta.url);function re(e){return ie(te(e),0)}function ie(e,n){let s=typeof e=="string"?e:"fleet-tracking-plan.json",o=[],t;try{t=JSON.parse(Ne(e,"utf8"))}catch(a){return{plan:null,problems:[`${s}: cannot read the plan (${a.message})`]}}if(o.push(...Fe(t,s)),o.length>0)return{plan:null,problems:o};let r=null;if(t.extends!==void 0){if(n>=ee)return{plan:null,problems:[`${s}: "extends" is nested more than ${ee} deep`]};let a=t.extends===ne?Ue:te(Ie(String(e)),t.extends),c=ie(a,n+1);if(!c.plan)return{plan:null,problems:c.problems};r=c.plan}let i=Me(r,t,s);return{plan:i.plan,problems:i.problems}}function Me(e,n,s="plan"){let o=[],t=new Map,r=new Map(e?.commonProperties??[]);for(let[c,l]of e?.events??[])t.set(c,{...l,properties:new Map(l.properties),senders:[...l.senders]});for(let[c,l]of Object.entries(n.commonProperties??{})){let f=r.get(c);if(f&&f.type!==l.type){o.push(`${s}: common property "${c}" is ${l.type} here but ${f.type} in the base plan`);continue}r.set(c,{...l,origin:f?.origin??n.product})}for(let[c,l]of Object.entries(n.events??{})){let f=t.get(c);if(!f){let d=["description","stage","owner","personalData"].filter(_=>l[_]===void 0);d.length>0&&o.push(`${s}: event "${c}" is not in the base plan, so it needs description, stage, owner and personalData (missing ${d.join(", ")})`),t.set(c,{name:c,description:l.description,stage:l.stage,owner:l.owner,personalData:l.personalData,senders:[...l.senders??[]],properties:new Map(Object.entries(l.properties??{})),origin:n.product});continue}for(let d of Object.keys(l))oe.has(d)||o.push(`${s}: event "${c}" is defined by the base plan, so it may only add properties or senders (found "${d}")`);for(let d of l.senders??[])f.senders.includes(d)||f.senders.push(d);for(let[d,_]of Object.entries(l.properties??{})){let $=f.properties.get(d);if($&&$.type!==_.type){o.push(`${s}: "${c}.${d}" is ${_.type} here but ${$.type} in the base plan`);continue}f.properties.set(d,_)}}for(let[c,l]of t)for(let f of l.properties.keys())r.has(f)&&o.push(`${s}: "${c}.${f}" is already a common property, so it must not be declared on the event`);let i=n.sources??[],a=new Set(i.map(c=>c.sender));if(i.length>0)for(let[c,l]of Object.entries(n.events??{}))for(let f of l.senders??[])a.has(f)||o.push(`${s}: event "${c}" names sender "${f}", which no source declares`);return{plan:{product:n.product,events:t,commonProperties:r,sources:i,file:s},problems:o}}function Fe(e,n="plan"){let s=[],o=t=>s.push(`${n}: ${t}`);if(!S(e))return o("the plan must be a JSON object"),s;if(R(e,Re,"the plan",o),(typeof e.product!="string"||!se.test(e.product))&&o('"product" must be a snake_case product slug'),e.extends!==void 0&&(typeof e.extends!="string"||e.extends.length===0)&&o(`"extends" must be "${ne}" or a path to another plan`),!S(e.events))o('"events" must be an object keyed by event name');else for(let[t,r]of Object.entries(e.events))Ke(t,r,o);if(e.commonProperties!==void 0&&ce("commonProperties",e.commonProperties,o),e.sources!==void 0)if(!Array.isArray(e.sources))o('"sources" must be an array');else for(let[t,r]of e.sources.entries())Be(r,t,o);return s}function Ke(e,n,s){if(v.test(e)||s(`event "${e}" is not a snake_case name`),!S(n)){s(`event "${e}" must be an object`);return}R(n,xe,`event "${e}"`,s),Object.keys(n).every(t=>oe.has(t))||((typeof n.description!="string"||n.description.trim()==="")&&s(`event "${e}" needs a description`),X.includes(n.stage)||s(`event "${e}" stage must be one of ${X.join(", ")}`),(typeof n.owner!="string"||n.owner.trim()==="")&&s(`event "${e}" needs an owner`),I.includes(n.personalData)||s(`event "${e}" personalData must be one of ${I.join(", ")}`)),n.senders!==void 0&&(!Array.isArray(n.senders)||n.senders.some(t=>typeof t!="string"))&&s(`event "${e}" senders must be an array of sender names`),n.properties!==void 0&&ce(`event "${e}"`,n.properties,s)}function ce(e,n,s){if(!S(n)){s(`${e} properties must be an object keyed by property name`);return}for(let[o,t]of Object.entries(n)){if(se.test(o)||s(`${e} property "${o}" is not a snake_case name`),!S(t)){s(`${e} property "${o}" must be an object`);continue}R(t,ke,`${e} property "${o}"`,s),Q.includes(t.type)||s(`${e} property "${o}" type must be one of ${Q.join(", ")}`),t.values!==void 0&&(!Array.isArray(t.values)||t.values.length===0)&&s(`${e} property "${o}" values must be a non-empty array`),t.nullable!==void 0&&typeof t.nullable!="boolean"&&s(`${e} property "${o}" nullable must be true or false`),t.personalData!==void 0&&!I.includes(t.personalData)&&s(`${e} property "${o}" personalData must be one of ${I.join(", ")}`)}}function Be(e,n,s){let o=`sources[${n}]`;if(!S(e)){s(`${o} must be an object`);return}R(e,je,o,s),(typeof e.sender!="string"||e.sender==="")&&s(`${o} needs a sender`),we.has(e.language)||s(`${o} language must be csharp or javascript`);for(let t of["constants","references","calls","ignoreConstants","scan","exclude"])e[t]!==void 0&&(!Array.isArray(e[t])||e[t].some(r=>typeof r!="string"))&&s(`${o} ${t} must be an array of strings`);Array.isArray(e.calls)&&e.calls.some(t=>typeof t=="string"&&!Le.test(t))&&s(`${o} calls must be function names, such as trackSiteEvent`),(e.constants?.length??0)===0&&((e.references?.length??0)>0||(e.calls?.length??0)===0)&&s(`${o} needs at least one constants file, unless it has calls and no references`)}function R(e,n,s,o){for(let t of Object.keys(e))n.has(t)||o(`${s} has an unknown field "${t}"`)}function S(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function ae(e,n,s={}){if(typeof n=="string"&&n.startsWith("$"))return[];let o=e.events.get(n);if(!o)return[`event "${n}" is not in the ${e.product} tracking plan`];let t=[];for(let[r,i]of Object.entries(s??{})){if(r.startsWith("$"))continue;let a=o.properties.get(r)??e.commonProperties.get(r);if(!a){t.push(`event "${n}" sends property "${r}", which the plan does not declare`);continue}let c=Ge(a,i);c&&t.push(`event "${n}" property "${r}" ${c}`)}return t}function Ge(e,n){return n==null?e.nullable?null:"is null, and the plan does not mark it nullable":{string:typeof n=="string",integer:Number.isInteger(n),number:typeof n=="number"&&Number.isFinite(n),boolean:typeof n=="boolean",array:Array.isArray(n),object:S(n)}[e.type]?e.values&&!e.values.includes(n)?`is "${n}", which is not one of ${e.values.join(", ")}`:null:`is ${Array.isArray(n)?"array":typeof n}, but the plan declares ${e.type}`}var pe=`usage: webority-analytics-check-events --plan <tracking-plan.json> [--root <dir>] [--events <file.jsonl>]
9
- `,m;try{m=Ve({options:{plan:{type:"string"},root:{type:"string"},events:{type:"string"},help:{type:"boolean"}}}).values}catch(e){process.stderr.write(`${e.message}
8
+ `,s+1))n.push(s);return s=>{let o=0,t=n.length;for(;o<t;){let r=o+t>>>1;n[r]<s?o=r+1:t=r}return o+1}}function G(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var be={csharp:new Set([".cs"]),javascript:new Set([".js",".jsx",".mjs",".cjs",".ts",".tsx",".html",".cshtml",".razor"])},Te="trackSiteEvent",Oe=/^(node_modules|bin|obj|dist|build|coverage|\.git|\.expo|__tests__|__mocks__|tests?)$|\.Tests?$/i,ve=/\.(test|spec)\.[cm]?[jt]sx?$|\.d\.ts$/i;function De(e){let n=new Map;for(let[s,o]of e.events)o.origin==="fleet"&&n.set(Pe(s),s);return n}function H(e,n){let s=[],o=(i,a,c)=>s.push({file:i?q(Y(n,i)):null,line:a,message:c}),t=De(e),r={constants:0,callSites:0,files:0};for(let i of e.sources){let a=new Map,c=new Set(i.ignoreConstants??[]),l=new Set;for(let y of i.constants??[]){let h=x(n,y);if(l.add(h),!z(h)){o(null,null,`${i.sender}: constants file ${y} does not exist`);continue}let E=W(h,"utf8"),A=i.language==="csharp"?w(E,t):U(E);for(let p of A){if(c.has(p.name))continue;if(r.constants++,p.value===null){o(h,p.line,`${p.name} is not a string literal or an AnalyticsEvents constant, so its event name cannot be read`);continue}if(!v.test(p.value)){o(h,p.line,`${p.name} = "${p.value}" is not a snake_case event name (list it in ignoreConstants if it is not an event)`);continue}e.events.has(p.value)||o(h,p.line,`event "${p.value}" (${p.name}) is not in the ${e.product} tracking plan`);let g=a.get(p.name);g!==void 0&&g!==p.value&&o(h,p.line,`${p.name} is declared twice with different events ("${g}" and "${p.value}")`),a.set(p.name,p.value)}}let f=i.references??[],d=i.language==="csharp",_=d?[...new Set([...f,"AnalyticsEvents"])]:f,$=i.language==="javascript"?[...new Set([...i.calls??[],Te])]:i.calls??[];if(_.length===0&&$.length===0)continue;let L=(y,h,E,A)=>{let p=e.events.get(E);if(p){p.senders.includes(i.sender)||o(y,h,`event "${E}" is sent by ${i.sender}, which its plan entry does not list as a sender`);for(let g of A??[])!p.properties.has(g)&&!e.commonProperties.has(g)&&o(y,h,`event "${E}" sends property "${g}", which the plan does not declare`)}};for(let y of i.scan??[]){let h=x(n,y);if(!z(h)){o(null,null,`${i.sender}: scan folder ${y} does not exist`);continue}for(let E of J(h,be[i.language],i.exclude??[],n)){if(l.has(E))continue;r.files++;let A=W(E,"utf8");for(let p of M(A,_,i.language)){if(c.has(p.constant))continue;let g=a.get(p.constant)??(d?t.get(p.constant):void 0);if(g===void 0){i.language==="javascript"&&o(E,p.line,`${p.constant} is not an event constant in ${i.constants.join(", ")}`);continue}r.callSites++,L(E,p.line,g,p.properties)}for(let p of F(A,$,i.language)){if(r.callSites++,!e.events.has(p.name)){o(E,p.line,`event "${p.name}" (sent through ${p.call}) is not in the ${e.product} tracking plan`);continue}L(E,p.line,p.name,p.properties)}}}}return{problems:s,summary:r}}function*J(e,n,s,o){let t=$e(e,{withFileTypes:!0}).sort((r,i)=>r.name<i.name?-1:r.name>i.name?1:0);for(let r of t){let i=Se(e,r.name),a=q(Y(o,i));s.some(c=>a===c||a.startsWith(`${c}/`)||r.name===c)||(r.isDirectory()?Oe.test(r.name)||(yield*J(i,n,s,o)):r.isFile()&&n.has(Ne(r.name))&&!ve.test(r.name)&&(yield i))}}function Ne(e){let n=e.lastIndexOf(".");return n===-1?"":e.slice(n).toLowerCase()}function Z(e){let n=V(x(e));return ye(n)===".webority"?V(n):n}function Pe(e){return e.split("_").map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join("")}function q(e){return e.split(Ae).join("/")}import{readFileSync as Ce}from"node:fs";import{dirname as Ie,resolve as te}from"node:path";var ne="@webority/analytics/fleet",X=Object.freeze(["acquisition","activation","engagement","retention","revenue","referral","support","quality"]),I=Object.freeze(["none","pseudonymous","personal"]),Q=Object.freeze(["string","integer","number","boolean","array","object"]),se=/^[a-z][a-z0-9]*(_[a-z0-9]+)*$/,oe=new Set(["properties","senders"]),Re=new Set(["$schema","product","extends","description","commonProperties","events","sources"]),xe=new Set(["description","stage","owner","personalData","senders","properties"]),ke=new Set(["type","description","values","nullable","personalData"]),je=new Set(["sender","language","constants","references","calls","ignoreConstants","scan","exclude"]),Le=/^[A-Za-z_$][\w$]*$/,we=new Set(["csharp","javascript"]),ee=4,Ue=new URL("./fleet-tracking-plan.json",import.meta.url);function re(e){return ie(te(e),0)}function ie(e,n){let s=typeof e=="string"?e:"fleet-tracking-plan.json",o=[],t;try{t=JSON.parse(Ce(e,"utf8"))}catch(a){return{plan:null,problems:[`${s}: cannot read the plan (${a.message})`]}}if(o.push(...Fe(t,s)),o.length>0)return{plan:null,problems:o};let r=null;if(t.extends!==void 0){if(n>=ee)return{plan:null,problems:[`${s}: "extends" is nested more than ${ee} deep`]};let a=t.extends===ne?Ue:te(Ie(String(e)),t.extends),c=ie(a,n+1);if(!c.plan)return{plan:null,problems:c.problems};r=c.plan}let i=Me(r,t,s);return{plan:i.plan,problems:i.problems}}function Me(e,n,s="plan"){let o=[],t=new Map,r=new Map(e?.commonProperties??[]);for(let[c,l]of e?.events??[])t.set(c,{...l,properties:new Map(l.properties),senders:[...l.senders]});for(let[c,l]of Object.entries(n.commonProperties??{})){let f=r.get(c);if(f&&f.type!==l.type){o.push(`${s}: common property "${c}" is ${l.type} here but ${f.type} in the base plan`);continue}r.set(c,{...l,origin:f?.origin??n.product})}for(let[c,l]of Object.entries(n.events??{})){let f=t.get(c);if(!f){let d=["description","stage","owner","personalData"].filter(_=>l[_]===void 0);d.length>0&&o.push(`${s}: event "${c}" is not in the base plan, so it needs description, stage, owner and personalData (missing ${d.join(", ")})`),t.set(c,{name:c,description:l.description,stage:l.stage,owner:l.owner,personalData:l.personalData,senders:[...l.senders??[]],properties:new Map(Object.entries(l.properties??{})),origin:n.product});continue}for(let d of Object.keys(l))oe.has(d)||o.push(`${s}: event "${c}" is defined by the base plan, so it may only add properties or senders (found "${d}")`);for(let d of l.senders??[])f.senders.includes(d)||f.senders.push(d);for(let[d,_]of Object.entries(l.properties??{})){let $=f.properties.get(d);if($&&$.type!==_.type){o.push(`${s}: "${c}.${d}" is ${_.type} here but ${$.type} in the base plan`);continue}f.properties.set(d,_)}}for(let[c,l]of t)for(let f of l.properties.keys())r.has(f)&&o.push(`${s}: "${c}.${f}" is already a common property, so it must not be declared on the event`);let i=n.sources??[],a=new Set(i.map(c=>c.sender));if(i.length>0)for(let[c,l]of Object.entries(n.events??{}))for(let f of l.senders??[])a.has(f)||o.push(`${s}: event "${c}" names sender "${f}", which no source declares`);return{plan:{product:n.product,events:t,commonProperties:r,sources:i,file:s},problems:o}}function Fe(e,n="plan"){let s=[],o=t=>s.push(`${n}: ${t}`);if(!S(e))return o("the plan must be a JSON object"),s;if(R(e,Re,"the plan",o),(typeof e.product!="string"||!se.test(e.product))&&o('"product" must be a snake_case product slug'),e.extends!==void 0&&(typeof e.extends!="string"||e.extends.length===0)&&o(`"extends" must be "${ne}" or a path to another plan`),!S(e.events))o('"events" must be an object keyed by event name');else for(let[t,r]of Object.entries(e.events))Ke(t,r,o);if(e.commonProperties!==void 0&&ce("commonProperties",e.commonProperties,o),e.sources!==void 0)if(!Array.isArray(e.sources))o('"sources" must be an array');else for(let[t,r]of e.sources.entries())Be(r,t,o);return s}function Ke(e,n,s){if(v.test(e)||s(`event "${e}" is not a snake_case name`),!S(n)){s(`event "${e}" must be an object`);return}R(n,xe,`event "${e}"`,s),Object.keys(n).every(t=>oe.has(t))||((typeof n.description!="string"||n.description.trim()==="")&&s(`event "${e}" needs a description`),X.includes(n.stage)||s(`event "${e}" stage must be one of ${X.join(", ")}`),(typeof n.owner!="string"||n.owner.trim()==="")&&s(`event "${e}" needs an owner`),I.includes(n.personalData)||s(`event "${e}" personalData must be one of ${I.join(", ")}`)),n.senders!==void 0&&(!Array.isArray(n.senders)||n.senders.some(t=>typeof t!="string"))&&s(`event "${e}" senders must be an array of sender names`),n.properties!==void 0&&ce(`event "${e}"`,n.properties,s)}function ce(e,n,s){if(!S(n)){s(`${e} properties must be an object keyed by property name`);return}for(let[o,t]of Object.entries(n)){if(se.test(o)||s(`${e} property "${o}" is not a snake_case name`),!S(t)){s(`${e} property "${o}" must be an object`);continue}R(t,ke,`${e} property "${o}"`,s),Q.includes(t.type)||s(`${e} property "${o}" type must be one of ${Q.join(", ")}`),t.values!==void 0&&(!Array.isArray(t.values)||t.values.length===0)&&s(`${e} property "${o}" values must be a non-empty array`),t.nullable!==void 0&&typeof t.nullable!="boolean"&&s(`${e} property "${o}" nullable must be true or false`),t.personalData!==void 0&&!I.includes(t.personalData)&&s(`${e} property "${o}" personalData must be one of ${I.join(", ")}`)}}function Be(e,n,s){let o=`sources[${n}]`;if(!S(e)){s(`${o} must be an object`);return}R(e,je,o,s),(typeof e.sender!="string"||e.sender==="")&&s(`${o} needs a sender`),we.has(e.language)||s(`${o} language must be csharp or javascript`);for(let t of["constants","references","calls","ignoreConstants","scan","exclude"])e[t]!==void 0&&(!Array.isArray(e[t])||e[t].some(r=>typeof r!="string"))&&s(`${o} ${t} must be an array of strings`);Array.isArray(e.calls)&&e.calls.some(t=>typeof t=="string"&&!Le.test(t))&&s(`${o} calls must be function names, such as trackSiteEvent`),(e.constants?.length??0)===0&&((e.references?.length??0)>0||(e.calls?.length??0)===0)&&s(`${o} needs at least one constants file, unless it has calls and no references`)}function R(e,n,s,o){for(let t of Object.keys(e))n.has(t)||o(`${s} has an unknown field "${t}"`)}function S(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function ae(e,n,s={}){if(typeof n=="string"&&n.startsWith("$"))return[];let o=e.events.get(n);if(!o)return[`event "${n}" is not in the ${e.product} tracking plan`];let t=[];for(let[r,i]of Object.entries(s??{})){if(r.startsWith("$"))continue;let a=o.properties.get(r)??e.commonProperties.get(r);if(!a){t.push(`event "${n}" sends property "${r}", which the plan does not declare`);continue}let c=Ge(a,i);c&&t.push(`event "${n}" property "${r}" ${c}`)}return t}function Ge(e,n){return n==null?e.nullable?null:"is null, and the plan does not mark it nullable":{string:typeof n=="string",integer:Number.isInteger(n),number:typeof n=="number"&&Number.isFinite(n),boolean:typeof n=="boolean",array:Array.isArray(n),object:S(n)}[e.type]?e.values&&!e.values.includes(n)?`is "${n}", which is not one of ${e.values.join(", ")}`:null:`is ${Array.isArray(n)?"array":typeof n}, but the plan declares ${e.type}`}var pe=`usage: webority-analytics-check-events --plan <tracking-plan.json> [--root <dir>] [--events <file.jsonl>]
9
+ `,m;try{m=We({options:{plan:{type:"string"},root:{type:"string"},events:{type:"string"},help:{type:"boolean"}}}).values}catch(e){process.stderr.write(`${e.message}
10
10
  ${pe}`),process.exit(2)}(m.help||!m.plan)&&((m.help?process.stdout:process.stderr).write(pe),process.exit(m.help?0:2));var{plan:T,problems:k}=re(m.plan);if(!T||k.length>0){process.stderr.write(`The tracking plan has ${k.length} problem(s):
11
11
  `);for(let e of k)process.stderr.write(` ${e}
12
- `);process.exit(1)}var Ye=le(m.root??Z(m.plan)),{problems:O,summary:j}=H(T,Ye),fe=0;m.events&&ze(le(m.events),"utf8").split(/\r?\n/).forEach((n,s)=>{if(n.trim()==="")return;let o;try{o=JSON.parse(n)}catch{O.push({file:m.events,line:s+1,message:"not a JSON object"});return}fe++;for(let t of ae(T,o.event,o.properties))O.push({file:m.events,line:s+1,message:t})});if(O.length>0){process.stderr.write(`${O.length} event problem(s) against the ${T.product} tracking plan (${m.plan}):
12
+ `);process.exit(1)}var Ve=le(m.root??Z(m.plan)),{problems:O,summary:j}=H(T,Ve),fe=0;m.events&&ze(le(m.events),"utf8").split(/\r?\n/).forEach((n,s)=>{if(n.trim()==="")return;let o;try{o=JSON.parse(n)}catch{O.push({file:m.events,line:s+1,message:"not a JSON object"});return}fe++;for(let t of ae(T,o.event,o.properties))O.push({file:m.events,line:s+1,message:t})});if(O.length>0){process.stderr.write(`${O.length} event problem(s) against the ${T.product} tracking plan (${m.plan}):
13
13
  `);for(let{file:e,line:n,message:s}of O)process.stderr.write(` ${e?`${e}${n?`:${n}`:""}: `:""}${s}
14
- `);process.exit(1)}var We=m.events?`, ${fe} captured event(s)`:"";process.stdout.write(`OK: ${T.events.size} events in the ${T.product} plan; ${j.constants} constants and ${j.callSites} call sites in ${j.files} files${We} all match.
14
+ `);process.exit(1)}var Ye=m.events?`, ${fe} captured event(s)`:"";process.stdout.write(`OK: ${T.events.size} events in the ${T.product} plan; ${j.constants} constants and ${j.callSites} call sites in ${j.files} files${Ye} all match.
15
15
  `);
@@ -0,0 +1 @@
1
+ var be=["google","googleads","adwords","youtube"],Ne=["meta","facebook","fb","instagram","ig","messenger"],Re=["linkedin","lnkd"],De=["bing","microsoft","microsoftads","msn"],J=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"]]]),Le=["bing.com","duckduckgo.com","search.yahoo.com","ecosia.org","search.brave.com"],ke=["google","yandex"],ve=["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"],f=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 T(e){if(!e)return f.DIRECT;let t=m(e.utmSource);if(t){let r=w(t);if(be.includes(r))return f.GOOGLE;if(Ne.includes(r))return f.META;if(Re.includes(r))return f.LINKEDIN;if(De.includes(r))return f.MICROSOFT}if(m(e.fbclid))return f.META;if(m(e.gclid)||m(e.gbraid)||m(e.wbraid))return f.GOOGLE;if(m(e.liFatId))return f.LINKEDIN;if(m(e.msclkid))return f.MICROSOFT;if(Q(t))return f.AI_ASSISTANT;if(t||m(e.utmMedium)||m(e.utmCampaign)||m(e.utmContent)||m(e.utmTerm))return f.OTHER;let o=te(e.referrer);return o?Z(o)?f.AI_ASSISTANT:xe(o)?f.ORGANIC_SEARCH:ve.some(r=>ee(o,r))?f.ORGANIC_SOCIAL:f.REFERRAL:f.DIRECT}function k(e){if(!e)return"";let t=Q(m(e.utmSource));if(t)return t;let n=te(e.referrer);return n?Z(n):""}function Q(e){if(!e)return"";let t=w(e);for(let[n,o]of J)if(w(n)===t||o.some(r=>w(r)===t))return n;return""}function Z(e){for(let[t,n]of J)if(n.some(o=>ee(e,o)))return t;return""}function xe(e){return Le.includes(e)?!0:ke.some(t=>{if(!e.startsWith(`${t}.`))return!1;let n=e.slice(t.length+1).split(".");return n.length===1||n.length===2&&(n[0]==="co"||n[0]==="com")})}function ee(e,t){return e===t||e.endsWith(`.${t}`)}function te(e){let t=m(e);if(!t)return"";try{let n=new URL(/^[a-z][a-z0-9+.-]*:\/\//i.test(t)?t:`https://${t}`).hostname.toLowerCase();return n.startsWith("www.")?n.slice(4):n}catch{return""}}function w(e){return String(e).toLowerCase().replace(/[^\p{L}\p{N}]/gu,"")}function m(e){return String(e??"").trim()}var v=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 Ue(e){let t=typeof e=="string"?e.trim().toUpperCase():"";return t.length!==2||t==="XX"||t==="T1"?!0:v.includes(t)}var O="webority_cookie_consent",oe="webority-consent-change",re=365,a={initialized:!1,requiresOptIn:!0,strictOptIn:!1,adStorage:!0,cookieDays:re,cookieDomain:null,regionCookie:null,region:null,saved:null},ie=["eea","other"],x=new Set;function Fe(e){let t=e?.strictOptIn??!1;if(typeof t!="boolean")throw new Error("@webority/analytics: initConsent strictOptIn must be true or false, or left out.");if(t){if(e.requiresOptIn!==void 0&&e.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 e?.requiresOptIn!="boolean")throw new Error("@webority/analytics: initConsent needs requiresOptIn (true or false), decided from the visitor's country.");if(e.cookieDomain!==void 0&&(typeof e.cookieDomain!="string"||!e.cookieDomain.trim()))throw new Error('@webority/analytics: initConsent cookieDomain must be a domain such as ".example.com", or left out.');if(e.cookieDays!==void 0&&!(Number.isInteger(e.cookieDays)&&e.cookieDays>0))throw new Error("@webority/analytics: initConsent cookieDays must be a whole number of days above zero, or left out.");if(e.adStorage!==void 0&&typeof e.adStorage!="boolean")throw new Error("@webority/analytics: initConsent adStorage must be true or false, or left out.");if(e.regionCookie!==void 0&&(typeof e.regionCookie!="string"||!/^[\w.-]+$/.test(e.regionCookie)))throw new Error('@webority/analytics: initConsent regionCookie must be a cookie name such as "wui_region", or left out.');a.initialized=!0,a.strictOptIn=t,a.requiresOptIn=t||e.requiresOptIn,a.adStorage=e.adStorage??!t,a.cookieDays=e.cookieDays??re,a.cookieDomain=e.cookieDomain?.trim()??null,a.regionCookie=e.regionCookie??null,a.region=a.regionCookie?Be(a.regionCookie):null;let{saved:n,entryCount:o}=ze();a.saved=n,a.cookieDomain&&o>1&&n&&le(n),Ge(),$e(),a.saved?P(a.saved):ce()&&ue()}function Pe(e){if(F("setConsentRegion"),!ie.includes(e))throw new Error('@webority/analytics: setConsentRegion needs "eea" or "other".');let t=d();if(a.region=e,a.saved)return;let n=d();t.analytics===n.analytics&&t.functional===n.functional&&t.marketing===n.marketing||(ue(),se(n))}function y(){return a.initialized}function ae(){return a.strictOptIn}function U(){return a.adStorage}function d(){F("getConsent");let e=a.saved;if(e)return{essential:!0,analytics:e.analytics,functional:e.functional,marketing:e.marketing,decided:!0};if(ce())return{essential:!0,analytics:!0,functional:!0,marketing:!1,decided:!1};let t=!a.requiresOptIn;return{essential:!0,analytics:t,functional:t,marketing:t,decided:!1}}function Me(e){F("saveConsent");let t={essential:!0,analytics:e?.analytics===!0,functional:e?.functional===!0,marketing:e?.marketing===!0,timestamp:new Date().toISOString()};le(t),a.saved=t,P(t),se(d())}function C(e){return x.add(e),()=>x.delete(e)}function se(e){for(let t of x)try{t(e)}catch(n){queueMicrotask(()=>{throw n})}typeof window?.dispatchEvent=="function"&&typeof CustomEvent=="function"&&window.dispatchEvent(new CustomEvent(oe,{detail:e}))}function F(e){if(!a.initialized)throw new Error(`@webority/analytics: call initConsent before ${e}.`)}function I(){window.dataLayer=window.dataLayer||[],window.dataLayer.push(arguments)}function Ge(){if(a.strictOptIn){I("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}I("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:[...v]});let e=a.adStorage?"granted":"denied";I("consent","default",{ad_storage:e,ad_user_data:e,ad_personalization:e,analytics_storage:"granted",functionality_storage:"granted",personalization_storage:"granted",security_storage:"granted"})}function $e(){I("set","ads_data_redaction",!0),I("set","url_passthrough",!0)}function ce(){return a.requiresOptIn&&!a.strictOptIn&&a.region==="other"}function ue(){let e=d();P(e,e.analytics&&a.adStorage)}function P(e,t=e.marketing&&a.adStorage){let n=o=>o?"granted":"denied";I("consent","update",{analytics_storage:n(e.analytics),functionality_storage:n(e.functional),personalization_storage:n(e.functional),ad_storage:n(t),ad_user_data:n(t),ad_personalization:n(t)})}function ze(){let e=`${O}=`,t=(document.cookie||"").split(";").map(o=>o.trim()).filter(o=>o.startsWith(e)),n=t.map(o=>Ke(o.slice(e.length))).filter(Boolean);return{saved:qe(n),entryCount:t.length}}function Be(e){let t=`${e}=`,o=(document.cookie||"").split(";").map(r=>r.trim()).find(r=>r.startsWith(t))?.slice(t.length);return ie.includes(o)?o:null}function Ke(e){try{let t=JSON.parse(decodeURIComponent(e));return!t||typeof t!="object"?null:{essential:!0,analytics:t.analytics===!0,functional:t.functional===!0,marketing:t.marketing===!0,timestamp:t.timestamp??null}}catch{return null}}function qe(e){if(e.length===0)return null;let t=e.map(o=>typeof o.timestamp=="string"?Date.parse(o.timestamp):Number.NaN);if(t.some(Number.isNaN))return e.at(-1);let n=0;for(let o=1;o<e.length;o++)t[o]>=t[n]&&(n=o);return e[n]}function le(e){let t=typeof e.timestamp=="string"?Date.parse(e.timestamp):Number.NaN,n=(Number.isNaN(t)?Date.now():t)+a.cookieDays*24*60*60*1e3,o=window.location?.protocol==="https:"?";Secure":"";a.cookieDomain&&ne(`${O}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;max-age=0;path=/;SameSite=Lax${o}`);let r=a.cookieDomain?`;domain=${a.cookieDomain}`:"";ne(`${O}=${encodeURIComponent(JSON.stringify(e))};expires=${new Date(n).toUTCString()};path=/${r};SameSite=Lax${o}`)}function ne(e){document.cookie=e}var b="webority_attribution",je=2160*60*60*1e3,He=200,M=500,We=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"}),de=!1;function Ve(){me("captureAttribution"),Qe();let e=Xe();if(!e)return;let t=K(G());pe(G(),{firstTouch:t?.firstTouch??e,lastTouch:e}),Ye(e)}function Ye(e){let t={event:"acquisition_touch",acquisition_channel:T(e)};e.aiSource&&(t.ai_source=e.aiSource),window.dataLayer=window.dataLayer||[],window.dataLayer.push(t)}function B(){return me("getAttribution"),K(G())}function Xe(){let e=new URLSearchParams(window.location.search),t={};for(let[r,c]of Object.entries(We)){let s=A(e.get(r),He);s&&(t[c]=s)}let n=A(e.get("referrer"),M)||Je();if(n&&(t.referrer=n),Object.keys(t).length===0)return null;let o=k(t);return o&&(t.aiSource=o),t.landingPage=A(window.location.pathname,M),t.capturedDateTimeUtc=new Date().toISOString(),t}function Je(){let e=document.referrer;if(!e)return"";try{return new URL(e).hostname===window.location.hostname?"":A(e,M)}catch{return""}}function Qe(){de||(de=!0,C(e=>{let t=e.marketing?z():$(),n=e.marketing?$():z(),o=K(t);Ze(t),o&&pe(n,o)}))}function G(){return d().marketing?$():z()}function $(){try{return window.localStorage}catch{return null}}function z(){try{return window.sessionStorage}catch{return null}}function K(e){try{let t=e?.getItem(b);if(!t)return null;let n=JSON.parse(t),o=fe(n?.firstTouch),r=fe(n?.lastTouch);return!o&&!r?(e.removeItem(b),null):{firstTouch:o??r,lastTouch:r??o}}catch{return null}}function pe(e,t){try{e?.setItem(b,JSON.stringify(t))}catch{}}function Ze(e){try{e?.removeItem(b)}catch{}}function fe(e){if(!e||typeof e!="object")return null;let t=Date.parse(e.capturedDateTimeUtc);return Number.isFinite(t)&&Date.now()-t<=je?e:null}function A(e,t){let n=String(e??"").trim();return n?n.slice(0,t):""}function me(e){if(!y())throw new Error(`@webority/analytics: call initConsent before ${e}.`)}var et=["scroll","mousemove","touchstart","keydown","pointerdown"];function N(e){let t=!1,n=()=>{t||(t=!0,e())};for(let o of et)window.addEventListener(o,n,{once:!0,passive:!0});document.readyState==="complete"?setTimeout(n,1500):window.addEventListener("load",()=>setTimeout(n,1500),{once:!0})}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",LEAD_WON:"lead_won",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",REPORT_VERIFIED:"report_verified",CONTENT_ENGAGED:"content_engaged",EMAIL_CLICK:"email_click",PAGE_NOT_FOUND:"page_not_found",CHAT_OPENED:"chat_opened",TOUR_STARTED:"tour_started",TOUR_STEP_VIEWED:"tour_step_viewed",TOUR_COMPLETED:"tour_completed",TOUR_SKIPPED:"tour_skipped"}),Pt=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,leadWon:i.LEAD_WON,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,reportVerified:i.REPORT_VERIFIED,contentEngaged:i.CONTENT_ENGAGED,emailClick:i.EMAIL_CLICK,pageNotFound:i.PAGE_NOT_FOUND,chatOpened:i.CHAT_OPENED,tourStarted:i.TOUR_STARTED,tourStepViewed:i.TOUR_STEP_VIEWED,tourCompleted:i.TOUR_COMPLETED,tourSkipped:i.TOUR_SKIPPED}),ge=/^[a-z][a-z0-9]*(_[a-z0-9]+)*$/;var tt=50;function _e(){let e=new Set(Object.values(i)),t=new Set;return{warned:t,register(n){for(let o of n){if(!ge.test(o))throw new Error(`@webority/analytics: invalid event name "${o}". Expected snake_case.`);e.add(o)}},accept(n,o){return e.has(n)?!0:(nt(t,n,o),!1)}}}function nt(e,t,n){if(e.has(t))return;e.size<tt&&e.add(t);let o=`@webority/analytics: event "${t}" is not registered, so it was dropped. Call registerEvents() first.`;if(typeof n?.warn=="function"){n.warn(o);return}if(typeof n?.info=="function"){n.info(o);return}console.warn(o)}var ot=_e(),u={config:null,posthogInstance:null,posthogInitPromise:null,warnedUnregisteredEvents:ot.warned,pendingIdentify:null};function Kt(e){u.config=e,u.posthogInstance=null,u.posthogInitPromise=null,u.pendingIdentify=null}function rt(){let e=u.config;return e?!!(e.enabled&&e.clientKey&&e.environment!=="Local"):!1}function R(){return y()&&d().analytics}function Ee(){return rt()&&R()}var D=new Set,ye=new WeakSet,Ce=null;function Ht(e){let t=q();if(!t)return!1;try{return t.isFeatureEnabled(e)===!0}catch{return!1}}function Wt(e){let t=q();if(!t)return null;try{return t.getFeatureFlag(e)??null}catch{return null}}function Vt(e){D.add(e);let t=q();return(!t||Ce===t)&&queueMicrotask(()=>{D.has(e)&&Ie(e)}),()=>D.delete(e)}function Se(e){u.config?.featureFlags!==!0||ye.has(e)||typeof e.onFeatureFlags!="function"||(ye.add(e),e.onFeatureFlags(()=>{Ce=e;for(let t of[...D])Ie(t)}))}function q(){return u.config?.featureFlags!==!0||!Ee()?null:u.posthogInstance??null}function Ie(e){try{e()}catch(t){queueMicrotask(()=>{throw t})}}var it=new Set(["token","code","email","access_token","id_token","state","session_state","password","search","q","query"]),at=/(?:access_token|id_token|session_state|token|code|state|email|password)=/i,st=["$current_url","$referrer","$pathname","$initial_current_url","$initial_referrer","$initial_pathname","$session_entry_url","$session_entry_referrer","$session_entry_pathname"],ct=4,ut=5,lt=6;function h(e){if(typeof e!="string")return e;let t=e.indexOf("#"),n=t===-1?e:e.slice(0,t),o=t===-1||at.test(e.slice(t))?"":e.slice(t),r=n.indexOf("?");if(r===-1)return n+o;let c=n.slice(r+1).split("&"),s=c.filter(_=>!it.has(mt(_))).map(pt);if(s.length===c.length&&s.every((_,E)=>_===c[E]))return n+o;let p=n.slice(0,r),S=s.filter(_=>_!=="").join("&");return(S?`${p}?${S}`:p)+o}function he(e){if(!e||typeof e!="object")return e;let t=e.properties;for(let r of[t,e.$set,e.$set_once,t?.$set,t?.$set_once])ft(r);let n=t?.$heatmap_data;if(n&&typeof n=="object"){let r={};for(let[c,s]of Object.entries(n)){let p=h(c);r[p]=r[p]?r[p].concat(s):s}t.$heatmap_data=r}if(t&&typeof t=="object"){for(let[r,c]of Object.entries(t))if(r.startsWith("$web_vitals_")&&r.endsWith("_event")&&c&&typeof c=="object")for(let s of["$current_url","navigationURL"])typeof c[s]=="string"&&(c[s]=h(c[s]))}let o=t?.$snapshot_data;if(e.event==="$snapshot"&&o&&typeof o=="object")for(let r of Array.isArray(o)?o:[o])dt(r);return e}function dt(e){let t=e?.data;if(!(!t||typeof t!="object")){if(e.type===ct)L(t,["href"]);else if(e.type===ut)L(t.payload,["href"]);else if(e.type===lt&&Array.isArray(t.payload?.requests))for(let n of t.payload.requests)L(n,["name","url"])}}function L(e,t){if(!(!e||typeof e!="object"))for(let n of t)typeof e[n]=="string"&&(e[n]=h(e[n]))}function ft(e){L(e,st)}function pt(e){let t=e.indexOf("=");if(t===-1)return e;let n;try{n=decodeURIComponent(e.slice(t+1).replace(/\+/g," "))}catch{return e}if(!n.startsWith("/")&&!/^https?:\/\//i.test(n))return e;let o=h(n);return o===n?e:`${e.slice(0,t)}=${encodeURIComponent(o)}`}function mt(e){let t=e.split("=",1)[0].replace(/\+/g," ");try{return decodeURIComponent(t).toLowerCase()}catch{return t.toLowerCase()}}async function en(){if(u.posthogInstance)return u.posthogInstance;if(u.posthogInitPromise)return u.posthogInitPromise;let e=u.config;return u.posthogInitPromise=import("posthog-js").then(t=>{let n=t.default??t,o=j(H(e),R(),e.featureFlags===!0);return n.init(e.clientKey,o),n.register({product:e.product,surface:e.surface,environment:e.environment}),R()?n.opt_in_capturing({captureEventName:!1}):n.opt_out_capturing(),u.posthogInstance=n,Se(n),n}).catch(t=>{throw u.posthogInitPromise=null,t}),u.posthogInitPromise}function j(e,t,n=!1){return t?e:{...e,opt_out_capturing_by_default:!0,...n?{advanced_disable_feature_flags_on_first_load:!0}:{}}}function H(e){let t=e.sessionRecording??{enabled:!1},n={api_host:e.host,autocapture:!1,capture_pageview:"history_change",cookieless_mode:"on_reject",person_profiles:"identified_only",persistence:"localStorage+cookie",cross_subdomain_cookie:!0,disable_session_recording:!t.enabled,enable_heatmaps:e.heatmaps===!0,capture_exceptions:e.captureExceptions===!0,capture_performance:{web_vitals:e.webVitals===!0},disable_surveys:!0,disable_product_tours:!0,disable_conversations:!0,advanced_disable_feature_flags:!(t.enabled||e.featureFlags===!0),before_send:he};return t.enabled&&(n.session_recording={maskAllInputs:t.maskAllInputs??!0,...t.maskTextSelector?{maskTextSelector:t.maskTextSelector}:{},maskCapturedNetworkRequestFn:o=>({...o,name:h(o.name)}),recordBody:!1,recordHeaders:!1}),n}var gt=()=>import("posthog-js"),_t=100,l={config:null,posthog:null,pending:[],failed:!1,loadPosthog:gt,stopFollowingConsent:null};function Et({host:e,clientKey:t,product:n,surface:o,environment:r,enabled:c=!0,sessionRecording:s,heatmaps:p=!1,captureExceptions:S=!1,webVitals:_=!1}={}){if(!y())throw new Error("@webority/analytics: call initConsent before initSiteAnalytics.");!c||!e||!t||r==="Local"||l.config||(l.config={host:e,clientKey:t,product:n,surface:o,environment:r,sessionRecording:s,heatmaps:p,captureExceptions:S,webVitals:_},l.stopFollowingConsent=C(E=>Ct(E.analytics)),N(()=>{Promise.resolve().then(l.loadPosthog).then(E=>yt(E.default??E)).catch(()=>{l.failed=!0,l.pending=[]})}))}function yt(e){let t=l.config,n=d().analytics;e.init(t.clientKey,j(St(t),n)),e.register({product:t.product,surface:t.surface,environment:t.environment}),n?e.opt_in_capturing({captureEventName:!1}):e.opt_out_capturing(),l.posthog=e;let o=l.pending;l.pending=[];for(let[r,c]of o)we(e,r,c)}function Ct(e){l.posthog&&(e?l.posthog.opt_in_capturing():l.posthog.opt_out_capturing())}function St(e){return{...H({host:e.host,sessionRecording:e.sessionRecording,heatmaps:e.heatmaps,captureExceptions:e.captureExceptions,webVitals:e.webVitals}),capture_pageview:!0}}function Te(e,t){let n=l.config;if(!n)return;let o={...t,product:n.product,surface:n.surface,environment:n.environment};l.posthog?we(l.posthog,e,o):!l.failed&&l.pending.length<_t&&l.pending.push([e,o])}function we(e,t,n){try{e.capture(t,n)}catch{}}var It=new Set(Object.values(i));function ht(e,t={}){if(!It.has(e))return!1;let n=d().analytics,o=B(),r={...t};for(let[c,s]of[["first",o?.firstTouch],["last",o?.lastTouch]])s&&(r[`${c}_touch_channel`]=T(s),s.aiSource&&(r[`${c}_touch_ai_source`]=s.aiSource));return Te(e,r),n?(window.dataLayer=window.dataLayer||[],window.dataLayer.push({...r,event:e}),!0):!1}var Tt="https://www.googletagmanager.com/gtm.js",wt=3e3,Ot=100,g={loaded:!1,clarityId:null,clarityLoaded:!1,cancelClaritySchedule:null};function At(e={}){if(!y())throw new Error("@webority/analytics: call initConsent before loadTags.");if(g.loaded)return;g.loaded=!0;let{gtmId:t,gtmUrl:n=Tt,clarityId:o,ahrefsKey:r}=e;if(typeof n!="string"||n.trim()==="")throw new Error("@webority/analytics: gtmUrl must be a non-empty string.");let c=ae();if(r){let s=()=>V("https://analytics.ahrefs.com/analytics.js",{"data-key":r});c?Oe(p=>p.analytics,s):s()}if(t){let s=U(),p=X=>X.analytics||X.marketing&&s,S=()=>{window.dataLayer=window.dataLayer||[],window.dataLayer.push({"gtm.start":Date.now(),event:"gtm.js"}),V(`${n}${n.includes("?")?"&":"?"}id=${encodeURIComponent(t)}`)},_=d(),E=_.decided&&p(_)?bt:N,Y=()=>E(S);c?Oe(p,Y):Y()}o&&(g.clarityId=o,d().analytics&&Nt(),C(s=>{s.analytics&&!g.clarityLoaded?W():g.clarityLoaded&&Ae(s)}))}function Oe(e,t){if(e(d())){t();return}let n=C(o=>{e(o)&&(n(),t())})}function bt(e){document.readyState==="loading"?document.addEventListener("DOMContentLoaded",e,{once:!0}):e()}function Nt(){let e=()=>{window.scrollY>Ot&&W()};window.addEventListener("scroll",e,{passive:!0});let t=setTimeout(W,wt);g.cancelClaritySchedule=()=>{window.removeEventListener("scroll",e),clearTimeout(t)}}function W(){g.cancelClaritySchedule?.(),g.cancelClaritySchedule=null,!(g.clarityLoaded||!g.clarityId)&&(g.clarityLoaded=!0,window.clarity=window.clarity||function(){window.clarity.q=window.clarity.q||[],window.clarity.q.push(arguments)},Ae(d()),V(`https://www.clarity.ms/tag/${encodeURIComponent(g.clarityId)}`,{crossorigin:"anonymous"}))}function Ae(e){window.clarity("consentv2",{ad_Storage:e.marketing&&U()?"granted":"denied",analytics_Storage:e.analytics?"granted":"denied"})}function V(e,t={}){let n=document.createElement("script");n.async=!0,n.src=e;for(let[o,r]of Object.entries(t))n.setAttribute(o,r);document.head.appendChild(n)}export{Ue as a,O as b,oe as c,Fe as d,Pe as e,y as f,d as g,Me as h,C as i,i as j,Pt as k,ot as l,u as m,Kt as n,rt as o,R as p,Ht as q,Wt as r,Vt as s,en as t,f as u,T as v,k as w,Ve as x,B as y,Et as z,ht as A,At as B};
@@ -111,6 +111,12 @@
111
111
  "owner": "fleet",
112
112
  "personalData": "pseudonymous"
113
113
  },
114
+ "lead_won": {
115
+ "description": "Sales marked a lead as won.",
116
+ "stage": "revenue",
117
+ "owner": "fleet",
118
+ "personalData": "pseudonymous"
119
+ },
114
120
  "whatsapp_click": {
115
121
  "description": "A website visitor opened a WhatsApp chat.",
116
122
  "stage": "acquisition",
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
- import{existsSync as se,readFileSync as oe,writeFileSync as re}from"node:fs";import{basename as ie,resolve as ae}from"node:path";import{parseArgs as ce}from"node:util";var r=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",REPORT_VERIFIED:"report_verified",CONTENT_ENGAGED:"content_engaged",EMAIL_CLICK:"email_click",PAGE_NOT_FOUND:"page_not_found",CHAT_OPENED:"chat_opened",TOUR_STARTED:"tour_started",TOUR_STEP_VIEWED:"tour_step_viewed",TOUR_COMPLETED:"tour_completed",TOUR_SKIPPED:"tour_skipped"}),le=Object.freeze({signupStarted:r.SIGNUP_STARTED,signupCompleted:r.SIGNUP_COMPLETED,loginSucceeded:r.LOGIN_SUCCEEDED,onboardingStarted:r.ONBOARDING_STARTED,onboardingStepCompleted:r.ONBOARDING_STEP_COMPLETED,onboardingCompleted:r.ONBOARDING_COMPLETED,subscriptionActivated:r.SUBSCRIPTION_ACTIVATED,subscriptionCancelled:r.SUBSCRIPTION_CANCELLED,paymentSucceeded:r.PAYMENT_SUCCEEDED,paymentFailed:r.PAYMENT_FAILED,feedbackSubmitted:r.FEEDBACK_SUBMITTED,leadSubmitted:r.LEAD_SUBMITTED,leadQualified:r.LEAD_QUALIFIED,whatsappClick:r.WHATSAPP_CLICK,calculatorUse:r.CALCULATOR_USE,phoneClick:r.PHONE_CLICK,demoBooked:r.DEMO_BOOKED,contactSubmitted:r.CONTACT_SUBMITTED,trialStartClick:r.TRIAL_START_CLICK,sampleReportDownload:r.SAMPLE_REPORT_DOWNLOAD,reportVerified:r.REPORT_VERIFIED,contentEngaged:r.CONTENT_ENGAGED,emailClick:r.EMAIL_CLICK,pageNotFound:r.PAGE_NOT_FOUND,chatOpened:r.CHAT_OPENED,tourStarted:r.TOUR_STARTED,tourStepViewed:r.TOUR_STEP_VIEWED,tourCompleted:r.TOUR_COMPLETED,tourSkipped:r.TOUR_SKIPPED}),O=/^[a-z][a-z0-9]*(_[a-z0-9]+)*$/;function $(e){return e.split("_").map(o=>o.charAt(0).toUpperCase()+o.slice(1)).join("")}function C(e,{sender:o=null,productOnly:t=!1}={}){return[...e.events.values()].filter(s=>(!o||s.senders.includes(o))&&(!t||s.origin===e.product))}function P(e,{exportName:o="events",keys:t="constant",planLabel:s="tracking-plan.json"}={}){let n=[`// Generated by webority-analytics-generate-events from ${s}. Do not edit: change the plan and run the generator.`,`export const ${o} = Object.freeze({`];for(let i of e)n.push(` // ${v(i.description)} (${i.stage})`),n.push(` ${t==="pascal"?$(i.name):i.name.toUpperCase()}: "${i.name}",`);return n.push("});",""),n.join(`
3
- `)}function N(e,{namespace:o,className:t,accessibility:s="public",planLabel:n="tracking-plan.json"}){let i=["// <auto-generated>",`// Generated by webority-analytics-generate-events from ${n}. Do not edit: change the plan and run the generator.`,"// </auto-generated>","",`namespace ${o};`,"","/// <summary>",`/// Event names from ${D(n)}.`,"/// </summary>",`${s} static class ${t}`,"{"];return e.forEach((d,f)=>{f>0&&i.push(""),i.push(` /// <summary>${D(v(d.description))} Stage: ${d.stage}.</summary>`),i.push(` public const string ${$(d.name)} = "${d.name}";`)}),i.push("}",""),i.join(`
4
- `)}function v(e){return String(e??"").replace(/\s+/g," ").trim()}function D(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}import{readFileSync as z}from"node:fs";import{dirname as V,resolve as x}from"node:path";var k="@webority/analytics/fleet",j=Object.freeze(["acquisition","activation","engagement","retention","revenue","referral","support","quality"]),g=Object.freeze(["none","pseudonymous","personal"]),I=Object.freeze(["string","integer","number","boolean","array","object"]),L=/^[a-z][a-z0-9]*(_[a-z0-9]+)*$/,U=new Set(["properties","senders"]),Y=new Set(["$schema","product","extends","description","commonProperties","events","sources"]),W=new Set(["description","stage","owner","personalData","senders","properties"]),H=new Set(["type","description","values","nullable","personalData"]),J=new Set(["sender","language","constants","references","calls","ignoreConstants","scan","exclude"]),X=/^[A-Za-z_$][\w$]*$/,q=new Set(["csharp","javascript"]),R=4,Q=new URL("./fleet-tracking-plan.json",import.meta.url);function w(e){return M(x(e),0)}function M(e,o){let t=typeof e=="string"?e:"fleet-tracking-plan.json",s=[],n;try{n=JSON.parse(z(e,"utf8"))}catch(f){return{plan:null,problems:[`${t}: cannot read the plan (${f.message})`]}}if(s.push(...ee(n,t)),s.length>0)return{plan:null,problems:s};let i=null;if(n.extends!==void 0){if(o>=R)return{plan:null,problems:[`${t}: "extends" is nested more than ${R} deep`]};let f=n.extends===k?Q:x(V(String(e)),n.extends),a=M(f,o+1);if(!a.plan)return{plan:null,problems:a.problems};i=a.plan}let d=Z(i,n,t);return{plan:d.plan,problems:d.problems}}function Z(e,o,t="plan"){let s=[],n=new Map,i=new Map(e?.commonProperties??[]);for(let[a,c]of e?.events??[])n.set(a,{...c,properties:new Map(c.properties),senders:[...c.senders]});for(let[a,c]of Object.entries(o.commonProperties??{})){let l=i.get(a);if(l&&l.type!==c.type){s.push(`${t}: common property "${a}" is ${c.type} here but ${l.type} in the base plan`);continue}i.set(a,{...c,origin:l?.origin??o.product})}for(let[a,c]of Object.entries(o.events??{})){let l=n.get(a);if(!l){let u=["description","stage","owner","personalData"].filter(E=>c[E]===void 0);u.length>0&&s.push(`${t}: event "${a}" is not in the base plan, so it needs description, stage, owner and personalData (missing ${u.join(", ")})`),n.set(a,{name:a,description:c.description,stage:c.stage,owner:c.owner,personalData:c.personalData,senders:[...c.senders??[]],properties:new Map(Object.entries(c.properties??{})),origin:o.product});continue}for(let u of Object.keys(c))U.has(u)||s.push(`${t}: event "${a}" is defined by the base plan, so it may only add properties or senders (found "${u}")`);for(let u of c.senders??[])l.senders.includes(u)||l.senders.push(u);for(let[u,E]of Object.entries(c.properties??{})){let h=l.properties.get(u);if(h&&h.type!==E.type){s.push(`${t}: "${a}.${u}" is ${E.type} here but ${h.type} in the base plan`);continue}l.properties.set(u,E)}}for(let[a,c]of n)for(let l of c.properties.keys())i.has(l)&&s.push(`${t}: "${a}.${l}" is already a common property, so it must not be declared on the event`);let d=o.sources??[],f=new Set(d.map(a=>a.sender));if(d.length>0)for(let[a,c]of Object.entries(o.events??{}))for(let l of c.senders??[])f.has(l)||s.push(`${t}: event "${a}" names sender "${l}", which no source declares`);return{plan:{product:o.product,events:n,commonProperties:i,sources:d,file:t},problems:s}}function ee(e,o="plan"){let t=[],s=n=>t.push(`${o}: ${n}`);if(!m(e))return s("the plan must be a JSON object"),t;if(y(e,Y,"the plan",s),(typeof e.product!="string"||!L.test(e.product))&&s('"product" must be a snake_case product slug'),e.extends!==void 0&&(typeof e.extends!="string"||e.extends.length===0)&&s(`"extends" must be "${k}" or a path to another plan`),!m(e.events))s('"events" must be an object keyed by event name');else for(let[n,i]of Object.entries(e.events))te(n,i,s);if(e.commonProperties!==void 0&&F("commonProperties",e.commonProperties,s),e.sources!==void 0)if(!Array.isArray(e.sources))s('"sources" must be an array');else for(let[n,i]of e.sources.entries())ne(i,n,s);return t}function te(e,o,t){if(O.test(e)||t(`event "${e}" is not a snake_case name`),!m(o)){t(`event "${e}" must be an object`);return}y(o,W,`event "${e}"`,t),Object.keys(o).every(n=>U.has(n))||((typeof o.description!="string"||o.description.trim()==="")&&t(`event "${e}" needs a description`),j.includes(o.stage)||t(`event "${e}" stage must be one of ${j.join(", ")}`),(typeof o.owner!="string"||o.owner.trim()==="")&&t(`event "${e}" needs an owner`),g.includes(o.personalData)||t(`event "${e}" personalData must be one of ${g.join(", ")}`)),o.senders!==void 0&&(!Array.isArray(o.senders)||o.senders.some(n=>typeof n!="string"))&&t(`event "${e}" senders must be an array of sender names`),o.properties!==void 0&&F(`event "${e}"`,o.properties,t)}function F(e,o,t){if(!m(o)){t(`${e} properties must be an object keyed by property name`);return}for(let[s,n]of Object.entries(o)){if(L.test(s)||t(`${e} property "${s}" is not a snake_case name`),!m(n)){t(`${e} property "${s}" must be an object`);continue}y(n,H,`${e} property "${s}"`,t),I.includes(n.type)||t(`${e} property "${s}" type must be one of ${I.join(", ")}`),n.values!==void 0&&(!Array.isArray(n.values)||n.values.length===0)&&t(`${e} property "${s}" values must be a non-empty array`),n.nullable!==void 0&&typeof n.nullable!="boolean"&&t(`${e} property "${s}" nullable must be true or false`),n.personalData!==void 0&&!g.includes(n.personalData)&&t(`${e} property "${s}" personalData must be one of ${g.join(", ")}`)}}function ne(e,o,t){let s=`sources[${o}]`;if(!m(e)){t(`${s} must be an object`);return}y(e,J,s,t),(typeof e.sender!="string"||e.sender==="")&&t(`${s} needs a sender`),q.has(e.language)||t(`${s} language must be csharp or javascript`);for(let n of["constants","references","calls","ignoreConstants","scan","exclude"])e[n]!==void 0&&(!Array.isArray(e[n])||e[n].some(i=>typeof i!="string"))&&t(`${s} ${n} must be an array of strings`);Array.isArray(e.calls)&&e.calls.some(n=>typeof n=="string"&&!X.test(n))&&t(`${s} calls must be function names, such as trackSiteEvent`),(e.constants?.length??0)===0&&((e.references?.length??0)>0||(e.calls?.length??0)===0)&&t(`${s} needs at least one constants file, unless it has calls and no references`)}function y(e,o,t,s){for(let n of Object.keys(e))o.has(n)||s(`${t} has an unknown field "${n}"`)}function m(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var S=`usage: webority-analytics-generate-events --plan <tracking-plan.json> [--js <file> [--js-export <name>] [--js-keys constant|pascal]] [--cs <file> --cs-namespace <ns> --cs-class <name> [--cs-internal]] [--sender <sender>] [--product-only] [--check]
2
+ import{existsSync as se,readFileSync as oe,writeFileSync as re}from"node:fs";import{basename as ie,resolve as ae}from"node:path";import{parseArgs as ce}from"node:util";var r=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",LEAD_WON:"lead_won",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",REPORT_VERIFIED:"report_verified",CONTENT_ENGAGED:"content_engaged",EMAIL_CLICK:"email_click",PAGE_NOT_FOUND:"page_not_found",CHAT_OPENED:"chat_opened",TOUR_STARTED:"tour_started",TOUR_STEP_VIEWED:"tour_step_viewed",TOUR_COMPLETED:"tour_completed",TOUR_SKIPPED:"tour_skipped"}),le=Object.freeze({signupStarted:r.SIGNUP_STARTED,signupCompleted:r.SIGNUP_COMPLETED,loginSucceeded:r.LOGIN_SUCCEEDED,onboardingStarted:r.ONBOARDING_STARTED,onboardingStepCompleted:r.ONBOARDING_STEP_COMPLETED,onboardingCompleted:r.ONBOARDING_COMPLETED,subscriptionActivated:r.SUBSCRIPTION_ACTIVATED,subscriptionCancelled:r.SUBSCRIPTION_CANCELLED,paymentSucceeded:r.PAYMENT_SUCCEEDED,paymentFailed:r.PAYMENT_FAILED,feedbackSubmitted:r.FEEDBACK_SUBMITTED,leadSubmitted:r.LEAD_SUBMITTED,leadQualified:r.LEAD_QUALIFIED,leadWon:r.LEAD_WON,whatsappClick:r.WHATSAPP_CLICK,calculatorUse:r.CALCULATOR_USE,phoneClick:r.PHONE_CLICK,demoBooked:r.DEMO_BOOKED,contactSubmitted:r.CONTACT_SUBMITTED,trialStartClick:r.TRIAL_START_CLICK,sampleReportDownload:r.SAMPLE_REPORT_DOWNLOAD,reportVerified:r.REPORT_VERIFIED,contentEngaged:r.CONTENT_ENGAGED,emailClick:r.EMAIL_CLICK,pageNotFound:r.PAGE_NOT_FOUND,chatOpened:r.CHAT_OPENED,tourStarted:r.TOUR_STARTED,tourStepViewed:r.TOUR_STEP_VIEWED,tourCompleted:r.TOUR_COMPLETED,tourSkipped:r.TOUR_SKIPPED}),O=/^[a-z][a-z0-9]*(_[a-z0-9]+)*$/;function $(e){return e.split("_").map(o=>o.charAt(0).toUpperCase()+o.slice(1)).join("")}function C(e,{sender:o=null,productOnly:t=!1}={}){return[...e.events.values()].filter(s=>(!o||s.senders.includes(o))&&(!t||s.origin===e.product))}function N(e,{exportName:o="events",keys:t="constant",planLabel:s="tracking-plan.json"}={}){let n=[`// Generated by webority-analytics-generate-events from ${s}. Do not edit: change the plan and run the generator.`,`export const ${o} = Object.freeze({`];for(let i of e)n.push(` // ${v(i.description)} (${i.stage})`),n.push(` ${t==="pascal"?$(i.name):i.name.toUpperCase()}: "${i.name}",`);return n.push("});",""),n.join(`
3
+ `)}function P(e,{namespace:o,className:t,accessibility:s="public",planLabel:n="tracking-plan.json"}){let i=["// <auto-generated>",`// Generated by webority-analytics-generate-events from ${n}. Do not edit: change the plan and run the generator.`,"// </auto-generated>","",`namespace ${o};`,"","/// <summary>",`/// Event names from ${D(n)}.`,"/// </summary>",`${s} static class ${t}`,"{"];return e.forEach((u,f)=>{f>0&&i.push(""),i.push(` /// <summary>${D(v(u.description))} Stage: ${u.stage}.</summary>`),i.push(` public const string ${$(u.name)} = "${u.name}";`)}),i.push("}",""),i.join(`
4
+ `)}function v(e){return String(e??"").replace(/\s+/g," ").trim()}function D(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}import{readFileSync as z}from"node:fs";import{dirname as V,resolve as x}from"node:path";var k="@webority/analytics/fleet",j=Object.freeze(["acquisition","activation","engagement","retention","revenue","referral","support","quality"]),g=Object.freeze(["none","pseudonymous","personal"]),I=Object.freeze(["string","integer","number","boolean","array","object"]),L=/^[a-z][a-z0-9]*(_[a-z0-9]+)*$/,U=new Set(["properties","senders"]),W=new Set(["$schema","product","extends","description","commonProperties","events","sources"]),Y=new Set(["description","stage","owner","personalData","senders","properties"]),H=new Set(["type","description","values","nullable","personalData"]),J=new Set(["sender","language","constants","references","calls","ignoreConstants","scan","exclude"]),X=/^[A-Za-z_$][\w$]*$/,q=new Set(["csharp","javascript"]),R=4,Q=new URL("./fleet-tracking-plan.json",import.meta.url);function w(e){return M(x(e),0)}function M(e,o){let t=typeof e=="string"?e:"fleet-tracking-plan.json",s=[],n;try{n=JSON.parse(z(e,"utf8"))}catch(f){return{plan:null,problems:[`${t}: cannot read the plan (${f.message})`]}}if(s.push(...ee(n,t)),s.length>0)return{plan:null,problems:s};let i=null;if(n.extends!==void 0){if(o>=R)return{plan:null,problems:[`${t}: "extends" is nested more than ${R} deep`]};let f=n.extends===k?Q:x(V(String(e)),n.extends),a=M(f,o+1);if(!a.plan)return{plan:null,problems:a.problems};i=a.plan}let u=Z(i,n,t);return{plan:u.plan,problems:u.problems}}function Z(e,o,t="plan"){let s=[],n=new Map,i=new Map(e?.commonProperties??[]);for(let[a,c]of e?.events??[])n.set(a,{...c,properties:new Map(c.properties),senders:[...c.senders]});for(let[a,c]of Object.entries(o.commonProperties??{})){let l=i.get(a);if(l&&l.type!==c.type){s.push(`${t}: common property "${a}" is ${c.type} here but ${l.type} in the base plan`);continue}i.set(a,{...c,origin:l?.origin??o.product})}for(let[a,c]of Object.entries(o.events??{})){let l=n.get(a);if(!l){let d=["description","stage","owner","personalData"].filter(E=>c[E]===void 0);d.length>0&&s.push(`${t}: event "${a}" is not in the base plan, so it needs description, stage, owner and personalData (missing ${d.join(", ")})`),n.set(a,{name:a,description:c.description,stage:c.stage,owner:c.owner,personalData:c.personalData,senders:[...c.senders??[]],properties:new Map(Object.entries(c.properties??{})),origin:o.product});continue}for(let d of Object.keys(c))U.has(d)||s.push(`${t}: event "${a}" is defined by the base plan, so it may only add properties or senders (found "${d}")`);for(let d of c.senders??[])l.senders.includes(d)||l.senders.push(d);for(let[d,E]of Object.entries(c.properties??{})){let h=l.properties.get(d);if(h&&h.type!==E.type){s.push(`${t}: "${a}.${d}" is ${E.type} here but ${h.type} in the base plan`);continue}l.properties.set(d,E)}}for(let[a,c]of n)for(let l of c.properties.keys())i.has(l)&&s.push(`${t}: "${a}.${l}" is already a common property, so it must not be declared on the event`);let u=o.sources??[],f=new Set(u.map(a=>a.sender));if(u.length>0)for(let[a,c]of Object.entries(o.events??{}))for(let l of c.senders??[])f.has(l)||s.push(`${t}: event "${a}" names sender "${l}", which no source declares`);return{plan:{product:o.product,events:n,commonProperties:i,sources:u,file:t},problems:s}}function ee(e,o="plan"){let t=[],s=n=>t.push(`${o}: ${n}`);if(!m(e))return s("the plan must be a JSON object"),t;if(y(e,W,"the plan",s),(typeof e.product!="string"||!L.test(e.product))&&s('"product" must be a snake_case product slug'),e.extends!==void 0&&(typeof e.extends!="string"||e.extends.length===0)&&s(`"extends" must be "${k}" or a path to another plan`),!m(e.events))s('"events" must be an object keyed by event name');else for(let[n,i]of Object.entries(e.events))te(n,i,s);if(e.commonProperties!==void 0&&F("commonProperties",e.commonProperties,s),e.sources!==void 0)if(!Array.isArray(e.sources))s('"sources" must be an array');else for(let[n,i]of e.sources.entries())ne(i,n,s);return t}function te(e,o,t){if(O.test(e)||t(`event "${e}" is not a snake_case name`),!m(o)){t(`event "${e}" must be an object`);return}y(o,Y,`event "${e}"`,t),Object.keys(o).every(n=>U.has(n))||((typeof o.description!="string"||o.description.trim()==="")&&t(`event "${e}" needs a description`),j.includes(o.stage)||t(`event "${e}" stage must be one of ${j.join(", ")}`),(typeof o.owner!="string"||o.owner.trim()==="")&&t(`event "${e}" needs an owner`),g.includes(o.personalData)||t(`event "${e}" personalData must be one of ${g.join(", ")}`)),o.senders!==void 0&&(!Array.isArray(o.senders)||o.senders.some(n=>typeof n!="string"))&&t(`event "${e}" senders must be an array of sender names`),o.properties!==void 0&&F(`event "${e}"`,o.properties,t)}function F(e,o,t){if(!m(o)){t(`${e} properties must be an object keyed by property name`);return}for(let[s,n]of Object.entries(o)){if(L.test(s)||t(`${e} property "${s}" is not a snake_case name`),!m(n)){t(`${e} property "${s}" must be an object`);continue}y(n,H,`${e} property "${s}"`,t),I.includes(n.type)||t(`${e} property "${s}" type must be one of ${I.join(", ")}`),n.values!==void 0&&(!Array.isArray(n.values)||n.values.length===0)&&t(`${e} property "${s}" values must be a non-empty array`),n.nullable!==void 0&&typeof n.nullable!="boolean"&&t(`${e} property "${s}" nullable must be true or false`),n.personalData!==void 0&&!g.includes(n.personalData)&&t(`${e} property "${s}" personalData must be one of ${g.join(", ")}`)}}function ne(e,o,t){let s=`sources[${o}]`;if(!m(e)){t(`${s} must be an object`);return}y(e,J,s,t),(typeof e.sender!="string"||e.sender==="")&&t(`${s} needs a sender`),q.has(e.language)||t(`${s} language must be csharp or javascript`);for(let n of["constants","references","calls","ignoreConstants","scan","exclude"])e[n]!==void 0&&(!Array.isArray(e[n])||e[n].some(i=>typeof i!="string"))&&t(`${s} ${n} must be an array of strings`);Array.isArray(e.calls)&&e.calls.some(n=>typeof n=="string"&&!X.test(n))&&t(`${s} calls must be function names, such as trackSiteEvent`),(e.constants?.length??0)===0&&((e.references?.length??0)>0||(e.calls?.length??0)===0)&&t(`${s} needs at least one constants file, unless it has calls and no references`)}function y(e,o,t,s){for(let n of Object.keys(e))o.has(n)||s(`${t} has an unknown field "${n}"`)}function m(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var S=`usage: webority-analytics-generate-events --plan <tracking-plan.json> [--js <file> [--js-export <name>] [--js-keys constant|pascal]] [--cs <file> --cs-namespace <ns> --cs-class <name> [--cs-internal]] [--sender <sender>] [--product-only] [--check]
5
5
  `,p;try{p=ce({options:{plan:{type:"string"},js:{type:"string"},"js-export":{type:"string"},"js-keys":{type:"string"},cs:{type:"string"},"cs-namespace":{type:"string"},"cs-class":{type:"string"},"cs-internal":{type:"boolean"},sender:{type:"string"},"product-only":{type:"boolean"},check:{type:"boolean"},help:{type:"boolean"}}}).values}catch(e){process.stderr.write(`${e.message}
6
6
  ${S}`),process.exit(2)}p.help&&(process.stdout.write(S),process.exit(0));var G=pe(p);G&&(process.stderr.write(`${G}
7
7
  ${S}`),process.exit(2));var{plan:K,problems:b}=w(p.plan);if(!K||b.length>0){process.stderr.write(`The tracking plan has ${b.length} problem(s):
8
8
  `);for(let e of b)process.stderr.write(` ${e}
9
- `);process.exit(1)}var T=C(K,{sender:p.sender??null,productOnly:p["product-only"]??!1}),A=ie(p.plan),_=[];p.js&&_.push([p.js,P(T,{exportName:p["js-export"]??"events",keys:p["js-keys"]??"constant",planLabel:A})]);p.cs&&_.push([p.cs,N(T,{namespace:p["cs-namespace"],className:p["cs-class"],accessibility:p["cs-internal"]?"internal":"public",planLabel:A})]);var B=0;for(let[e,o]of _){let t=ae(e);if(p.check){let s=se(t)?oe(t,"utf8").replace(/\r\n/g,`
9
+ `);process.exit(1)}var T=C(K,{sender:p.sender??null,productOnly:p["product-only"]??!1}),A=ie(p.plan),_=[];p.js&&_.push([p.js,N(T,{exportName:p["js-export"]??"events",keys:p["js-keys"]??"constant",planLabel:A})]);p.cs&&_.push([p.cs,P(T,{namespace:p["cs-namespace"],className:p["cs-class"],accessibility:p["cs-internal"]?"internal":"public",planLabel:A})]);var B=0;for(let[e,o]of _){let t=ae(e);if(p.check){let s=se(t)?oe(t,"utf8").replace(/\r\n/g,`
10
10
  `):null;s!==o&&(B++,process.stderr.write(`${e} is ${s===null?"missing":"out of date"}; run webority-analytics-generate-events without --check
11
11
  `));continue}re(t,o),process.stdout.write(`Wrote ${T.length} events to ${e}
12
12
  `)}B>0&&process.exit(1);p.check&&process.stdout.write(`OK: ${_.length} generated file(s) match ${A}.
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{A as H,B as M,a as A,b as P,c as S,d as F,e as N,f as b,g as U,h as j,i as m,j as a,k as C,l as E,m as n,n as O,o as s,p as i,q as K,r as D,s as L,t as c,u as W,v as G,w as V,x as q,y as z}from"./chunk-KXTYI3NY.js";var x=null,p=new Map,Y="workspace";function B(t){if(!b())throw new Error("@webority/analytics: call initConsent before initAnalytics.");x?.(),x=m(e=>Q(e.analytics)),p.clear(),O({host:t.host,clientKey:t.clientKey,product:t.product,surface:t.surface,environment:t.environment,enabled:t.enabled??!0,logger:t.logger??null,sessionRecording:{enabled:t.sessionRecording?.enabled??!1,maskAllInputs:t.sessionRecording?.maskAllInputs??!0,maskTextSelector:t.sessionRecording?.maskTextSelector??null},heatmaps:t.heatmaps??!1,captureExceptions:t.captureExceptions??!1,webVitals:t.webVitals??!1,featureFlags:t.featureFlags===!0}),s()&&J()}function J(){let t=()=>{s()&&R()};typeof requestIdleCallback=="function"?requestIdleCallback(t,{timeout:3e3}):setTimeout(t,0)}function R(){c().catch(()=>{})}function Q(t){if(s()){if(t){n.posthogInstance?(n.posthogInstance.opt_in_capturing(),T(n.posthogInstance),w(n.posthogInstance)):c().then(e=>{T(e),e&&w(e)}).catch(()=>{});return}!n.posthogInstance&&!n.posthogInitPromise&&R(),X()}}function T(t){if(!t||!i())return;let e=n.pendingIdentify;e&&t.identify(e.publicId,e.props);for(let[r,{key:o,props:l}]of p)t.group(r,o,l)}function w(t){n.config?.featureFlags===!0&&i()&&t.reloadFeatureFlags?.()}function X(){if(n.posthogInstance){n.posthogInstance.opt_out_capturing();return}n.posthogInitPromise&&n.posthogInitPromise.then(t=>{i()||t?.opt_out_capturing()}).catch(()=>{})}function Z(t,e={}){if(!s()){h("identify",{publicId:t,...e});return}n.pendingIdentify={publicId:t,props:e},i()&&c().then(r=>{!r||!i()||r.identify(t,e)}).catch(()=>{})}function $(t,e,r={}){if(typeof t!="string"||!t||typeof e!="string"||!e){n.config?.logger?.warn?.("@webority/analytics: group needs a type and a PublicId string, so it was dropped.");return}if(!s()){h("group",{type:t,key:e,...r});return}p.set(t,{key:e,props:r}),i()&&c().then(o=>{!o||!i()||o.group(t,e,r)}).catch(()=>{})}function tt(){n.pendingIdentify=null,p.clear(),n.posthogInstance&&n.posthogInstance.reset()}function et(t){E.register(t)}function u(t,e={}){E.accept(t,n.config?.logger)&&nt(t,e)}function nt(t,e){if(!s()){h(t,e);return}let r={...e,product:n.config.product,surface:n.config.surface,environment:n.config.environment};c().then(o=>{o?.capture(t,r)}).catch(()=>{})}function h(t,e){n.config?.environment==="Local"&&n.config.logger?.info(t,e)}function rt(){if(typeof document>"u")return()=>{};for(let[t,e]of Object.entries(k))document.addEventListener(t,e);return()=>{for(let[t,e]of Object.entries(k))document.removeEventListener(t,e)}}function ot(t){d(a.TOUR_STARTED,t,{step_count:f(t.detail?.total)})}function it(t){d(a.TOUR_STEP_VIEWED,t,{step_position:f(t.detail?.position),step_count:f(t.detail?.total)})}function st(t){let e=t.detail,r={step_position:f(e?.position),step_count:f(e?.total)};e?.reason==="finished"?d(a.TOUR_COMPLETED,t,r):e?.reason==="skipped"&&d(a.TOUR_SKIPPED,t,{...r,via:I(e.via)})}var k={"wui-tour:start":ot,"wui-tour:step":it,"wui-tour:close":st};function d(t,e,r){let o=e.target,l=I(o?.getAttribute?.("tour-id"));if(!l)return;let g={tour_id:l},y=I(o.getAttribute("trigger"));y&&(g.trigger=y);for(let[v,_]of Object.entries(r))_!==void 0&&(g[v]=_);u(t,g)}function f(t){return Number.isInteger(t)&&t>=0?t:void 0}function I(t){return typeof t=="string"&&t!==""?t:void 0}var at=Object.freeze(Object.fromEntries(Object.entries(C).map(([t,e])=>[t,(r={})=>u(e,r)])));export{S as CONSENT_CHANGE_EVENT,P as CONSENT_COOKIE_NAME,Y as WORKSPACE_GROUP_TYPE,q as captureAttribution,W as channels,a as events,z as getAttribution,U as getConsent,D as getFeatureFlag,$ as group,Z as identify,B as initAnalytics,F as initConsent,K as isFeatureEnabled,M as loadTags,m as onConsentChange,L as onFeatureFlags,et as registerEvents,A as requiresOptIn,tt as resetIdentity,V as resolveAiSource,G as resolveChannel,j as saveConsent,N as setConsentRegion,at as track,u as trackEvent,H as trackSiteEvent,rt as trackTours};
1
+ import{A as H,B as M,a as A,b as P,c as S,d as F,e as N,f as b,g as U,h as j,i as m,j as a,k as C,l as E,m as n,n as O,o as s,p as i,q as K,r as D,s as L,t as c,u as W,v as G,w as V,x as q,y as z}from"./chunk-YB7OUORE.js";var x=null,p=new Map,Y="workspace";function B(t){if(!b())throw new Error("@webority/analytics: call initConsent before initAnalytics.");x?.(),x=m(e=>Q(e.analytics)),p.clear(),O({host:t.host,clientKey:t.clientKey,product:t.product,surface:t.surface,environment:t.environment,enabled:t.enabled??!0,logger:t.logger??null,sessionRecording:{enabled:t.sessionRecording?.enabled??!1,maskAllInputs:t.sessionRecording?.maskAllInputs??!0,maskTextSelector:t.sessionRecording?.maskTextSelector??null},heatmaps:t.heatmaps??!1,captureExceptions:t.captureExceptions??!1,webVitals:t.webVitals??!1,featureFlags:t.featureFlags===!0}),s()&&J()}function J(){let t=()=>{s()&&R()};typeof requestIdleCallback=="function"?requestIdleCallback(t,{timeout:3e3}):setTimeout(t,0)}function R(){c().catch(()=>{})}function Q(t){if(s()){if(t){n.posthogInstance?(n.posthogInstance.opt_in_capturing(),T(n.posthogInstance),w(n.posthogInstance)):c().then(e=>{T(e),e&&w(e)}).catch(()=>{});return}!n.posthogInstance&&!n.posthogInitPromise&&R(),X()}}function T(t){if(!t||!i())return;let e=n.pendingIdentify;e&&t.identify(e.publicId,e.props);for(let[r,{key:o,props:l}]of p)t.group(r,o,l)}function w(t){n.config?.featureFlags===!0&&i()&&t.reloadFeatureFlags?.()}function X(){if(n.posthogInstance){n.posthogInstance.opt_out_capturing();return}n.posthogInitPromise&&n.posthogInitPromise.then(t=>{i()||t?.opt_out_capturing()}).catch(()=>{})}function Z(t,e={}){if(!s()){h("identify",{publicId:t,...e});return}n.pendingIdentify={publicId:t,props:e},i()&&c().then(r=>{!r||!i()||r.identify(t,e)}).catch(()=>{})}function $(t,e,r={}){if(typeof t!="string"||!t||typeof e!="string"||!e){n.config?.logger?.warn?.("@webority/analytics: group needs a type and a PublicId string, so it was dropped.");return}if(!s()){h("group",{type:t,key:e,...r});return}p.set(t,{key:e,props:r}),i()&&c().then(o=>{!o||!i()||o.group(t,e,r)}).catch(()=>{})}function tt(){n.pendingIdentify=null,p.clear(),n.posthogInstance&&n.posthogInstance.reset()}function et(t){E.register(t)}function u(t,e={}){E.accept(t,n.config?.logger)&&nt(t,e)}function nt(t,e){if(!s()){h(t,e);return}let r={...e,product:n.config.product,surface:n.config.surface,environment:n.config.environment};c().then(o=>{o?.capture(t,r)}).catch(()=>{})}function h(t,e){n.config?.environment==="Local"&&n.config.logger?.info(t,e)}function rt(){if(typeof document>"u")return()=>{};for(let[t,e]of Object.entries(k))document.addEventListener(t,e);return()=>{for(let[t,e]of Object.entries(k))document.removeEventListener(t,e)}}function ot(t){d(a.TOUR_STARTED,t,{step_count:f(t.detail?.total)})}function it(t){d(a.TOUR_STEP_VIEWED,t,{step_position:f(t.detail?.position),step_count:f(t.detail?.total)})}function st(t){let e=t.detail,r={step_position:f(e?.position),step_count:f(e?.total)};e?.reason==="finished"?d(a.TOUR_COMPLETED,t,r):e?.reason==="skipped"&&d(a.TOUR_SKIPPED,t,{...r,via:I(e.via)})}var k={"wui-tour:start":ot,"wui-tour:step":it,"wui-tour:close":st};function d(t,e,r){let o=e.target,l=I(o?.getAttribute?.("tour-id"));if(!l)return;let g={tour_id:l},y=I(o.getAttribute("trigger"));y&&(g.trigger=y);for(let[v,_]of Object.entries(r))_!==void 0&&(g[v]=_);u(t,g)}function f(t){return Number.isInteger(t)&&t>=0?t:void 0}function I(t){return typeof t=="string"&&t!==""?t:void 0}var at=Object.freeze(Object.fromEntries(Object.entries(C).map(([t,e])=>[t,(r={})=>u(e,r)])));export{S as CONSENT_CHANGE_EVENT,P as CONSENT_COOKIE_NAME,Y as WORKSPACE_GROUP_TYPE,q as captureAttribution,W as channels,a as events,z as getAttribution,U as getConsent,D as getFeatureFlag,$ as group,Z as identify,B as initAnalytics,F as initConsent,K as isFeatureEnabled,M as loadTags,m as onConsentChange,L as onFeatureFlags,et as registerEvents,A as requiresOptIn,tt as resetIdentity,V as resolveAiSource,G as resolveChannel,j as saveConsent,N as setConsentRegion,at as track,u as trackEvent,H as trackSiteEvent,rt as trackTours};
@@ -1 +1 @@
1
- var o=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",REPORT_VERIFIED:"report_verified",CONTENT_ENGAGED:"content_engaged",EMAIL_CLICK:"email_click",PAGE_NOT_FOUND:"page_not_found",CHAT_OPENED:"chat_opened",TOUR_STARTED:"tour_started",TOUR_STEP_VIEWED:"tour_step_viewed",TOUR_COMPLETED:"tour_completed",TOUR_SKIPPED:"tour_skipped"}),K=Object.freeze({signupStarted:o.SIGNUP_STARTED,signupCompleted:o.SIGNUP_COMPLETED,loginSucceeded:o.LOGIN_SUCCEEDED,onboardingStarted:o.ONBOARDING_STARTED,onboardingStepCompleted:o.ONBOARDING_STEP_COMPLETED,onboardingCompleted:o.ONBOARDING_COMPLETED,subscriptionActivated:o.SUBSCRIPTION_ACTIVATED,subscriptionCancelled:o.SUBSCRIPTION_CANCELLED,paymentSucceeded:o.PAYMENT_SUCCEEDED,paymentFailed:o.PAYMENT_FAILED,feedbackSubmitted:o.FEEDBACK_SUBMITTED,leadSubmitted:o.LEAD_SUBMITTED,leadQualified:o.LEAD_QUALIFIED,whatsappClick:o.WHATSAPP_CLICK,calculatorUse:o.CALCULATOR_USE,phoneClick:o.PHONE_CLICK,demoBooked:o.DEMO_BOOKED,contactSubmitted:o.CONTACT_SUBMITTED,trialStartClick:o.TRIAL_START_CLICK,sampleReportDownload:o.SAMPLE_REPORT_DOWNLOAD,reportVerified:o.REPORT_VERIFIED,contentEngaged:o.CONTENT_ENGAGED,emailClick:o.EMAIL_CLICK,pageNotFound:o.PAGE_NOT_FOUND,chatOpened:o.CHAT_OPENED,tourStarted:o.TOUR_STARTED,tourStepViewed:o.TOUR_STEP_VIEWED,tourCompleted:o.TOUR_COMPLETED,tourSkipped:o.TOUR_SKIPPED}),D=/^[a-z][a-z0-9]*(_[a-z0-9]+)*$/;var b=50;function P(){let e=new Set(Object.values(o)),t=new Set;return{warned:t,register(r){for(let i of r){if(!D.test(i))throw new Error(`@webority/analytics: invalid event name "${i}". Expected snake_case.`);e.add(i)}},accept(r,i){return e.has(r)?!0:(v(t,r,i),!1)}}}function v(e,t,r){if(e.has(t))return;e.size<b&&e.add(t);let i=`@webority/analytics: event "${t}" is not registered, so it was dropped. Call registerEvents() first.`;if(typeof r?.warn=="function"){r.warn(i);return}if(typeof r?.info=="function"){r.info(i);return}console.warn(i)}var E=null;function F(e){E=e}async function N(){if(E)return E.PostHog??null;try{let e=await import("posthog-react-native");return e.PostHog??e.default?.PostHog??e.default??null}catch{return null}}function R(e){return{host:e.host,defaultOptIn:!1,personProfiles:"identified_only",captureAppLifecycleEvents:!1,enableSessionReplay:!1,preloadFeatureFlags:!1,disableRemoteFeatureFlags:e.featureFlags!==!0,disableSurveys:!0}}var _="webority_analytics_consent",U=["eea","other"],$="workspace",n={config:null,initPromise:null,posthog:null,requiresOptIn:!0,region:null,saved:null,pendingIdentify:null,pendingGroups:new Map,flagsLoaded:!1,failureReported:!1},T=P(),g=new Set,f=new Set;function j(e){if(n.initPromise)return n.initPromise;let t=l();return n.config={host:e?.host,clientKey:e?.clientKey,product:e?.product,surface:e?.surface,environment:e?.environment,enabled:e?.enabled??!0,logger:e?.logger??null,storage:e?.storage??null,featureFlags:e?.featureFlags===!0},n.requiresOptIn=e?.requiresOptIn!==!1,n.initPromise=M(t).catch(s),n.initPromise}async function M(e){let t=m(),r=n.saved,i=await B(t);r&&t?await a(()=>t.setItem(_,JSON.stringify(r))):!n.saved&&i&&(n.saved=i);let u=l();if((e.analytics!==u.analytics||e.decided!==u.decided)&&C(u),!d())return;let S=await N();if(!S){s(new Error("@webority/analytics: posthog-react-native is not installed, so nothing is sent."));return}let p=new S(n.config.clientKey,R(n.config));await p.ready?.(),await p.register(A()),n.posthog=p,x(p),await y(c())}function J(e){if(!U.includes(e))throw new Error('@webority/analytics: setConsentRegion needs "eea" or "other".');let t=l();n.region=e;let r=l();t.analytics!==r.analytics&&(y(r.analytics),C(r))}async function Q(e){let t={analytics:e===!0,savedAtUtc:new Date().toISOString()};n.saved=t,y(t.analytics),C(l());let r=m();r&&await a(()=>r.setItem(_,JSON.stringify(t)))}function l(){return n.saved?{analytics:n.saved.analytics,decided:!0}:{analytics:!n.requiresOptIn||n.region==="other",decided:!1}}function X(e){return g.add(e),()=>g.delete(e)}function Z(e,t={}){if(n.config&&!d()){I("identify",{publicId:e,...t});return}n.pendingIdentify={publicId:e,props:t},n.posthog&&c()&&a(()=>n.posthog.identify(e,t))}function ee(e,t,r={}){if(typeof e!="string"||!e||typeof t!="string"||!t){L("@webority/analytics: group needs a type and a PublicId string, so it was dropped.");return}if(n.config&&!d()){I("group",{type:e,key:t,...r});return}n.pendingGroups.set(e,{key:t,props:r}),n.posthog&&c()&&a(()=>n.posthog.group(e,t,r))}function te(e){let t=O();if(!t)return!1;try{return t.isFeatureEnabled(e)===!0}catch(r){return s(r),!1}}function ne(e){let t=O();if(!t)return null;try{return t.getFeatureFlag(e)??null}catch(r){return s(r),null}}function re(e){return f.add(e),(!O()||n.flagsLoaded)&&queueMicrotask(()=>{f.has(e)&&w(e)}),()=>f.delete(e)}function oe(){n.pendingIdentify=null,n.pendingGroups.clear();let e=n.posthog;e&&a(async()=>{e.reset(),await e.register(A()),c()?await e.optIn():await e.optOut()})}function ie(e){T.register(e)}function ae(e,t={}){T.accept(e,n.config?.logger)&&h(e,t,(r,i)=>r.capture(e,i))}function se(e,t={}){h(e,t,(r,i)=>r.screen(e,i))}function h(e,t,r){if(!d()){I(e,t);return}if(!c())return;let i={...t,...A()};if(n.posthog){a(()=>r(n.posthog,i));return}n.initPromise?.then(()=>{n.posthog&&c()&&a(()=>r(n.posthog,i))})}function y(e){let t=n.posthog;return t?a(async()=>{if(!e){await t.optOut();return}await t.optIn(),G(t),n.config.featureFlags&&await t.reloadFeatureFlagsAsync?.()}):Promise.resolve()}function x(e){!n.config.featureFlags||typeof e.onFeatureFlags!="function"||a(()=>e.onFeatureFlags(()=>{n.flagsLoaded=!0;for(let t of[...f])w(t)}))}function O(){return!n.config?.featureFlags||!d()||!c()?null:n.posthog}function w(e){try{e()}catch(t){L(`@webority/analytics: a feature flag listener threw: ${t?.message??t}`)}}function G(e){if(!c())return;let t=n.pendingIdentify;t&&e.identify(t.publicId,t.props);for(let[r,{key:i,props:u}]of n.pendingGroups)e.group(r,i,u)}function m(){let e=n.config?.storage??null;return n.config&&!e&&s(new Error("@webority/analytics: no storage was passed to initMobileAnalytics, so the choice lasts until the app closes.")),e}async function B(e){if(!e)return null;try{let t=await e.getItem(_);if(!t)return null;let r=JSON.parse(t);return typeof r?.analytics!="boolean"?null:{analytics:r.analytics,savedAtUtc:typeof r.savedAtUtc=="string"?r.savedAtUtc:null}}catch(t){return s(t),null}}function C(e){for(let t of g)try{t(e)}catch(r){s(r)}}function d(){let e=n.config;return!!(e?.enabled&&e.clientKey&&e.host&&e.environment!=="Local")}function c(){return l().analytics}function A(){return{product:n.config.product,surface:n.config.surface,environment:n.config.environment}}function a(e){try{return Promise.resolve(e()).then(void 0,s)}catch(t){return s(t),Promise.resolve()}}function s(e){if(n.failureReported||(n.failureReported=!0,globalThis.__DEV__!==!0))return;let t=n.config?.logger,r=typeof t?.warn=="function"?t.warn:t?.info;if(typeof r=="function")try{r.call(t,`@webority/analytics: ${e?.message??e}`)}catch{}}function L(e){let t=n.config?.logger,r=typeof t?.warn=="function"?t.warn:t?.info;if(typeof r=="function")try{r.call(t,e)}catch{}}function I(e,t){n.config?.environment==="Local"&&n.config.logger?.info(e,t)}function ce(){n.config=null,n.initPromise=null,n.posthog=null,n.requiresOptIn=!0,n.region=null,n.saved=null,n.pendingIdentify=null,n.pendingGroups.clear(),n.flagsLoaded=!1,n.failureReported=!1,T.warned.clear(),g.clear(),f.clear()}export{_ as CONSENT_STORAGE_KEY,$ as WORKSPACE_GROUP_TYPE,ce as __resetForTests,F as __setNativeModulesForTests,o as events,l as getAnalyticsConsent,ne as getFeatureFlag,ee as group,Z as identify,j as initMobileAnalytics,te as isFeatureEnabled,X as onAnalyticsConsentChange,re as onFeatureFlags,ie as registerEvents,oe as resetIdentity,Q as setAnalyticsConsent,J as setConsentRegion,ae as trackEvent,se as trackScreen};
1
+ var o=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",LEAD_WON:"lead_won",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",REPORT_VERIFIED:"report_verified",CONTENT_ENGAGED:"content_engaged",EMAIL_CLICK:"email_click",PAGE_NOT_FOUND:"page_not_found",CHAT_OPENED:"chat_opened",TOUR_STARTED:"tour_started",TOUR_STEP_VIEWED:"tour_step_viewed",TOUR_COMPLETED:"tour_completed",TOUR_SKIPPED:"tour_skipped"}),K=Object.freeze({signupStarted:o.SIGNUP_STARTED,signupCompleted:o.SIGNUP_COMPLETED,loginSucceeded:o.LOGIN_SUCCEEDED,onboardingStarted:o.ONBOARDING_STARTED,onboardingStepCompleted:o.ONBOARDING_STEP_COMPLETED,onboardingCompleted:o.ONBOARDING_COMPLETED,subscriptionActivated:o.SUBSCRIPTION_ACTIVATED,subscriptionCancelled:o.SUBSCRIPTION_CANCELLED,paymentSucceeded:o.PAYMENT_SUCCEEDED,paymentFailed:o.PAYMENT_FAILED,feedbackSubmitted:o.FEEDBACK_SUBMITTED,leadSubmitted:o.LEAD_SUBMITTED,leadQualified:o.LEAD_QUALIFIED,leadWon:o.LEAD_WON,whatsappClick:o.WHATSAPP_CLICK,calculatorUse:o.CALCULATOR_USE,phoneClick:o.PHONE_CLICK,demoBooked:o.DEMO_BOOKED,contactSubmitted:o.CONTACT_SUBMITTED,trialStartClick:o.TRIAL_START_CLICK,sampleReportDownload:o.SAMPLE_REPORT_DOWNLOAD,reportVerified:o.REPORT_VERIFIED,contentEngaged:o.CONTENT_ENGAGED,emailClick:o.EMAIL_CLICK,pageNotFound:o.PAGE_NOT_FOUND,chatOpened:o.CHAT_OPENED,tourStarted:o.TOUR_STARTED,tourStepViewed:o.TOUR_STEP_VIEWED,tourCompleted:o.TOUR_COMPLETED,tourSkipped:o.TOUR_SKIPPED}),S=/^[a-z][a-z0-9]*(_[a-z0-9]+)*$/;var b=50;function P(){let e=new Set(Object.values(o)),t=new Set;return{warned:t,register(r){for(let i of r){if(!S.test(i))throw new Error(`@webority/analytics: invalid event name "${i}". Expected snake_case.`);e.add(i)}},accept(r,i){return e.has(r)?!0:(v(t,r,i),!1)}}}function v(e,t,r){if(e.has(t))return;e.size<b&&e.add(t);let i=`@webority/analytics: event "${t}" is not registered, so it was dropped. Call registerEvents() first.`;if(typeof r?.warn=="function"){r.warn(i);return}if(typeof r?.info=="function"){r.info(i);return}console.warn(i)}var E=null;function F(e){E=e}async function N(){if(E)return E.PostHog??null;try{let e=await import("posthog-react-native");return e.PostHog??e.default?.PostHog??e.default??null}catch{return null}}function w(e){return{host:e.host,defaultOptIn:!1,personProfiles:"identified_only",captureAppLifecycleEvents:!1,enableSessionReplay:!1,preloadFeatureFlags:!1,disableRemoteFeatureFlags:e.featureFlags!==!0,disableSurveys:!0}}var _="webority_analytics_consent",U=["eea","other"],$="workspace",n={config:null,initPromise:null,posthog:null,requiresOptIn:!0,region:null,saved:null,pendingIdentify:null,pendingGroups:new Map,flagsLoaded:!1,failureReported:!1},T=P(),g=new Set,f=new Set;function j(e){if(n.initPromise)return n.initPromise;let t=l();return n.config={host:e?.host,clientKey:e?.clientKey,product:e?.product,surface:e?.surface,environment:e?.environment,enabled:e?.enabled??!0,logger:e?.logger??null,storage:e?.storage??null,featureFlags:e?.featureFlags===!0},n.requiresOptIn=e?.requiresOptIn!==!1,n.initPromise=M(t).catch(s),n.initPromise}async function M(e){let t=m(),r=n.saved,i=await B(t);r&&t?await a(()=>t.setItem(_,JSON.stringify(r))):!n.saved&&i&&(n.saved=i);let u=l();if((e.analytics!==u.analytics||e.decided!==u.decided)&&C(u),!d())return;let D=await N();if(!D){s(new Error("@webority/analytics: posthog-react-native is not installed, so nothing is sent."));return}let p=new D(n.config.clientKey,w(n.config));await p.ready?.(),await p.register(A()),n.posthog=p,x(p),await y(c())}function J(e){if(!U.includes(e))throw new Error('@webority/analytics: setConsentRegion needs "eea" or "other".');let t=l();n.region=e;let r=l();t.analytics!==r.analytics&&(y(r.analytics),C(r))}async function Q(e){let t={analytics:e===!0,savedAtUtc:new Date().toISOString()};n.saved=t,y(t.analytics),C(l());let r=m();r&&await a(()=>r.setItem(_,JSON.stringify(t)))}function l(){return n.saved?{analytics:n.saved.analytics,decided:!0}:{analytics:!n.requiresOptIn||n.region==="other",decided:!1}}function X(e){return g.add(e),()=>g.delete(e)}function Z(e,t={}){if(n.config&&!d()){I("identify",{publicId:e,...t});return}n.pendingIdentify={publicId:e,props:t},n.posthog&&c()&&a(()=>n.posthog.identify(e,t))}function ee(e,t,r={}){if(typeof e!="string"||!e||typeof t!="string"||!t){L("@webority/analytics: group needs a type and a PublicId string, so it was dropped.");return}if(n.config&&!d()){I("group",{type:e,key:t,...r});return}n.pendingGroups.set(e,{key:t,props:r}),n.posthog&&c()&&a(()=>n.posthog.group(e,t,r))}function te(e){let t=O();if(!t)return!1;try{return t.isFeatureEnabled(e)===!0}catch(r){return s(r),!1}}function ne(e){let t=O();if(!t)return null;try{return t.getFeatureFlag(e)??null}catch(r){return s(r),null}}function re(e){return f.add(e),(!O()||n.flagsLoaded)&&queueMicrotask(()=>{f.has(e)&&h(e)}),()=>f.delete(e)}function oe(){n.pendingIdentify=null,n.pendingGroups.clear();let e=n.posthog;e&&a(async()=>{e.reset(),await e.register(A()),c()?await e.optIn():await e.optOut()})}function ie(e){T.register(e)}function ae(e,t={}){T.accept(e,n.config?.logger)&&R(e,t,(r,i)=>r.capture(e,i))}function se(e,t={}){R(e,t,(r,i)=>r.screen(e,i))}function R(e,t,r){if(!d()){I(e,t);return}if(!c())return;let i={...t,...A()};if(n.posthog){a(()=>r(n.posthog,i));return}n.initPromise?.then(()=>{n.posthog&&c()&&a(()=>r(n.posthog,i))})}function y(e){let t=n.posthog;return t?a(async()=>{if(!e){await t.optOut();return}await t.optIn(),G(t),n.config.featureFlags&&await t.reloadFeatureFlagsAsync?.()}):Promise.resolve()}function x(e){!n.config.featureFlags||typeof e.onFeatureFlags!="function"||a(()=>e.onFeatureFlags(()=>{n.flagsLoaded=!0;for(let t of[...f])h(t)}))}function O(){return!n.config?.featureFlags||!d()||!c()?null:n.posthog}function h(e){try{e()}catch(t){L(`@webority/analytics: a feature flag listener threw: ${t?.message??t}`)}}function G(e){if(!c())return;let t=n.pendingIdentify;t&&e.identify(t.publicId,t.props);for(let[r,{key:i,props:u}]of n.pendingGroups)e.group(r,i,u)}function m(){let e=n.config?.storage??null;return n.config&&!e&&s(new Error("@webority/analytics: no storage was passed to initMobileAnalytics, so the choice lasts until the app closes.")),e}async function B(e){if(!e)return null;try{let t=await e.getItem(_);if(!t)return null;let r=JSON.parse(t);return typeof r?.analytics!="boolean"?null:{analytics:r.analytics,savedAtUtc:typeof r.savedAtUtc=="string"?r.savedAtUtc:null}}catch(t){return s(t),null}}function C(e){for(let t of g)try{t(e)}catch(r){s(r)}}function d(){let e=n.config;return!!(e?.enabled&&e.clientKey&&e.host&&e.environment!=="Local")}function c(){return l().analytics}function A(){return{product:n.config.product,surface:n.config.surface,environment:n.config.environment}}function a(e){try{return Promise.resolve(e()).then(void 0,s)}catch(t){return s(t),Promise.resolve()}}function s(e){if(n.failureReported||(n.failureReported=!0,globalThis.__DEV__!==!0))return;let t=n.config?.logger,r=typeof t?.warn=="function"?t.warn:t?.info;if(typeof r=="function")try{r.call(t,`@webority/analytics: ${e?.message??e}`)}catch{}}function L(e){let t=n.config?.logger,r=typeof t?.warn=="function"?t.warn:t?.info;if(typeof r=="function")try{r.call(t,e)}catch{}}function I(e,t){n.config?.environment==="Local"&&n.config.logger?.info(e,t)}function ce(){n.config=null,n.initPromise=null,n.posthog=null,n.requiresOptIn=!0,n.region=null,n.saved=null,n.pendingIdentify=null,n.pendingGroups.clear(),n.flagsLoaded=!1,n.failureReported=!1,T.warned.clear(),g.clear(),f.clear()}export{_ as CONSENT_STORAGE_KEY,$ as WORKSPACE_GROUP_TYPE,ce as __resetForTests,F as __setNativeModulesForTests,o as events,l as getAnalyticsConsent,ne as getFeatureFlag,ee as group,Z as identify,j as initMobileAnalytics,te as isFeatureEnabled,X as onAnalyticsConsentChange,re as onFeatureFlags,ie as registerEvents,oe as resetIdentity,Q as setAnalyticsConsent,J as setConsentRegion,ae as trackEvent,se as trackScreen};
package/dist/site.js CHANGED
@@ -1 +1 @@
1
- import{A as p,B as q,a,b,c,d,e,g as f,h as g,i as h,j as i,u as j,v as k,w as l,x as m,y as n,z as o}from"./chunk-KXTYI3NY.js";export{c as CONSENT_CHANGE_EVENT,b as CONSENT_COOKIE_NAME,m as captureAttribution,j as channels,i as events,n as getAttribution,f as getConsent,d as initConsent,o as initSiteAnalytics,q as loadTags,h as onConsentChange,a as requiresOptIn,l as resolveAiSource,k as resolveChannel,g as saveConsent,e as setConsentRegion,p as trackSiteEvent};
1
+ import{A as p,B as q,a,b,c,d,e,g as f,h as g,i as h,j as i,u as j,v as k,w as l,x as m,y as n,z as o}from"./chunk-YB7OUORE.js";export{c as CONSENT_CHANGE_EVENT,b as CONSENT_COOKIE_NAME,m as captureAttribution,j as channels,i as events,n as getAttribution,f as getConsent,d as initConsent,o as initSiteAnalytics,q as loadTags,h as onConsentChange,a as requiresOptIn,l as resolveAiSource,k as resolveChannel,g as saveConsent,e as setConsentRegion,p as trackSiteEvent};
@@ -95,6 +95,9 @@
95
95
  "lead_qualified": {
96
96
  "$ref": "#/$defs/eventExtension"
97
97
  },
98
+ "lead_won": {
99
+ "$ref": "#/$defs/eventExtension"
100
+ },
98
101
  "whatsapp_click": {
99
102
  "$ref": "#/$defs/eventExtension"
100
103
  },
@@ -1 +1 @@
1
- var WeborityAnalytics=(()=>{var L=Object.defineProperty;var Re=Object.getOwnPropertyDescriptor;var Le=Object.getOwnPropertyNames;var ke=Object.prototype.hasOwnProperty;var Ue=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(o){throw n=[o],o}};var V=(e,t)=>{for(var n in t)L(e,n,{get:t[n],enumerable:!0})},ve=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Le(t))!ke.call(e,r)&&r!==n&&L(e,r,{get:()=>t[r],enumerable:!(o=Re(t,r))||o.enumerable});return e};var xe=e=>ve(L({},"__esModule",{value:!0}),e);var he={};V(he,{default:()=>gt});function _t(){let e=[];e._i=[],e.__SV=1,e.people=[];for(let t of Ce)e[t]=(...n)=>{e.push([t,...n])};e.init=(t,n)=>{e._i.push([t,n]);let o=document.createElement("script");o.async=!0,o.crossOrigin="anonymous",o.src=`${n.api_host.replace(/\/+$/,"").replace(".i.posthog.com","-assets.i.posthog.com")}/static/array.js`,document.head.appendChild(o)},window.posthog=e}var Ce,Se,gt,Te=Ue(()=>{Ce=["capture","register","opt_in_capturing","opt_out_capturing"];Se={init(e,t){window.posthog||_t(),window.posthog.init(e,t)}};for(let e of Ce)Se[e]=(...t)=>window.posthog[e](...t);gt=Se});var Nt={};V(Nt,{CONSENT_CHANGE_EVENT:()=>v,CONSENT_COOKIE_NAME:()=>I,captureAttribution:()=>pe,channels:()=>l,events:()=>a,getAttribution:()=>N,getConsent:()=>d,initConsent:()=>oe,initSiteAnalytics:()=>Ie,loadTags:()=>Ne,onConsentChange:()=>g,requiresOptIn:()=>Z,resolveAiSource:()=>O,resolveChannel:()=>C,saveConsent:()=>ae,setConsentRegion:()=>re,trackSiteEvent:()=>Ae});var Pe=["google","googleads","adwords","youtube"],Me=["meta","facebook","fb","instagram","ig","messenger"],Fe=["linkedin","lnkd"],Ge=["bing","microsoft","microsoftads","msn"],W=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"]]]),$e=["bing.com","duckduckgo.com","search.yahoo.com","ecosia.org","search.brave.com"],Be=["google","yandex"],ze=["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"],l=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 C(e){if(!e)return l.DIRECT;let t=p(e.utmSource);if(t){let r=w(t);if(Pe.includes(r))return l.GOOGLE;if(Me.includes(r))return l.META;if(Fe.includes(r))return l.LINKEDIN;if(Ge.includes(r))return l.MICROSOFT}if(p(e.fbclid))return l.META;if(p(e.gclid)||p(e.gbraid)||p(e.wbraid))return l.GOOGLE;if(p(e.liFatId))return l.LINKEDIN;if(p(e.msclkid))return l.MICROSOFT;if(Y(t))return l.AI_ASSISTANT;if(t||p(e.utmMedium)||p(e.utmCampaign)||p(e.utmContent)||p(e.utmTerm))return l.OTHER;let o=J(e.referrer);return o?Q(o)?l.AI_ASSISTANT:Ke(o)?l.ORGANIC_SEARCH:ze.some(r=>X(o,r))?l.ORGANIC_SOCIAL:l.REFERRAL:l.DIRECT}function O(e){if(!e)return"";let t=Y(p(e.utmSource));if(t)return t;let n=J(e.referrer);return n?Q(n):""}function Y(e){if(!e)return"";let t=w(e);for(let[n,o]of W)if(w(n)===t||o.some(r=>w(r)===t))return n;return""}function Q(e){for(let[t,n]of W)if(n.some(o=>X(e,o)))return t;return""}function Ke(e){return $e.includes(e)?!0:Be.some(t=>{if(!e.startsWith(`${t}.`))return!1;let n=e.slice(t.length+1).split(".");return n.length===1||n.length===2&&(n[0]==="co"||n[0]==="com")})}function X(e,t){return e===t||e.endsWith(`.${t}`)}function J(e){let t=p(e);if(!t)return"";try{let n=new URL(/^[a-z][a-z0-9+.-]*:\/\//i.test(t)?t:`https://${t}`).hostname.toLowerCase();return n.startsWith("www.")?n.slice(4):n}catch{return""}}function w(e){return String(e).toLowerCase().replace(/[^\p{L}\p{N}]/gu,"")}function p(e){return String(e??"").trim()}var k=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 Z(e){let t=typeof e=="string"?e.trim().toUpperCase():"";return t.length!==2||t==="XX"||t==="T1"?!0:k.includes(t)}var I="webority_cookie_consent",v="webority-consent-change",te=365,i={initialized:!1,requiresOptIn:!0,strictOptIn:!1,adStorage:!0,cookieDays:te,cookieDomain:null,regionCookie:null,region:null,saved:null},ne=["eea","other"],U=new Set;function oe(e){let t=e?.strictOptIn??!1;if(typeof t!="boolean")throw new Error("@webority/analytics: initConsent strictOptIn must be true or false, or left out.");if(t){if(e.requiresOptIn!==void 0&&e.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 e?.requiresOptIn!="boolean")throw new Error("@webority/analytics: initConsent needs requiresOptIn (true or false), decided from the visitor's country.");if(e.cookieDomain!==void 0&&(typeof e.cookieDomain!="string"||!e.cookieDomain.trim()))throw new Error('@webority/analytics: initConsent cookieDomain must be a domain such as ".example.com", or left out.');if(e.cookieDays!==void 0&&!(Number.isInteger(e.cookieDays)&&e.cookieDays>0))throw new Error("@webority/analytics: initConsent cookieDays must be a whole number of days above zero, or left out.");if(e.adStorage!==void 0&&typeof e.adStorage!="boolean")throw new Error("@webority/analytics: initConsent adStorage must be true or false, or left out.");if(e.regionCookie!==void 0&&(typeof e.regionCookie!="string"||!/^[\w.-]+$/.test(e.regionCookie)))throw new Error('@webority/analytics: initConsent regionCookie must be a cookie name such as "wui_region", or left out.');i.initialized=!0,i.strictOptIn=t,i.requiresOptIn=t||e.requiresOptIn,i.adStorage=e.adStorage??!t,i.cookieDays=e.cookieDays??te,i.cookieDomain=e.cookieDomain?.trim()??null,i.regionCookie=e.regionCookie??null,i.region=i.regionCookie?Ve(i.regionCookie):null;let{saved:n,entryCount:o}=je();i.saved=n,i.cookieDomain&&o>1&&n&&le(n),qe(),He(),i.saved?M(i.saved):ce()&&ue()}function re(e){if(P("setConsentRegion"),!ne.includes(e))throw new Error('@webority/analytics: setConsentRegion needs "eea" or "other".');let t=d();if(i.region=e,i.saved)return;let n=d();t.analytics===n.analytics&&t.functional===n.functional&&t.marketing===n.marketing||(ue(),se(n))}function h(){return i.initialized}function ie(){return i.strictOptIn}function x(){return i.adStorage}function d(){P("getConsent");let e=i.saved;if(e)return{essential:!0,analytics:e.analytics,functional:e.functional,marketing:e.marketing,decided:!0};if(ce())return{essential:!0,analytics:!0,functional:!0,marketing:!1,decided:!1};let t=!i.requiresOptIn;return{essential:!0,analytics:t,functional:t,marketing:t,decided:!1}}function ae(e){P("saveConsent");let t={essential:!0,analytics:e?.analytics===!0,functional:e?.functional===!0,marketing:e?.marketing===!0,timestamp:new Date().toISOString()};le(t),i.saved=t,M(t),se(d())}function g(e){return U.add(e),()=>U.delete(e)}function se(e){for(let t of U)try{t(e)}catch(n){queueMicrotask(()=>{throw n})}typeof window?.dispatchEvent=="function"&&typeof CustomEvent=="function"&&window.dispatchEvent(new CustomEvent(v,{detail:e}))}function P(e){if(!i.initialized)throw new Error(`@webority/analytics: call initConsent before ${e}.`)}function S(){window.dataLayer=window.dataLayer||[],window.dataLayer.push(arguments)}function qe(){if(i.strictOptIn){S("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}S("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:[...k]});let e=i.adStorage?"granted":"denied";S("consent","default",{ad_storage:e,ad_user_data:e,ad_personalization:e,analytics_storage:"granted",functionality_storage:"granted",personalization_storage:"granted",security_storage:"granted"})}function He(){S("set","ads_data_redaction",!0),S("set","url_passthrough",!0)}function ce(){return i.requiresOptIn&&!i.strictOptIn&&i.region==="other"}function ue(){let e=d();M(e,e.analytics&&i.adStorage)}function M(e,t=e.marketing&&i.adStorage){let n=o=>o?"granted":"denied";S("consent","update",{analytics_storage:n(e.analytics),functionality_storage:n(e.functional),personalization_storage:n(e.functional),ad_storage:n(t),ad_user_data:n(t),ad_personalization:n(t)})}function je(){let e=`${I}=`,t=(document.cookie||"").split(";").map(o=>o.trim()).filter(o=>o.startsWith(e)),n=t.map(o=>We(o.slice(e.length))).filter(Boolean);return{saved:Ye(n),entryCount:t.length}}function Ve(e){let t=`${e}=`,o=(document.cookie||"").split(";").map(r=>r.trim()).find(r=>r.startsWith(t))?.slice(t.length);return ne.includes(o)?o:null}function We(e){try{let t=JSON.parse(decodeURIComponent(e));return!t||typeof t!="object"?null:{essential:!0,analytics:t.analytics===!0,functional:t.functional===!0,marketing:t.marketing===!0,timestamp:t.timestamp??null}}catch{return null}}function Ye(e){if(e.length===0)return null;let t=e.map(o=>typeof o.timestamp=="string"?Date.parse(o.timestamp):Number.NaN);if(t.some(Number.isNaN))return e.at(-1);let n=0;for(let o=1;o<e.length;o++)t[o]>=t[n]&&(n=o);return e[n]}function le(e){let t=typeof e.timestamp=="string"?Date.parse(e.timestamp):Number.NaN,n=(Number.isNaN(t)?Date.now():t)+i.cookieDays*24*60*60*1e3,o=window.location?.protocol==="https:"?";Secure":"";i.cookieDomain&&ee(`${I}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;max-age=0;path=/;SameSite=Lax${o}`);let r=i.cookieDomain?`;domain=${i.cookieDomain}`:"";ee(`${I}=${encodeURIComponent(JSON.stringify(e))};expires=${new Date(n).toUTCString()};path=/${r};SameSite=Lax${o}`)}function ee(e){document.cookie=e}var b="webority_attribution",Qe=2160*60*60*1e3,Xe=200,F=500,Je=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"}),de=!1;function pe(){_e("captureAttribution"),nt();let e=et();if(!e)return;let t=z(G());me(G(),{firstTouch:t?.firstTouch??e,lastTouch:e}),Ze(e)}function Ze(e){let t={event:"acquisition_touch",acquisition_channel:C(e)};e.aiSource&&(t.ai_source=e.aiSource),window.dataLayer=window.dataLayer||[],window.dataLayer.push(t)}function N(){return _e("getAttribution"),z(G())}function et(){let e=new URLSearchParams(window.location.search),t={};for(let[r,c]of Object.entries(Je)){let s=A(e.get(r),Xe);s&&(t[c]=s)}let n=A(e.get("referrer"),F)||tt();if(n&&(t.referrer=n),Object.keys(t).length===0)return null;let o=O(t);return o&&(t.aiSource=o),t.landingPage=A(window.location.pathname,F),t.capturedDateTimeUtc=new Date().toISOString(),t}function tt(){let e=document.referrer;if(!e)return"";try{return new URL(e).hostname===window.location.hostname?"":A(e,F)}catch{return""}}function nt(){de||(de=!0,g(e=>{let t=e.marketing?B():$(),n=e.marketing?$():B(),o=z(t);ot(t),o&&me(n,o)}))}function G(){return d().marketing?$():B()}function $(){try{return window.localStorage}catch{return null}}function B(){try{return window.sessionStorage}catch{return null}}function z(e){try{let t=e?.getItem(b);if(!t)return null;let n=JSON.parse(t),o=fe(n?.firstTouch),r=fe(n?.lastTouch);return!o&&!r?(e.removeItem(b),null):{firstTouch:o??r,lastTouch:r??o}}catch{return null}}function me(e,t){try{e?.setItem(b,JSON.stringify(t))}catch{}}function ot(e){try{e?.removeItem(b)}catch{}}function fe(e){if(!e||typeof e!="object")return null;let t=Date.parse(e.capturedDateTimeUtc);return Number.isFinite(t)&&Date.now()-t<=Qe?e:null}function A(e,t){let n=String(e??"").trim();return n?n.slice(0,t):""}function _e(e){if(!h())throw new Error(`@webority/analytics: call initConsent before ${e}.`)}var rt=["scroll","mousemove","touchstart","keydown","pointerdown"];function D(e){let t=!1,n=()=>{t||(t=!0,e())};for(let o of rt)window.addEventListener(o,n,{once:!0,passive:!0});document.readyState==="complete"?setTimeout(n,1500):window.addEventListener("load",()=>setTimeout(n,1500),{once:!0})}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",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",REPORT_VERIFIED:"report_verified",CONTENT_ENGAGED:"content_engaged",EMAIL_CLICK:"email_click",PAGE_NOT_FOUND:"page_not_found",CHAT_OPENED:"chat_opened",TOUR_STARTED:"tour_started",TOUR_STEP_VIEWED:"tour_step_viewed",TOUR_COMPLETED:"tour_completed",TOUR_SKIPPED:"tour_skipped"}),Ft=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,leadQualified:a.LEAD_QUALIFIED,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,reportVerified:a.REPORT_VERIFIED,contentEngaged:a.CONTENT_ENGAGED,emailClick:a.EMAIL_CLICK,pageNotFound:a.PAGE_NOT_FOUND,chatOpened:a.CHAT_OPENED,tourStarted:a.TOUR_STARTED,tourStepViewed:a.TOUR_STEP_VIEWED,tourCompleted:a.TOUR_COMPLETED,tourSkipped:a.TOUR_SKIPPED});var it=new Set(["token","code","email","access_token","id_token","state","session_state","password","search","q","query"]),at=/(?:access_token|id_token|session_state|token|code|state|email|password)=/i,st=["$current_url","$referrer","$pathname","$initial_current_url","$initial_referrer","$initial_pathname","$session_entry_url","$session_entry_referrer","$session_entry_pathname"],ct=4,ut=5,lt=6;function T(e){if(typeof e!="string")return e;let t=e.indexOf("#"),n=t===-1?e:e.slice(0,t),o=t===-1||at.test(e.slice(t))?"":e.slice(t),r=n.indexOf("?");if(r===-1)return n+o;let c=n.slice(r+1).split("&"),s=c.filter(_=>!it.has(mt(_))).map(pt);if(s.length===c.length&&s.every((_,E)=>_===c[E]))return n+o;let f=n.slice(0,r),y=s.filter(_=>_!=="").join("&");return(y?`${f}?${y}`:f)+o}function ge(e){if(!e||typeof e!="object")return e;let t=e.properties;for(let r of[t,e.$set,e.$set_once,t?.$set,t?.$set_once])ft(r);let n=t?.$heatmap_data;if(n&&typeof n=="object"){let r={};for(let[c,s]of Object.entries(n)){let f=T(c);r[f]=r[f]?r[f].concat(s):s}t.$heatmap_data=r}if(t&&typeof t=="object"){for(let[r,c]of Object.entries(t))if(r.startsWith("$web_vitals_")&&r.endsWith("_event")&&c&&typeof c=="object")for(let s of["$current_url","navigationURL"])typeof c[s]=="string"&&(c[s]=T(c[s]))}let o=t?.$snapshot_data;if(e.event==="$snapshot"&&o&&typeof o=="object")for(let r of Array.isArray(o)?o:[o])dt(r);return e}function dt(e){let t=e?.data;if(!(!t||typeof t!="object")){if(e.type===ct)R(t,["href"]);else if(e.type===ut)R(t.payload,["href"]);else if(e.type===lt&&Array.isArray(t.payload?.requests))for(let n of t.payload.requests)R(n,["name","url"])}}function R(e,t){if(!(!e||typeof e!="object"))for(let n of t)typeof e[n]=="string"&&(e[n]=T(e[n]))}function ft(e){R(e,st)}function pt(e){let t=e.indexOf("=");if(t===-1)return e;let n;try{n=decodeURIComponent(e.slice(t+1).replace(/\+/g," "))}catch{return e}if(!n.startsWith("/")&&!/^https?:\/\//i.test(n))return e;let o=T(n);return o===n?e:`${e.slice(0,t)}=${encodeURIComponent(o)}`}function mt(e){let t=e.split("=",1)[0].replace(/\+/g," ");try{return decodeURIComponent(t).toLowerCase()}catch{return t.toLowerCase()}}function Ee(e,t,n=!1){return t?e:{...e,opt_out_capturing_by_default:!0,...n?{advanced_disable_feature_flags_on_first_load:!0}:{}}}function ye(e){let t=e.sessionRecording??{enabled:!1},n={api_host:e.host,autocapture:!1,capture_pageview:"history_change",cookieless_mode:"on_reject",person_profiles:"identified_only",persistence:"localStorage+cookie",cross_subdomain_cookie:!0,disable_session_recording:!t.enabled,enable_heatmaps:e.heatmaps===!0,capture_exceptions:e.captureExceptions===!0,capture_performance:{web_vitals:e.webVitals===!0},disable_surveys:!0,disable_product_tours:!0,disable_conversations:!0,advanced_disable_feature_flags:!(t.enabled||e.featureFlags===!0),before_send:ge};return t.enabled&&(n.session_recording={maskAllInputs:t.maskAllInputs??!0,...t.maskTextSelector?{maskTextSelector:t.maskTextSelector}:{},maskCapturedNetworkRequestFn:o=>({...o,name:T(o.name)}),recordBody:!1,recordHeaders:!1}),n}var Et=()=>Promise.resolve().then(()=>(Te(),he)),yt=100,u={config:null,posthog:null,pending:[],failed:!1,loadPosthog:Et,stopFollowingConsent:null};function Ie({host:e,clientKey:t,product:n,surface:o,environment:r,enabled:c=!0,sessionRecording:s,heatmaps:f=!1,captureExceptions:y=!1,webVitals:_=!1}={}){if(!h())throw new Error("@webority/analytics: call initConsent before initSiteAnalytics.");!c||!e||!t||r==="Local"||u.config||(u.config={host:e,clientKey:t,product:n,surface:o,environment:r,sessionRecording:s,heatmaps:f,captureExceptions:y,webVitals:_},u.stopFollowingConsent=g(E=>St(E.analytics)),D(()=>{Promise.resolve().then(u.loadPosthog).then(E=>Ct(E.default??E)).catch(()=>{u.failed=!0,u.pending=[]})}))}function Ct(e){let t=u.config,n=d().analytics;e.init(t.clientKey,Ee(ht(t),n)),e.register({product:t.product,surface:t.surface,environment:t.environment}),n?e.opt_in_capturing({captureEventName:!1}):e.opt_out_capturing(),u.posthog=e;let o=u.pending;u.pending=[];for(let[r,c]of o)Oe(e,r,c)}function St(e){u.posthog&&(e?u.posthog.opt_in_capturing():u.posthog.opt_out_capturing())}function ht(e){return{...ye({host:e.host,sessionRecording:e.sessionRecording,heatmaps:e.heatmaps,captureExceptions:e.captureExceptions,webVitals:e.webVitals}),capture_pageview:!0}}function we(e,t){let n=u.config;if(!n)return;let o={...t,product:n.product,surface:n.surface,environment:n.environment};u.posthog?Oe(u.posthog,e,o):!u.failed&&u.pending.length<yt&&u.pending.push([e,o])}function Oe(e,t,n){try{e.capture(t,n)}catch{}}var Tt=new Set(Object.values(a));function Ae(e,t={}){if(!Tt.has(e))return!1;let n=d().analytics,o=N(),r={...t};for(let[c,s]of[["first",o?.firstTouch],["last",o?.lastTouch]])s&&(r[`${c}_touch_channel`]=C(s),s.aiSource&&(r[`${c}_touch_ai_source`]=s.aiSource));return we(e,r),n?(window.dataLayer=window.dataLayer||[],window.dataLayer.push({...r,event:e}),!0):!1}var It="https://www.googletagmanager.com/gtm.js",wt=3e3,Ot=100,m={loaded:!1,clarityId:null,clarityLoaded:!1,cancelClaritySchedule:null};function Ne(e={}){if(!h())throw new Error("@webority/analytics: call initConsent before loadTags.");if(m.loaded)return;m.loaded=!0;let{gtmId:t,gtmUrl:n=It,clarityId:o,ahrefsKey:r}=e;if(typeof n!="string"||n.trim()==="")throw new Error("@webority/analytics: gtmUrl must be a non-empty string.");let c=ie();if(r){let s=()=>q("https://analytics.ahrefs.com/analytics.js",{"data-key":r});c?be(f=>f.analytics,s):s()}if(t){let s=x(),f=j=>j.analytics||j.marketing&&s,y=()=>{window.dataLayer=window.dataLayer||[],window.dataLayer.push({"gtm.start":Date.now(),event:"gtm.js"}),q(`${n}${n.includes("?")?"&":"?"}id=${encodeURIComponent(t)}`)},_=d(),E=_.decided&&f(_)?At:D,H=()=>E(y);c?be(f,H):H()}o&&(m.clarityId=o,d().analytics&&bt(),g(s=>{s.analytics&&!m.clarityLoaded?K():m.clarityLoaded&&De(s)}))}function be(e,t){if(e(d())){t();return}let n=g(o=>{e(o)&&(n(),t())})}function At(e){document.readyState==="loading"?document.addEventListener("DOMContentLoaded",e,{once:!0}):e()}function bt(){let e=()=>{window.scrollY>Ot&&K()};window.addEventListener("scroll",e,{passive:!0});let t=setTimeout(K,wt);m.cancelClaritySchedule=()=>{window.removeEventListener("scroll",e),clearTimeout(t)}}function K(){m.cancelClaritySchedule?.(),m.cancelClaritySchedule=null,!(m.clarityLoaded||!m.clarityId)&&(m.clarityLoaded=!0,window.clarity=window.clarity||function(){window.clarity.q=window.clarity.q||[],window.clarity.q.push(arguments)},De(d()),q(`https://www.clarity.ms/tag/${encodeURIComponent(m.clarityId)}`,{crossorigin:"anonymous"}))}function De(e){window.clarity("consentv2",{ad_Storage:e.marketing&&x()?"granted":"denied",analytics_Storage:e.analytics?"granted":"denied"})}function q(e,t={}){let n=document.createElement("script");n.async=!0,n.src=e;for(let[o,r]of Object.entries(t))n.setAttribute(o,r);document.head.appendChild(n)}return xe(Nt);})();
1
+ var WeborityAnalytics=(()=>{var L=Object.defineProperty;var Re=Object.getOwnPropertyDescriptor;var Le=Object.getOwnPropertyNames;var ke=Object.prototype.hasOwnProperty;var Ue=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(o){throw n=[o],o}};var W=(e,t)=>{for(var n in t)L(e,n,{get:t[n],enumerable:!0})},ve=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Le(t))!ke.call(e,r)&&r!==n&&L(e,r,{get:()=>t[r],enumerable:!(o=Re(t,r))||o.enumerable});return e};var xe=e=>ve(L({},"__esModule",{value:!0}),e);var he={};W(he,{default:()=>gt});function _t(){let e=[];e._i=[],e.__SV=1,e.people=[];for(let t of Ce)e[t]=(...n)=>{e.push([t,...n])};e.init=(t,n)=>{e._i.push([t,n]);let o=document.createElement("script");o.async=!0,o.crossOrigin="anonymous",o.src=`${n.api_host.replace(/\/+$/,"").replace(".i.posthog.com","-assets.i.posthog.com")}/static/array.js`,document.head.appendChild(o)},window.posthog=e}var Ce,Se,gt,Te=Ue(()=>{Ce=["capture","register","opt_in_capturing","opt_out_capturing"];Se={init(e,t){window.posthog||_t(),window.posthog.init(e,t)}};for(let e of Ce)Se[e]=(...t)=>window.posthog[e](...t);gt=Se});var Nt={};W(Nt,{CONSENT_CHANGE_EVENT:()=>v,CONSENT_COOKIE_NAME:()=>I,captureAttribution:()=>pe,channels:()=>l,events:()=>a,getAttribution:()=>N,getConsent:()=>d,initConsent:()=>oe,initSiteAnalytics:()=>Ie,loadTags:()=>Ne,onConsentChange:()=>g,requiresOptIn:()=>Z,resolveAiSource:()=>O,resolveChannel:()=>C,saveConsent:()=>ae,setConsentRegion:()=>re,trackSiteEvent:()=>Ae});var Pe=["google","googleads","adwords","youtube"],Me=["meta","facebook","fb","instagram","ig","messenger"],Fe=["linkedin","lnkd"],Ge=["bing","microsoft","microsoftads","msn"],V=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"]]]),$e=["bing.com","duckduckgo.com","search.yahoo.com","ecosia.org","search.brave.com"],Be=["google","yandex"],ze=["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"],l=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 C(e){if(!e)return l.DIRECT;let t=p(e.utmSource);if(t){let r=w(t);if(Pe.includes(r))return l.GOOGLE;if(Me.includes(r))return l.META;if(Fe.includes(r))return l.LINKEDIN;if(Ge.includes(r))return l.MICROSOFT}if(p(e.fbclid))return l.META;if(p(e.gclid)||p(e.gbraid)||p(e.wbraid))return l.GOOGLE;if(p(e.liFatId))return l.LINKEDIN;if(p(e.msclkid))return l.MICROSOFT;if(Y(t))return l.AI_ASSISTANT;if(t||p(e.utmMedium)||p(e.utmCampaign)||p(e.utmContent)||p(e.utmTerm))return l.OTHER;let o=J(e.referrer);return o?Q(o)?l.AI_ASSISTANT:Ke(o)?l.ORGANIC_SEARCH:ze.some(r=>X(o,r))?l.ORGANIC_SOCIAL:l.REFERRAL:l.DIRECT}function O(e){if(!e)return"";let t=Y(p(e.utmSource));if(t)return t;let n=J(e.referrer);return n?Q(n):""}function Y(e){if(!e)return"";let t=w(e);for(let[n,o]of V)if(w(n)===t||o.some(r=>w(r)===t))return n;return""}function Q(e){for(let[t,n]of V)if(n.some(o=>X(e,o)))return t;return""}function Ke(e){return $e.includes(e)?!0:Be.some(t=>{if(!e.startsWith(`${t}.`))return!1;let n=e.slice(t.length+1).split(".");return n.length===1||n.length===2&&(n[0]==="co"||n[0]==="com")})}function X(e,t){return e===t||e.endsWith(`.${t}`)}function J(e){let t=p(e);if(!t)return"";try{let n=new URL(/^[a-z][a-z0-9+.-]*:\/\//i.test(t)?t:`https://${t}`).hostname.toLowerCase();return n.startsWith("www.")?n.slice(4):n}catch{return""}}function w(e){return String(e).toLowerCase().replace(/[^\p{L}\p{N}]/gu,"")}function p(e){return String(e??"").trim()}var k=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 Z(e){let t=typeof e=="string"?e.trim().toUpperCase():"";return t.length!==2||t==="XX"||t==="T1"?!0:k.includes(t)}var I="webority_cookie_consent",v="webority-consent-change",te=365,i={initialized:!1,requiresOptIn:!0,strictOptIn:!1,adStorage:!0,cookieDays:te,cookieDomain:null,regionCookie:null,region:null,saved:null},ne=["eea","other"],U=new Set;function oe(e){let t=e?.strictOptIn??!1;if(typeof t!="boolean")throw new Error("@webority/analytics: initConsent strictOptIn must be true or false, or left out.");if(t){if(e.requiresOptIn!==void 0&&e.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 e?.requiresOptIn!="boolean")throw new Error("@webority/analytics: initConsent needs requiresOptIn (true or false), decided from the visitor's country.");if(e.cookieDomain!==void 0&&(typeof e.cookieDomain!="string"||!e.cookieDomain.trim()))throw new Error('@webority/analytics: initConsent cookieDomain must be a domain such as ".example.com", or left out.');if(e.cookieDays!==void 0&&!(Number.isInteger(e.cookieDays)&&e.cookieDays>0))throw new Error("@webority/analytics: initConsent cookieDays must be a whole number of days above zero, or left out.");if(e.adStorage!==void 0&&typeof e.adStorage!="boolean")throw new Error("@webority/analytics: initConsent adStorage must be true or false, or left out.");if(e.regionCookie!==void 0&&(typeof e.regionCookie!="string"||!/^[\w.-]+$/.test(e.regionCookie)))throw new Error('@webority/analytics: initConsent regionCookie must be a cookie name such as "wui_region", or left out.');i.initialized=!0,i.strictOptIn=t,i.requiresOptIn=t||e.requiresOptIn,i.adStorage=e.adStorage??!t,i.cookieDays=e.cookieDays??te,i.cookieDomain=e.cookieDomain?.trim()??null,i.regionCookie=e.regionCookie??null,i.region=i.regionCookie?We(i.regionCookie):null;let{saved:n,entryCount:o}=je();i.saved=n,i.cookieDomain&&o>1&&n&&le(n),qe(),He(),i.saved?M(i.saved):ce()&&ue()}function re(e){if(P("setConsentRegion"),!ne.includes(e))throw new Error('@webority/analytics: setConsentRegion needs "eea" or "other".');let t=d();if(i.region=e,i.saved)return;let n=d();t.analytics===n.analytics&&t.functional===n.functional&&t.marketing===n.marketing||(ue(),se(n))}function h(){return i.initialized}function ie(){return i.strictOptIn}function x(){return i.adStorage}function d(){P("getConsent");let e=i.saved;if(e)return{essential:!0,analytics:e.analytics,functional:e.functional,marketing:e.marketing,decided:!0};if(ce())return{essential:!0,analytics:!0,functional:!0,marketing:!1,decided:!1};let t=!i.requiresOptIn;return{essential:!0,analytics:t,functional:t,marketing:t,decided:!1}}function ae(e){P("saveConsent");let t={essential:!0,analytics:e?.analytics===!0,functional:e?.functional===!0,marketing:e?.marketing===!0,timestamp:new Date().toISOString()};le(t),i.saved=t,M(t),se(d())}function g(e){return U.add(e),()=>U.delete(e)}function se(e){for(let t of U)try{t(e)}catch(n){queueMicrotask(()=>{throw n})}typeof window?.dispatchEvent=="function"&&typeof CustomEvent=="function"&&window.dispatchEvent(new CustomEvent(v,{detail:e}))}function P(e){if(!i.initialized)throw new Error(`@webority/analytics: call initConsent before ${e}.`)}function S(){window.dataLayer=window.dataLayer||[],window.dataLayer.push(arguments)}function qe(){if(i.strictOptIn){S("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}S("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:[...k]});let e=i.adStorage?"granted":"denied";S("consent","default",{ad_storage:e,ad_user_data:e,ad_personalization:e,analytics_storage:"granted",functionality_storage:"granted",personalization_storage:"granted",security_storage:"granted"})}function He(){S("set","ads_data_redaction",!0),S("set","url_passthrough",!0)}function ce(){return i.requiresOptIn&&!i.strictOptIn&&i.region==="other"}function ue(){let e=d();M(e,e.analytics&&i.adStorage)}function M(e,t=e.marketing&&i.adStorage){let n=o=>o?"granted":"denied";S("consent","update",{analytics_storage:n(e.analytics),functionality_storage:n(e.functional),personalization_storage:n(e.functional),ad_storage:n(t),ad_user_data:n(t),ad_personalization:n(t)})}function je(){let e=`${I}=`,t=(document.cookie||"").split(";").map(o=>o.trim()).filter(o=>o.startsWith(e)),n=t.map(o=>Ve(o.slice(e.length))).filter(Boolean);return{saved:Ye(n),entryCount:t.length}}function We(e){let t=`${e}=`,o=(document.cookie||"").split(";").map(r=>r.trim()).find(r=>r.startsWith(t))?.slice(t.length);return ne.includes(o)?o:null}function Ve(e){try{let t=JSON.parse(decodeURIComponent(e));return!t||typeof t!="object"?null:{essential:!0,analytics:t.analytics===!0,functional:t.functional===!0,marketing:t.marketing===!0,timestamp:t.timestamp??null}}catch{return null}}function Ye(e){if(e.length===0)return null;let t=e.map(o=>typeof o.timestamp=="string"?Date.parse(o.timestamp):Number.NaN);if(t.some(Number.isNaN))return e.at(-1);let n=0;for(let o=1;o<e.length;o++)t[o]>=t[n]&&(n=o);return e[n]}function le(e){let t=typeof e.timestamp=="string"?Date.parse(e.timestamp):Number.NaN,n=(Number.isNaN(t)?Date.now():t)+i.cookieDays*24*60*60*1e3,o=window.location?.protocol==="https:"?";Secure":"";i.cookieDomain&&ee(`${I}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;max-age=0;path=/;SameSite=Lax${o}`);let r=i.cookieDomain?`;domain=${i.cookieDomain}`:"";ee(`${I}=${encodeURIComponent(JSON.stringify(e))};expires=${new Date(n).toUTCString()};path=/${r};SameSite=Lax${o}`)}function ee(e){document.cookie=e}var b="webority_attribution",Qe=2160*60*60*1e3,Xe=200,F=500,Je=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"}),de=!1;function pe(){_e("captureAttribution"),nt();let e=et();if(!e)return;let t=z(G());me(G(),{firstTouch:t?.firstTouch??e,lastTouch:e}),Ze(e)}function Ze(e){let t={event:"acquisition_touch",acquisition_channel:C(e)};e.aiSource&&(t.ai_source=e.aiSource),window.dataLayer=window.dataLayer||[],window.dataLayer.push(t)}function N(){return _e("getAttribution"),z(G())}function et(){let e=new URLSearchParams(window.location.search),t={};for(let[r,c]of Object.entries(Je)){let s=A(e.get(r),Xe);s&&(t[c]=s)}let n=A(e.get("referrer"),F)||tt();if(n&&(t.referrer=n),Object.keys(t).length===0)return null;let o=O(t);return o&&(t.aiSource=o),t.landingPage=A(window.location.pathname,F),t.capturedDateTimeUtc=new Date().toISOString(),t}function tt(){let e=document.referrer;if(!e)return"";try{return new URL(e).hostname===window.location.hostname?"":A(e,F)}catch{return""}}function nt(){de||(de=!0,g(e=>{let t=e.marketing?B():$(),n=e.marketing?$():B(),o=z(t);ot(t),o&&me(n,o)}))}function G(){return d().marketing?$():B()}function $(){try{return window.localStorage}catch{return null}}function B(){try{return window.sessionStorage}catch{return null}}function z(e){try{let t=e?.getItem(b);if(!t)return null;let n=JSON.parse(t),o=fe(n?.firstTouch),r=fe(n?.lastTouch);return!o&&!r?(e.removeItem(b),null):{firstTouch:o??r,lastTouch:r??o}}catch{return null}}function me(e,t){try{e?.setItem(b,JSON.stringify(t))}catch{}}function ot(e){try{e?.removeItem(b)}catch{}}function fe(e){if(!e||typeof e!="object")return null;let t=Date.parse(e.capturedDateTimeUtc);return Number.isFinite(t)&&Date.now()-t<=Qe?e:null}function A(e,t){let n=String(e??"").trim();return n?n.slice(0,t):""}function _e(e){if(!h())throw new Error(`@webority/analytics: call initConsent before ${e}.`)}var rt=["scroll","mousemove","touchstart","keydown","pointerdown"];function D(e){let t=!1,n=()=>{t||(t=!0,e())};for(let o of rt)window.addEventListener(o,n,{once:!0,passive:!0});document.readyState==="complete"?setTimeout(n,1500):window.addEventListener("load",()=>setTimeout(n,1500),{once:!0})}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",LEAD_QUALIFIED:"lead_qualified",LEAD_WON:"lead_won",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",REPORT_VERIFIED:"report_verified",CONTENT_ENGAGED:"content_engaged",EMAIL_CLICK:"email_click",PAGE_NOT_FOUND:"page_not_found",CHAT_OPENED:"chat_opened",TOUR_STARTED:"tour_started",TOUR_STEP_VIEWED:"tour_step_viewed",TOUR_COMPLETED:"tour_completed",TOUR_SKIPPED:"tour_skipped"}),Ft=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,leadQualified:a.LEAD_QUALIFIED,leadWon:a.LEAD_WON,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,reportVerified:a.REPORT_VERIFIED,contentEngaged:a.CONTENT_ENGAGED,emailClick:a.EMAIL_CLICK,pageNotFound:a.PAGE_NOT_FOUND,chatOpened:a.CHAT_OPENED,tourStarted:a.TOUR_STARTED,tourStepViewed:a.TOUR_STEP_VIEWED,tourCompleted:a.TOUR_COMPLETED,tourSkipped:a.TOUR_SKIPPED});var it=new Set(["token","code","email","access_token","id_token","state","session_state","password","search","q","query"]),at=/(?:access_token|id_token|session_state|token|code|state|email|password)=/i,st=["$current_url","$referrer","$pathname","$initial_current_url","$initial_referrer","$initial_pathname","$session_entry_url","$session_entry_referrer","$session_entry_pathname"],ct=4,ut=5,lt=6;function T(e){if(typeof e!="string")return e;let t=e.indexOf("#"),n=t===-1?e:e.slice(0,t),o=t===-1||at.test(e.slice(t))?"":e.slice(t),r=n.indexOf("?");if(r===-1)return n+o;let c=n.slice(r+1).split("&"),s=c.filter(_=>!it.has(mt(_))).map(pt);if(s.length===c.length&&s.every((_,E)=>_===c[E]))return n+o;let f=n.slice(0,r),y=s.filter(_=>_!=="").join("&");return(y?`${f}?${y}`:f)+o}function ge(e){if(!e||typeof e!="object")return e;let t=e.properties;for(let r of[t,e.$set,e.$set_once,t?.$set,t?.$set_once])ft(r);let n=t?.$heatmap_data;if(n&&typeof n=="object"){let r={};for(let[c,s]of Object.entries(n)){let f=T(c);r[f]=r[f]?r[f].concat(s):s}t.$heatmap_data=r}if(t&&typeof t=="object"){for(let[r,c]of Object.entries(t))if(r.startsWith("$web_vitals_")&&r.endsWith("_event")&&c&&typeof c=="object")for(let s of["$current_url","navigationURL"])typeof c[s]=="string"&&(c[s]=T(c[s]))}let o=t?.$snapshot_data;if(e.event==="$snapshot"&&o&&typeof o=="object")for(let r of Array.isArray(o)?o:[o])dt(r);return e}function dt(e){let t=e?.data;if(!(!t||typeof t!="object")){if(e.type===ct)R(t,["href"]);else if(e.type===ut)R(t.payload,["href"]);else if(e.type===lt&&Array.isArray(t.payload?.requests))for(let n of t.payload.requests)R(n,["name","url"])}}function R(e,t){if(!(!e||typeof e!="object"))for(let n of t)typeof e[n]=="string"&&(e[n]=T(e[n]))}function ft(e){R(e,st)}function pt(e){let t=e.indexOf("=");if(t===-1)return e;let n;try{n=decodeURIComponent(e.slice(t+1).replace(/\+/g," "))}catch{return e}if(!n.startsWith("/")&&!/^https?:\/\//i.test(n))return e;let o=T(n);return o===n?e:`${e.slice(0,t)}=${encodeURIComponent(o)}`}function mt(e){let t=e.split("=",1)[0].replace(/\+/g," ");try{return decodeURIComponent(t).toLowerCase()}catch{return t.toLowerCase()}}function Ee(e,t,n=!1){return t?e:{...e,opt_out_capturing_by_default:!0,...n?{advanced_disable_feature_flags_on_first_load:!0}:{}}}function ye(e){let t=e.sessionRecording??{enabled:!1},n={api_host:e.host,autocapture:!1,capture_pageview:"history_change",cookieless_mode:"on_reject",person_profiles:"identified_only",persistence:"localStorage+cookie",cross_subdomain_cookie:!0,disable_session_recording:!t.enabled,enable_heatmaps:e.heatmaps===!0,capture_exceptions:e.captureExceptions===!0,capture_performance:{web_vitals:e.webVitals===!0},disable_surveys:!0,disable_product_tours:!0,disable_conversations:!0,advanced_disable_feature_flags:!(t.enabled||e.featureFlags===!0),before_send:ge};return t.enabled&&(n.session_recording={maskAllInputs:t.maskAllInputs??!0,...t.maskTextSelector?{maskTextSelector:t.maskTextSelector}:{},maskCapturedNetworkRequestFn:o=>({...o,name:T(o.name)}),recordBody:!1,recordHeaders:!1}),n}var Et=()=>Promise.resolve().then(()=>(Te(),he)),yt=100,u={config:null,posthog:null,pending:[],failed:!1,loadPosthog:Et,stopFollowingConsent:null};function Ie({host:e,clientKey:t,product:n,surface:o,environment:r,enabled:c=!0,sessionRecording:s,heatmaps:f=!1,captureExceptions:y=!1,webVitals:_=!1}={}){if(!h())throw new Error("@webority/analytics: call initConsent before initSiteAnalytics.");!c||!e||!t||r==="Local"||u.config||(u.config={host:e,clientKey:t,product:n,surface:o,environment:r,sessionRecording:s,heatmaps:f,captureExceptions:y,webVitals:_},u.stopFollowingConsent=g(E=>St(E.analytics)),D(()=>{Promise.resolve().then(u.loadPosthog).then(E=>Ct(E.default??E)).catch(()=>{u.failed=!0,u.pending=[]})}))}function Ct(e){let t=u.config,n=d().analytics;e.init(t.clientKey,Ee(ht(t),n)),e.register({product:t.product,surface:t.surface,environment:t.environment}),n?e.opt_in_capturing({captureEventName:!1}):e.opt_out_capturing(),u.posthog=e;let o=u.pending;u.pending=[];for(let[r,c]of o)Oe(e,r,c)}function St(e){u.posthog&&(e?u.posthog.opt_in_capturing():u.posthog.opt_out_capturing())}function ht(e){return{...ye({host:e.host,sessionRecording:e.sessionRecording,heatmaps:e.heatmaps,captureExceptions:e.captureExceptions,webVitals:e.webVitals}),capture_pageview:!0}}function we(e,t){let n=u.config;if(!n)return;let o={...t,product:n.product,surface:n.surface,environment:n.environment};u.posthog?Oe(u.posthog,e,o):!u.failed&&u.pending.length<yt&&u.pending.push([e,o])}function Oe(e,t,n){try{e.capture(t,n)}catch{}}var Tt=new Set(Object.values(a));function Ae(e,t={}){if(!Tt.has(e))return!1;let n=d().analytics,o=N(),r={...t};for(let[c,s]of[["first",o?.firstTouch],["last",o?.lastTouch]])s&&(r[`${c}_touch_channel`]=C(s),s.aiSource&&(r[`${c}_touch_ai_source`]=s.aiSource));return we(e,r),n?(window.dataLayer=window.dataLayer||[],window.dataLayer.push({...r,event:e}),!0):!1}var It="https://www.googletagmanager.com/gtm.js",wt=3e3,Ot=100,m={loaded:!1,clarityId:null,clarityLoaded:!1,cancelClaritySchedule:null};function Ne(e={}){if(!h())throw new Error("@webority/analytics: call initConsent before loadTags.");if(m.loaded)return;m.loaded=!0;let{gtmId:t,gtmUrl:n=It,clarityId:o,ahrefsKey:r}=e;if(typeof n!="string"||n.trim()==="")throw new Error("@webority/analytics: gtmUrl must be a non-empty string.");let c=ie();if(r){let s=()=>q("https://analytics.ahrefs.com/analytics.js",{"data-key":r});c?be(f=>f.analytics,s):s()}if(t){let s=x(),f=j=>j.analytics||j.marketing&&s,y=()=>{window.dataLayer=window.dataLayer||[],window.dataLayer.push({"gtm.start":Date.now(),event:"gtm.js"}),q(`${n}${n.includes("?")?"&":"?"}id=${encodeURIComponent(t)}`)},_=d(),E=_.decided&&f(_)?At:D,H=()=>E(y);c?be(f,H):H()}o&&(m.clarityId=o,d().analytics&&bt(),g(s=>{s.analytics&&!m.clarityLoaded?K():m.clarityLoaded&&De(s)}))}function be(e,t){if(e(d())){t();return}let n=g(o=>{e(o)&&(n(),t())})}function At(e){document.readyState==="loading"?document.addEventListener("DOMContentLoaded",e,{once:!0}):e()}function bt(){let e=()=>{window.scrollY>Ot&&K()};window.addEventListener("scroll",e,{passive:!0});let t=setTimeout(K,wt);m.cancelClaritySchedule=()=>{window.removeEventListener("scroll",e),clearTimeout(t)}}function K(){m.cancelClaritySchedule?.(),m.cancelClaritySchedule=null,!(m.clarityLoaded||!m.clarityId)&&(m.clarityLoaded=!0,window.clarity=window.clarity||function(){window.clarity.q=window.clarity.q||[],window.clarity.q.push(arguments)},De(d()),q(`https://www.clarity.ms/tag/${encodeURIComponent(m.clarityId)}`,{crossorigin:"anonymous"}))}function De(e){window.clarity("consentv2",{ad_Storage:e.marketing&&x()?"granted":"denied",analytics_Storage:e.analytics?"granted":"denied"})}function q(e,t={}){let n=document.createElement("script");n.async=!0,n.src=e;for(let[o,r]of Object.entries(t))n.setAttribute(o,r);document.head.appendChild(n)}return xe(Nt);})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webority/analytics",
3
- "version": "0.25.0",
3
+ "version": "0.26.0",
4
4
  "license": "SEE LICENSE IN LICENSE",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1 +0,0 @@
1
- var be=["google","googleads","adwords","youtube"],Ne=["meta","facebook","fb","instagram","ig","messenger"],Re=["linkedin","lnkd"],De=["bing","microsoft","microsoftads","msn"],J=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"]]]),Le=["bing.com","duckduckgo.com","search.yahoo.com","ecosia.org","search.brave.com"],ke=["google","yandex"],ve=["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"],f=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 T(e){if(!e)return f.DIRECT;let t=m(e.utmSource);if(t){let r=w(t);if(be.includes(r))return f.GOOGLE;if(Ne.includes(r))return f.META;if(Re.includes(r))return f.LINKEDIN;if(De.includes(r))return f.MICROSOFT}if(m(e.fbclid))return f.META;if(m(e.gclid)||m(e.gbraid)||m(e.wbraid))return f.GOOGLE;if(m(e.liFatId))return f.LINKEDIN;if(m(e.msclkid))return f.MICROSOFT;if(Q(t))return f.AI_ASSISTANT;if(t||m(e.utmMedium)||m(e.utmCampaign)||m(e.utmContent)||m(e.utmTerm))return f.OTHER;let o=te(e.referrer);return o?Z(o)?f.AI_ASSISTANT:xe(o)?f.ORGANIC_SEARCH:ve.some(r=>ee(o,r))?f.ORGANIC_SOCIAL:f.REFERRAL:f.DIRECT}function k(e){if(!e)return"";let t=Q(m(e.utmSource));if(t)return t;let n=te(e.referrer);return n?Z(n):""}function Q(e){if(!e)return"";let t=w(e);for(let[n,o]of J)if(w(n)===t||o.some(r=>w(r)===t))return n;return""}function Z(e){for(let[t,n]of J)if(n.some(o=>ee(e,o)))return t;return""}function xe(e){return Le.includes(e)?!0:ke.some(t=>{if(!e.startsWith(`${t}.`))return!1;let n=e.slice(t.length+1).split(".");return n.length===1||n.length===2&&(n[0]==="co"||n[0]==="com")})}function ee(e,t){return e===t||e.endsWith(`.${t}`)}function te(e){let t=m(e);if(!t)return"";try{let n=new URL(/^[a-z][a-z0-9+.-]*:\/\//i.test(t)?t:`https://${t}`).hostname.toLowerCase();return n.startsWith("www.")?n.slice(4):n}catch{return""}}function w(e){return String(e).toLowerCase().replace(/[^\p{L}\p{N}]/gu,"")}function m(e){return String(e??"").trim()}var v=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 Ue(e){let t=typeof e=="string"?e.trim().toUpperCase():"";return t.length!==2||t==="XX"||t==="T1"?!0:v.includes(t)}var O="webority_cookie_consent",oe="webority-consent-change",re=365,i={initialized:!1,requiresOptIn:!0,strictOptIn:!1,adStorage:!0,cookieDays:re,cookieDomain:null,regionCookie:null,region:null,saved:null},ie=["eea","other"],x=new Set;function Fe(e){let t=e?.strictOptIn??!1;if(typeof t!="boolean")throw new Error("@webority/analytics: initConsent strictOptIn must be true or false, or left out.");if(t){if(e.requiresOptIn!==void 0&&e.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 e?.requiresOptIn!="boolean")throw new Error("@webority/analytics: initConsent needs requiresOptIn (true or false), decided from the visitor's country.");if(e.cookieDomain!==void 0&&(typeof e.cookieDomain!="string"||!e.cookieDomain.trim()))throw new Error('@webority/analytics: initConsent cookieDomain must be a domain such as ".example.com", or left out.');if(e.cookieDays!==void 0&&!(Number.isInteger(e.cookieDays)&&e.cookieDays>0))throw new Error("@webority/analytics: initConsent cookieDays must be a whole number of days above zero, or left out.");if(e.adStorage!==void 0&&typeof e.adStorage!="boolean")throw new Error("@webority/analytics: initConsent adStorage must be true or false, or left out.");if(e.regionCookie!==void 0&&(typeof e.regionCookie!="string"||!/^[\w.-]+$/.test(e.regionCookie)))throw new Error('@webority/analytics: initConsent regionCookie must be a cookie name such as "wui_region", or left out.');i.initialized=!0,i.strictOptIn=t,i.requiresOptIn=t||e.requiresOptIn,i.adStorage=e.adStorage??!t,i.cookieDays=e.cookieDays??re,i.cookieDomain=e.cookieDomain?.trim()??null,i.regionCookie=e.regionCookie??null,i.region=i.regionCookie?Be(i.regionCookie):null;let{saved:n,entryCount:o}=ze();i.saved=n,i.cookieDomain&&o>1&&n&&le(n),Ge(),$e(),i.saved?P(i.saved):ce()&&ue()}function Pe(e){if(F("setConsentRegion"),!ie.includes(e))throw new Error('@webority/analytics: setConsentRegion needs "eea" or "other".');let t=d();if(i.region=e,i.saved)return;let n=d();t.analytics===n.analytics&&t.functional===n.functional&&t.marketing===n.marketing||(ue(),se(n))}function y(){return i.initialized}function ae(){return i.strictOptIn}function U(){return i.adStorage}function d(){F("getConsent");let e=i.saved;if(e)return{essential:!0,analytics:e.analytics,functional:e.functional,marketing:e.marketing,decided:!0};if(ce())return{essential:!0,analytics:!0,functional:!0,marketing:!1,decided:!1};let t=!i.requiresOptIn;return{essential:!0,analytics:t,functional:t,marketing:t,decided:!1}}function Me(e){F("saveConsent");let t={essential:!0,analytics:e?.analytics===!0,functional:e?.functional===!0,marketing:e?.marketing===!0,timestamp:new Date().toISOString()};le(t),i.saved=t,P(t),se(d())}function C(e){return x.add(e),()=>x.delete(e)}function se(e){for(let t of x)try{t(e)}catch(n){queueMicrotask(()=>{throw n})}typeof window?.dispatchEvent=="function"&&typeof CustomEvent=="function"&&window.dispatchEvent(new CustomEvent(oe,{detail:e}))}function F(e){if(!i.initialized)throw new Error(`@webority/analytics: call initConsent before ${e}.`)}function I(){window.dataLayer=window.dataLayer||[],window.dataLayer.push(arguments)}function Ge(){if(i.strictOptIn){I("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}I("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:[...v]});let e=i.adStorage?"granted":"denied";I("consent","default",{ad_storage:e,ad_user_data:e,ad_personalization:e,analytics_storage:"granted",functionality_storage:"granted",personalization_storage:"granted",security_storage:"granted"})}function $e(){I("set","ads_data_redaction",!0),I("set","url_passthrough",!0)}function ce(){return i.requiresOptIn&&!i.strictOptIn&&i.region==="other"}function ue(){let e=d();P(e,e.analytics&&i.adStorage)}function P(e,t=e.marketing&&i.adStorage){let n=o=>o?"granted":"denied";I("consent","update",{analytics_storage:n(e.analytics),functionality_storage:n(e.functional),personalization_storage:n(e.functional),ad_storage:n(t),ad_user_data:n(t),ad_personalization:n(t)})}function ze(){let e=`${O}=`,t=(document.cookie||"").split(";").map(o=>o.trim()).filter(o=>o.startsWith(e)),n=t.map(o=>Ke(o.slice(e.length))).filter(Boolean);return{saved:qe(n),entryCount:t.length}}function Be(e){let t=`${e}=`,o=(document.cookie||"").split(";").map(r=>r.trim()).find(r=>r.startsWith(t))?.slice(t.length);return ie.includes(o)?o:null}function Ke(e){try{let t=JSON.parse(decodeURIComponent(e));return!t||typeof t!="object"?null:{essential:!0,analytics:t.analytics===!0,functional:t.functional===!0,marketing:t.marketing===!0,timestamp:t.timestamp??null}}catch{return null}}function qe(e){if(e.length===0)return null;let t=e.map(o=>typeof o.timestamp=="string"?Date.parse(o.timestamp):Number.NaN);if(t.some(Number.isNaN))return e.at(-1);let n=0;for(let o=1;o<e.length;o++)t[o]>=t[n]&&(n=o);return e[n]}function le(e){let t=typeof e.timestamp=="string"?Date.parse(e.timestamp):Number.NaN,n=(Number.isNaN(t)?Date.now():t)+i.cookieDays*24*60*60*1e3,o=window.location?.protocol==="https:"?";Secure":"";i.cookieDomain&&ne(`${O}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;max-age=0;path=/;SameSite=Lax${o}`);let r=i.cookieDomain?`;domain=${i.cookieDomain}`:"";ne(`${O}=${encodeURIComponent(JSON.stringify(e))};expires=${new Date(n).toUTCString()};path=/${r};SameSite=Lax${o}`)}function ne(e){document.cookie=e}var b="webority_attribution",je=2160*60*60*1e3,He=200,M=500,Ve=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"}),de=!1;function We(){me("captureAttribution"),Qe();let e=Xe();if(!e)return;let t=K(G());pe(G(),{firstTouch:t?.firstTouch??e,lastTouch:e}),Ye(e)}function Ye(e){let t={event:"acquisition_touch",acquisition_channel:T(e)};e.aiSource&&(t.ai_source=e.aiSource),window.dataLayer=window.dataLayer||[],window.dataLayer.push(t)}function B(){return me("getAttribution"),K(G())}function Xe(){let e=new URLSearchParams(window.location.search),t={};for(let[r,c]of Object.entries(Ve)){let s=A(e.get(r),He);s&&(t[c]=s)}let n=A(e.get("referrer"),M)||Je();if(n&&(t.referrer=n),Object.keys(t).length===0)return null;let o=k(t);return o&&(t.aiSource=o),t.landingPage=A(window.location.pathname,M),t.capturedDateTimeUtc=new Date().toISOString(),t}function Je(){let e=document.referrer;if(!e)return"";try{return new URL(e).hostname===window.location.hostname?"":A(e,M)}catch{return""}}function Qe(){de||(de=!0,C(e=>{let t=e.marketing?z():$(),n=e.marketing?$():z(),o=K(t);Ze(t),o&&pe(n,o)}))}function G(){return d().marketing?$():z()}function $(){try{return window.localStorage}catch{return null}}function z(){try{return window.sessionStorage}catch{return null}}function K(e){try{let t=e?.getItem(b);if(!t)return null;let n=JSON.parse(t),o=fe(n?.firstTouch),r=fe(n?.lastTouch);return!o&&!r?(e.removeItem(b),null):{firstTouch:o??r,lastTouch:r??o}}catch{return null}}function pe(e,t){try{e?.setItem(b,JSON.stringify(t))}catch{}}function Ze(e){try{e?.removeItem(b)}catch{}}function fe(e){if(!e||typeof e!="object")return null;let t=Date.parse(e.capturedDateTimeUtc);return Number.isFinite(t)&&Date.now()-t<=je?e:null}function A(e,t){let n=String(e??"").trim();return n?n.slice(0,t):""}function me(e){if(!y())throw new Error(`@webority/analytics: call initConsent before ${e}.`)}var et=["scroll","mousemove","touchstart","keydown","pointerdown"];function N(e){let t=!1,n=()=>{t||(t=!0,e())};for(let o of et)window.addEventListener(o,n,{once:!0,passive:!0});document.readyState==="complete"?setTimeout(n,1500):window.addEventListener("load",()=>setTimeout(n,1500),{once:!0})}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",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",REPORT_VERIFIED:"report_verified",CONTENT_ENGAGED:"content_engaged",EMAIL_CLICK:"email_click",PAGE_NOT_FOUND:"page_not_found",CHAT_OPENED:"chat_opened",TOUR_STARTED:"tour_started",TOUR_STEP_VIEWED:"tour_step_viewed",TOUR_COMPLETED:"tour_completed",TOUR_SKIPPED:"tour_skipped"}),Pt=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,leadQualified:a.LEAD_QUALIFIED,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,reportVerified:a.REPORT_VERIFIED,contentEngaged:a.CONTENT_ENGAGED,emailClick:a.EMAIL_CLICK,pageNotFound:a.PAGE_NOT_FOUND,chatOpened:a.CHAT_OPENED,tourStarted:a.TOUR_STARTED,tourStepViewed:a.TOUR_STEP_VIEWED,tourCompleted:a.TOUR_COMPLETED,tourSkipped:a.TOUR_SKIPPED}),ge=/^[a-z][a-z0-9]*(_[a-z0-9]+)*$/;var tt=50;function _e(){let e=new Set(Object.values(a)),t=new Set;return{warned:t,register(n){for(let o of n){if(!ge.test(o))throw new Error(`@webority/analytics: invalid event name "${o}". Expected snake_case.`);e.add(o)}},accept(n,o){return e.has(n)?!0:(nt(t,n,o),!1)}}}function nt(e,t,n){if(e.has(t))return;e.size<tt&&e.add(t);let o=`@webority/analytics: event "${t}" is not registered, so it was dropped. Call registerEvents() first.`;if(typeof n?.warn=="function"){n.warn(o);return}if(typeof n?.info=="function"){n.info(o);return}console.warn(o)}var ot=_e(),u={config:null,posthogInstance:null,posthogInitPromise:null,warnedUnregisteredEvents:ot.warned,pendingIdentify:null};function Kt(e){u.config=e,u.posthogInstance=null,u.posthogInitPromise=null,u.pendingIdentify=null}function rt(){let e=u.config;return e?!!(e.enabled&&e.clientKey&&e.environment!=="Local"):!1}function R(){return y()&&d().analytics}function Ee(){return rt()&&R()}var D=new Set,ye=new WeakSet,Ce=null;function Ht(e){let t=q();if(!t)return!1;try{return t.isFeatureEnabled(e)===!0}catch{return!1}}function Vt(e){let t=q();if(!t)return null;try{return t.getFeatureFlag(e)??null}catch{return null}}function Wt(e){D.add(e);let t=q();return(!t||Ce===t)&&queueMicrotask(()=>{D.has(e)&&Ie(e)}),()=>D.delete(e)}function Se(e){u.config?.featureFlags!==!0||ye.has(e)||typeof e.onFeatureFlags!="function"||(ye.add(e),e.onFeatureFlags(()=>{Ce=e;for(let t of[...D])Ie(t)}))}function q(){return u.config?.featureFlags!==!0||!Ee()?null:u.posthogInstance??null}function Ie(e){try{e()}catch(t){queueMicrotask(()=>{throw t})}}var it=new Set(["token","code","email","access_token","id_token","state","session_state","password","search","q","query"]),at=/(?:access_token|id_token|session_state|token|code|state|email|password)=/i,st=["$current_url","$referrer","$pathname","$initial_current_url","$initial_referrer","$initial_pathname","$session_entry_url","$session_entry_referrer","$session_entry_pathname"],ct=4,ut=5,lt=6;function h(e){if(typeof e!="string")return e;let t=e.indexOf("#"),n=t===-1?e:e.slice(0,t),o=t===-1||at.test(e.slice(t))?"":e.slice(t),r=n.indexOf("?");if(r===-1)return n+o;let c=n.slice(r+1).split("&"),s=c.filter(_=>!it.has(mt(_))).map(pt);if(s.length===c.length&&s.every((_,E)=>_===c[E]))return n+o;let p=n.slice(0,r),S=s.filter(_=>_!=="").join("&");return(S?`${p}?${S}`:p)+o}function he(e){if(!e||typeof e!="object")return e;let t=e.properties;for(let r of[t,e.$set,e.$set_once,t?.$set,t?.$set_once])ft(r);let n=t?.$heatmap_data;if(n&&typeof n=="object"){let r={};for(let[c,s]of Object.entries(n)){let p=h(c);r[p]=r[p]?r[p].concat(s):s}t.$heatmap_data=r}if(t&&typeof t=="object"){for(let[r,c]of Object.entries(t))if(r.startsWith("$web_vitals_")&&r.endsWith("_event")&&c&&typeof c=="object")for(let s of["$current_url","navigationURL"])typeof c[s]=="string"&&(c[s]=h(c[s]))}let o=t?.$snapshot_data;if(e.event==="$snapshot"&&o&&typeof o=="object")for(let r of Array.isArray(o)?o:[o])dt(r);return e}function dt(e){let t=e?.data;if(!(!t||typeof t!="object")){if(e.type===ct)L(t,["href"]);else if(e.type===ut)L(t.payload,["href"]);else if(e.type===lt&&Array.isArray(t.payload?.requests))for(let n of t.payload.requests)L(n,["name","url"])}}function L(e,t){if(!(!e||typeof e!="object"))for(let n of t)typeof e[n]=="string"&&(e[n]=h(e[n]))}function ft(e){L(e,st)}function pt(e){let t=e.indexOf("=");if(t===-1)return e;let n;try{n=decodeURIComponent(e.slice(t+1).replace(/\+/g," "))}catch{return e}if(!n.startsWith("/")&&!/^https?:\/\//i.test(n))return e;let o=h(n);return o===n?e:`${e.slice(0,t)}=${encodeURIComponent(o)}`}function mt(e){let t=e.split("=",1)[0].replace(/\+/g," ");try{return decodeURIComponent(t).toLowerCase()}catch{return t.toLowerCase()}}async function en(){if(u.posthogInstance)return u.posthogInstance;if(u.posthogInitPromise)return u.posthogInitPromise;let e=u.config;return u.posthogInitPromise=import("posthog-js").then(t=>{let n=t.default??t,o=j(H(e),R(),e.featureFlags===!0);return n.init(e.clientKey,o),n.register({product:e.product,surface:e.surface,environment:e.environment}),R()?n.opt_in_capturing({captureEventName:!1}):n.opt_out_capturing(),u.posthogInstance=n,Se(n),n}).catch(t=>{throw u.posthogInitPromise=null,t}),u.posthogInitPromise}function j(e,t,n=!1){return t?e:{...e,opt_out_capturing_by_default:!0,...n?{advanced_disable_feature_flags_on_first_load:!0}:{}}}function H(e){let t=e.sessionRecording??{enabled:!1},n={api_host:e.host,autocapture:!1,capture_pageview:"history_change",cookieless_mode:"on_reject",person_profiles:"identified_only",persistence:"localStorage+cookie",cross_subdomain_cookie:!0,disable_session_recording:!t.enabled,enable_heatmaps:e.heatmaps===!0,capture_exceptions:e.captureExceptions===!0,capture_performance:{web_vitals:e.webVitals===!0},disable_surveys:!0,disable_product_tours:!0,disable_conversations:!0,advanced_disable_feature_flags:!(t.enabled||e.featureFlags===!0),before_send:he};return t.enabled&&(n.session_recording={maskAllInputs:t.maskAllInputs??!0,...t.maskTextSelector?{maskTextSelector:t.maskTextSelector}:{},maskCapturedNetworkRequestFn:o=>({...o,name:h(o.name)}),recordBody:!1,recordHeaders:!1}),n}var gt=()=>import("posthog-js"),_t=100,l={config:null,posthog:null,pending:[],failed:!1,loadPosthog:gt,stopFollowingConsent:null};function Et({host:e,clientKey:t,product:n,surface:o,environment:r,enabled:c=!0,sessionRecording:s,heatmaps:p=!1,captureExceptions:S=!1,webVitals:_=!1}={}){if(!y())throw new Error("@webority/analytics: call initConsent before initSiteAnalytics.");!c||!e||!t||r==="Local"||l.config||(l.config={host:e,clientKey:t,product:n,surface:o,environment:r,sessionRecording:s,heatmaps:p,captureExceptions:S,webVitals:_},l.stopFollowingConsent=C(E=>Ct(E.analytics)),N(()=>{Promise.resolve().then(l.loadPosthog).then(E=>yt(E.default??E)).catch(()=>{l.failed=!0,l.pending=[]})}))}function yt(e){let t=l.config,n=d().analytics;e.init(t.clientKey,j(St(t),n)),e.register({product:t.product,surface:t.surface,environment:t.environment}),n?e.opt_in_capturing({captureEventName:!1}):e.opt_out_capturing(),l.posthog=e;let o=l.pending;l.pending=[];for(let[r,c]of o)we(e,r,c)}function Ct(e){l.posthog&&(e?l.posthog.opt_in_capturing():l.posthog.opt_out_capturing())}function St(e){return{...H({host:e.host,sessionRecording:e.sessionRecording,heatmaps:e.heatmaps,captureExceptions:e.captureExceptions,webVitals:e.webVitals}),capture_pageview:!0}}function Te(e,t){let n=l.config;if(!n)return;let o={...t,product:n.product,surface:n.surface,environment:n.environment};l.posthog?we(l.posthog,e,o):!l.failed&&l.pending.length<_t&&l.pending.push([e,o])}function we(e,t,n){try{e.capture(t,n)}catch{}}var It=new Set(Object.values(a));function ht(e,t={}){if(!It.has(e))return!1;let n=d().analytics,o=B(),r={...t};for(let[c,s]of[["first",o?.firstTouch],["last",o?.lastTouch]])s&&(r[`${c}_touch_channel`]=T(s),s.aiSource&&(r[`${c}_touch_ai_source`]=s.aiSource));return Te(e,r),n?(window.dataLayer=window.dataLayer||[],window.dataLayer.push({...r,event:e}),!0):!1}var Tt="https://www.googletagmanager.com/gtm.js",wt=3e3,Ot=100,g={loaded:!1,clarityId:null,clarityLoaded:!1,cancelClaritySchedule:null};function At(e={}){if(!y())throw new Error("@webority/analytics: call initConsent before loadTags.");if(g.loaded)return;g.loaded=!0;let{gtmId:t,gtmUrl:n=Tt,clarityId:o,ahrefsKey:r}=e;if(typeof n!="string"||n.trim()==="")throw new Error("@webority/analytics: gtmUrl must be a non-empty string.");let c=ae();if(r){let s=()=>W("https://analytics.ahrefs.com/analytics.js",{"data-key":r});c?Oe(p=>p.analytics,s):s()}if(t){let s=U(),p=X=>X.analytics||X.marketing&&s,S=()=>{window.dataLayer=window.dataLayer||[],window.dataLayer.push({"gtm.start":Date.now(),event:"gtm.js"}),W(`${n}${n.includes("?")?"&":"?"}id=${encodeURIComponent(t)}`)},_=d(),E=_.decided&&p(_)?bt:N,Y=()=>E(S);c?Oe(p,Y):Y()}o&&(g.clarityId=o,d().analytics&&Nt(),C(s=>{s.analytics&&!g.clarityLoaded?V():g.clarityLoaded&&Ae(s)}))}function Oe(e,t){if(e(d())){t();return}let n=C(o=>{e(o)&&(n(),t())})}function bt(e){document.readyState==="loading"?document.addEventListener("DOMContentLoaded",e,{once:!0}):e()}function Nt(){let e=()=>{window.scrollY>Ot&&V()};window.addEventListener("scroll",e,{passive:!0});let t=setTimeout(V,wt);g.cancelClaritySchedule=()=>{window.removeEventListener("scroll",e),clearTimeout(t)}}function V(){g.cancelClaritySchedule?.(),g.cancelClaritySchedule=null,!(g.clarityLoaded||!g.clarityId)&&(g.clarityLoaded=!0,window.clarity=window.clarity||function(){window.clarity.q=window.clarity.q||[],window.clarity.q.push(arguments)},Ae(d()),W(`https://www.clarity.ms/tag/${encodeURIComponent(g.clarityId)}`,{crossorigin:"anonymous"}))}function Ae(e){window.clarity("consentv2",{ad_Storage:e.marketing&&U()?"granted":"denied",analytics_Storage:e.analytics?"granted":"denied"})}function W(e,t={}){let n=document.createElement("script");n.async=!0,n.src=e;for(let[o,r]of Object.entries(t))n.setAttribute(o,r);document.head.appendChild(n)}export{Ue as a,O as b,oe as c,Fe as d,Pe as e,y as f,d as g,Me as h,C as i,a as j,Pt as k,ot as l,u as m,Kt as n,rt as o,R as p,Ht as q,Vt as r,Wt as s,en as t,f as u,T as v,k as w,We as x,B as y,Et as z,ht as A,At as B};