@gurulu/web 1.0.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/t.js CHANGED
@@ -1,10 +1,10 @@
1
- class Q{workspaceId;apiUrl;fetchImpl;storage;autoBanner;locale;anonymousIdValue;bannerConfigCache=null;bannerEl=null;constructor(u){this.workspaceId=u.workspaceId,this.apiUrl=(u.apiUrl??"https://api.gurulu.io").replace(/\/+$/,""),this.fetchImpl=u.fetchImpl??(typeof fetch<"u"?fetch.bind(globalThis):Xu),this.storage=u.storage??(typeof globalThis<"u"&&"localStorage"in globalThis?globalThis.localStorage:null),this.autoBanner=u.autoBanner??!0,this.locale=u.locale??Vu(),this.anonymousIdValue=u.anonymousId??this.loadOrCreateAnonId()}async init(){if(typeof window>"u")return;try{let m=await this.fetchImpl(`${this.apiUrl}/v1/consent/banner-config?workspace_id=${encodeURIComponent(this.workspaceId)}`,{method:"GET",credentials:"omit"});if(!m.ok)return;this.bannerConfigCache=await m.json()}catch{return}if(!this.getState()&&this.autoBanner&&this.bannerConfigCache?.mode==="banner_required")this.showBanner()}getState(){if(!this.storage)return null;try{let u=this.storage.getItem(this.storageKey());if(!u)return null;let m=JSON.parse(u);if(m.expiresAt&&new Date(m.expiresAt).getTime()<Date.now())return this.storage.removeItem(this.storageKey()),null;return m}catch{return null}}async setState(u){let m=this.getState()?.categories,n={necessary:!0,analytics:u.analytics??m?.analytics??!1,marketing:u.marketing??m?.marketing??!1,functional:u.functional??m?.functional??!1,personalization:u.personalization??m?.personalization??!1},_=new Date,A=this.bannerConfigCache?.renewal_months??13,C=new Date(_);C.setMonth(C.getMonth()+A);let c={workspaceId:this.workspaceId,anonymousId:this.anonymousIdValue,categories:n,grantedAt:_.toISOString(),expiresAt:C.toISOString(),source:"sdk_api"};if(this.storage)try{this.storage.setItem(this.storageKey(),JSON.stringify(c))}catch{}try{await this.fetchImpl(`${this.apiUrl}/v1/consent/state`,{method:"POST",credentials:"omit",headers:{"content-type":"application/json"},body:JSON.stringify({workspace_id:this.workspaceId,anonymous_id:this.anonymousIdValue,necessary:n.necessary,analytics:n.analytics,marketing:n.marketing,functional:n.functional,personalization:n.personalization,source:"sdk_api"})})}catch{}}showBanner(){if(typeof document>"u")return;if(this.bannerEl)return;let u=this.bannerConfigCache?.banner_config??{},m=this.bannerText(),n=u.brand?.primary_color??"#fafafa",_=u.position??"bottom",A=document.createElement("div");A.setAttribute("data-gurulu-consent-banner",""),A.setAttribute("role","dialog"),A.setAttribute("aria-label",m.heading),A.style.cssText=qu(_),A.innerHTML=Eu(m,n);let C=A.querySelector("[data-gurulu-accept]"),c=A.querySelector("[data-gurulu-reject]");C?.addEventListener("click",()=>{this.setState({analytics:!0,marketing:!0,functional:!0,personalization:!0}),this.hideBanner()}),c?.addEventListener("click",()=>{this.setState({analytics:!1,marketing:!1,functional:!1,personalization:!1}),this.hideBanner()}),document.body.appendChild(A),this.bannerEl=A}hideBanner(){if(this.bannerEl?.parentNode)this.bannerEl.parentNode.removeChild(this.bannerEl);this.bannerEl=null}buildIngestHeader(){let u=this.getState();if(!u)return JSON.stringify({necessary:!0});return JSON.stringify(u.categories)}getAnonymousId(){return this.anonymousIdValue}storageKey(){return`gurulu_consent_${this.workspaceId}`}loadOrCreateAnonId(){if(!this.storage)return G();try{let u=this.storage.getItem("gurulu_anon_id");if(u)return u;let m=G();return this.storage.setItem("gurulu_anon_id",m),m}catch{return G()}}bannerText(){let m=this.bannerConfigCache?.banner_config?.text_overrides?.[this.locale];if(this.locale==="tr")return{heading:m?.heading??"Çerezleri tercih et",body:m?.body??"Deneyimini iyileştirmek için analytics + pazarlama çerezleri kullanıyoruz.",accept:m?.accept??"Tümünü kabul et",reject:m?.reject??"Sadece gerekli olanlar"};return{heading:m?.heading??"Manage cookies",body:m?.body??"We use analytics and marketing cookies to improve your experience.",accept:m?.accept??"Accept all",reject:m?.reject??"Necessary only"}}}function qu(u){switch(u){case"top":return"position:fixed;z-index:2147483647;background:#141414;color:#fafafa;border:1px solid #262626;border-radius:8px;padding:16px;font-family:-apple-system,Segoe UI,Roboto,sans-serif;font-size:14px;line-height:1.5;box-shadow:0 4px 24px rgba(0,0,0,0.4);max-width:480px;top:16px;left:50%;transform:translateX(-50%);";case"bottom-left":return"position:fixed;z-index:2147483647;background:#141414;color:#fafafa;border:1px solid #262626;border-radius:8px;padding:16px;font-family:-apple-system,Segoe UI,Roboto,sans-serif;font-size:14px;line-height:1.5;box-shadow:0 4px 24px rgba(0,0,0,0.4);max-width:480px;bottom:16px;left:16px;";case"bottom-right":return"position:fixed;z-index:2147483647;background:#141414;color:#fafafa;border:1px solid #262626;border-radius:8px;padding:16px;font-family:-apple-system,Segoe UI,Roboto,sans-serif;font-size:14px;line-height:1.5;box-shadow:0 4px 24px rgba(0,0,0,0.4);max-width:480px;bottom:16px;right:16px;";case"modal":return"position:fixed;z-index:2147483647;background:#141414;color:#fafafa;border:1px solid #262626;border-radius:8px;padding:16px;font-family:-apple-system,Segoe UI,Roboto,sans-serif;font-size:14px;line-height:1.5;box-shadow:0 4px 24px rgba(0,0,0,0.4);max-width:480px;top:50%;left:50%;transform:translate(-50%,-50%);";default:return"position:fixed;z-index:2147483647;background:#141414;color:#fafafa;border:1px solid #262626;border-radius:8px;padding:16px;font-family:-apple-system,Segoe UI,Roboto,sans-serif;font-size:14px;line-height:1.5;box-shadow:0 4px 24px rgba(0,0,0,0.4);max-width:480px;bottom:16px;left:50%;transform:translateX(-50%);"}}function Eu(u,m){return`
2
- <div style="margin-bottom:12px;font-weight:600;">${M(u.heading)}</div>
3
- <div style="margin-bottom:16px;color:#a3a3a3;">${M(u.body)}</div>
1
+ function Mu(u){let r=2166136261;for(let o=0;o<u.length;o++)r^=u.charCodeAt(o),r=Math.imul(r,16777619);return r>>>0}function zu(u,r){return Mu(`${u}:${r}`)%1e4/1e4}var d={workspace_id:"",popups:[],tours:[],personalizations:[],experiments:[]};class V{cfg;data=null;pending=null;exposed=new Set;served=new Set;constructor(u){this.cfg=u}async refresh(u){if(this.pending)return this.pending;let r=this.cfg.fetchImpl??(typeof fetch<"u"?fetch.bind(globalThis):null);if(!r)return d;let o=this.cfg.getUid(),n=new URLSearchParams;if(o)n.set("uid",o);let m=typeof window<"u"&&window.location?window.location.href:"",_=u?.url??m;if(_)n.set("url",_);let c=typeof navigator<"u"&&navigator.userAgent?navigator.userAgent:"",A=u?.device??(/Mobi|Android/i.test(c)?"mobile":"desktop");return n.set("device",A),this.pending=(async()=>{try{let E=await r(`${this.cfg.endpoint}/v1/activate?${n.toString()}`,{method:"GET",headers:{Authorization:`Bearer ${this.cfg.workspaceKey}`},credentials:"omit"});if(!E.ok)return this.data??d;return this.data=await E.json(),this.data}catch{return this.data??d}finally{this.pending=null}})(),this.pending}getPopups(){return this.data?.popups??[]}getTours(){return this.data?.tours??[]}getContent(u){let r=(this.data?.personalizations??[]).find((o)=>o.slot_key===u);if(!r)return null;if(!this.served.has(r.key))this.served.add(r.key),this.cfg.track("personalization_served",{personalization_key:r.key,variant_key:r.variant_key,is_holdout:r.is_holdout});return r.content}getVariant(u){let r=(this.data?.experiments??[]).find((n)=>n.key===u);if(!r)return null;let o=r.assigned_variant??Du(u,this.cfg.getUid(),r.variants);if(o&&!this.exposed.has(u))this.exposed.add(u),this.cfg.track("experiment_exposed",{experiment_key:u,variant_key:o});return o}trackPopup(u,r){this.cfg.track(`popup_${r}`,{popup_key:u})}trackTour(u,r,o){this.cfg.track(`tour_${r}`,{tour_key:u,...o!==void 0?{step_index:o}:{}})}async saveTourProgress(u,r){}snapshot(){return this.data??d}}function Du(u,r,o){let n=o.filter((A)=>A.weight>0&&A.key.length>0);if(n.length===0||!r)return null;let m=n.reduce((A,E)=>A+E.weight,0);if(m<=0)return null;let _=zu(u,r),c=0;for(let A of n)if(c+=A.weight/m,_<c)return A.key;return n[n.length-1].key}class h{workspaceId;apiUrl;fetchImpl;storage;autoBanner;locale;anonymousIdValue;bannerConfigCache=null;bannerEl=null;constructor(u){this.workspaceId=u.workspaceId,this.apiUrl=(u.apiUrl??"https://api.gurulu.io").replace(/\/+$/,""),this.fetchImpl=u.fetchImpl??(typeof fetch<"u"?fetch.bind(globalThis):$u),this.storage=u.storage??(typeof globalThis<"u"&&"localStorage"in globalThis?globalThis.localStorage:null),this.autoBanner=u.autoBanner??!0,this.locale=u.locale??Vu(),this.anonymousIdValue=u.anonymousId??this.loadOrCreateAnonId()}async init(){if(typeof window>"u")return;try{let r=await this.fetchImpl(`${this.apiUrl}/v1/consent/banner-config?workspace_id=${encodeURIComponent(this.workspaceId)}`,{method:"GET",credentials:"omit"});if(!r.ok)return;this.bannerConfigCache=await r.json()}catch{return}if(!this.getState()&&this.autoBanner&&this.bannerConfigCache?.mode==="banner_required")this.showBanner()}getState(){if(!this.storage)return null;try{let u=this.storage.getItem(this.storageKey());if(!u)return null;let r=JSON.parse(u);if(r.expiresAt&&new Date(r.expiresAt).getTime()<Date.now())return this.storage.removeItem(this.storageKey()),null;return r}catch{return null}}async setState(u){let r=this.getState()?.categories,o={necessary:!0,analytics:u.analytics??r?.analytics??!1,marketing:u.marketing??r?.marketing??!1,functional:u.functional??r?.functional??!1,personalization:u.personalization??r?.personalization??!1},n=new Date,m=this.bannerConfigCache?.renewal_months??13,_=new Date(n);_.setMonth(_.getMonth()+m);let c={workspaceId:this.workspaceId,anonymousId:this.anonymousIdValue,categories:o,grantedAt:n.toISOString(),expiresAt:_.toISOString(),source:"sdk_api"};if(this.storage)try{this.storage.setItem(this.storageKey(),JSON.stringify(c))}catch{}try{await this.fetchImpl(`${this.apiUrl}/v1/consent/state`,{method:"POST",credentials:"omit",headers:{"content-type":"application/json"},body:JSON.stringify({workspace_id:this.workspaceId,anonymous_id:this.anonymousIdValue,necessary:o.necessary,analytics:o.analytics,marketing:o.marketing,functional:o.functional,personalization:o.personalization,source:"sdk_api"})})}catch{}}showBanner(){if(typeof document>"u")return;if(this.bannerEl)return;let u=this.bannerConfigCache?.banner_config??{},r=this.bannerText(),o=u.brand?.primary_color??"#fafafa",n=u.position??"bottom",m=document.createElement("div");m.setAttribute("data-gurulu-consent-banner",""),m.setAttribute("role","dialog"),m.setAttribute("aria-label",r.heading),m.style.cssText=Tu(n),m.innerHTML=qu(r,o);let _=m.querySelector("[data-gurulu-accept]"),c=m.querySelector("[data-gurulu-reject]");_?.addEventListener("click",()=>{this.setState({analytics:!0,marketing:!0,functional:!0,personalization:!0}),this.hideBanner()}),c?.addEventListener("click",()=>{this.setState({analytics:!1,marketing:!1,functional:!1,personalization:!1}),this.hideBanner()}),document.body.appendChild(m),this.bannerEl=m}hideBanner(){if(this.bannerEl?.parentNode)this.bannerEl.parentNode.removeChild(this.bannerEl);this.bannerEl=null}buildIngestHeader(){let u=this.getState();if(!u)return JSON.stringify({necessary:!0});return JSON.stringify(u.categories)}getAnonymousId(){return this.anonymousIdValue}storageKey(){return`gurulu_consent_${this.workspaceId}`}loadOrCreateAnonId(){if(!this.storage)return R();try{let u=this.storage.getItem("gurulu_anon_id");if(u)return u;let r=R();return this.storage.setItem("gurulu_anon_id",r),r}catch{return R()}}bannerText(){let r=this.bannerConfigCache?.banner_config?.text_overrides?.[this.locale];if(this.locale==="tr")return{heading:r?.heading??"Çerezleri tercih et",body:r?.body??"Deneyimini iyileştirmek için analytics + pazarlama çerezleri kullanıyoruz.",accept:r?.accept??"Tümünü kabul et",reject:r?.reject??"Sadece gerekli olanlar"};return{heading:r?.heading??"Manage cookies",body:r?.body??"We use analytics and marketing cookies to improve your experience.",accept:r?.accept??"Accept all",reject:r?.reject??"Necessary only"}}}function Tu(u){switch(u){case"top":return"position:fixed;z-index:2147483647;background:#141414;color:#fafafa;border:1px solid #262626;border-radius:8px;padding:16px;font-family:-apple-system,Segoe UI,Roboto,sans-serif;font-size:14px;line-height:1.5;box-shadow:0 4px 24px rgba(0,0,0,0.4);max-width:480px;top:16px;left:50%;transform:translateX(-50%);";case"bottom-left":return"position:fixed;z-index:2147483647;background:#141414;color:#fafafa;border:1px solid #262626;border-radius:8px;padding:16px;font-family:-apple-system,Segoe UI,Roboto,sans-serif;font-size:14px;line-height:1.5;box-shadow:0 4px 24px rgba(0,0,0,0.4);max-width:480px;bottom:16px;left:16px;";case"bottom-right":return"position:fixed;z-index:2147483647;background:#141414;color:#fafafa;border:1px solid #262626;border-radius:8px;padding:16px;font-family:-apple-system,Segoe UI,Roboto,sans-serif;font-size:14px;line-height:1.5;box-shadow:0 4px 24px rgba(0,0,0,0.4);max-width:480px;bottom:16px;right:16px;";case"modal":return"position:fixed;z-index:2147483647;background:#141414;color:#fafafa;border:1px solid #262626;border-radius:8px;padding:16px;font-family:-apple-system,Segoe UI,Roboto,sans-serif;font-size:14px;line-height:1.5;box-shadow:0 4px 24px rgba(0,0,0,0.4);max-width:480px;top:50%;left:50%;transform:translate(-50%,-50%);";default:return"position:fixed;z-index:2147483647;background:#141414;color:#fafafa;border:1px solid #262626;border-radius:8px;padding:16px;font-family:-apple-system,Segoe UI,Roboto,sans-serif;font-size:14px;line-height:1.5;box-shadow:0 4px 24px rgba(0,0,0,0.4);max-width:480px;bottom:16px;left:50%;transform:translateX(-50%);"}}function qu(u,r){return`
2
+ <div style="margin-bottom:12px;font-weight:600;">${$(u.heading)}</div>
3
+ <div style="margin-bottom:16px;color:#a3a3a3;">${$(u.body)}</div>
4
4
  <div style="display:flex;gap:8px;flex-wrap:wrap;">
5
- <button data-gurulu-accept type="button" style="background:${Nu(m)};color:#0a0a0a;border:none;padding:8px 16px;border-radius:6px;font-weight:600;cursor:pointer;">${M(u.accept)}</button>
6
- <button data-gurulu-reject type="button" style="background:transparent;color:#fafafa;border:1px solid #404040;padding:8px 16px;border-radius:6px;cursor:pointer;">${M(u.reject)}</button>
5
+ <button data-gurulu-accept type="button" style="background:${du(r)};color:#0a0a0a;border:none;padding:8px 16px;border-radius:6px;font-weight:600;cursor:pointer;">${$(u.accept)}</button>
6
+ <button data-gurulu-reject type="button" style="background:transparent;color:#fafafa;border:1px solid #404040;padding:8px 16px;border-radius:6px;cursor:pointer;">${$(u.reject)}</button>
7
7
  </div>
8
- `}function M(u){return u.replace(/[&<>"']/g,(m)=>{switch(m){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case"'":return"&#39;";default:return m}})}function Nu(u){return u.replace(/[^a-zA-Z0-9#()_\-., ]/g,"")}function Vu(){if(typeof navigator>"u")return"en";let u=(navigator.language??"").toLowerCase();if(u.startsWith("tr"))return"tr";if(u.startsWith("zh"))return"zh";if(u.startsWith("ar"))return"ar";return"en"}function G(){if(typeof crypto<"u"&&typeof crypto.randomUUID==="function")return`anon_${crypto.randomUUID()}`;return`anon_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`}async function Xu(){throw Error("fetch not available — provide opts.fetchImpl")}var $u=new Set(["A","BUTTON"]),hu=/\.(pdf|zip|dmg|exe|tar|gz|rar|7z|mp3|mp4|csv|xlsx?|docx?|pptx?)(\?|$)/i;function Ju(u){let m=u;while(m){if(m.hasAttribute?.("data-gurulu-no-track"))return!1;m=m.parentElement}return!0}function Mu(u){let m=u;while(m){if(!m.tagName){m=m.parentElement;continue}if($u.has(m.tagName))return m;if(m.getAttribute?.("role")==="button")return m;if(m.tagName==="INPUT"){let n=m.type?.toLowerCase();if(n==="submit"||n==="button")return m}m=m.parentElement}return null}function Qu(u){let m={};if(!u.attributes)return m;for(let n=0;n<u.attributes.length;n+=1){let _=u.attributes.item(n);if(!_)continue;if(_.name.startsWith("data-gurulu-prop-")){let A=_.name.slice(17);m[A]=_.value}}return m}function f(u){if(typeof document>"u")return{stop:()=>{return}};let m=(n)=>{let _=Mu(n.target);if(!_||!Ju(_))return;let A={element_tag:_.tagName.toLowerCase()};if(_.id)A.element_id=_.id;if(_.className&&typeof _.className==="string")A.element_class=_.className.slice(0,256);let C=(_.textContent??"").trim().slice(0,200);if(C)A.element_text=C;if(_.tagName==="A"){let l=_.href;if(l){A.href=l;try{let D=new URL(l).hostname;if(typeof window<"u"&&D!==window.location.hostname)A.is_outbound=!0}catch{}if(hu.test(l))A.is_download=!0}}let c=_.getAttribute?.("data-gurulu-event");if(c)A.custom_event=c,A.custom_props=Qu(_);u(A)};return document.addEventListener("click",m,!0),{stop(){document.removeEventListener("click",m,!0)}}}var Zu=new Set(["password","tel"]);function i(u){if(u.tagName!=="INPUT")return!1;let m=u,n=(m.type??"").toLowerCase();if(Zu.has(n))return!0;if((m.autocomplete??"").toLowerCase().startsWith("cc-"))return!0;return!1}function w(u){let m=u;while(m){if(m.hasAttribute?.("data-gurulu-no-track"))return!1;m=m.parentElement}return!0}function Fu(u){let m=u;while(m){if(m.tagName==="FORM")return m;m=m.parentElement}return null}function d(u){let m={count:u.elements?.length??0};if(u.id)m.id=u.id;if(u.name)m.name=u.name;return m}function o(u){if(typeof document>"u")return{stop:()=>{return}};let m=new WeakSet,n=(A)=>{let C=A.target;if(!C)return;if(i(C))return;if(!w(C))return;let c=Fu(C);if(!c||m.has(c))return;m.add(c);let l=d(c),D={field_count:l.count};if(l.id)D.form_id=l.id;if(l.name)D.form_name=l.name;u.onStart(D)},_=(A)=>{let C=A.target;if(!C||C.tagName!=="FORM")return;if(!w(C))return;let c=d(C),l=[],D=C.elements;for(let z=0;z<D.length;z+=1){let H=D[z];if(!H)continue;if(i(H))continue;if(!("value"in H))continue;if(typeof H.value==="string"&&H.value.length>0&&H.name)l.push(H.name)}let j={field_count:c.count};if(c.id)j.form_id=c.id;if(c.name)j.form_name=c.name;if(l.length>0)j.filled_fields=l;u.onSubmit(j)};return document.addEventListener("focus",n,!0),document.addEventListener("submit",_,!0),{stop(){document.removeEventListener("focus",n,!0),document.removeEventListener("submit",_,!0)}}}function g(u){if(typeof window>"u"||typeof document>"u")return{stop:()=>{return}};let m=window.location.pathname+window.location.search;function n(){let c=window.location.pathname+window.location.search;if(c===m)return;m=c,u(window.location.href,document.title,document.referrer)}u(window.location.href,document.title,document.referrer);let _=()=>n();window.addEventListener("popstate",_);let A=history.pushState.bind(history),C=history.replaceState.bind(history);return history.pushState=function(...l){let D=A(...l);return queueMicrotask(n),D},history.replaceState=function(...l){let D=C(...l);return queueMicrotask(n),D},{stop(){window.removeEventListener("popstate",_),history.pushState=A,history.replaceState=C}}}var Bu=[25,50,75,90];function O(u){if(typeof window>"u"||typeof document>"u")return{stop:()=>{return}};let m=new Set,n=0,_=()=>{n=0;let{documentElement:C,body:c}=document;if(!C||!c)return;let l=window.scrollY??C.scrollTop??0,D=window.innerHeight??C.clientHeight??0,j=Math.max(c.scrollHeight??0,C.scrollHeight??0);if(j<=D)return;let z=(l+D)/j*100;for(let H of Bu)if(z>=H&&!m.has(H))m.add(H),u({depth_percent:H})},A=()=>{if(n!==0)return;n=requestAnimationFrame(_)};return window.addEventListener("scroll",A,{passive:!0}),{stop(){if(window.removeEventListener("scroll",A),n!==0)cancelAnimationFrame(n)}}}var Gu={LCP:[2500,4000],FID:[100,300],INP:[200,500],CLS:[0.1,0.25],TTFB:[800,1800],FCP:[1800,3000]};function V(u,m){let[n,_]=Gu[u];if(m<=n)return"good";if(m<=_)return"needs-improvement";return"poor"}function Z(u,m,n){if(typeof PerformanceObserver>"u")return null;try{let _=new PerformanceObserver((A)=>n(A.getEntries()));return _.observe({type:u,buffered:m}),_}catch{return null}}function k(u){if(typeof window>"u")return{stop:()=>{return}};let m=[];try{let S=performance.getEntriesByType("navigation")[0];if(S&&S.responseStart>0)u({metric:"TTFB",value:S.responseStart,rating:V("TTFB",S.responseStart)});let T=performance.getEntriesByName("first-contentful-paint")[0];if(T)u({metric:"FCP",value:T.startTime,rating:V("FCP",T.startTime)})}catch{}let n=0,_=Z("largest-contentful-paint",!0,(S)=>{let T=S[S.length-1];if(T)n=T.startTime});if(_)m.push(_);let A=Z("first-input",!0,(S)=>{let T=S[0];if(T){let b=T.processingStart-T.startTime;u({metric:"FID",value:b,rating:V("FID",b)})}});if(A)m.push(A);let C=0,c=Z("event",!0,(S)=>{for(let T of S){let b=T.duration;if(b>C)C=b}});if(c)m.push(c);let l=0,D=Z("layout-shift",!0,(S)=>{for(let T of S){let b=T;if(!b.hadRecentInput)l+=b.value}});if(D)m.push(D);let j=()=>{if(n>0)u({metric:"LCP",value:n,rating:V("LCP",n)});if(C>0)u({metric:"INP",value:C,rating:V("INP",C)});if(l>0)u({metric:"CLS",value:l,rating:V("CLS",l)});n=0,C=0,l=0},z=null,H=null;if(typeof document<"u")z=()=>{if(document.visibilityState==="hidden")j()},H=j,document.addEventListener("visibilitychange",z),window.addEventListener("pagehide",H);return{stop(){for(let S of m)try{S.disconnect()}catch{}if(typeof document<"u"&&z)document.removeEventListener("visibilitychange",z);if(typeof window<"u"&&H)window.removeEventListener("pagehide",H)}}}var Ru={page_view:!0,click:!0,form_started:!0,form_submitted:!0,scroll_depth:!0,web_vitals:!0,outbound_link_click:!0,download_click:!0,js_error:!1,console_error:!1,network_error:!1};function y(u,m){if(u===!1)return{stopAll:()=>{return}};let n={...Ru,...u??{}},_=[];if(n.page_view)_.push(g(m.pageView));if(n.click)_.push(f(m.click));if(n.form_started||n.form_submitted)_.push(o({onStart:n.form_started?m.formStarted:()=>{return},onSubmit:n.form_submitted?m.formSubmitted:()=>{return}}));if(n.scroll_depth)_.push(O(m.scrollDepth));if(n.web_vitals)_.push(k(m.webVital));return{stopAll(){for(let A of _)try{A.stop()}catch{}}}}function X(){return typeof window<"u"&&typeof document<"u"}function W(){if(typeof crypto<"u"&&typeof crypto.randomUUID==="function")return crypto.randomUUID();return`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}function I(u){if(!X())return null;try{return window.localStorage.getItem(u)}catch{return null}}function F(u,m){if(!X())return;try{window.localStorage.setItem(u,m)}catch{}}function r(u){if(!X())return;try{window.localStorage.removeItem(u)}catch{}}function Wu(u){if(!X())return null;let m=document.cookie??"";for(let n of m.split(";")){let[_,A]=n.trim().split("=");if(_===u&&A!==void 0)return decodeURIComponent(A)}return null}function R(u,m,n=365){if(!X())return;let _=new Date(Date.now()+n*86400000).toUTCString(),A=window.location.hostname,C=A.split("."),c=C.length>=2?`.${C.slice(-2).join(".")}`:A;try{document.cookie=`${u}=${encodeURIComponent(m)}; path=/; domain=${c}; expires=${_}; SameSite=Lax`}catch{}}function v(){let u=I("gurulu_aid")??Wu("gurulu_aid_mirror");if(u)return F("gurulu_aid",u),R("gurulu_aid_mirror",u),u;let m=W();return F("gurulu_aid",m),R("gurulu_aid_mirror",m),m}function p(u){F("gurulu_pid",u)}function a(){return I("gurulu_pid")}function e(){r("gurulu_pid"),r("gurulu_aid");let u=W();return F("gurulu_aid",u),R("gurulu_aid_mirror",u),u}function s(){return W()}class E extends Error{code;constructor(u,m){super(m);this.code=u,this.name="SDKError"}}class uu extends E{constructor(u){super("SDK_INIT",u);this.name="InitError"}}class N extends E{status;constructor(u,m){super("SDK_NETWORK",u);if(this.name="NetworkError",m!==void 0)this.status=m}}class mu extends E{constructor(u){super("SDK_QUEUE_FULL",u);this.name="QueueFullError"}}class _u extends E{constructor(){super("SDK_OPTED_OUT","tracking disabled — gurulu.optOut() in effect");this.name="OptedOutError"}}class nu extends E{constructor(){super("SDK_CONSENT_BLOCKED","event queued — awaiting consent grant");this.name="ConsentBlockedError"}}var tu=65536;function Au(u,m){let n=new Headers({"content-type":"application/json",authorization:`Bearer ${u.workspaceKey}`,"x-gurulu-sdk":`@gurulu/web@${u.sdkVersion}`});if(m)for(let[_,A]of Object.entries(m))n.set(_,A);return n}async function Cu(u,m,n){let _=u.fetchImpl??(typeof fetch<"u"?fetch.bind(globalThis):null);if(!_)throw new N("fetch unavailable");let A=`${u.endpoint}/v1/ingest/batch`,C=await _(A,{method:"POST",keepalive:!0,credentials:"omit",headers:Au(u,n),body:JSON.stringify(m)});if(!C.ok)throw new N(`ingest ${C.status}`,C.status)}function cu(u,m){if(typeof navigator>"u"||typeof navigator.sendBeacon!=="function")return!1;let n=`${u.endpoint}/v1/ingest/batch?wk=${encodeURIComponent(u.workspaceKey)}&sdk=${encodeURIComponent(u.sdkVersion)}`;try{let _=JSON.stringify(m);if(_.length>=tu)return!1;let A=new Blob([_],{type:"application/json"});return navigator.sendBeacon(n,A)}catch{return!1}}async function lu(u,m){let n=u.fetchImpl??(typeof fetch<"u"?fetch.bind(globalThis):null);if(!n)throw new N("fetch unavailable");let _=await n(`${u.endpoint}/v1/ingest/identify`,{method:"POST",keepalive:!0,credentials:"omit",headers:Au(u),body:JSON.stringify(m)});if(!_.ok)throw new N(`identify ${_.status}`,_.status)}var Y="gurulu_queue";function L(){return typeof window<"u"}function Yu(){if(!L())return[];try{let u=window.localStorage.getItem(Y);if(!u)return[];let m=JSON.parse(u);return Array.isArray(m)?m:[]}catch{return[]}}function t(u){if(!L())return;try{if(u.length===0)window.localStorage.removeItem(Y);else window.localStorage.setItem(Y,JSON.stringify(u))}catch{}}class P{opts;buffer;timer=null;flushing=!1;constructor(u){if(this.opts=u,this.buffer=Yu(),this.scheduleNext(),this.installUnloadHooks(),this.buffer.length>0)this.scheduleImmediate()}enqueue(u){if(this.buffer.push(u),t(this.buffer),this.buffer.length>=this.opts.maxQueueSize)this.flush();else this.scheduleNext()}size(){return this.buffer.length}async flush(){if(this.flushing||this.buffer.length===0)return;this.flushing=!0;let u=this.buffer.slice(0);try{await this.sendWithRetry(u),this.buffer=this.buffer.slice(u.length),t(this.buffer)}catch(m){if(this.opts.debug&&typeof console<"u")console.warn("[gurulu] flush failed, retain queue",m)}finally{this.flushing=!1}}flushBeacon(){if(this.buffer.length===0)return;if(cu(this.opts.transport,{events:this.buffer}))this.buffer=[],t(this.buffer)}scheduleNext(){if(this.timer!==null)return;this.timer=setTimeout(()=>{this.timer=null,this.flush()},this.opts.flushIntervalMs)}scheduleImmediate(){if(this.timer!==null)clearTimeout(this.timer),this.timer=null;this.timer=setTimeout(()=>{this.timer=null,this.flush()},50)}async sendWithRetry(u){let m=0,n=3;while(m<n)try{await Cu(this.opts.transport,{events:u});return}catch(_){if(m+=1,m>=n)throw _;let A=2**m*1000;await new Promise((C)=>setTimeout(C,A))}}installUnloadHooks(){if(!L()||typeof document>"u")return;let u=()=>{if(document.visibilityState==="hidden")this.flushBeacon()};try{document.addEventListener("visibilitychange",u),window.addEventListener("pagehide",()=>this.flushBeacon())}catch{}}}function Du(){return typeof window<"u"}function Lu(){if(typeof crypto<"u"&&typeof crypto.randomUUID==="function")return crypto.randomUUID();return`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}function h(u){if(!Du())return null;try{return window.localStorage.getItem(u)}catch{return null}}function $(u,m){if(!Du())return;try{window.localStorage.setItem(u,m)}catch{}}function B(u=Date.now()){let m=h("gurulu_sid"),n=Number(h("gurulu_session_started_at")??"0"),_=Number(h("gurulu_last_event_at")??"0");if(m&&n&&u-_<1800000)return $("gurulu_last_event_at",String(u)),{session_id:m,session_started_at:n,is_new:!1};let A=Lu();return $("gurulu_sid",A),$("gurulu_session_started_at",String(u)),$("gurulu_last_event_at",String(u)),{session_id:A,session_started_at:u,is_new:!0}}function Hu(u,m){let n={},_={};if(!u)return{utm:n,click_id:_};let A;try{A=new URL(u)}catch{return{utm:n,click_id:_}}let C=A.searchParams,c=C.get("utm_source");if(c)n.source=c;let l=C.get("utm_medium");if(l)n.medium=l;let D=C.get("utm_campaign");if(D)n.campaign=D;let j=C.get("utm_term");if(j)n.term=j;let z=C.get("utm_content");if(z)n.content=z;let H=C.get("gclid");if(H)_.gclid=H;let S=C.get("fbclid");if(S)_.fbclid=S;let T=C.get("ttclid");if(T)_.ttclid=T;let b=C.get("li_fat_id");if(b)_.li_fat_id=b;return{utm:n,click_id:_}}function Su(u){if(h("gurulu_first_source"))return;$("gurulu_first_source",JSON.stringify(u))}function Tu(){let u=h("gurulu_first_source");if(!u)return null;try{return JSON.parse(u)}catch{return null}}var K="0.1.0",ju="https://ingest.gurulu.io",Pu="https://api.gurulu.io",U="gurulu_opt_out";function zu(){if(typeof window>"u")return!1;try{return window.localStorage.getItem(U)==="1"}catch{return!1}}function bu(u){if(typeof window>"u")return;try{if(u)window.localStorage.setItem(U,"1");else window.localStorage.removeItem(U)}catch{}}function Ku(){return new Date().toISOString()}class J{initialized=!1;opts=null;queue=null;session=null;anonymousId=null;autocaptureHandle=null;testMode=!1;consent;init(u){if(this.initialized){if(u.debug&&typeof console<"u")console.warn("[gurulu] init() already called — ignoring");return}if(typeof window>"u")return;this.opts=u,this.testMode=u.test_mode===!0,this.anonymousId=v(),this.session=B(),this.consent=new Q({workspaceId:u.workspaceKey,apiUrl:u.apiUrl??Pu,anonymousId:this.anonymousId,autoBanner:u.consent_mode==="banner_required"}),this.consent.init();let m={endpoint:u.endpoint??ju,workspaceKey:u.workspaceKey,sdkVersion:K};this.queue=new P({transport:m,flushIntervalMs:u.flush_interval_ms??5000,maxQueueSize:u.max_queue_size??50,...u.debug?{debug:!0}:{}});let n=Hu(window.location.href,document.referrer);if(Object.keys(n.utm).length>0||Object.keys(n.click_id).length>0){let _={utm:n.utm,click_id:n.click_id,referrer:document.referrer,landing_url:window.location.href,captured_at:Date.now()};Su(_)}this.autocaptureHandle=y(u.autocapture,{pageView:(_,A,C)=>this.queueEvent("page_view","interaction",{url:_,title:A,referrer:C}),click:(_)=>{let A=_.custom_event??"element_clicked",C={element_tag:_.element_tag,..._.element_id?{element_id:_.element_id}:{},..._.element_class?{element_class:_.element_class}:{},..._.element_text?{element_text:_.element_text}:{},..._.href?{href:_.href}:{},..._.is_outbound?{is_outbound:!0}:{},..._.is_download?{is_download:!0}:{},..._.custom_props??{}};this.queueEvent(A,"interaction",C)},formStarted:(_)=>this.queueEvent("form_started","interaction",_),formSubmitted:(_)=>this.queueEvent("form_submitted","interaction",_),scrollDepth:(_)=>this.queueEvent("scroll_depth","interaction",_),webVital:(_)=>this.queueEvent("web_vital","interaction",_)}),this.initialized=!0}track(u,m){this.queueEvent(u,"interaction",m)}page(u){if(!this.initialized||typeof window>"u")return;let m=u?.url??window.location.href,n=u?.title??document.title,_=u?.referrer??document.referrer;this.queueEvent("page_view","interaction",{url:m,title:n,referrer:_})}async identify(u,m){if(!this.initialized||zu())return;if(p(u),!this.opts)return;try{await lu({endpoint:this.opts.endpoint??ju,workspaceKey:this.opts.workspaceKey,sdkVersion:K},{anonymous_id:this.anonymousId,external_user_id:u,...m?.email?{email:m.email}:{},...m?.phone?{phone:m.phone}:{},...m?{traits:m}:{}})}catch(n){if(this.opts?.debug&&typeof console<"u")console.warn("[gurulu] identify failed",n)}}reset(){if(this.anonymousId=e(),typeof window<"u")try{window.localStorage.removeItem("gurulu_sid"),window.localStorage.removeItem("gurulu_session_started_at"),window.localStorage.removeItem("gurulu_last_event_at"),window.localStorage.removeItem("gurulu_first_source")}catch{}this.session=B()}async flush(){await this.queue?.flush()}optOut(){bu(!0)}optIn(){bu(!1)}queueEvent(u,m,n){if(!this.initialized||!this.queue||zu())return;if(!this.consentAllowsAnalytics()&&this.opts?.consent_mode==="banner_required")return;this.session=B();let _={anonymous_id:this.anonymousId??"anon_unknown",event_id:s(),event_key:u,event_type:m,occurred_at:Ku(),producer:"script",producer_version:K,...this.session?{session_id:this.session.session_id}:{}},A=a();if(A)_.person_id=A;if(n&&Object.keys(n).length>0)_.properties=n;let C=this.buildContext();if(C)_.context=C;let c=this.snapshotConsent();if(c)_.consent_state=c;if(this.testMode)_.test_mode=!0;this.queue.enqueue(_)}snapshotConsent(){let u=this.consent?.getState();if(!u)return;return{necessary:u.categories.necessary,analytics:u.categories.analytics,marketing:u.categories.marketing,functional:u.categories.functional,personalization:u.categories.personalization}}consentAllowsAnalytics(){let u=this.consent?.getState();if(!u)return!1;return u.categories.analytics===!0}buildContext(){if(typeof window>"u")return;let u={url:window.location.href,referrer:document.referrer,page_title:document.title,user_agent:navigator.userAgent,domain:window.location.hostname},m=Tu();if(m?.utm&&Object.keys(m.utm).length>0)u.utm=m.utm;if(m?.click_id&&Object.keys(m.click_id).length>0)u.click_id=m.click_id;return u}}var Uu="0.1.0",q=new J;function Tm(){return new J}var x={init:(u)=>q.init(u),track:(u,m)=>q.track(u,m),identify:(u,m)=>q.identify(u,m),page:(u)=>q.page(u),reset:()=>q.reset(),flush:()=>q.flush(),optOut:()=>q.optOut(),optIn:()=>q.optIn(),get consent(){return q.consent},VERSION:Uu};function xu(){if(typeof document>"u")return;let u=document.currentScript,m=!u?document.querySelector("script[data-workspace]"):u;if(!m)return;let n=m.getAttribute("data-workspace");if(!n)return;let _={workspaceKey:n},A=m.getAttribute("data-endpoint");if(A)_.endpoint=A;let C=m.getAttribute("data-api-url");if(C)_.apiUrl=C;let c=m.getAttribute("data-consent");if(c==="banner_required"||c==="allow_by_default")_.consent_mode=c;let l=m.getAttribute("data-allowlist");if(l)_.cross_domain_allowlist=l.split(",").map((D)=>D.trim());if(x.init(_),typeof window<"u")window.gurulu=x}xu();var Em=x;export{Em as default,Tm as createGurulu,xu as autoBootstrap,Uu as VERSION,E as SDKError,mu as QueueFullError,_u as OptedOutError,N as NetworkError,uu as InitError,Q as GuruluConsent,J as Gurulu,nu as ConsentBlockedError};
8
+ `}function $(u){return u.replace(/[&<>"']/g,(r)=>{switch(r){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case"'":return"&#39;";default:return r}})}function du(u){return u.replace(/[^a-zA-Z0-9#()_\-., ]/g,"")}function Vu(){if(typeof navigator>"u")return"en";let u=(navigator.language??"").toLowerCase();if(u.startsWith("tr"))return"tr";if(u.startsWith("zh"))return"zh";if(u.startsWith("ar"))return"ar";return"en"}function R(){if(typeof crypto<"u"&&typeof crypto.randomUUID==="function")return`anon_${crypto.randomUUID()}`;return`anon_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`}async function $u(){throw Error("fetch not available — provide opts.fetchImpl")}var hu=new Set(["A","BUTTON"]),Nu=/\.(pdf|zip|dmg|exe|tar|gz|rar|7z|mp3|mp4|csv|xlsx?|docx?|pptx?)(\?|$)/i;function Gu(u){let r=u;while(r){if(r.hasAttribute?.("data-gurulu-no-track"))return!1;r=r.parentElement}return!0}function Qu(u){let r=u;while(r){if(!r.tagName){r=r.parentElement;continue}if(hu.has(r.tagName))return r;if(r.getAttribute?.("role")==="button")return r;if(r.tagName==="INPUT"){let o=r.type?.toLowerCase();if(o==="submit"||o==="button")return r}r=r.parentElement}return null}function Ru(u){let r={};if(!u.attributes)return r;for(let o=0;o<u.attributes.length;o+=1){let n=u.attributes.item(o);if(!n)continue;if(n.name.startsWith("data-gurulu-prop-")){let m=n.name.slice(17);r[m]=n.value}}return r}function U(u){if(typeof document>"u")return{stop:()=>{return}};let r=(o)=>{let n=Qu(o.target);if(!n||!Gu(n))return;let m={element_tag:n.tagName.toLowerCase()};if(n.id)m.element_id=n.id;if(n.className&&typeof n.className==="string")m.element_class=n.className.slice(0,256);let _=(n.textContent??"").trim().slice(0,200);if(_)m.element_text=_;if(n.tagName==="A"){let A=n.href;if(A){m.href=A;try{let E=new URL(A).hostname;if(typeof window<"u"&&E!==window.location.hostname)m.is_outbound=!0}catch{}if(Nu.test(A))m.is_download=!0}}let c=n.getAttribute?.("data-gurulu-event");if(c)m.custom_event=c,m.custom_props=Ru(n);u(m)};return document.addEventListener("click",r,!0),{stop(){document.removeEventListener("click",r,!0)}}}function K(u){if(typeof window>"u")return{stop:()=>{return}};let r=(n)=>{let m=n.error;u({message:String(n.message??m?.message??"Error").slice(0,1000),error_type:m?.name??"Error",...n.filename?{source:n.filename}:{},...typeof n.lineno==="number"?{lineno:n.lineno}:{},...typeof n.colno==="number"?{colno:n.colno}:{},...m?.stack?{stack:String(m.stack).slice(0,2000)}:{}})},o=(n)=>{let m=n.reason,_=m instanceof Error;u({message:String(_?m.message:m).slice(0,1000),error_type:_?m.name:"UnhandledRejection",..._&&m.stack?{stack:String(m.stack).slice(0,2000)}:{}})};return window.addEventListener("error",r),window.addEventListener("unhandledrejection",o),{stop(){window.removeEventListener("error",r),window.removeEventListener("unhandledrejection",o)}}}var Zu=new Set(["password","tel"]);function O(u){if(u.tagName!=="INPUT")return!1;let r=u,o=(r.type??"").toLowerCase();if(Zu.has(o))return!0;if((r.autocomplete??"").toLowerCase().startsWith("cc-"))return!0;return!1}function k(u){let r=u;while(r){if(r.hasAttribute?.("data-gurulu-no-track"))return!1;r=r.parentElement}return!0}function iu(u){let r=u;while(r){if(r.tagName==="FORM")return r;r=r.parentElement}return null}function x(u){let r={count:u.elements?.length??0};if(u.id)r.id=u.id;if(u.name)r.name=u.name;return r}function y(u){if(typeof document>"u")return{stop:()=>{return}};let r=new WeakSet,o=(m)=>{let _=m.target;if(!_)return;if(O(_))return;if(!k(_))return;let c=iu(_);if(!c||r.has(c))return;r.add(c);let A=x(c),E={field_count:A.count};if(A.id)E.form_id=A.id;if(A.name)E.form_name=A.name;u.onStart(E)},n=(m)=>{let _=m.target;if(!_||_.tagName!=="FORM")return;if(!k(_))return;let c=x(_),A=[],E=_.elements;for(let t=0;t<E.length;t+=1){let l=E[t];if(!l)continue;if(O(l))continue;if(!("value"in l))continue;if(typeof l.value==="string"&&l.value.length>0&&l.name)A.push(l.name)}let j={field_count:c.count};if(c.id)j.form_id=c.id;if(c.name)j.form_name=c.name;if(A.length>0)j.filled_fields=A;u.onSubmit(j)};return document.addEventListener("focus",o,!0),document.addEventListener("submit",n,!0),{stop(){document.removeEventListener("focus",o,!0),document.removeEventListener("submit",n,!0)}}}function I(u){if(typeof window>"u"||typeof document>"u")return{stop:()=>{return}};let r=window.location.pathname+window.location.search;function o(){let c=window.location.pathname+window.location.search;if(c===r)return;r=c,u(window.location.href,document.title,document.referrer)}u(window.location.href,document.title,document.referrer);let n=()=>o();window.addEventListener("popstate",n);let m=history.pushState.bind(history),_=history.replaceState.bind(history);return history.pushState=function(...A){let E=m(...A);return queueMicrotask(o),E},history.replaceState=function(...A){let E=_(...A);return queueMicrotask(o),E},{stop(){window.removeEventListener("popstate",n),history.pushState=m,history.replaceState=_}}}var fu=[25,50,75,90];function v(u){if(typeof window>"u"||typeof document>"u")return{stop:()=>{return}};let r=new Set,o=0,n=()=>{o=0;let{documentElement:_,body:c}=document;if(!_||!c)return;let A=window.scrollY??_.scrollTop??0,E=window.innerHeight??_.clientHeight??0,j=Math.max(c.scrollHeight??0,_.scrollHeight??0);if(j<=E)return;let t=(A+E)/j*100;for(let l of fu)if(t>=l&&!r.has(l))r.add(l),u({depth_percent:l})},m=()=>{if(o!==0)return;o=requestAnimationFrame(n)};return window.addEventListener("scroll",m,{passive:!0}),{stop(){if(window.removeEventListener("scroll",m),o!==0)cancelAnimationFrame(o)}}}var Fu={LCP:[2500,4000],FID:[100,300],INP:[200,500],CLS:[0.1,0.25],TTFB:[800,1800],FCP:[1800,3000]};function M(u,r){let[o,n]=Fu[u];if(r<=o)return"good";if(r<=n)return"needs-improvement";return"poor"}function N(u,r,o){if(typeof PerformanceObserver>"u")return null;try{let n=new PerformanceObserver((m)=>o(m.getEntries()));return n.observe({type:u,buffered:r}),n}catch{return null}}function a(u){if(typeof window>"u")return{stop:()=>{return}};let r=[];try{let C=performance.getEntriesByType("navigation")[0];if(C&&C.responseStart>0)u({metric:"TTFB",value:C.responseStart,rating:M("TTFB",C.responseStart)});let S=performance.getEntriesByName("first-contentful-paint")[0];if(S)u({metric:"FCP",value:S.startTime,rating:M("FCP",S.startTime)})}catch{}let o=0,n=N("largest-contentful-paint",!0,(C)=>{let S=C[C.length-1];if(S)o=S.startTime});if(n)r.push(n);let m=N("first-input",!0,(C)=>{let S=C[0];if(S){let H=S.processingStart-S.startTime;u({metric:"FID",value:H,rating:M("FID",H)})}});if(m)r.push(m);let _=0,c=N("event",!0,(C)=>{for(let S of C){let H=S.duration;if(H>_)_=H}});if(c)r.push(c);let A=0,E=N("layout-shift",!0,(C)=>{for(let S of C){let H=S;if(!H.hadRecentInput)A+=H.value}});if(E)r.push(E);let j=()=>{if(o>0)u({metric:"LCP",value:o,rating:M("LCP",o)});if(_>0)u({metric:"INP",value:_,rating:M("INP",_)});if(A>0)u({metric:"CLS",value:A,rating:M("CLS",A)});o=0,_=0,A=0},t=null,l=null;if(typeof document<"u")t=()=>{if(document.visibilityState==="hidden")j()},l=j,document.addEventListener("visibilitychange",t),window.addEventListener("pagehide",l);return{stop(){for(let C of r)try{C.disconnect()}catch{}if(typeof document<"u"&&t)document.removeEventListener("visibilitychange",t);if(typeof window<"u"&&l)window.removeEventListener("pagehide",l)}}}var gu={page_view:!0,click:!0,form_started:!0,form_submitted:!0,scroll_depth:!0,web_vitals:!0,outbound_link_click:!0,download_click:!0,js_error:!1,console_error:!1,network_error:!1};function e(u,r){if(u===!1)return{stopAll:()=>{return}};let o={...gu,...u??{}},n=[];if(o.page_view)n.push(I(r.pageView));if(o.click)n.push(U(r.click));if(o.form_started||o.form_submitted)n.push(y({onStart:o.form_started?r.formStarted:()=>{return},onSubmit:o.form_submitted?r.formSubmitted:()=>{return}}));if(o.scroll_depth)n.push(v(r.scrollDepth));if(o.web_vitals)n.push(a(r.webVital));if(o.js_error)n.push(K(r.jsError));return{stopAll(){for(let m of n)try{m.stop()}catch{}}}}function z(){return typeof window<"u"&&typeof document<"u"}function i(){if(typeof crypto<"u"&&typeof crypto.randomUUID==="function")return crypto.randomUUID();return`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}function s(u){if(!z())return null;try{return window.localStorage.getItem(u)}catch{return null}}function G(u,r){if(!z())return;try{window.localStorage.setItem(u,r)}catch{}}function p(u){if(!z())return;try{window.localStorage.removeItem(u)}catch{}}function wu(u){if(!z())return null;let r=document.cookie??"";for(let o of r.split(";")){let[n,m]=o.trim().split("=");if(n===u&&m!==void 0)return decodeURIComponent(m)}return null}function Z(u,r,o=365){if(!z())return;let n=new Date(Date.now()+o*86400000).toUTCString(),m=window.location.hostname,_=m.split("."),c=_.length>=2?`.${_.slice(-2).join(".")}`:m;try{document.cookie=`${u}=${encodeURIComponent(r)}; path=/; domain=${c}; expires=${n}; SameSite=Lax`}catch{}}function uu(){let u=s("gurulu_aid")??wu("gurulu_aid_mirror");if(u)return G("gurulu_aid",u),Z("gurulu_aid_mirror",u),u;let r=i();return G("gurulu_aid",r),Z("gurulu_aid_mirror",r),r}function ru(u){G("gurulu_pid",u)}function f(){return s("gurulu_pid")}function nu(){p("gurulu_pid"),p("gurulu_aid");let u=i();return G("gurulu_aid",u),Z("gurulu_aid_mirror",u),u}function ou(){return i()}class J extends Error{code;constructor(u,r){super(r);this.code=u,this.name="SDKError"}}class mu extends J{constructor(u){super("SDK_INIT",u);this.name="InitError"}}class b extends J{status;constructor(u,r){super("SDK_NETWORK",u);if(this.name="NetworkError",r!==void 0)this.status=r}}class _u extends J{constructor(u){super("SDK_QUEUE_FULL",u);this.name="QueueFullError"}}class cu extends J{constructor(){super("SDK_OPTED_OUT","tracking disabled — gurulu.optOut() in effect");this.name="OptedOutError"}}class Au extends J{constructor(){super("SDK_CONSENT_BLOCKED","event queued — awaiting consent grant");this.name="ConsentBlockedError"}}var Wu=65536;function Eu(u,r){let o=new Headers({"content-type":"application/json",authorization:`Bearer ${u.workspaceKey}`,"x-gurulu-sdk":`@gurulu/web@${u.sdkVersion}`});if(r)for(let[n,m]of Object.entries(r))o.set(n,m);return o}async function lu(u,r,o){let n=u.fetchImpl??(typeof fetch<"u"?fetch.bind(globalThis):null);if(!n)throw new b("fetch unavailable");let m=`${u.endpoint}/v1/ingest/batch`,_=await n(m,{method:"POST",keepalive:!0,credentials:"omit",headers:Eu(u,o),body:JSON.stringify(r)});if(!_.ok)throw new b(`ingest ${_.status}`,_.status)}function Cu(u,r){if(typeof navigator>"u"||typeof navigator.sendBeacon!=="function")return!1;let o=`${u.endpoint}/v1/ingest/batch?wk=${encodeURIComponent(u.workspaceKey)}&sdk=${encodeURIComponent(u.sdkVersion)}`;try{let n=JSON.stringify(r);if(n.length>=Wu)return!1;let m=new Blob([n],{type:"application/json"});return navigator.sendBeacon(o,m)}catch{return!1}}async function Su(u,r){let o=u.fetchImpl??(typeof fetch<"u"?fetch.bind(globalThis):null);if(!o)throw new b("fetch unavailable");let n=await o(`${u.endpoint}/v1/ingest/identify`,{method:"POST",keepalive:!0,credentials:"omit",headers:Eu(u),body:JSON.stringify(r)});if(!n.ok)throw new b(`identify ${n.status}`,n.status)}var g="gurulu_queue";function w(){return typeof window<"u"}function Bu(){if(!w())return[];try{let u=window.localStorage.getItem(g);if(!u)return[];let r=JSON.parse(u);return Array.isArray(r)?r:[]}catch{return[]}}function F(u){if(!w())return;try{if(u.length===0)window.localStorage.removeItem(g);else window.localStorage.setItem(g,JSON.stringify(u))}catch{}}class W{opts;buffer;timer=null;flushing=!1;constructor(u){if(this.opts=u,this.buffer=Bu(),this.scheduleNext(),this.installUnloadHooks(),this.buffer.length>0)this.scheduleImmediate()}enqueue(u){if(this.buffer.push(u),F(this.buffer),this.buffer.length>=this.opts.maxQueueSize)this.flush();else this.scheduleNext()}size(){return this.buffer.length}async flush(){if(this.flushing||this.buffer.length===0)return;this.flushing=!0;let u=this.buffer.slice(0);try{await this.sendWithRetry(u),this.buffer=this.buffer.slice(u.length),F(this.buffer)}catch(r){if(this.opts.debug&&typeof console<"u")console.warn("[gurulu] flush failed, retain queue",r)}finally{this.flushing=!1}}flushBeacon(){if(this.buffer.length===0)return;if(Cu(this.opts.transport,{events:this.buffer}))this.buffer=[],F(this.buffer)}scheduleNext(){if(this.timer!==null)return;this.timer=setTimeout(()=>{this.timer=null,this.flush()},this.opts.flushIntervalMs)}scheduleImmediate(){if(this.timer!==null)clearTimeout(this.timer),this.timer=null;this.timer=setTimeout(()=>{this.timer=null,this.flush()},50)}async sendWithRetry(u){let r=0,o=3;while(r<o)try{await lu(this.opts.transport,{events:u});return}catch(n){if(r+=1,r>=o)throw n;let m=2**r*1000;await new Promise((_)=>setTimeout(_,m))}}installUnloadHooks(){if(!w()||typeof document>"u")return;let u=()=>{if(document.visibilityState==="hidden")this.flushBeacon()};try{document.addEventListener("visibilitychange",u),window.addEventListener("pagehide",()=>this.flushBeacon())}catch{}}}function ju(){return typeof window<"u"}function Lu(){if(typeof crypto<"u"&&typeof crypto.randomUUID==="function")return crypto.randomUUID();return`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}function T(u){if(!ju())return null;try{return window.localStorage.getItem(u)}catch{return null}}function D(u,r){if(!ju())return;try{window.localStorage.setItem(u,r)}catch{}}function Q(u=Date.now()){let r=T("gurulu_sid"),o=Number(T("gurulu_session_started_at")??"0"),n=Number(T("gurulu_last_event_at")??"0");if(r&&o&&u-n<1800000)return D("gurulu_last_event_at",String(u)),{session_id:r,session_started_at:o,is_new:!1};let m=Lu();return D("gurulu_sid",m),D("gurulu_session_started_at",String(u)),D("gurulu_last_event_at",String(u)),{session_id:m,session_started_at:u,is_new:!0}}function tu(u,r){let o={},n={};if(!u)return{utm:o,click_id:n};let m;try{m=new URL(u)}catch{return{utm:o,click_id:n}}let _=m.searchParams,c=_.get("utm_source");if(c)o.source=c;let A=_.get("utm_medium");if(A)o.medium=A;let E=_.get("utm_campaign");if(E)o.campaign=E;let j=_.get("utm_term");if(j)o.term=j;let t=_.get("utm_content");if(t)o.content=t;let l=_.get("gclid");if(l)n.gclid=l;let C=_.get("fbclid");if(C)n.fbclid=C;let S=_.get("ttclid");if(S)n.ttclid=S;let H=_.get("li_fat_id");if(H)n.li_fat_id=H;return{utm:o,click_id:n}}function Hu(u){if(T("gurulu_first_source"))return;D("gurulu_first_source",JSON.stringify(u))}function Xu(){let u=T("gurulu_first_source");if(!u)return null;try{return JSON.parse(u)}catch{return null}}var B="0.1.0",L="https://ingest.gurulu.io",Yu="https://api.gurulu.io",Y="gurulu_opt_out";function Ju(){if(typeof window>"u")return!1;try{return window.localStorage.getItem(Y)==="1"}catch{return!1}}function bu(u){if(typeof window>"u")return;try{if(u)window.localStorage.setItem(Y,"1");else window.localStorage.removeItem(Y)}catch{}}function Pu(){return new Date().toISOString()}class q{initialized=!1;opts=null;queue=null;session=null;anonymousId=null;autocaptureHandle=null;testMode=!1;consent;activation;init(u){if(this.initialized){if(u.debug&&typeof console<"u")console.warn("[gurulu] init() already called — ignoring");return}if(typeof window>"u")return;this.opts=u,this.testMode=u.test_mode===!0,this.anonymousId=uu(),this.session=Q(),this.consent=new h({workspaceId:u.workspaceKey,apiUrl:u.apiUrl??Yu,anonymousId:this.anonymousId,autoBanner:u.consent_mode==="banner_required"}),this.consent.init(),this.activation=new V({endpoint:u.endpoint??L,workspaceKey:u.workspaceKey,getUid:()=>f()??this.anonymousId??"",track:(n,m)=>this.track(n,m)});let r={endpoint:u.endpoint??L,workspaceKey:u.workspaceKey,sdkVersion:B};this.queue=new W({transport:r,flushIntervalMs:u.flush_interval_ms??5000,maxQueueSize:u.max_queue_size??50,...u.debug?{debug:!0}:{}});let o=tu(window.location.href,document.referrer);if(Object.keys(o.utm).length>0||Object.keys(o.click_id).length>0){let n={utm:o.utm,click_id:o.click_id,referrer:document.referrer,landing_url:window.location.href,captured_at:Date.now()};Hu(n)}this.autocaptureHandle=e(u.autocapture,{pageView:(n,m,_)=>this.queueEvent("page_view","interaction",{url:n,title:m,referrer:_}),click:(n)=>{let m=n.custom_event??"element_clicked",_={element_tag:n.element_tag,...n.element_id?{element_id:n.element_id}:{},...n.element_class?{element_class:n.element_class}:{},...n.element_text?{element_text:n.element_text}:{},...n.href?{href:n.href}:{},...n.is_outbound?{is_outbound:!0}:{},...n.is_download?{is_download:!0}:{},...n.custom_props??{}};this.queueEvent(m,"interaction",_)},formStarted:(n)=>this.queueEvent("form_started","interaction",n),formSubmitted:(n)=>this.queueEvent("form_submitted","interaction",n),scrollDepth:(n)=>this.queueEvent("scroll_depth","interaction",n),webVital:(n)=>this.queueEvent("web_vital","interaction",n),jsError:(n)=>this.queueEvent("js_error","interaction",n)}),this.initialized=!0}track(u,r){this.queueEvent(u,"interaction",r)}page(u){if(!this.initialized||typeof window>"u")return;let r=u?.url??window.location.href,o=u?.title??document.title,n=u?.referrer??document.referrer;this.queueEvent("page_view","interaction",{url:r,title:o,referrer:n})}async identify(u,r){if(!this.initialized||Ju())return;if(ru(u),!this.opts)return;try{await Su({endpoint:this.opts.endpoint??L,workspaceKey:this.opts.workspaceKey,sdkVersion:B},{anonymous_id:this.anonymousId,external_user_id:u,...r?.email?{email:r.email}:{},...r?.phone?{phone:r.phone}:{},...r?{traits:r}:{}})}catch(o){if(this.opts?.debug&&typeof console<"u")console.warn("[gurulu] identify failed",o)}}reset(){if(this.anonymousId=nu(),typeof window<"u")try{window.localStorage.removeItem("gurulu_sid"),window.localStorage.removeItem("gurulu_session_started_at"),window.localStorage.removeItem("gurulu_last_event_at"),window.localStorage.removeItem("gurulu_first_source")}catch{}this.session=Q()}async flush(){await this.queue?.flush()}optOut(){bu(!0)}optIn(){bu(!1)}queueEvent(u,r,o){if(!this.initialized||!this.queue||Ju())return;if(!this.consentAllowsAnalytics()&&this.opts?.consent_mode==="banner_required")return;this.session=Q();let n={anonymous_id:this.anonymousId??"anon_unknown",event_id:ou(),event_key:u,event_type:r,occurred_at:Pu(),producer:"script",producer_version:B,...this.session?{session_id:this.session.session_id}:{}},m=f();if(m)n.person_id=m;if(o&&Object.keys(o).length>0)n.properties=o;let _=this.buildContext();if(_)n.context=_;let c=this.snapshotConsent();if(c)n.consent_state=c;if(this.testMode)n.test_mode=!0;this.queue.enqueue(n)}snapshotConsent(){let u=this.consent?.getState();if(!u)return;return{necessary:u.categories.necessary,analytics:u.categories.analytics,marketing:u.categories.marketing,functional:u.categories.functional,personalization:u.categories.personalization}}consentAllowsAnalytics(){let u=this.consent?.getState();if(!u)return!1;return u.categories.analytics===!0}buildContext(){if(typeof window>"u")return;let u={url:window.location.href,referrer:document.referrer,page_title:document.title,user_agent:navigator.userAgent,domain:window.location.hostname},r=Xu();if(r?.utm&&Object.keys(r.utm).length>0)u.utm=r.utm;if(r?.click_id&&Object.keys(r.click_id).length>0)u.click_id=r.click_id;return u}}var Uu="0.1.0",X=new q;function Tr(){return new q}var P={init:(u)=>X.init(u),track:(u,r)=>X.track(u,r),identify:(u,r)=>X.identify(u,r),page:(u)=>X.page(u),reset:()=>X.reset(),flush:()=>X.flush(),optOut:()=>X.optOut(),optIn:()=>X.optIn(),get consent(){return X.consent},get activation(){return X.activation},VERSION:Uu};function Ku(){if(typeof document>"u")return;let u=document.currentScript,r=!u?document.querySelector("script[data-workspace]"):u;if(!r)return;let o=r.getAttribute("data-workspace");if(!o)return;let n={workspaceKey:o},m=r.getAttribute("data-endpoint");if(m)n.endpoint=m;let _=r.getAttribute("data-api-url");if(_)n.apiUrl=_;let c=r.getAttribute("data-consent");if(c==="banner_required"||c==="allow_by_default")n.consent_mode=c;let A=r.getAttribute("data-allowlist");if(A)n.cross_domain_allowlist=A.split(",").map((E)=>E.trim());if(P.init(n),typeof window<"u")window.gurulu=P}Ku();var Nr=P;export{Nr as default,Tr as createGurulu,Ku as autoBootstrap,Uu as VERSION,J as SDKError,_u as QueueFullError,cu as OptedOutError,b as NetworkError,mu as InitError,h as GuruluConsent,V as GuruluActivation,q as Gurulu,Au as ConsentBlockedError};
9
9
 
10
- //# debugId=399296B48A9012C664756E2164756E21
10
+ //# debugId=AF94586E9911F89164756E2164756E21
package/dist/t.js.map CHANGED
@@ -1,23 +1,25 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/consent.ts", "../src/autocapture/click.ts", "../src/autocapture/form.ts", "../src/autocapture/page.ts", "../src/autocapture/scroll.ts", "../src/autocapture/web-vitals.ts", "../src/autocapture/index.ts", "../src/identity.ts", "../src/errors.ts", "../src/transport.ts", "../src/queue.ts", "../src/session.ts", "../src/core.ts", "../src/index.ts"],
3
+ "sources": ["../src/activation.ts", "../src/consent.ts", "../src/autocapture/click.ts", "../src/autocapture/error.ts", "../src/autocapture/form.ts", "../src/autocapture/page.ts", "../src/autocapture/scroll.ts", "../src/autocapture/web-vitals.ts", "../src/autocapture/index.ts", "../src/identity.ts", "../src/errors.ts", "../src/transport.ts", "../src/queue.ts", "../src/session.ts", "../src/core.ts", "../src/index.ts"],
4
4
  "sourcesContent": [
5
+ "// @gurulu/web Activation — M31 popup + M32 tour + M33 personalization + M30 experiment\n// HEADLESS katmanı (K35). /v1/activate'ten workspace aktif config'ini çeker, typed\n// erişim + track helper'ları sunar. Müşteri kendi render eder; hosted Shadow DOM\n// render `@gurulu/web/activate` ayrı chunk (activate-runtime.ts).\n//\n// Deterministik atama hash @gurulu/core/activation'ın BİREBİR kopyası (published\n// boundary — @gurulu/core'a bağlanamaz). Algoritma değişirse 3 yer senkron.\n\nexport function fnv1a32(str: string): number {\n let h = 0x811c9dc5;\n for (let i = 0; i < str.length; i++) {\n h ^= str.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return h >>> 0;\n}\n\nexport function activationBucket(key: string, uid: string): number {\n return (fnv1a32(`${key}:${uid}`) % 10000) / 10000;\n}\n\n// ── Kontrat tipleri (server JSON) ─────────────────────────────────────────────\nexport interface PopupDef {\n key: string;\n type: 'modal' | 'banner' | 'slidein';\n content: Record<string, string>;\n trigger: { type: string; value?: number };\n frequency_cap?: { per_user_per_day?: number };\n consent_category?: string;\n}\nexport interface TourStepDef {\n selector: string;\n title: string;\n body: string;\n placement?: string;\n advance_on?: string;\n}\nexport interface TourDef {\n key: string;\n steps: TourStepDef[];\n trigger: { auto?: boolean; manual?: boolean };\n progress?: { current_step: number; completed: boolean; dismissed: boolean };\n}\nexport interface PznResolved {\n key: string;\n slot_key: string;\n variant_key: string;\n is_holdout: boolean;\n content: Record<string, string>;\n}\nexport interface ExperimentDef {\n key: string;\n variants: Array<{ key: string; name?: string; weight: number }>;\n assigned_variant?: string | null;\n}\nexport interface ActivationData {\n workspace_id: string;\n popups: PopupDef[];\n tours: TourDef[];\n personalizations: PznResolved[];\n experiments: ExperimentDef[];\n}\n\nexport interface ActivationConfig {\n endpoint: string;\n workspaceKey: string;\n /** person_id ?? anonymous_id. */\n getUid: () => string;\n /** Parent SDK track() — exposure/serve event'leri buradan gider. */\n track: (eventKey: string, properties: Record<string, unknown>) => void;\n fetchImpl?: typeof fetch;\n}\n\nconst EMPTY: ActivationData = {\n workspace_id: '',\n popups: [],\n tours: [],\n personalizations: [],\n experiments: [],\n};\n\nexport class GuruluActivation {\n private data: ActivationData | null = null;\n private pending: Promise<ActivationData> | null = null;\n private exposed = new Set<string>(); // experiment_key — bir kez expose\n private served = new Set<string>(); // personalization_key — bir kez serve\n\n constructor(private cfg: ActivationConfig) {}\n\n /** /v1/activate'ten aktif config'i çek (tek round-trip). Idempotent (in-flight paylaşır). */\n async refresh(opts?: { url?: string; device?: string }): Promise<ActivationData> {\n if (this.pending) return this.pending;\n const f = this.cfg.fetchImpl ?? (typeof fetch !== 'undefined' ? fetch.bind(globalThis) : null);\n if (!f) return EMPTY;\n const uid = this.cfg.getUid();\n const sp = new URLSearchParams();\n if (uid) sp.set('uid', uid);\n const winHref = typeof window !== 'undefined' && window.location ? window.location.href : '';\n const url = opts?.url ?? winHref;\n if (url) sp.set('url', url);\n const ua = typeof navigator !== 'undefined' && navigator.userAgent ? navigator.userAgent : '';\n const device = opts?.device ?? (/Mobi|Android/i.test(ua) ? 'mobile' : 'desktop');\n sp.set('device', device);\n\n this.pending = (async () => {\n try {\n const res = await f(`${this.cfg.endpoint}/v1/activate?${sp.toString()}`, {\n method: 'GET',\n headers: { Authorization: `Bearer ${this.cfg.workspaceKey}` },\n credentials: 'omit',\n });\n if (!res.ok) return this.data ?? EMPTY;\n this.data = (await res.json()) as ActivationData;\n return this.data;\n } catch {\n return this.data ?? EMPTY;\n } finally {\n this.pending = null;\n }\n })();\n return this.pending;\n }\n\n /** Eligible popup'lar (refresh çağrılmadıysa boş). */\n getPopups(): PopupDef[] {\n return this.data?.popups ?? [];\n }\n /** Aktif tour'lar (uid progress dahil, tamamlanan/kapatılan hariç). */\n getTours(): TourDef[] {\n return this.data?.tours ?? [];\n }\n\n /**\n * Slot için çözülmüş içerik (audience/holdout server'da uygulandı). İlk okumada\n * `personalization_served` emit (bir kez). Slot yoksa null.\n */\n getContent(slot: string): Record<string, string> | null {\n const p = (this.data?.personalizations ?? []).find((x) => x.slot_key === slot);\n if (!p) return null;\n if (!this.served.has(p.key)) {\n this.served.add(p.key);\n this.cfg.track('personalization_served', {\n personalization_key: p.key,\n variant_key: p.variant_key,\n is_holdout: p.is_holdout,\n });\n }\n return p.content;\n }\n\n /**\n * Experiment varyantı (server-assigned; yoksa lokal deterministik). İlk okumada\n * `experiment_exposed` emit (bir kez). Experiment yoksa null.\n */\n getVariant(experimentKey: string): string | null {\n const e = (this.data?.experiments ?? []).find((x) => x.key === experimentKey);\n if (!e) return null;\n const variant =\n e.assigned_variant ?? assignLocalVariant(experimentKey, this.cfg.getUid(), e.variants);\n if (variant && !this.exposed.has(experimentKey)) {\n this.exposed.add(experimentKey);\n this.cfg.track('experiment_exposed', {\n experiment_key: experimentKey,\n variant_key: variant,\n });\n }\n return variant;\n }\n\n // ── Track helper'ları (render katmanı çağırır) ──\n trackPopup(key: string, action: 'shown' | 'clicked' | 'dismissed'): void {\n this.cfg.track(`popup_${action}`, { popup_key: key });\n }\n trackTour(\n key: string,\n action: 'started' | 'step_completed' | 'completed' | 'dismissed',\n stepIndex?: number,\n ): void {\n this.cfg.track(`tour_${action}`, {\n tour_key: key,\n ...(stepIndex !== undefined ? { step_index: stepIndex } : {}),\n });\n }\n\n /** Tur ilerlemesini server'a kaydet (cross-device). Best-effort. */\n async saveTourProgress(\n tourKey: string,\n body: {\n current_step?: number;\n completed_step?: number;\n completed?: boolean;\n dismissed?: boolean;\n },\n ): Promise<void> {\n // Not: /progress backend uç'u tour_id ister (dashboard). Public plane v1'de\n // progress = event-driven (tour_step_completed); server-side upsert worker'da.\n // Burada track ile yetin (cross-device server tarafında olaylardan türetilir).\n void tourKey;\n void body;\n }\n\n /** Test/SSR için snapshot. */\n snapshot(): ActivationData {\n return this.data ?? EMPTY;\n }\n}\n\nfunction assignLocalVariant(\n key: string,\n uid: string,\n variants: Array<{ key: string; weight: number }>,\n): string | null {\n const valid = variants.filter((v) => v.weight > 0 && v.key.length > 0);\n if (valid.length === 0 || !uid) return null;\n const total = valid.reduce((s, v) => s + v.weight, 0);\n if (total <= 0) return null;\n const bucket = activationBucket(key, uid);\n let cum = 0;\n for (const v of valid) {\n cum += v.weight / total;\n if (bucket < cum) return v.key;\n }\n return valid[valid.length - 1]!.key;\n}\n",
5
6
  "// @gurulu/web — browser SDK consent hook (Sprint D, M11 K28 zero-runtime-dep).\n//\n// API:\n// const consent = new GuruluConsent({ workspaceId, apiUrl: 'https://api.gurulu.io' });\n// await consent.init(); // banner-config fetch + auto-show if needed\n// consent.getState(); // localStorage snapshot\n// await consent.setState({ analytics: true }); // POST /v1/consent/state + cache\n// consent.showBanner() / hideBanner();\n// consent.buildIngestHeader(); // gurulu.track() için header\n//\n// Tasarım:\n// - LocalStorage key: gurulu_consent_{workspaceId}\n// - Fetch credentials: 'omit' (3rd-party context — cookie istemiyoruz)\n// - Banner UI: minimal positioned <div>, inline styles (CSP friendly).\n// - SSR-safe — window/document undefined check'leri.\n//\n// PostHog/Mixpanel/GA4 karşılaştırma:\n// - GA4 Consent Mode: gtag('consent', 'update', {...}) — Gurulu API'mizden de\n// set edilen state'i `dataLayer`a kopyalama optional helper (Faz 1.x).\n// - PostHog: cookie-based, banner kendi UI yok — Gurulu inline minimal banner.\n// - Mixpanel: opt_out_tracking() — Gurulu `setState({analytics:false})` eşdeğer.\n\nexport interface ConsentCategories {\n necessary: boolean;\n analytics: boolean;\n marketing: boolean;\n functional: boolean;\n personalization: boolean;\n}\n\nexport interface ConsentSnapshot {\n workspaceId: string;\n anonymousId: string;\n categories: ConsentCategories;\n /** ISO 8601. */\n grantedAt: string;\n /** ISO 8601. */\n expiresAt: string;\n /** Hangi kaynaktan geldi — 'banner' | 'settings_page' | 'sdk_api' | 'remote'. */\n source: 'banner' | 'settings_page' | 'sdk_api' | 'remote';\n}\n\nexport interface BannerConfig {\n position?: 'bottom' | 'top' | 'bottom-left' | 'bottom-right' | 'modal';\n theme?: 'auto' | 'light' | 'dark';\n buttons?: {\n accept?: boolean;\n reject?: boolean;\n customize?: boolean;\n };\n brand?: {\n logo_url?: string;\n primary_color?: string;\n };\n text_overrides?: Record<string, Record<string, string>>;\n}\n\nexport interface BannerConfigResponse {\n workspace_id: string;\n mode: 'allow_by_default' | 'banner_required' | 'strict_gdpr';\n categories: {\n necessary: { required: true; default: true };\n analytics: { default: boolean };\n marketing: { default: boolean };\n functional: { default: boolean };\n personalization: { default: boolean };\n };\n banner_config: BannerConfig;\n renewal_months: number;\n eu_detected: {\n country: string;\n region: string;\n gdpr_applicable: boolean;\n };\n}\n\nexport interface GuruluConsentOptions {\n workspaceId: string;\n /** Default 'https://api.gurulu.io'. Local dev: 'http://localhost:3000'. */\n apiUrl?: string;\n /** Browser locale (banner copy fallback). Default navigator.language. */\n locale?: 'tr' | 'en' | 'zh' | 'ar';\n /** Anonymous ID (otherwise generated). */\n anonymousId?: string;\n /** Test injection. */\n fetchImpl?: typeof fetch;\n /** Test injection. */\n storage?: Storage;\n /** Auto-call showBanner() in init() if mode requires. Default true. */\n autoBanner?: boolean;\n}\n\nconst DEFAULT_API_URL = 'https://api.gurulu.io';\nconst STORAGE_PREFIX = 'gurulu_consent_';\nconst ANON_STORAGE_KEY = 'gurulu_anon_id';\n\n/**\n * Browser SDK consent manager.\n * Zero runtime dep (M11 K28). SSR-safe (init no-op if window undefined).\n */\nexport class GuruluConsent {\n private readonly workspaceId: string;\n private readonly apiUrl: string;\n private readonly fetchImpl: typeof fetch;\n private readonly storage: Storage | null;\n private readonly autoBanner: boolean;\n private readonly locale: 'tr' | 'en' | 'zh' | 'ar';\n private anonymousIdValue: string;\n private bannerConfigCache: BannerConfigResponse | null = null;\n private bannerEl: HTMLElement | null = null;\n\n constructor(opts: GuruluConsentOptions) {\n this.workspaceId = opts.workspaceId;\n this.apiUrl = (opts.apiUrl ?? DEFAULT_API_URL).replace(/\\/+$/, '');\n this.fetchImpl =\n opts.fetchImpl ??\n (typeof fetch !== 'undefined'\n ? (fetch.bind(globalThis) as typeof fetch)\n : (noFetch as unknown as typeof fetch));\n this.storage =\n opts.storage ??\n (typeof globalThis !== 'undefined' && 'localStorage' in globalThis\n ? (globalThis as unknown as { localStorage: Storage }).localStorage\n : null);\n this.autoBanner = opts.autoBanner ?? true;\n this.locale = opts.locale ?? detectLocale();\n this.anonymousIdValue = opts.anonymousId ?? this.loadOrCreateAnonId();\n }\n\n /**\n * Banner config fetch + auto-show. Idempotent — tekrar çağırılabilir.\n */\n async init(): Promise<void> {\n if (typeof window === 'undefined') return; // SSR no-op\n\n try {\n const res = await this.fetchImpl(\n `${this.apiUrl}/v1/consent/banner-config?workspace_id=${encodeURIComponent(this.workspaceId)}`,\n { method: 'GET', credentials: 'omit' },\n );\n if (!res.ok) return;\n this.bannerConfigCache = (await res.json()) as BannerConfigResponse;\n } catch {\n // Network fail — caller decides (state lookup local fallback).\n return;\n }\n\n const local = this.getState();\n if (!local && this.autoBanner && this.bannerConfigCache?.mode === 'banner_required') {\n this.showBanner();\n }\n }\n\n /** Local consent snapshot — `null` if visitor henüz consent vermemiş. */\n getState(): ConsentSnapshot | null {\n if (!this.storage) return null;\n try {\n const raw = this.storage.getItem(this.storageKey());\n if (!raw) return null;\n const parsed = JSON.parse(raw) as ConsentSnapshot;\n // Expiry check.\n if (parsed.expiresAt && new Date(parsed.expiresAt).getTime() < Date.now()) {\n this.storage.removeItem(this.storageKey());\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n }\n\n /**\n * Consent state set + remote sync (POST /v1/consent/state).\n * `necessary` her zaman true (forced).\n */\n async setState(categories: Partial<ConsentCategories>): Promise<void> {\n const current = this.getState()?.categories;\n const next: ConsentCategories = {\n necessary: true,\n analytics: categories.analytics ?? current?.analytics ?? false,\n marketing: categories.marketing ?? current?.marketing ?? false,\n functional: categories.functional ?? current?.functional ?? false,\n personalization: categories.personalization ?? current?.personalization ?? false,\n };\n\n const grantedAt = new Date();\n const renewalMonths = this.bannerConfigCache?.renewal_months ?? 13;\n const expiresAt = new Date(grantedAt);\n expiresAt.setMonth(expiresAt.getMonth() + renewalMonths);\n\n const snapshot: ConsentSnapshot = {\n workspaceId: this.workspaceId,\n anonymousId: this.anonymousIdValue,\n categories: next,\n grantedAt: grantedAt.toISOString(),\n expiresAt: expiresAt.toISOString(),\n source: 'sdk_api',\n };\n\n // Local-first — Faz 1: 3rd-party context cookie-less.\n if (this.storage) {\n try {\n this.storage.setItem(this.storageKey(), JSON.stringify(snapshot));\n } catch {\n /* quota / private mode */\n }\n }\n\n // Remote sync — best-effort.\n try {\n await this.fetchImpl(`${this.apiUrl}/v1/consent/state`, {\n method: 'POST',\n credentials: 'omit',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n workspace_id: this.workspaceId,\n anonymous_id: this.anonymousIdValue,\n necessary: next.necessary,\n analytics: next.analytics,\n marketing: next.marketing,\n functional: next.functional,\n personalization: next.personalization,\n source: 'sdk_api',\n }),\n });\n } catch {\n // Offline — local state geçerli, next init() sync edecek.\n }\n }\n\n /** Banner DOM elemanını oluştur + body'ye ekle. Idempotent. */\n showBanner(): void {\n if (typeof document === 'undefined') return;\n if (this.bannerEl) return;\n\n const cfg = this.bannerConfigCache?.banner_config ?? {};\n const text = this.bannerText();\n const accentColor = cfg.brand?.primary_color ?? '#fafafa';\n const position = cfg.position ?? 'bottom';\n\n const el = document.createElement('div');\n el.setAttribute('data-gurulu-consent-banner', '');\n el.setAttribute('role', 'dialog');\n el.setAttribute('aria-label', text.heading);\n el.style.cssText = bannerCss(position);\n el.innerHTML = bannerHtml(text, accentColor);\n\n const acceptBtn = el.querySelector<HTMLButtonElement>('[data-gurulu-accept]');\n const rejectBtn = el.querySelector<HTMLButtonElement>('[data-gurulu-reject]');\n acceptBtn?.addEventListener('click', () => {\n void this.setState({\n analytics: true,\n marketing: true,\n functional: true,\n personalization: true,\n });\n this.hideBanner();\n });\n rejectBtn?.addEventListener('click', () => {\n void this.setState({\n analytics: false,\n marketing: false,\n functional: false,\n personalization: false,\n });\n this.hideBanner();\n });\n\n document.body.appendChild(el);\n this.bannerEl = el;\n }\n\n hideBanner(): void {\n if (this.bannerEl?.parentNode) {\n this.bannerEl.parentNode.removeChild(this.bannerEl);\n }\n this.bannerEl = null;\n }\n\n /**\n * gurulu.track() için header — `X-Gurulu-Consent: {categories JSON}`.\n * Ingest endpoint K17 event snapshot için bu header'ı okur.\n */\n buildIngestHeader(): string {\n const snap = this.getState();\n if (!snap) return JSON.stringify({ necessary: true });\n return JSON.stringify(snap.categories);\n }\n\n /** Test util — current anon id. */\n getAnonymousId(): string {\n return this.anonymousIdValue;\n }\n\n // ─── internal ──────────────────────────────────────────────────────────\n\n private storageKey(): string {\n return `${STORAGE_PREFIX}${this.workspaceId}`;\n }\n\n private loadOrCreateAnonId(): string {\n if (!this.storage) return generateAnonId();\n try {\n const existing = this.storage.getItem(ANON_STORAGE_KEY);\n if (existing) return existing;\n const fresh = generateAnonId();\n this.storage.setItem(ANON_STORAGE_KEY, fresh);\n return fresh;\n } catch {\n return generateAnonId();\n }\n }\n\n private bannerText(): { heading: string; body: string; accept: string; reject: string } {\n // Per-locale text — backend banner_config text_overrides override eder.\n const cfg = this.bannerConfigCache?.banner_config;\n const localeOverride = cfg?.text_overrides?.[this.locale];\n if (this.locale === 'tr') {\n return {\n heading: localeOverride?.heading ?? 'Çerezleri tercih et',\n body:\n localeOverride?.body ??\n 'Deneyimini iyileştirmek için analytics + pazarlama çerezleri kullanıyoruz.',\n accept: localeOverride?.accept ?? 'Tümünü kabul et',\n reject: localeOverride?.reject ?? 'Sadece gerekli olanlar',\n };\n }\n return {\n heading: localeOverride?.heading ?? 'Manage cookies',\n body:\n localeOverride?.body ??\n 'We use analytics and marketing cookies to improve your experience.',\n accept: localeOverride?.accept ?? 'Accept all',\n reject: localeOverride?.reject ?? 'Necessary only',\n };\n }\n}\n\nfunction bannerCss(position: NonNullable<BannerConfig['position']>): string {\n const base =\n 'position:fixed;z-index:2147483647;background:#141414;color:#fafafa;border:1px solid #262626;border-radius:8px;padding:16px;font-family:-apple-system,Segoe UI,Roboto,sans-serif;font-size:14px;line-height:1.5;box-shadow:0 4px 24px rgba(0,0,0,0.4);max-width:480px;';\n switch (position) {\n case 'top':\n return `${base}top:16px;left:50%;transform:translateX(-50%);`;\n case 'bottom-left':\n return `${base}bottom:16px;left:16px;`;\n case 'bottom-right':\n return `${base}bottom:16px;right:16px;`;\n case 'modal':\n return `${base}top:50%;left:50%;transform:translate(-50%,-50%);`;\n default:\n return `${base}bottom:16px;left:50%;transform:translateX(-50%);`;\n }\n}\n\nfunction bannerHtml(\n text: { heading: string; body: string; accept: string; reject: string },\n accent: string,\n): string {\n // Inline button colors — accent ile primary, gri secondary.\n return `\n <div style=\"margin-bottom:12px;font-weight:600;\">${escapeHtml(text.heading)}</div>\n <div style=\"margin-bottom:16px;color:#a3a3a3;\">${escapeHtml(text.body)}</div>\n <div style=\"display:flex;gap:8px;flex-wrap:wrap;\">\n <button data-gurulu-accept type=\"button\" style=\"background:${escapeAttr(accent)};color:#0a0a0a;border:none;padding:8px 16px;border-radius:6px;font-weight:600;cursor:pointer;\">${escapeHtml(text.accept)}</button>\n <button data-gurulu-reject type=\"button\" style=\"background:transparent;color:#fafafa;border:1px solid #404040;padding:8px 16px;border-radius:6px;cursor:pointer;\">${escapeHtml(text.reject)}</button>\n </div>\n `;\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"']/g, (c) => {\n switch (c) {\n case '&':\n return '&amp;';\n case '<':\n return '&lt;';\n case '>':\n return '&gt;';\n case '\"':\n return '&quot;';\n case \"'\":\n return '&#39;';\n default:\n return c;\n }\n });\n}\n\nfunction escapeAttr(s: string): string {\n return s.replace(/[^a-zA-Z0-9#()_\\-., ]/g, '');\n}\n\nfunction detectLocale(): 'tr' | 'en' | 'zh' | 'ar' {\n if (typeof navigator === 'undefined') return 'en';\n const lang = (navigator.language ?? '').toLowerCase();\n if (lang.startsWith('tr')) return 'tr';\n if (lang.startsWith('zh')) return 'zh';\n if (lang.startsWith('ar')) return 'ar';\n return 'en';\n}\n\nfunction generateAnonId(): string {\n // RFC 4122 v4-ish; crypto.randomUUID varsa kullan.\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return `anon_${crypto.randomUUID()}`;\n }\n return `anon_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`;\n}\n\nasync function noFetch(): Promise<Response> {\n throw new Error('fetch not available — provide opts.fetchImpl');\n}\n",
6
7
  "// @gurulu/web autocapture — click on <a>/<button>/[role=button]/<input type=submit|button>.\n//\n// Privacy: traverse up — bail if any ancestor has `data-gurulu-no-track`.\n// Skip elements inside password/payment <input> (auto-redact category).\n//\n// Spec § 2.5 + § 4.3.\n\nexport interface ClickPayload {\n element_tag: string;\n element_id?: string;\n element_class?: string;\n element_text?: string;\n href?: string;\n is_outbound?: boolean;\n is_download?: boolean;\n custom_event?: string;\n custom_props?: Record<string, string>;\n}\n\nexport type ClickTracker = (payload: ClickPayload) => void;\n\nconst CLICKABLE_TAGS = new Set(['A', 'BUTTON']);\nconst DOWNLOAD_EXT = /\\.(pdf|zip|dmg|exe|tar|gz|rar|7z|mp3|mp4|csv|xlsx?|docx?|pptx?)(\\?|$)/i;\n\nfunction isTrackable(el: HTMLElement): boolean {\n let node: HTMLElement | null = el;\n while (node) {\n if (node.hasAttribute?.('data-gurulu-no-track')) return false;\n node = node.parentElement;\n }\n return true;\n}\n\nfunction findClickable(target: EventTarget | null): HTMLElement | null {\n let node = target as HTMLElement | null;\n while (node) {\n if (!node.tagName) {\n node = node.parentElement;\n continue;\n }\n if (CLICKABLE_TAGS.has(node.tagName)) return node;\n if (node.getAttribute?.('role') === 'button') return node;\n if (node.tagName === 'INPUT') {\n const t = (node as HTMLInputElement).type?.toLowerCase();\n if (t === 'submit' || t === 'button') return node;\n }\n node = node.parentElement;\n }\n return null;\n}\n\nfunction readCustomProps(el: HTMLElement): Record<string, string> {\n const out: Record<string, string> = {};\n if (!el.attributes) return out;\n for (let i = 0; i < el.attributes.length; i += 1) {\n const attr = el.attributes.item(i);\n if (!attr) continue;\n if (attr.name.startsWith('data-gurulu-prop-')) {\n const k = attr.name.slice('data-gurulu-prop-'.length);\n out[k] = attr.value;\n }\n }\n return out;\n}\n\nexport interface ClickAutocaptureHandle {\n stop(): void;\n}\n\nexport function startClickAutocapture(track: ClickTracker): ClickAutocaptureHandle {\n if (typeof document === 'undefined') return { stop: () => undefined };\n\n const handler = (ev: Event): void => {\n const found = findClickable(ev.target);\n if (!found || !isTrackable(found)) return;\n\n const payload: ClickPayload = {\n element_tag: found.tagName.toLowerCase(),\n };\n if (found.id) payload.element_id = found.id;\n if (found.className && typeof found.className === 'string') {\n payload.element_class = found.className.slice(0, 256);\n }\n const text = (found.textContent ?? '').trim().slice(0, 200);\n if (text) payload.element_text = text;\n\n if (found.tagName === 'A') {\n const href = (found as HTMLAnchorElement).href;\n if (href) {\n payload.href = href;\n try {\n const host = new URL(href).hostname;\n if (typeof window !== 'undefined' && host !== window.location.hostname) {\n payload.is_outbound = true;\n }\n } catch {\n /* invalid href */\n }\n if (DOWNLOAD_EXT.test(href)) payload.is_download = true;\n }\n }\n\n const customEvent = found.getAttribute?.('data-gurulu-event');\n if (customEvent) {\n payload.custom_event = customEvent;\n payload.custom_props = readCustomProps(found);\n }\n\n track(payload);\n };\n\n document.addEventListener('click', handler, true);\n\n return {\n stop(): void {\n document.removeEventListener('click', handler, true);\n },\n };\n}\n",
8
+ "// @gurulu/web autocapture — js_error via window.onerror + unhandledrejection.\n//\n// Opt-in (config.js_error=true) — default kapalı. `js_error` event'i emit eder.\n// message/stack müşteri verisi içerebilir → opt-in + müşteri kontrolünde.\n// Stack + message truncate edilir (payload şişmesin).\n\nexport interface JsErrorPayload {\n message: string;\n error_type: string;\n source?: string;\n lineno?: number;\n colno?: number;\n stack?: string;\n}\n\nexport type JsErrorTracker = (payload: JsErrorPayload) => void;\n\nexport interface ErrorAutocaptureHandle {\n stop(): void;\n}\n\nconst MAX_STACK = 2000;\nconst MAX_MESSAGE = 1000;\n\nexport function startErrorAutocapture(track: JsErrorTracker): ErrorAutocaptureHandle {\n if (typeof window === 'undefined') return { stop: () => undefined };\n\n const onError = (ev: ErrorEvent): void => {\n const err = ev.error as Error | undefined;\n track({\n message: String(ev.message ?? err?.message ?? 'Error').slice(0, MAX_MESSAGE),\n error_type: err?.name ?? 'Error',\n ...(ev.filename ? { source: ev.filename } : {}),\n ...(typeof ev.lineno === 'number' ? { lineno: ev.lineno } : {}),\n ...(typeof ev.colno === 'number' ? { colno: ev.colno } : {}),\n ...(err?.stack ? { stack: String(err.stack).slice(0, MAX_STACK) } : {}),\n });\n };\n\n const onRejection = (ev: PromiseRejectionEvent): void => {\n const reason = ev.reason;\n const isErr = reason instanceof Error;\n track({\n message: String(isErr ? reason.message : reason).slice(0, MAX_MESSAGE),\n error_type: isErr ? reason.name : 'UnhandledRejection',\n ...(isErr && reason.stack ? { stack: String(reason.stack).slice(0, MAX_STACK) } : {}),\n });\n };\n\n window.addEventListener('error', onError);\n window.addEventListener('unhandledrejection', onRejection);\n\n return {\n stop(): void {\n window.removeEventListener('error', onError);\n window.removeEventListener('unhandledrejection', onRejection);\n },\n };\n}\n",
7
9
  "// @gurulu/web autocapture — form_started (first focus) + form_submitted.\n//\n// Privacy auto-skip: <input type=\"password|tel|email\">, [autocomplete*=\"cc-\"],\n// and any field inside [data-gurulu-no-track].\n//\n// Spec § 2.5 + § 7 Privacy.\n\nexport interface FormStartedPayload {\n form_id?: string;\n form_name?: string;\n field_count: number;\n}\n\nexport interface FormSubmittedPayload {\n form_id?: string;\n form_name?: string;\n field_count: number;\n /** Names of fields that had user input (PII-safe — no values). */\n filled_fields?: string[];\n}\n\nexport type FormTracker = {\n onStart: (p: FormStartedPayload) => void;\n onSubmit: (p: FormSubmittedPayload) => void;\n};\n\nconst SENSITIVE_INPUT_TYPES = new Set(['password', 'tel']);\n\nfunction isSensitiveField(el: HTMLElement): boolean {\n if (el.tagName !== 'INPUT') return false;\n const input = el as HTMLInputElement;\n const type = (input.type ?? '').toLowerCase();\n if (SENSITIVE_INPUT_TYPES.has(type)) return true;\n const autocomplete = (input.autocomplete ?? '').toLowerCase();\n if (autocomplete.startsWith('cc-')) return true;\n return false;\n}\n\nfunction isTrackable(el: HTMLElement): boolean {\n let node: HTMLElement | null = el;\n while (node) {\n if (node.hasAttribute?.('data-gurulu-no-track')) return false;\n node = node.parentElement;\n }\n return true;\n}\n\nfunction findForm(target: EventTarget | null): HTMLFormElement | null {\n let node = target as HTMLElement | null;\n while (node) {\n if (node.tagName === 'FORM') return node as HTMLFormElement;\n node = node.parentElement;\n }\n return null;\n}\n\nfunction formMeta(form: HTMLFormElement): { id?: string; name?: string; count: number } {\n const out: { id?: string; name?: string; count: number } = {\n count: form.elements?.length ?? 0,\n };\n if (form.id) out.id = form.id;\n if (form.name) out.name = form.name;\n return out;\n}\n\nexport interface FormAutocaptureHandle {\n stop(): void;\n}\n\nexport function startFormAutocapture(track: FormTracker): FormAutocaptureHandle {\n if (typeof document === 'undefined') return { stop: () => undefined };\n\n const startedForms = new WeakSet<HTMLFormElement>();\n\n const onFocus = (ev: FocusEvent): void => {\n const t = ev.target as HTMLElement | null;\n if (!t) return;\n if (isSensitiveField(t)) return;\n if (!isTrackable(t)) return;\n const form = findForm(t);\n if (!form || startedForms.has(form)) return;\n startedForms.add(form);\n const meta = formMeta(form);\n const p: FormStartedPayload = { field_count: meta.count };\n if (meta.id) p.form_id = meta.id;\n if (meta.name) p.form_name = meta.name;\n track.onStart(p);\n };\n\n const onSubmit = (ev: Event): void => {\n const form = ev.target as HTMLFormElement | null;\n if (!form || form.tagName !== 'FORM') return;\n if (!isTrackable(form)) return;\n const meta = formMeta(form);\n const filled: string[] = [];\n const els = form.elements;\n for (let i = 0; i < els.length; i += 1) {\n const el = els[i] as HTMLInputElement | undefined;\n if (!el) continue;\n if (isSensitiveField(el)) continue;\n if (!('value' in el)) continue;\n if (typeof el.value === 'string' && el.value.length > 0 && el.name) {\n filled.push(el.name);\n }\n }\n const p: FormSubmittedPayload = { field_count: meta.count };\n if (meta.id) p.form_id = meta.id;\n if (meta.name) p.form_name = meta.name;\n if (filled.length > 0) p.filled_fields = filled;\n track.onSubmit(p);\n };\n\n document.addEventListener('focus', onFocus, true);\n document.addEventListener('submit', onSubmit, true);\n\n return {\n stop(): void {\n document.removeEventListener('focus', onFocus, true);\n document.removeEventListener('submit', onSubmit, true);\n },\n };\n}\n",
8
10
  "// @gurulu/web autocapture — page_view + SPA route change.\n//\n// Spec § 2.5 — auto on init + popstate + history.pushState/replaceState patch.\n\nexport type PageTracker = (path: string, title: string, referrer: string) => void;\n\nexport interface PageAutocaptureHandle {\n stop(): void;\n}\n\n/**\n * Patch history & listen popstate. Emits once on init for initial page_view.\n */\nexport function startPageAutocapture(track: PageTracker): PageAutocaptureHandle {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return { stop: () => undefined };\n }\n\n let lastPath = window.location.pathname + window.location.search;\n\n function emit(): void {\n const current = window.location.pathname + window.location.search;\n if (current === lastPath) return;\n lastPath = current;\n track(window.location.href, document.title, document.referrer);\n }\n\n // Initial page_view.\n track(window.location.href, document.title, document.referrer);\n\n const onPop = (): void => emit();\n window.addEventListener('popstate', onPop);\n\n const origPush = history.pushState.bind(history);\n const origReplace = history.replaceState.bind(history);\n\n history.pushState = function patchedPush(...args) {\n const ret = origPush(...args);\n queueMicrotask(emit);\n return ret;\n } as History['pushState'];\n\n history.replaceState = function patchedReplace(...args) {\n const ret = origReplace(...args);\n queueMicrotask(emit);\n return ret;\n } as History['replaceState'];\n\n return {\n stop(): void {\n window.removeEventListener('popstate', onPop);\n history.pushState = origPush;\n history.replaceState = origReplace;\n },\n };\n}\n",
9
11
  "// @gurulu/web autocapture — scroll_depth (25/50/75/90%) via scroll listener.\n//\n// Spec § 2.5 — modal scroll depth thresholds, fired once each per session.\n// Note: IntersectionObserver would only work with sentinel injection — using a\n// throttled scroll listener is simpler and SSR-safe.\n\nexport interface ScrollDepthPayload {\n depth_percent: 25 | 50 | 75 | 90;\n}\n\nexport type ScrollTracker = (payload: ScrollDepthPayload) => void;\n\nconst THRESHOLDS: Array<25 | 50 | 75 | 90> = [25, 50, 75, 90];\n\nexport interface ScrollAutocaptureHandle {\n stop(): void;\n}\n\nexport function startScrollAutocapture(track: ScrollTracker): ScrollAutocaptureHandle {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return { stop: () => undefined };\n }\n\n const fired = new Set<number>();\n let raf = 0;\n\n const compute = (): void => {\n raf = 0;\n const doc = document.documentElement;\n const body = document.body;\n if (!doc || !body) return;\n const scrollTop = window.scrollY ?? doc.scrollTop ?? 0;\n const viewport = window.innerHeight ?? doc.clientHeight ?? 0;\n const docHeight = Math.max(body.scrollHeight ?? 0, doc.scrollHeight ?? 0);\n if (docHeight <= viewport) return;\n const percent = ((scrollTop + viewport) / docHeight) * 100;\n for (const t of THRESHOLDS) {\n if (percent >= t && !fired.has(t)) {\n fired.add(t);\n track({ depth_percent: t });\n }\n }\n };\n\n const onScroll = (): void => {\n if (raf !== 0) return;\n raf = requestAnimationFrame(compute);\n };\n\n window.addEventListener('scroll', onScroll, { passive: true });\n\n return {\n stop(): void {\n window.removeEventListener('scroll', onScroll);\n if (raf !== 0) cancelAnimationFrame(raf);\n },\n };\n}\n",
10
12
  "// @gurulu/web autocapture — Core Web Vitals via native PerformanceObserver.\n//\n// Spec § 2.5 — LCP / FID / CLS / INP / TTFB / FCP. No `web-vitals` package\n// (zero runtime dep). Approximations rather than the exact w3c-spec formulas\n// — good enough for product analytics; full fidelity defers to Faz 2 errors+.\n\nexport interface WebVitalPayload {\n metric: 'LCP' | 'FID' | 'INP' | 'CLS' | 'TTFB' | 'FCP';\n value: number;\n rating?: 'good' | 'needs-improvement' | 'poor';\n}\n\nexport type WebVitalTracker = (payload: WebVitalPayload) => void;\n\nconst RATINGS: Record<WebVitalPayload['metric'], [number, number]> = {\n LCP: [2500, 4000],\n FID: [100, 300],\n INP: [200, 500],\n CLS: [0.1, 0.25],\n TTFB: [800, 1800],\n FCP: [1800, 3000],\n};\n\nfunction rate(metric: WebVitalPayload['metric'], value: number): WebVitalPayload['rating'] {\n const [good, poor] = RATINGS[metric];\n if (value <= good) return 'good';\n if (value <= poor) return 'needs-improvement';\n return 'poor';\n}\n\nfunction safeObserve(\n entryType: string,\n buffered: boolean,\n cb: (entries: PerformanceEntry[]) => void,\n): PerformanceObserver | null {\n if (typeof PerformanceObserver === 'undefined') return null;\n try {\n const po = new PerformanceObserver((list) => cb(list.getEntries()));\n po.observe({ type: entryType, buffered } as PerformanceObserverInit);\n return po;\n } catch {\n return null;\n }\n}\n\nexport interface WebVitalsHandle {\n stop(): void;\n}\n\nexport function startWebVitalsAutocapture(track: WebVitalTracker): WebVitalsHandle {\n if (typeof window === 'undefined') return { stop: () => undefined };\n\n const observers: PerformanceObserver[] = [];\n\n // TTFB + FCP — read from `navigation`/`paint` entries.\n try {\n const nav = performance.getEntriesByType('navigation')[0] as\n | PerformanceNavigationTiming\n | undefined;\n if (nav && nav.responseStart > 0) {\n track({ metric: 'TTFB', value: nav.responseStart, rating: rate('TTFB', nav.responseStart) });\n }\n const fcp = performance.getEntriesByName('first-contentful-paint')[0];\n if (fcp) {\n track({ metric: 'FCP', value: fcp.startTime, rating: rate('FCP', fcp.startTime) });\n }\n } catch {\n /* timing API missing */\n }\n\n // LCP — largest entry wins; report on visibility hidden.\n let lastLcp = 0;\n const lcpPo = safeObserve('largest-contentful-paint', true, (entries) => {\n const last = entries[entries.length - 1];\n if (last) lastLcp = (last as PerformanceEntry & { startTime: number }).startTime;\n });\n if (lcpPo) observers.push(lcpPo);\n\n // FID — first-input.\n const fidPo = safeObserve('first-input', true, (entries) => {\n const first = entries[0] as\n | (PerformanceEntry & { processingStart: number; startTime: number })\n | undefined;\n if (first) {\n const value = first.processingStart - first.startTime;\n track({ metric: 'FID', value, rating: rate('FID', value) });\n }\n });\n if (fidPo) observers.push(fidPo);\n\n // INP — approximated via slowest event duration > 40ms (interaction proxy).\n let worstInp = 0;\n const eventPo = safeObserve('event', true, (entries) => {\n for (const e of entries) {\n const dur = (e as PerformanceEntry & { duration: number }).duration;\n if (dur > worstInp) worstInp = dur;\n }\n });\n if (eventPo) observers.push(eventPo);\n\n // CLS — sum of layout-shifts without recent input.\n let cls = 0;\n const clsPo = safeObserve('layout-shift', true, (entries) => {\n for (const e of entries) {\n const ls = e as PerformanceEntry & { value: number; hadRecentInput: boolean };\n if (!ls.hadRecentInput) cls += ls.value;\n }\n });\n if (clsPo) observers.push(clsPo);\n\n const flush = (): void => {\n if (lastLcp > 0) track({ metric: 'LCP', value: lastLcp, rating: rate('LCP', lastLcp) });\n if (worstInp > 0) track({ metric: 'INP', value: worstInp, rating: rate('INP', worstInp) });\n if (cls > 0) track({ metric: 'CLS', value: cls, rating: rate('CLS', cls) });\n lastLcp = 0;\n worstInp = 0;\n cls = 0;\n };\n\n // Report on visibility hidden / pagehide.\n let onHidden: (() => void) | null = null;\n let onPagehide: (() => void) | null = null;\n if (typeof document !== 'undefined') {\n onHidden = (): void => {\n if (document.visibilityState === 'hidden') flush();\n };\n onPagehide = flush;\n document.addEventListener('visibilitychange', onHidden);\n window.addEventListener('pagehide', onPagehide);\n }\n\n return {\n stop(): void {\n for (const po of observers) {\n try {\n po.disconnect();\n } catch {\n /* noop */\n }\n }\n if (typeof document !== 'undefined' && onHidden) {\n document.removeEventListener('visibilitychange', onHidden);\n }\n if (typeof window !== 'undefined' && onPagehide) {\n window.removeEventListener('pagehide', onPagehide);\n }\n },\n };\n}\n",
11
- "// @gurulu/web autocapture orchestrator — wires page/click/form/scroll/web-vitals\n// observers to a single track callback.\n//\n// Default policy: all five default-on; opt-in features (js_error/console_error/\n// network_error) wired Faz 2.\n\nimport type { AutocaptureConfig } from '../types.ts';\nimport { type ClickPayload, startClickAutocapture } from './click.ts';\nimport {\n type FormStartedPayload,\n type FormSubmittedPayload,\n startFormAutocapture,\n} from './form.ts';\nimport { startPageAutocapture } from './page.ts';\nimport { type ScrollDepthPayload, startScrollAutocapture } from './scroll.ts';\nimport { startWebVitalsAutocapture, type WebVitalPayload } from './web-vitals.ts';\n\nexport interface AutocaptureSinks {\n pageView: (url: string, title: string, referrer: string) => void;\n click: (payload: ClickPayload) => void;\n formStarted: (payload: FormStartedPayload) => void;\n formSubmitted: (payload: FormSubmittedPayload) => void;\n scrollDepth: (payload: ScrollDepthPayload) => void;\n webVital: (payload: WebVitalPayload) => void;\n}\n\nexport interface AutocaptureHandle {\n stopAll(): void;\n}\n\nconst DEFAULTS: Required<Omit<AutocaptureConfig, 'js_error' | 'console_error' | 'network_error'>> &\n Pick<AutocaptureConfig, 'js_error' | 'console_error' | 'network_error'> = {\n page_view: true,\n click: true,\n form_started: true,\n form_submitted: true,\n scroll_depth: true,\n web_vitals: true,\n outbound_link_click: true,\n download_click: true,\n js_error: false,\n console_error: false,\n network_error: false,\n};\n\nexport function startAutocapture(\n cfg: AutocaptureConfig | false | undefined,\n sinks: AutocaptureSinks,\n): AutocaptureHandle {\n if (cfg === false) return { stopAll: () => undefined };\n const merged = { ...DEFAULTS, ...(cfg ?? {}) };\n\n const handles: Array<{ stop(): void }> = [];\n\n if (merged.page_view) handles.push(startPageAutocapture(sinks.pageView));\n if (merged.click) handles.push(startClickAutocapture(sinks.click));\n if (merged.form_started || merged.form_submitted) {\n handles.push(\n startFormAutocapture({\n onStart: merged.form_started ? sinks.formStarted : () => undefined,\n onSubmit: merged.form_submitted ? sinks.formSubmitted : () => undefined,\n }),\n );\n }\n if (merged.scroll_depth) handles.push(startScrollAutocapture(sinks.scrollDepth));\n if (merged.web_vitals) handles.push(startWebVitalsAutocapture(sinks.webVital));\n\n return {\n stopAll(): void {\n for (const h of handles) {\n try {\n h.stop();\n } catch {\n /* noop */\n }\n }\n },\n };\n}\n",
13
+ "// @gurulu/web autocapture orchestrator — wires page/click/form/scroll/web-vitals\n// observers to a single track callback.\n//\n// Default policy: all five default-on; opt-in features (js_error/console_error/\n// network_error) wired Faz 2.\n\nimport type { AutocaptureConfig } from '../types.ts';\nimport { type ClickPayload, startClickAutocapture } from './click.ts';\nimport { type JsErrorPayload, startErrorAutocapture } from './error.ts';\nimport {\n type FormStartedPayload,\n type FormSubmittedPayload,\n startFormAutocapture,\n} from './form.ts';\nimport { startPageAutocapture } from './page.ts';\nimport { type ScrollDepthPayload, startScrollAutocapture } from './scroll.ts';\nimport { startWebVitalsAutocapture, type WebVitalPayload } from './web-vitals.ts';\n\nexport interface AutocaptureSinks {\n pageView: (url: string, title: string, referrer: string) => void;\n click: (payload: ClickPayload) => void;\n formStarted: (payload: FormStartedPayload) => void;\n formSubmitted: (payload: FormSubmittedPayload) => void;\n scrollDepth: (payload: ScrollDepthPayload) => void;\n webVital: (payload: WebVitalPayload) => void;\n jsError: (payload: JsErrorPayload) => void;\n}\n\nexport interface AutocaptureHandle {\n stopAll(): void;\n}\n\nconst DEFAULTS: Required<Omit<AutocaptureConfig, 'js_error' | 'console_error' | 'network_error'>> &\n Pick<AutocaptureConfig, 'js_error' | 'console_error' | 'network_error'> = {\n page_view: true,\n click: true,\n form_started: true,\n form_submitted: true,\n scroll_depth: true,\n web_vitals: true,\n outbound_link_click: true,\n download_click: true,\n js_error: false,\n console_error: false,\n network_error: false,\n};\n\nexport function startAutocapture(\n cfg: AutocaptureConfig | false | undefined,\n sinks: AutocaptureSinks,\n): AutocaptureHandle {\n if (cfg === false) return { stopAll: () => undefined };\n const merged = { ...DEFAULTS, ...(cfg ?? {}) };\n\n const handles: Array<{ stop(): void }> = [];\n\n if (merged.page_view) handles.push(startPageAutocapture(sinks.pageView));\n if (merged.click) handles.push(startClickAutocapture(sinks.click));\n if (merged.form_started || merged.form_submitted) {\n handles.push(\n startFormAutocapture({\n onStart: merged.form_started ? sinks.formStarted : () => undefined,\n onSubmit: merged.form_submitted ? sinks.formSubmitted : () => undefined,\n }),\n );\n }\n if (merged.scroll_depth) handles.push(startScrollAutocapture(sinks.scrollDepth));\n if (merged.web_vitals) handles.push(startWebVitalsAutocapture(sinks.webVital));\n if (merged.js_error) handles.push(startErrorAutocapture(sinks.jsError));\n\n return {\n stopAll(): void {\n for (const h of handles) {\n try {\n h.stop();\n } catch {\n /* noop */\n }\n }\n },\n };\n}\n",
12
14
  "// @gurulu/web identity layer — anonymous_id + person_id + 1st-party cookie mirror.\n//\n// Spec § 3.1 / 3.2: localStorage backed with cookie mirror for cross-subdomain\n// continuity. UUID via native crypto.randomUUID (K28 — native Web API only).\n\nconst ANON_KEY = 'gurulu_aid';\nconst ANON_COOKIE = 'gurulu_aid_mirror';\nconst PERSON_KEY = 'gurulu_pid';\n\nfunction hasWindow(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nfunction uuid(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n // Fallback (very rare browser); not RFC v7 but unique enough for queue keying.\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nfunction readLocalStorage(key: string): string | null {\n if (!hasWindow()) return null;\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction writeLocalStorage(key: string, value: string): void {\n if (!hasWindow()) return;\n try {\n window.localStorage.setItem(key, value);\n } catch {\n /* private mode / quota */\n }\n}\n\nfunction deleteLocalStorage(key: string): void {\n if (!hasWindow()) return;\n try {\n window.localStorage.removeItem(key);\n } catch {\n /* noop */\n }\n}\n\nfunction readCookie(name: string): string | null {\n if (!hasWindow()) return null;\n const cookieStr = document.cookie ?? '';\n for (const part of cookieStr.split(';')) {\n const [k, v] = part.trim().split('=');\n if (k === name && v !== undefined) return decodeURIComponent(v);\n }\n return null;\n}\n\nfunction writeCookie(name: string, value: string, days = 365): void {\n if (!hasWindow()) return;\n const expires = new Date(Date.now() + days * 86400000).toUTCString();\n const host = window.location.hostname;\n // Try to set on registrable-domain (.domain.com) — best-effort.\n const parts = host.split('.');\n const domain = parts.length >= 2 ? `.${parts.slice(-2).join('.')}` : host;\n try {\n document.cookie = `${name}=${encodeURIComponent(value)}; path=/; domain=${domain}; expires=${expires}; SameSite=Lax`;\n } catch {\n /* cross-origin / file:// */\n }\n}\n\nexport function getOrCreateAnonymousId(): string {\n const existing = readLocalStorage(ANON_KEY) ?? readCookie(ANON_COOKIE);\n if (existing) {\n // Re-mirror to both stores (recovery from one-side eviction).\n writeLocalStorage(ANON_KEY, existing);\n writeCookie(ANON_COOKIE, existing);\n return existing;\n }\n const fresh = uuid();\n writeLocalStorage(ANON_KEY, fresh);\n writeCookie(ANON_COOKIE, fresh);\n return fresh;\n}\n\nexport function setPersonId(personId: string): void {\n writeLocalStorage(PERSON_KEY, personId);\n}\n\nexport function getPersonId(): string | null {\n return readLocalStorage(PERSON_KEY);\n}\n\nexport function clearIdentity(): string {\n deleteLocalStorage(PERSON_KEY);\n deleteLocalStorage(ANON_KEY);\n const fresh = uuid();\n writeLocalStorage(ANON_KEY, fresh);\n writeCookie(ANON_COOKIE, fresh);\n return fresh;\n}\n\nexport function newEventId(): string {\n return uuid();\n}\n",
13
15
  "// @gurulu/web — minimal error class hierarchy.\n// Note: SDK runtime never throws to user code — these are internal markers\n// surfaced through debug logging.\n\nexport class SDKError extends Error {\n readonly code: string;\n constructor(code: string, message: string) {\n super(message);\n this.code = code;\n this.name = 'SDKError';\n }\n}\n\nexport class InitError extends SDKError {\n constructor(message: string) {\n super('SDK_INIT', message);\n this.name = 'InitError';\n }\n}\n\nexport class NetworkError extends SDKError {\n readonly status?: number;\n constructor(message: string, status?: number) {\n super('SDK_NETWORK', message);\n this.name = 'NetworkError';\n if (status !== undefined) this.status = status;\n }\n}\n\nexport class QueueFullError extends SDKError {\n constructor(message: string) {\n super('SDK_QUEUE_FULL', message);\n this.name = 'QueueFullError';\n }\n}\n\nexport class OptedOutError extends SDKError {\n constructor() {\n super('SDK_OPTED_OUT', 'tracking disabled — gurulu.optOut() in effect');\n this.name = 'OptedOutError';\n }\n}\n\nexport class ConsentBlockedError extends SDKError {\n constructor() {\n super('SDK_CONSENT_BLOCKED', 'event queued — awaiting consent grant');\n this.name = 'ConsentBlockedError';\n }\n}\n",
14
16
  "// @gurulu/web transport — fetch keepalive (primary) + sendBeacon (unload fallback).\n// 3rd-party context: credentials: 'omit', custom auth via Bearer header.\n//\n// Spec § 4.5.\n\nimport { NetworkError } from './errors.ts';\n\nconst BEACON_SIZE_LIMIT = 65536; // 64KB\n\nexport interface TransportConfig {\n endpoint: string;\n workspaceKey: string;\n sdkVersion: string;\n /** Optional override (tests). */\n fetchImpl?: typeof fetch;\n}\n\nfunction buildHeaders(cfg: TransportConfig, extra?: Record<string, string>): Headers {\n const h = new Headers({\n 'content-type': 'application/json',\n authorization: `Bearer ${cfg.workspaceKey}`,\n 'x-gurulu-sdk': `@gurulu/web@${cfg.sdkVersion}`,\n });\n if (extra) {\n for (const [k, v] of Object.entries(extra)) h.set(k, v);\n }\n return h;\n}\n\n/**\n * Send batch to /v1/ingest/batch via fetch keepalive.\n * Throws NetworkError on non-2xx. Caller handles retry/backoff.\n */\nexport async function sendBatch(\n cfg: TransportConfig,\n body: unknown,\n extraHeaders?: Record<string, string>,\n): Promise<void> {\n const f = cfg.fetchImpl ?? (typeof fetch !== 'undefined' ? fetch.bind(globalThis) : null);\n if (!f) throw new NetworkError('fetch unavailable');\n const url = `${cfg.endpoint}/v1/ingest/batch`;\n const res = await f(url, {\n method: 'POST',\n keepalive: true,\n credentials: 'omit',\n headers: buildHeaders(cfg, extraHeaders),\n body: JSON.stringify(body),\n });\n if (!res.ok) throw new NetworkError(`ingest ${res.status}`, res.status);\n}\n\n/** sendBeacon for `pagehide`/`beforeunload`. Sync best-effort. */\nexport function sendBeaconBatch(cfg: TransportConfig, body: unknown): boolean {\n if (typeof navigator === 'undefined' || typeof navigator.sendBeacon !== 'function') return false;\n const url = `${cfg.endpoint}/v1/ingest/batch?wk=${encodeURIComponent(cfg.workspaceKey)}&sdk=${encodeURIComponent(cfg.sdkVersion)}`;\n try {\n const payload = JSON.stringify(body);\n if (payload.length >= BEACON_SIZE_LIMIT) return false;\n const blob = new Blob([payload], { type: 'application/json' });\n return navigator.sendBeacon(url, blob);\n } catch {\n return false;\n }\n}\n\n/** Identify call → /v1/ingest/identify. */\nexport async function sendIdentify(cfg: TransportConfig, body: unknown): Promise<void> {\n const f = cfg.fetchImpl ?? (typeof fetch !== 'undefined' ? fetch.bind(globalThis) : null);\n if (!f) throw new NetworkError('fetch unavailable');\n const res = await f(`${cfg.endpoint}/v1/ingest/identify`, {\n method: 'POST',\n keepalive: true,\n credentials: 'omit',\n headers: buildHeaders(cfg),\n body: JSON.stringify(body),\n });\n if (!res.ok) throw new NetworkError(`identify ${res.status}`, res.status);\n}\n",
15
17
  "// @gurulu/web batch queue — localStorage backed + 3x exponential retry.\n//\n// Spec § 4.5 — max 50 events, 5s auto-flush, sendBeacon fallback on unload.\n\nimport { sendBatch, sendBeaconBatch, type TransportConfig } from './transport.ts';\nimport type { OutgoingEvent } from './types.ts';\n\nconst QUEUE_KEY = 'gurulu_queue';\n\nfunction hasWindow(): boolean {\n return typeof window !== 'undefined';\n}\n\nfunction loadPersisted(): OutgoingEvent[] {\n if (!hasWindow()) return [];\n try {\n const raw = window.localStorage.getItem(QUEUE_KEY);\n if (!raw) return [];\n const arr = JSON.parse(raw);\n return Array.isArray(arr) ? (arr as OutgoingEvent[]) : [];\n } catch {\n return [];\n }\n}\n\nfunction persist(events: OutgoingEvent[]): void {\n if (!hasWindow()) return;\n try {\n if (events.length === 0) window.localStorage.removeItem(QUEUE_KEY);\n else window.localStorage.setItem(QUEUE_KEY, JSON.stringify(events));\n } catch {\n /* quota — silently drop persist */\n }\n}\n\nexport interface QueueOptions {\n transport: TransportConfig;\n flushIntervalMs: number;\n maxQueueSize: number;\n debug?: boolean;\n}\n\nexport class EventQueue {\n private readonly opts: QueueOptions;\n private buffer: OutgoingEvent[];\n private timer: ReturnType<typeof setTimeout> | null = null;\n private flushing = false;\n\n constructor(opts: QueueOptions) {\n this.opts = opts;\n this.buffer = loadPersisted();\n this.scheduleNext();\n this.installUnloadHooks();\n // Best-effort drain any persisted backlog on startup.\n if (this.buffer.length > 0) this.scheduleImmediate();\n }\n\n enqueue(event: OutgoingEvent): void {\n this.buffer.push(event);\n persist(this.buffer);\n if (this.buffer.length >= this.opts.maxQueueSize) {\n void this.flush();\n } else {\n this.scheduleNext();\n }\n }\n\n size(): number {\n return this.buffer.length;\n }\n\n /** Manual flush — caller may await. */\n async flush(): Promise<void> {\n if (this.flushing || this.buffer.length === 0) return;\n this.flushing = true;\n const batch = this.buffer.slice(0);\n try {\n await this.sendWithRetry(batch);\n this.buffer = this.buffer.slice(batch.length);\n persist(this.buffer);\n } catch (err) {\n // Persisted in `buffer` — next flush re-attempts.\n if (this.opts.debug && typeof console !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn('[gurulu] flush failed, retain queue', err);\n }\n } finally {\n this.flushing = false;\n }\n }\n\n /** Unload-path: synchronous best-effort via sendBeacon. */\n flushBeacon(): void {\n if (this.buffer.length === 0) return;\n const sent = sendBeaconBatch(this.opts.transport, { events: this.buffer });\n if (sent) {\n this.buffer = [];\n persist(this.buffer);\n }\n }\n\n private scheduleNext(): void {\n if (this.timer !== null) return;\n this.timer = setTimeout(() => {\n this.timer = null;\n void this.flush();\n }, this.opts.flushIntervalMs);\n }\n\n private scheduleImmediate(): void {\n if (this.timer !== null) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n this.timer = setTimeout(() => {\n this.timer = null;\n void this.flush();\n }, 50);\n }\n\n private async sendWithRetry(batch: OutgoingEvent[]): Promise<void> {\n let attempt = 0;\n const max = 3;\n while (attempt < max) {\n try {\n await sendBatch(this.opts.transport, { events: batch });\n return;\n } catch (err) {\n attempt += 1;\n if (attempt >= max) throw err;\n const backoff = 2 ** attempt * 1000;\n await new Promise((r) => setTimeout(r, backoff));\n }\n }\n }\n\n private installUnloadHooks(): void {\n if (!hasWindow() || typeof document === 'undefined') return;\n const onHidden = (): void => {\n if (document.visibilityState === 'hidden') this.flushBeacon();\n };\n try {\n document.addEventListener('visibilitychange', onHidden);\n window.addEventListener('pagehide', () => this.flushBeacon());\n } catch {\n /* DOM unavailable */\n }\n }\n}\n",
16
18
  "// @gurulu/web session resolution — 30 min idle timeout + UTM/click_id first-touch.\n//\n// Spec § 3.1 — gurulu_sid + gurulu_session_started_at + gurulu_first_source.\n\nimport type { ClickIdContext, SourceTouch, UTMContext } from './types.ts';\n\nconst SESSION_KEY = 'gurulu_sid';\nconst SESSION_STARTED_KEY = 'gurulu_session_started_at';\nconst LAST_EVENT_KEY = 'gurulu_last_event_at';\nconst FIRST_SOURCE_KEY = 'gurulu_first_source';\nconst SESSION_TIMEOUT_MS = 30 * 60 * 1000;\n\nfunction hasWindow(): boolean {\n return typeof window !== 'undefined';\n}\n\nfunction uuid(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nfunction readLs(key: string): string | null {\n if (!hasWindow()) return null;\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction writeLs(key: string, value: string): void {\n if (!hasWindow()) return;\n try {\n window.localStorage.setItem(key, value);\n } catch {\n /* noop */\n }\n}\n\nexport interface SessionState {\n session_id: string;\n session_started_at: number;\n is_new: boolean;\n}\n\nexport function resolveSession(now = Date.now()): SessionState {\n const existing = readLs(SESSION_KEY);\n const startedAt = Number(readLs(SESSION_STARTED_KEY) ?? '0');\n const lastEvent = Number(readLs(LAST_EVENT_KEY) ?? '0');\n\n if (existing && startedAt && now - lastEvent < SESSION_TIMEOUT_MS) {\n writeLs(LAST_EVENT_KEY, String(now));\n return { session_id: existing, session_started_at: startedAt, is_new: false };\n }\n const fresh = uuid();\n writeLs(SESSION_KEY, fresh);\n writeLs(SESSION_STARTED_KEY, String(now));\n writeLs(LAST_EVENT_KEY, String(now));\n return { session_id: fresh, session_started_at: now, is_new: true };\n}\n\nexport function newSession(now = Date.now()): SessionState {\n const fresh = uuid();\n writeLs(SESSION_KEY, fresh);\n writeLs(SESSION_STARTED_KEY, String(now));\n writeLs(LAST_EVENT_KEY, String(now));\n return { session_id: fresh, session_started_at: now, is_new: true };\n}\n\nexport function parseUrlContext(\n href: string | undefined,\n referrer: string | undefined,\n): {\n utm: UTMContext;\n click_id: ClickIdContext;\n} {\n const utm: UTMContext = {};\n const clickId: ClickIdContext = {};\n if (!href) return { utm, click_id: clickId };\n let url: URL;\n try {\n url = new URL(href);\n } catch {\n return { utm, click_id: clickId };\n }\n const p = url.searchParams;\n const s = p.get('utm_source');\n if (s) utm.source = s;\n const m = p.get('utm_medium');\n if (m) utm.medium = m;\n const c = p.get('utm_campaign');\n if (c) utm.campaign = c;\n const t = p.get('utm_term');\n if (t) utm.term = t;\n const ct = p.get('utm_content');\n if (ct) utm.content = ct;\n const gclid = p.get('gclid');\n if (gclid) clickId.gclid = gclid;\n const fbclid = p.get('fbclid');\n if (fbclid) clickId.fbclid = fbclid;\n const ttclid = p.get('ttclid');\n if (ttclid) clickId.ttclid = ttclid;\n const li = p.get('li_fat_id');\n if (li) clickId.li_fat_id = li;\n void referrer; // reserved for referrer-source classifier (future)\n return { utm, click_id: clickId };\n}\n\nexport function preserveFirstSource(touch: SourceTouch): void {\n if (readLs(FIRST_SOURCE_KEY)) return;\n writeLs(FIRST_SOURCE_KEY, JSON.stringify(touch));\n}\n\nexport function getFirstSource(): SourceTouch | null {\n const raw = readLs(FIRST_SOURCE_KEY);\n if (!raw) return null;\n try {\n return JSON.parse(raw) as SourceTouch;\n } catch {\n return null;\n }\n}\n",
17
- "// @gurulu/web core — main Gurulu SDK class.\n// Spec: docs/specs/07-sdk-web.md\n//\n// Lifecycle:\n// const sdk = createGurulu();\n// sdk.init({ workspaceKey: 'pk_xxx' });\n// sdk.track('button_clicked', { ... });\n// sdk.identify('user_42', { email: '...' });\n// sdk.reset(); // logout\n// sdk.flush(); // unload edge\n//\n// Zero runtime dep — all transport via native fetch + sendBeacon.\n\nimport { startAutocapture } from './autocapture/index.ts';\nimport { GuruluConsent } from './consent.ts';\nimport {\n clearIdentity,\n getOrCreateAnonymousId,\n getPersonId,\n newEventId,\n setPersonId,\n} from './identity.ts';\nimport { EventQueue } from './queue.ts';\nimport {\n getFirstSource,\n parseUrlContext,\n preserveFirstSource,\n resolveSession,\n type SessionState,\n} from './session.ts';\nimport { sendIdentify, type TransportConfig } from './transport.ts';\nimport type {\n ConsentCategoriesState,\n EventContext,\n EventType,\n InitOptions,\n OutgoingEvent,\n} from './types.ts';\n\nconst SDK_VERSION = '0.1.0';\nconst DEFAULT_ENDPOINT = 'https://ingest.gurulu.io';\nconst DEFAULT_API_URL = 'https://api.gurulu.io';\nconst OPT_OUT_KEY = 'gurulu_opt_out';\n\nfunction isOptedOut(): boolean {\n if (typeof window === 'undefined') return false;\n try {\n return window.localStorage.getItem(OPT_OUT_KEY) === '1';\n } catch {\n return false;\n }\n}\n\nfunction setOptOut(flag: boolean): void {\n if (typeof window === 'undefined') return;\n try {\n if (flag) window.localStorage.setItem(OPT_OUT_KEY, '1');\n else window.localStorage.removeItem(OPT_OUT_KEY);\n } catch {\n /* noop */\n }\n}\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nexport interface PageOverride {\n url?: string;\n title?: string;\n referrer?: string;\n}\n\nexport class Gurulu {\n private initialized = false;\n private opts: InitOptions | null = null;\n private queue: EventQueue | null = null;\n private session: SessionState | null = null;\n private anonymousId: string | null = null;\n private autocaptureHandle: { stopAll: () => void } | null = null;\n private testMode = false;\n consent!: GuruluConsent;\n\n /**\n * 1-line init. Idempotent — second call no-ops with debug warning.\n */\n init(opts: InitOptions): void {\n if (this.initialized) {\n if (opts.debug && typeof console !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn('[gurulu] init() already called — ignoring');\n }\n return;\n }\n if (typeof window === 'undefined') return; // SSR no-op\n\n this.opts = opts;\n this.testMode = opts.test_mode === true;\n this.anonymousId = getOrCreateAnonymousId();\n this.session = resolveSession();\n this.consent = new GuruluConsent({\n workspaceId: opts.workspaceKey,\n apiUrl: opts.apiUrl ?? DEFAULT_API_URL,\n anonymousId: this.anonymousId,\n autoBanner: opts.consent_mode === 'banner_required',\n });\n // Fire consent banner-config (best-effort, async).\n void this.consent.init();\n\n const transport: TransportConfig = {\n endpoint: opts.endpoint ?? DEFAULT_ENDPOINT,\n workspaceKey: opts.workspaceKey,\n sdkVersion: SDK_VERSION,\n };\n this.queue = new EventQueue({\n transport,\n flushIntervalMs: opts.flush_interval_ms ?? 5000,\n maxQueueSize: opts.max_queue_size ?? 50,\n ...(opts.debug ? { debug: true } : {}),\n });\n\n // First-touch UTM preserve.\n const ctx = parseUrlContext(window.location.href, document.referrer);\n if (Object.keys(ctx.utm).length > 0 || Object.keys(ctx.click_id).length > 0) {\n const touch = {\n utm: ctx.utm,\n click_id: ctx.click_id,\n referrer: document.referrer,\n landing_url: window.location.href,\n captured_at: Date.now(),\n };\n preserveFirstSource(touch);\n }\n\n // Wire autocapture.\n this.autocaptureHandle = startAutocapture(opts.autocapture, {\n pageView: (url, title, referrer) =>\n this.queueEvent('page_view', 'interaction', { url, title, referrer }),\n click: (payload) => {\n const ev = payload.custom_event ?? 'element_clicked';\n const props: Record<string, unknown> = {\n element_tag: payload.element_tag,\n ...(payload.element_id ? { element_id: payload.element_id } : {}),\n ...(payload.element_class ? { element_class: payload.element_class } : {}),\n ...(payload.element_text ? { element_text: payload.element_text } : {}),\n ...(payload.href ? { href: payload.href } : {}),\n ...(payload.is_outbound ? { is_outbound: true } : {}),\n ...(payload.is_download ? { is_download: true } : {}),\n ...(payload.custom_props ?? {}),\n };\n this.queueEvent(ev, 'interaction', props);\n },\n formStarted: (p) =>\n this.queueEvent('form_started', 'interaction', p as unknown as Record<string, unknown>),\n formSubmitted: (p) =>\n this.queueEvent('form_submitted', 'interaction', p as unknown as Record<string, unknown>),\n scrollDepth: (p) =>\n this.queueEvent('scroll_depth', 'interaction', p as unknown as Record<string, unknown>),\n webVital: (p) =>\n this.queueEvent('web_vital', 'interaction', p as unknown as Record<string, unknown>),\n });\n\n this.initialized = true;\n }\n\n /** Manual `track()` — typed via codegen (`@gurulu/web/generated`). */\n track(eventKey: string, properties?: Record<string, unknown>): void {\n this.queueEvent(eventKey, 'interaction', properties);\n }\n\n /** Manual `page()` — SPA route helper for non-history flows. */\n page(override?: PageOverride): void {\n if (!this.initialized || typeof window === 'undefined') return;\n const url = override?.url ?? window.location.href;\n const title = override?.title ?? document.title;\n const referrer = override?.referrer ?? document.referrer;\n this.queueEvent('page_view', 'interaction', { url, title, referrer });\n }\n\n /**\n * Identify — anonymous → person merge.\n * Stores person_id locally + best-effort POST /v1/ingest/identify.\n */\n async identify(personId: string, traits?: Record<string, unknown>): Promise<void> {\n if (!this.initialized || isOptedOut()) return;\n setPersonId(personId);\n if (!this.opts) return;\n try {\n await sendIdentify(\n {\n endpoint: this.opts.endpoint ?? DEFAULT_ENDPOINT,\n workspaceKey: this.opts.workspaceKey,\n sdkVersion: SDK_VERSION,\n },\n {\n anonymous_id: this.anonymousId,\n external_user_id: personId,\n ...(traits?.email ? { email: traits.email } : {}),\n ...(traits?.phone ? { phone: traits.phone } : {}),\n ...(traits ? { traits } : {}),\n },\n );\n } catch (err) {\n if (this.opts?.debug && typeof console !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn('[gurulu] identify failed', err);\n }\n }\n }\n\n /** Logout — wipes person_id, rotates anonymous_id, new session. */\n reset(): void {\n this.anonymousId = clearIdentity();\n if (typeof window !== 'undefined') {\n try {\n window.localStorage.removeItem('gurulu_sid');\n window.localStorage.removeItem('gurulu_session_started_at');\n window.localStorage.removeItem('gurulu_last_event_at');\n window.localStorage.removeItem('gurulu_first_source');\n } catch {\n /* noop */\n }\n }\n this.session = resolveSession();\n }\n\n /** Manual flush — caller may await. */\n async flush(): Promise<void> {\n await this.queue?.flush();\n }\n\n /** Tracking opt-out — all subsequent track/identify no-op. */\n optOut(): void {\n setOptOut(true);\n }\n\n /** Re-enable tracking. */\n optIn(): void {\n setOptOut(false);\n }\n\n // ───────────────────────── internal ──────────────────────────────\n\n private queueEvent(\n eventKey: string,\n eventType: EventType,\n properties?: Record<string, unknown>,\n ): void {\n if (!this.initialized || !this.queue || isOptedOut()) return;\n if (!this.consentAllowsAnalytics() && this.opts?.consent_mode === 'banner_required') {\n // Drop pre-consent in banner_required mode; SDK queue still captures\n // necessary events post-consent.\n return;\n }\n this.session = resolveSession();\n const event: OutgoingEvent = {\n anonymous_id: this.anonymousId ?? 'anon_unknown',\n event_id: newEventId(),\n event_key: eventKey,\n event_type: eventType,\n occurred_at: nowIso(),\n producer: 'script',\n producer_version: SDK_VERSION,\n ...(this.session ? { session_id: this.session.session_id } : {}),\n };\n const pid = getPersonId();\n if (pid) event.person_id = pid;\n if (properties && Object.keys(properties).length > 0) event.properties = properties;\n const ctx = this.buildContext();\n if (ctx) event.context = ctx;\n const consent = this.snapshotConsent();\n if (consent) event.consent_state = consent;\n // Opt-in test_mode flag — only attach when true so prod payloads stay lean.\n if (this.testMode) event.test_mode = true;\n this.queue.enqueue(event);\n }\n\n private snapshotConsent(): ConsentCategoriesState | undefined {\n const snap = this.consent?.getState();\n if (!snap) return undefined;\n return {\n necessary: snap.categories.necessary,\n analytics: snap.categories.analytics,\n marketing: snap.categories.marketing,\n functional: snap.categories.functional,\n personalization: snap.categories.personalization,\n };\n }\n\n private consentAllowsAnalytics(): boolean {\n const snap = this.consent?.getState();\n if (!snap) return false;\n return snap.categories.analytics === true;\n }\n\n private buildContext(): EventContext | undefined {\n if (typeof window === 'undefined') return undefined;\n const ctx: EventContext = {\n url: window.location.href,\n referrer: document.referrer,\n page_title: document.title,\n user_agent: navigator.userAgent,\n domain: window.location.hostname,\n };\n const first = getFirstSource();\n if (first?.utm && Object.keys(first.utm).length > 0) ctx.utm = first.utm;\n if (first?.click_id && Object.keys(first.click_id).length > 0) ctx.click_id = first.click_id;\n return ctx;\n }\n}\n",
18
- "// @gurulu/web — Modül 11 browser SDK. PUBLIC NPM + CDN `t.js` (apps/cdn).\n//\n// Spec: docs/specs/07-sdk-web.md\n// Install (1-line script):\n// <script src=\"https://cdn.gurulu.io/t.js\" data-workspace=\"pk_xxx\" defer></script>\n//\n// npm:\n// import gurulu, { GuruluEvents } from '@gurulu/web';\n// gurulu.init({ workspaceKey: 'pk_xxx' });\n// gurulu.track('button_clicked', { ... });\n//\n// Sprint F1.3: core + queue + transport + identity + session + autocapture\n// (page/click/form/scroll/web-vitals) + script-tag bootstrap. Zero runtime\n// dep (M11 K28). SSR-safe.\n\nexport const VERSION = '0.1.0';\n\nexport {\n type BannerConfig,\n type BannerConfigResponse,\n type ConsentCategories,\n type ConsentSnapshot,\n GuruluConsent,\n type GuruluConsentOptions,\n} from './consent.ts';\n\nexport { Gurulu, type PageOverride } from './core.ts';\nexport {\n ConsentBlockedError,\n InitError,\n NetworkError,\n OptedOutError,\n QueueFullError,\n SDKError,\n} from './errors.ts';\nexport type {\n AutocaptureConfig,\n ClickIdContext,\n ConsentCategoriesState,\n EventContext,\n EventProducer,\n EventType,\n InitOptions,\n OutgoingEvent,\n UTMContext,\n} from './types.ts';\n\nimport { Gurulu } from './core.ts';\nimport type { InitOptions } from './types.ts';\n\n/** Singleton — matches `window.gurulu` global behaviour. */\nconst singleton = new Gurulu();\n\nexport interface GuruluPublicSDK {\n init: (opts: InitOptions) => void;\n track: (eventKey: string, properties?: Record<string, unknown>) => void;\n identify: (personId: string, traits?: Record<string, unknown>) => Promise<void>;\n page: (override?: Parameters<Gurulu['page']>[0]) => void;\n reset: () => void;\n flush: () => Promise<void>;\n optOut: () => void;\n optIn: () => void;\n consent: Gurulu['consent'];\n VERSION: string;\n}\n\n/**\n * Factory — `createGurulu()` returns an isolated instance (multi-tenant SDK or\n * test harness). For 99% of consumers, prefer the default singleton via the\n * default export below.\n */\nexport function createGurulu(): Gurulu {\n return new Gurulu();\n}\n\nconst publicSdk = {\n init: (opts: InitOptions) => singleton.init(opts),\n track: (eventKey: string, properties?: Record<string, unknown>) =>\n singleton.track(eventKey, properties),\n identify: (personId: string, traits?: Record<string, unknown>) =>\n singleton.identify(personId, traits),\n page: (override?: Parameters<Gurulu['page']>[0]) => singleton.page(override),\n reset: () => singleton.reset(),\n flush: () => singleton.flush(),\n optOut: () => singleton.optOut(),\n optIn: () => singleton.optIn(),\n get consent() {\n return singleton.consent;\n },\n VERSION,\n};\n\n/**\n * Script-tag auto-init — reads `<script data-workspace=\"pk_xxx\" ...>` and\n * runs `init()` automatically. No-op in non-browser environments and when\n * the script is loaded via ESM import (no `data-workspace` attr).\n */\nexport function autoBootstrap(): void {\n if (typeof document === 'undefined') return;\n const script = document.currentScript as HTMLScriptElement | null;\n const fallback = !script\n ? (document.querySelector('script[data-workspace]') as HTMLScriptElement | null)\n : script;\n if (!fallback) return;\n const workspaceKey = fallback.getAttribute('data-workspace');\n if (!workspaceKey) return;\n const opts: InitOptions = { workspaceKey };\n const endpoint = fallback.getAttribute('data-endpoint');\n if (endpoint) opts.endpoint = endpoint;\n const apiUrl = fallback.getAttribute('data-api-url');\n if (apiUrl) opts.apiUrl = apiUrl;\n const consentMode = fallback.getAttribute('data-consent');\n if (consentMode === 'banner_required' || consentMode === 'allow_by_default') {\n opts.consent_mode = consentMode;\n }\n const allowlist = fallback.getAttribute('data-allowlist');\n if (allowlist) opts.cross_domain_allowlist = allowlist.split(',').map((s) => s.trim());\n publicSdk.init(opts);\n if (typeof window !== 'undefined') {\n (window as unknown as { gurulu: typeof publicSdk }).gurulu = publicSdk;\n }\n}\n\n// Side-effect: auto-bootstrap when running as the CDN `t.js` build target.\n// In ESM consumer mode (`import gurulu from '@gurulu/web'`), `currentScript`\n// is null + no `data-workspace` attribute, so this is a safe no-op.\nautoBootstrap();\n\nexport default publicSdk;\n"
19
+ "// @gurulu/web core — main Gurulu SDK class.\n// Spec: docs/specs/07-sdk-web.md\n//\n// Lifecycle:\n// const sdk = createGurulu();\n// sdk.init({ workspaceKey: 'pk_xxx' });\n// sdk.track('button_clicked', { ... });\n// sdk.identify('user_42', { email: '...' });\n// sdk.reset(); // logout\n// sdk.flush(); // unload edge\n//\n// Zero runtime dep — all transport via native fetch + sendBeacon.\n\nimport { GuruluActivation } from './activation.ts';\nimport { startAutocapture } from './autocapture/index.ts';\nimport { GuruluConsent } from './consent.ts';\nimport {\n clearIdentity,\n getOrCreateAnonymousId,\n getPersonId,\n newEventId,\n setPersonId,\n} from './identity.ts';\nimport { EventQueue } from './queue.ts';\nimport {\n getFirstSource,\n parseUrlContext,\n preserveFirstSource,\n resolveSession,\n type SessionState,\n} from './session.ts';\nimport { sendIdentify, type TransportConfig } from './transport.ts';\nimport type {\n ConsentCategoriesState,\n EventContext,\n EventType,\n InitOptions,\n OutgoingEvent,\n} from './types.ts';\n\nconst SDK_VERSION = '0.1.0';\nconst DEFAULT_ENDPOINT = 'https://ingest.gurulu.io';\nconst DEFAULT_API_URL = 'https://api.gurulu.io';\nconst OPT_OUT_KEY = 'gurulu_opt_out';\n\nfunction isOptedOut(): boolean {\n if (typeof window === 'undefined') return false;\n try {\n return window.localStorage.getItem(OPT_OUT_KEY) === '1';\n } catch {\n return false;\n }\n}\n\nfunction setOptOut(flag: boolean): void {\n if (typeof window === 'undefined') return;\n try {\n if (flag) window.localStorage.setItem(OPT_OUT_KEY, '1');\n else window.localStorage.removeItem(OPT_OUT_KEY);\n } catch {\n /* noop */\n }\n}\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nexport interface PageOverride {\n url?: string;\n title?: string;\n referrer?: string;\n}\n\nexport class Gurulu {\n private initialized = false;\n private opts: InitOptions | null = null;\n private queue: EventQueue | null = null;\n private session: SessionState | null = null;\n private anonymousId: string | null = null;\n private autocaptureHandle: { stopAll: () => void } | null = null;\n private testMode = false;\n consent!: GuruluConsent;\n /** M31/M32/M33/M30 Activation — headless (refresh/getPopups/getContent/getVariant). */\n activation!: GuruluActivation;\n\n /**\n * 1-line init. Idempotent — second call no-ops with debug warning.\n */\n init(opts: InitOptions): void {\n if (this.initialized) {\n if (opts.debug && typeof console !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn('[gurulu] init() already called — ignoring');\n }\n return;\n }\n if (typeof window === 'undefined') return; // SSR no-op\n\n this.opts = opts;\n this.testMode = opts.test_mode === true;\n this.anonymousId = getOrCreateAnonymousId();\n this.session = resolveSession();\n this.consent = new GuruluConsent({\n workspaceId: opts.workspaceKey,\n apiUrl: opts.apiUrl ?? DEFAULT_API_URL,\n anonymousId: this.anonymousId,\n autoBanner: opts.consent_mode === 'banner_required',\n });\n // Fire consent banner-config (best-effort, async).\n void this.consent.init();\n\n // M31/M32/M33/M30 Activation headless layer (lazy — refresh çağrılana dek fetch yok).\n this.activation = new GuruluActivation({\n endpoint: opts.endpoint ?? DEFAULT_ENDPOINT,\n workspaceKey: opts.workspaceKey,\n getUid: () => getPersonId() ?? this.anonymousId ?? '',\n track: (key, props) => this.track(key, props),\n });\n\n const transport: TransportConfig = {\n endpoint: opts.endpoint ?? DEFAULT_ENDPOINT,\n workspaceKey: opts.workspaceKey,\n sdkVersion: SDK_VERSION,\n };\n this.queue = new EventQueue({\n transport,\n flushIntervalMs: opts.flush_interval_ms ?? 5000,\n maxQueueSize: opts.max_queue_size ?? 50,\n ...(opts.debug ? { debug: true } : {}),\n });\n\n // First-touch UTM preserve.\n const ctx = parseUrlContext(window.location.href, document.referrer);\n if (Object.keys(ctx.utm).length > 0 || Object.keys(ctx.click_id).length > 0) {\n const touch = {\n utm: ctx.utm,\n click_id: ctx.click_id,\n referrer: document.referrer,\n landing_url: window.location.href,\n captured_at: Date.now(),\n };\n preserveFirstSource(touch);\n }\n\n // Wire autocapture.\n this.autocaptureHandle = startAutocapture(opts.autocapture, {\n pageView: (url, title, referrer) =>\n this.queueEvent('page_view', 'interaction', { url, title, referrer }),\n click: (payload) => {\n const ev = payload.custom_event ?? 'element_clicked';\n const props: Record<string, unknown> = {\n element_tag: payload.element_tag,\n ...(payload.element_id ? { element_id: payload.element_id } : {}),\n ...(payload.element_class ? { element_class: payload.element_class } : {}),\n ...(payload.element_text ? { element_text: payload.element_text } : {}),\n ...(payload.href ? { href: payload.href } : {}),\n ...(payload.is_outbound ? { is_outbound: true } : {}),\n ...(payload.is_download ? { is_download: true } : {}),\n ...(payload.custom_props ?? {}),\n };\n this.queueEvent(ev, 'interaction', props);\n },\n formStarted: (p) =>\n this.queueEvent('form_started', 'interaction', p as unknown as Record<string, unknown>),\n formSubmitted: (p) =>\n this.queueEvent('form_submitted', 'interaction', p as unknown as Record<string, unknown>),\n scrollDepth: (p) =>\n this.queueEvent('scroll_depth', 'interaction', p as unknown as Record<string, unknown>),\n webVital: (p) =>\n this.queueEvent('web_vital', 'interaction', p as unknown as Record<string, unknown>),\n jsError: (p) =>\n this.queueEvent('js_error', 'interaction', p as unknown as Record<string, unknown>),\n });\n\n this.initialized = true;\n }\n\n /** Manual `track()` — typed via codegen (`@gurulu/web/generated`). */\n track(eventKey: string, properties?: Record<string, unknown>): void {\n this.queueEvent(eventKey, 'interaction', properties);\n }\n\n /** Manual `page()` — SPA route helper for non-history flows. */\n page(override?: PageOverride): void {\n if (!this.initialized || typeof window === 'undefined') return;\n const url = override?.url ?? window.location.href;\n const title = override?.title ?? document.title;\n const referrer = override?.referrer ?? document.referrer;\n this.queueEvent('page_view', 'interaction', { url, title, referrer });\n }\n\n /**\n * Identify — anonymous → person merge.\n * Stores person_id locally + best-effort POST /v1/ingest/identify.\n */\n async identify(personId: string, traits?: Record<string, unknown>): Promise<void> {\n if (!this.initialized || isOptedOut()) return;\n setPersonId(personId);\n if (!this.opts) return;\n try {\n await sendIdentify(\n {\n endpoint: this.opts.endpoint ?? DEFAULT_ENDPOINT,\n workspaceKey: this.opts.workspaceKey,\n sdkVersion: SDK_VERSION,\n },\n {\n anonymous_id: this.anonymousId,\n external_user_id: personId,\n ...(traits?.email ? { email: traits.email } : {}),\n ...(traits?.phone ? { phone: traits.phone } : {}),\n ...(traits ? { traits } : {}),\n },\n );\n } catch (err) {\n if (this.opts?.debug && typeof console !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn('[gurulu] identify failed', err);\n }\n }\n }\n\n /** Logout — wipes person_id, rotates anonymous_id, new session. */\n reset(): void {\n this.anonymousId = clearIdentity();\n if (typeof window !== 'undefined') {\n try {\n window.localStorage.removeItem('gurulu_sid');\n window.localStorage.removeItem('gurulu_session_started_at');\n window.localStorage.removeItem('gurulu_last_event_at');\n window.localStorage.removeItem('gurulu_first_source');\n } catch {\n /* noop */\n }\n }\n this.session = resolveSession();\n }\n\n /** Manual flush — caller may await. */\n async flush(): Promise<void> {\n await this.queue?.flush();\n }\n\n /** Tracking opt-out — all subsequent track/identify no-op. */\n optOut(): void {\n setOptOut(true);\n }\n\n /** Re-enable tracking. */\n optIn(): void {\n setOptOut(false);\n }\n\n // ───────────────────────── internal ──────────────────────────────\n\n private queueEvent(\n eventKey: string,\n eventType: EventType,\n properties?: Record<string, unknown>,\n ): void {\n if (!this.initialized || !this.queue || isOptedOut()) return;\n if (!this.consentAllowsAnalytics() && this.opts?.consent_mode === 'banner_required') {\n // Drop pre-consent in banner_required mode; SDK queue still captures\n // necessary events post-consent.\n return;\n }\n this.session = resolveSession();\n const event: OutgoingEvent = {\n anonymous_id: this.anonymousId ?? 'anon_unknown',\n event_id: newEventId(),\n event_key: eventKey,\n event_type: eventType,\n occurred_at: nowIso(),\n producer: 'script',\n producer_version: SDK_VERSION,\n ...(this.session ? { session_id: this.session.session_id } : {}),\n };\n const pid = getPersonId();\n if (pid) event.person_id = pid;\n if (properties && Object.keys(properties).length > 0) event.properties = properties;\n const ctx = this.buildContext();\n if (ctx) event.context = ctx;\n const consent = this.snapshotConsent();\n if (consent) event.consent_state = consent;\n // Opt-in test_mode flag — only attach when true so prod payloads stay lean.\n if (this.testMode) event.test_mode = true;\n this.queue.enqueue(event);\n }\n\n private snapshotConsent(): ConsentCategoriesState | undefined {\n const snap = this.consent?.getState();\n if (!snap) return undefined;\n return {\n necessary: snap.categories.necessary,\n analytics: snap.categories.analytics,\n marketing: snap.categories.marketing,\n functional: snap.categories.functional,\n personalization: snap.categories.personalization,\n };\n }\n\n private consentAllowsAnalytics(): boolean {\n const snap = this.consent?.getState();\n if (!snap) return false;\n return snap.categories.analytics === true;\n }\n\n private buildContext(): EventContext | undefined {\n if (typeof window === 'undefined') return undefined;\n const ctx: EventContext = {\n url: window.location.href,\n referrer: document.referrer,\n page_title: document.title,\n user_agent: navigator.userAgent,\n domain: window.location.hostname,\n };\n const first = getFirstSource();\n if (first?.utm && Object.keys(first.utm).length > 0) ctx.utm = first.utm;\n if (first?.click_id && Object.keys(first.click_id).length > 0) ctx.click_id = first.click_id;\n return ctx;\n }\n}\n",
20
+ "// @gurulu/web — Modül 11 browser SDK. PUBLIC NPM + CDN `t.js` (apps/cdn).\n//\n// Spec: docs/specs/07-sdk-web.md\n// Install (1-line script):\n// <script src=\"https://cdn.gurulu.io/t.js\" data-workspace=\"pk_xxx\" defer></script>\n//\n// npm:\n// import gurulu, { GuruluEvents } from '@gurulu/web';\n// gurulu.init({ workspaceKey: 'pk_xxx' });\n// gurulu.track('button_clicked', { ... });\n//\n// Sprint F1.3: core + queue + transport + identity + session + autocapture\n// (page/click/form/scroll/web-vitals) + script-tag bootstrap. Zero runtime\n// dep (M11 K28). SSR-safe.\n\nexport const VERSION = '0.1.0';\n\nexport {\n type ActivationData,\n type ExperimentDef,\n GuruluActivation,\n type PopupDef,\n type PznResolved,\n type TourDef,\n type TourStepDef,\n} from './activation.ts';\nexport {\n type BannerConfig,\n type BannerConfigResponse,\n type ConsentCategories,\n type ConsentSnapshot,\n GuruluConsent,\n type GuruluConsentOptions,\n} from './consent.ts';\nexport { Gurulu, type PageOverride } from './core.ts';\nexport {\n ConsentBlockedError,\n InitError,\n NetworkError,\n OptedOutError,\n QueueFullError,\n SDKError,\n} from './errors.ts';\nexport type {\n AutocaptureConfig,\n ClickIdContext,\n ConsentCategoriesState,\n EventContext,\n EventProducer,\n EventType,\n InitOptions,\n OutgoingEvent,\n UTMContext,\n} from './types.ts';\n\nimport { Gurulu } from './core.ts';\nimport type { InitOptions } from './types.ts';\n\n/** Singleton — matches `window.gurulu` global behaviour. */\nconst singleton = new Gurulu();\n\nexport interface GuruluPublicSDK {\n init: (opts: InitOptions) => void;\n track: (eventKey: string, properties?: Record<string, unknown>) => void;\n identify: (personId: string, traits?: Record<string, unknown>) => Promise<void>;\n page: (override?: Parameters<Gurulu['page']>[0]) => void;\n reset: () => void;\n flush: () => Promise<void>;\n optOut: () => void;\n optIn: () => void;\n consent: Gurulu['consent'];\n /** M31/M32/M33/M30 Activation headless layer (init sonrası). */\n activation: Gurulu['activation'];\n VERSION: string;\n}\n\n/**\n * Factory — `createGurulu()` returns an isolated instance (multi-tenant SDK or\n * test harness). For 99% of consumers, prefer the default singleton via the\n * default export below.\n */\nexport function createGurulu(): Gurulu {\n return new Gurulu();\n}\n\nconst publicSdk = {\n init: (opts: InitOptions) => singleton.init(opts),\n track: (eventKey: string, properties?: Record<string, unknown>) =>\n singleton.track(eventKey, properties),\n identify: (personId: string, traits?: Record<string, unknown>) =>\n singleton.identify(personId, traits),\n page: (override?: Parameters<Gurulu['page']>[0]) => singleton.page(override),\n reset: () => singleton.reset(),\n flush: () => singleton.flush(),\n optOut: () => singleton.optOut(),\n optIn: () => singleton.optIn(),\n get consent() {\n return singleton.consent;\n },\n get activation() {\n return singleton.activation;\n },\n VERSION,\n};\n\n/**\n * Script-tag auto-init — reads `<script data-workspace=\"pk_xxx\" ...>` and\n * runs `init()` automatically. No-op in non-browser environments and when\n * the script is loaded via ESM import (no `data-workspace` attr).\n */\nexport function autoBootstrap(): void {\n if (typeof document === 'undefined') return;\n const script = document.currentScript as HTMLScriptElement | null;\n const fallback = !script\n ? (document.querySelector('script[data-workspace]') as HTMLScriptElement | null)\n : script;\n if (!fallback) return;\n const workspaceKey = fallback.getAttribute('data-workspace');\n if (!workspaceKey) return;\n const opts: InitOptions = { workspaceKey };\n const endpoint = fallback.getAttribute('data-endpoint');\n if (endpoint) opts.endpoint = endpoint;\n const apiUrl = fallback.getAttribute('data-api-url');\n if (apiUrl) opts.apiUrl = apiUrl;\n const consentMode = fallback.getAttribute('data-consent');\n if (consentMode === 'banner_required' || consentMode === 'allow_by_default') {\n opts.consent_mode = consentMode;\n }\n const allowlist = fallback.getAttribute('data-allowlist');\n if (allowlist) opts.cross_domain_allowlist = allowlist.split(',').map((s) => s.trim());\n publicSdk.init(opts);\n if (typeof window !== 'undefined') {\n (window as unknown as { gurulu: typeof publicSdk }).gurulu = publicSdk;\n }\n}\n\n// Side-effect: auto-bootstrap when running as the CDN `t.js` build target.\n// In ESM consumer mode (`import gurulu from '@gurulu/web'`), `currentScript`\n// is null + no `data-workspace` attribute, so this is a safe no-op.\nautoBootstrap();\n\nexport default publicSdk;\n"
19
21
  ],
20
- "mappings": "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",
21
- "debugId": "399296B48A9012C664756E2164756E21",
22
+ "mappings": "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",
23
+ "debugId": "AF94586E9911F89164756E2164756E21",
22
24
  "names": []
23
25
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gurulu/web",
3
- "version": "1.0.2",
3
+ "version": "1.2.0",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -28,12 +28,22 @@
28
28
  "import": "./dist/index.js",
29
29
  "default": "./dist/index.js"
30
30
  },
31
+ "./react": {
32
+ "types": "./dist/react.d.ts",
33
+ "import": "./dist/react.js",
34
+ "default": "./dist/react.js"
35
+ },
36
+ "./activate": {
37
+ "types": "./dist/activate-runtime.d.ts",
38
+ "import": "./dist/activate-runtime.js",
39
+ "default": "./dist/activate-runtime.js"
40
+ },
31
41
  "./t.js": "./dist/t.js",
32
42
  "./package.json": "./package.json"
33
43
  },
34
44
  "scripts": {
35
45
  "build": "rm -rf dist && bun run build:esm && bun run build:cdn && bun run build:types",
36
- "build:esm": "bun build ./src/index.ts --outdir ./dist --target browser --format=esm",
46
+ "build:esm": "bun build ./src/index.ts ./src/react.ts ./src/activate-runtime.ts --outdir ./dist --target browser --format=esm --external react",
37
47
  "build:cdn": "bun build ./src/index.ts --outdir ./dist --entry-naming t.js --target browser --minify --sourcemap=external",
38
48
  "build:types": "tsc -p tsconfig.build.json",
39
49
  "build:dev": "bun build ./src/index.ts --outdir ./dist --target browser",
@@ -43,7 +53,17 @@
43
53
  "clean": "rm -rf dist .turbo"
44
54
  },
45
55
  "dependencies": {},
56
+ "peerDependencies": {
57
+ "react": ">=18"
58
+ },
59
+ "peerDependenciesMeta": {
60
+ "react": {
61
+ "optional": true
62
+ }
63
+ },
46
64
  "devDependencies": {
65
+ "@types/react": "^19.0.0",
66
+ "react": "^19.0.0",
47
67
  "typescript": "^5.6.0"
48
68
  }
49
69
  }