@rybbit/js 0.2.0 → 0.3.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/index.d.mts CHANGED
@@ -1,25 +1,26 @@
1
1
  interface RybbitConfig {
2
2
  analyticsHost: string;
3
- siteId: string | number;
3
+ siteId: string;
4
4
  debounce?: number;
5
- autoTrackPageviews?: boolean;
6
- autoTrackSpaRoutes?: boolean;
7
- trackQuerystring?: boolean;
8
- trackOutboundLinks?: boolean;
9
- trackHashRoutes?: boolean;
10
- trackDataAttributes?: boolean;
11
- trackWebVitals?: boolean;
12
- webVitalsTimeout?: number;
13
5
  skipPatterns?: string[];
14
6
  maskPatterns?: string[];
15
7
  debug?: boolean;
8
+ replayBufferSize?: number;
9
+ replayBatchInterval?: number;
10
+ replayPrivacyConfig?: {
11
+ maskAllInputs?: boolean;
12
+ maskTextSelectors?: string[];
13
+ };
14
+ enableRemoteConfig?: boolean;
15
+ remoteConfigTimeout?: number;
16
16
  }
17
17
  type PropertyValue = string | number | boolean;
18
18
  interface TrackProperties {
19
19
  [key: string]: PropertyValue | PropertyValue[];
20
20
  }
21
+ type PageChangeCallback = (pathname: string, previousPathname: string) => void;
21
22
  interface RybbitAPI {
22
- init: (config: RybbitConfig) => void;
23
+ init: (config: RybbitConfig) => Promise<void>;
23
24
  pageview: (path?: string) => void;
24
25
  event: (name: string, properties?: TrackProperties) => void;
25
26
  outbound: (url: string, text?: string, target?: string) => void;
@@ -27,6 +28,11 @@ interface RybbitAPI {
27
28
  clearUserId: () => void;
28
29
  getUserId: () => string | null;
29
30
  cleanup: () => void;
31
+ captureError: (error: Error | ErrorEvent, context?: TrackProperties) => void;
32
+ onPageChange: (callback: PageChangeCallback) => () => void;
33
+ startSessionReplay: () => void;
34
+ stopSessionReplay: () => void;
35
+ isSessionReplayActive: () => boolean;
30
36
  }
31
37
 
32
38
  declare const rybbit: RybbitAPI;
package/dist/index.d.ts CHANGED
@@ -1,25 +1,26 @@
1
1
  interface RybbitConfig {
2
2
  analyticsHost: string;
3
- siteId: string | number;
3
+ siteId: string;
4
4
  debounce?: number;
5
- autoTrackPageviews?: boolean;
6
- autoTrackSpaRoutes?: boolean;
7
- trackQuerystring?: boolean;
8
- trackOutboundLinks?: boolean;
9
- trackHashRoutes?: boolean;
10
- trackDataAttributes?: boolean;
11
- trackWebVitals?: boolean;
12
- webVitalsTimeout?: number;
13
5
  skipPatterns?: string[];
14
6
  maskPatterns?: string[];
15
7
  debug?: boolean;
8
+ replayBufferSize?: number;
9
+ replayBatchInterval?: number;
10
+ replayPrivacyConfig?: {
11
+ maskAllInputs?: boolean;
12
+ maskTextSelectors?: string[];
13
+ };
14
+ enableRemoteConfig?: boolean;
15
+ remoteConfigTimeout?: number;
16
16
  }
17
17
  type PropertyValue = string | number | boolean;
18
18
  interface TrackProperties {
19
19
  [key: string]: PropertyValue | PropertyValue[];
20
20
  }
21
+ type PageChangeCallback = (pathname: string, previousPathname: string) => void;
21
22
  interface RybbitAPI {
22
- init: (config: RybbitConfig) => void;
23
+ init: (config: RybbitConfig) => Promise<void>;
23
24
  pageview: (path?: string) => void;
24
25
  event: (name: string, properties?: TrackProperties) => void;
25
26
  outbound: (url: string, text?: string, target?: string) => void;
@@ -27,6 +28,11 @@ interface RybbitAPI {
27
28
  clearUserId: () => void;
28
29
  getUserId: () => string | null;
29
30
  cleanup: () => void;
31
+ captureError: (error: Error | ErrorEvent, context?: TrackProperties) => void;
32
+ onPageChange: (callback: PageChangeCallback) => () => void;
33
+ startSessionReplay: () => void;
34
+ stopSessionReplay: () => void;
35
+ isSessionReplayActive: () => boolean;
30
36
  }
31
37
 
32
38
  declare const rybbit: RybbitAPI;
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @rybbit/js v0.2.0
2
+ * @rybbit/js v0.3.0
3
3
  * Rybbit Web SDK
4
4
  * (c) 2025 Rybbit
5
5
  * Released under the AGPL-3.0-only license.
6
6
  */
7
- "use strict";var D=Object.defineProperty;var Ht=Object.getOwnPropertyDescriptor;var Ut=Object.getOwnPropertyNames,st=Object.getOwnPropertySymbols;var lt=Object.prototype.hasOwnProperty,Nt=Object.prototype.propertyIsEnumerable;var N=(e,t,i)=>t in e?D(e,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[t]=i,m=(e,t)=>{for(var i in t||(t={}))lt.call(t,i)&&N(e,i,t[i]);if(st)for(var i of st(t))Nt.call(t,i)&&N(e,i,t[i]);return e};var Ft=(e,t)=>{for(var i in t)D(e,i,{get:t[i],enumerable:!0})},zt=(e,t,i,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Ut(t))!lt.call(e,n)&&n!==i&&D(e,n,{get:()=>t[n],enumerable:!(r=Ht(t,n))||r.enumerable});return e};var $t=e=>zt(D({},"__esModule",{value:!0}),e);var y=(e,t,i)=>N(e,typeof t!="symbol"?t+"":t,i);var Yt={};Ft(Yt,{default:()=>Jt});module.exports=$t(Yt);function ct(e,t){let i=null;return function(...r){let n=this;i!==null&&clearTimeout(i),i=setTimeout(()=>{i=null,e.apply(n,r)},t)}}function ut(e){try{let t=window.location.hostname,i=new URL(e,window.location.href).hostname;return!!i&&i!==t}catch(t){return!1}}function Bt(e){try{let t="__DOUBLE_ASTERISK_TOKEN__",i="__SINGLE_ASTERISK_TOKEN__",n=e.replace(/\*\*/g,t).replace(/\*/g,i).replace(/[.+?^${}()|[\]\\]/g,"\\$&");n=n.replace(/\//g,"\\/");let u=n.replace(new RegExp(t,"g"),".*").replace(new RegExp(i,"g"),"[^/]+");return new RegExp("^"+u+"$")}catch(t){return o(`Invalid pattern: ${e}`,t),null}}function F(e,t=[]){if(!t||t.length===0)return null;for(let i of t){let r=Bt(i);if(r&&r.test(e))return i}return null}function s(...e){l.debug&&console.log("[Rybbit]",...e)}function o(...e){l.debug&&console.error("[Rybbit Error]",...e)}function z(){let e=new URL(window.location.href),t=e.pathname;return l.trackHashRoutes&&e.hash&&(t+=e.hash),t}var g={debounce:500,autoTrackPageviews:!0,autoTrackSpaRoutes:!0,trackQuerystring:!0,trackOutboundLinks:!0,trackHashRoutes:!0,trackDataAttributes:!0,trackWebVitals:!0,webVitalsTimeout:2e4,skipPatterns:[],maskPatterns:[],debug:!1},O=null,l=new Proxy({},{get:(e,t)=>{var i;return O?O[t]:(t!=="debug"&&o("Rybbit SDK accessed before initialization. Call rybbit.init() first."),(i=g[t])!=null?i:void 0)},set:()=>(o("Rybbit config is read-only after initialization."),!1)});function dt(e){var d,f,w,C,P,S,rt,nt,at,ot;if(O)return o("Rybbit SDK already initialized."),!1;if(typeof e!="object"||e===null)return o("Invalid configuration provided to rybbit.init(). Expected an object."),!1;let t=e,i=t.analyticsHost;if(!i)return o("`analyticsHost` is required in Rybbit config and must be a string."),!1;let r=i.replace(/\/$/,""),n=t.siteId;if(n==null||String(n).trim()==="")return o("`siteId` is required in Rybbit config and must be a non-empty string or number."),!1;let u=String(n),c=Array.isArray(t.skipPatterns)?t.skipPatterns:g.skipPatterns,a=Array.isArray(t.maskPatterns)?t.maskPatterns:g.maskPatterns;return O={analyticsHost:r,siteId:u,debounce:Math.max(0,(d=t.debounce)!=null?d:g.debounce),autoTrackPageviews:(f=t.autoTrackPageviews)!=null?f:g.autoTrackPageviews,autoTrackSpaRoutes:(w=t.autoTrackSpaRoutes)!=null?w:g.autoTrackSpaRoutes,trackQuerystring:(C=t.trackQuerystring)!=null?C:g.trackQuerystring,trackOutboundLinks:(P=t.trackOutboundLinks)!=null?P:g.trackOutboundLinks,trackHashRoutes:(S=t.trackHashRoutes)!=null?S:g.trackHashRoutes,trackDataAttributes:(rt=t.trackDataAttributes)!=null?rt:g.trackDataAttributes,trackWebVitals:(nt=t.trackWebVitals)!=null?nt:g.trackWebVitals,webVitalsTimeout:Math.max(1e3,(at=t.webVitalsTimeout)!=null?at:g.webVitalsTimeout),skipPatterns:c,maskPatterns:a,debug:(ot=t.debug)!=null?ot:g.debug},!0}var v=null,$=!1;try{let e=localStorage.getItem("rybbit-user-id");e&&(v=e),localStorage.getItem("disable-rybbit")!==null&&($=!0)}catch(e){o("localStorage unavailable")}typeof window!="undefined"&&window.__RYBBIT_OPTOUT__&&($=!0);function p(e,t={}){if($){s("Opted out of tracking.");return}if(!l||!l.analyticsHost||!l.siteId){o("Rybbit config not available. Ensure rybbit.init() was called successfully.");return}let{eventName:i,properties:r,pathOverride:n,webVitals:u}=t;if((e==="custom_event"||e==="performance")&&!i){o("Event name is required and must be a string for performance or custom events.");return}try{let c=new URL(window.location.href),a,d="";if(e==="pageview"&&typeof n=="string"&&n.trim()){s(`Using path override: ${n}`);try{let S=new URL(n,"http://dummybase");a=S.pathname,d=S.search||"",s(`Parsed override path: ${a}, search: ${d}`)}catch(S){o(`Invalid pathOverride format: ${n}. Using window location.`),a=z(),d=l.trackQuerystring?c.search:""}}else a=z(),d=l.trackQuerystring?c.search:"";if(e!=="performance"&&F(a,l.skipPatterns)){s(`Skipping track for path: ${a}`);return}let f=F(a,l.maskPatterns);f&&e!=="performance"&&(s(`Masking path ${a} as ${f}`),a=f,d="");let w=m(m(m(m({site_id:l.siteId,hostname:c.hostname,pathname:a,querystring:d,screenWidth:window.innerWidth,screenHeight:window.innerHeight,language:navigator.language,page_title:document.title,referrer:document.referrer||"direct",type:e},(e==="custom_event"||e==="performance")&&{event_name:i}),(e==="custom_event"||e==="outbound")&&Object.keys(r!=null?r:{}).length>0&&{properties:JSON.stringify(r)}),e==="performance"&&u&&m({},u)),v&&{user_id:v});s("Sending track event:",w);let C=JSON.stringify(w),P=`${l.analyticsHost}/track`;navigator.sendBeacon?navigator.sendBeacon(P,new Blob([C],{type:"application/json"}))||(o("sendBeacon failed, falling back to fetch."),ft(P,C)):ft(P,C)}catch(c){o("Error during tracking:",c)}}function ft(e,t){fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:t,mode:"cors",keepalive:!0}).catch(i=>{o("Fetch request failed:",i)})}function gt(e){if(e.trim()===""){o("User ID must be a non-empty string");return}v=e.trim();try{localStorage.setItem("rybbit-user-id",v),s("User identified:",v)}catch(t){o("Could not persist user ID to localStorage")}}function pt(){v=null;try{localStorage.removeItem("rybbit-user-id"),s("User ID cleared")}catch(e){o("Could not remove user ID from localStorage")}}function mt(){return v}var k,_=!1;function bt(){if(_){s("Automatic tracking already set up.");return}if(!l.autoTrackPageviews){s("Automatic pageview tracking is disabled.");return}if(s("Setting up automatic tracking..."),k=l.debounce&&l.debounce>0?ct(()=>p("pageview"),l.debounce):()=>p("pageview"),requestAnimationFrame(()=>{k()}),l.autoTrackSpaRoutes){s("Setting up SPA route change tracking.");let e=history.pushState,t=history.replaceState;history.pushState=function(...i){e.apply(this,i),k()},history.replaceState=function(...i){t.apply(this,i),k()},window.addEventListener("popstate",k)}else s("SPA route change tracking is disabled.");l.trackHashRoutes?window.addEventListener("hashchange",k):s("Hash route tracking is disabled."),_=!0}function ht(){if(!l.trackDataAttributes){s("Data attribute tracking is disabled.");return}s("Setting up data attribute and outbound link tracking."),document.addEventListener("click",yt,!0)}function yt(e){if(!(e.target instanceof Element))return;let t=e.target;for(;t;){if(t.hasAttribute("data-rybbit-event")){let i=t.getAttribute("data-rybbit-event");if(i){let r={};for(let n of t.attributes)if(n.name.startsWith("data-rybbit-prop-")){let u=n.name.replace("data-rybbit-prop-","");r[u]=n.value}s("Data attribute event triggered:",i,r),p("custom_event",{eventName:i,properties:r})}break}t=t.parentElement}if(l.trackOutboundLinks&&e.target instanceof Element){let i=e.target.closest("a");if(i&&i.href&&ut(i.href)){s("Outbound link clicked:",i.href);let r={url:i.href,text:i.innerText||i.textContent||"",target:i.target||"_self"};p("outbound",{properties:r})}}}function vt(){_&&(s("Cleaning up automatic tracking listeners."),window.removeEventListener("popstate",k),window.removeEventListener("hashchange",k),document.removeEventListener("click",yt,!0),_=!1)}var Lt=-1,E=e=>{addEventListener("pageshow",t=>{t.persisted&&(Lt=t.timeStamp,e(t))},!0)},b=(e,t,i,r)=>{let n,u;return c=>{t.value>=0&&(c||r)&&(u=t.value-(n!=null?n:0),(u||n===void 0)&&(n=t.value,t.delta=u,t.rating=((a,d)=>a>d[1]?"poor":a>d[0]?"needs-improvement":"good")(t.value,i),e(t)))}},Y=e=>{requestAnimationFrame(()=>requestAnimationFrame(()=>e()))},X=()=>{let e=performance.getEntriesByType("navigation")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},L=()=>{var t;let e=X();return(t=e==null?void 0:e.activationStart)!=null?t:0},h=(e,t=-1)=>{let i=X(),r="navigate";return Lt>=0?r="back-forward-cache":i&&(document.prerendering||L()>0?r="prerender":document.wasDiscarded?r="restore":i.type&&(r=i.type.replace(/_/g,"-"))),{name:e,value:t,rating:"good",delta:0,entries:[],id:`v5-${Date.now()}-${Math.floor(8999999999999*Math.random())+1e12}`,navigationType:r}},B=new WeakMap;function Z(e,t){return B.get(e)||B.set(e,new t),B.get(e)}var q=class{constructor(){y(this,"t");y(this,"i",0);y(this,"o",[])}h(t){var n;if(t.hadRecentInput)return;let i=this.o[0],r=this.o.at(-1);this.i&&i&&r&&t.startTime-r.startTime<1e3&&t.startTime-i.startTime<5e3?(this.i+=t.value,this.o.push(t)):(this.i=t.value,this.o=[t]),(n=this.t)==null||n.call(this,t)}},A=(e,t,i={})=>{try{if(PerformanceObserver.supportedEntryTypes.includes(e)){let r=new PerformanceObserver(n=>{Promise.resolve().then(()=>{t(n.getEntries())})});return r.observe(m({type:e,buffered:!0},i)),r}}catch(r){}},tt=e=>{let t=!1;return()=>{t||(e(),t=!0)}},R=-1,kt=()=>document.visibilityState!=="hidden"||document.prerendering?1/0:0,V=e=>{document.visibilityState==="hidden"&&R>-1&&(R=e.type==="visibilitychange"?e.timeStamp:0,Kt())},Tt=()=>{addEventListener("visibilitychange",V,!0),addEventListener("prerenderingchange",V,!0)},Kt=()=>{removeEventListener("visibilitychange",V,!0),removeEventListener("prerenderingchange",V,!0)},At=()=>{var e;if(R<0){let t=L(),i=document.prerendering||(e=globalThis.performance.getEntriesByType("visibility-state").filter(r=>r.name==="hidden"&&r.startTime>t)[0])==null?void 0:e.startTime;R=i!=null?i:kt(),Tt(),E(()=>{setTimeout(()=>{R=kt(),Tt()})})}return{get firstHiddenTime(){return R}}},W=e=>{document.prerendering?addEventListener("prerenderingchange",()=>e(),!0):e()},wt=[1800,3e3],et=(e,t={})=>{W(()=>{let i=At(),r,n=h("FCP"),u=A("paint",c=>{for(let a of c)a.name==="first-contentful-paint"&&(u.disconnect(),a.startTime<i.firstHiddenTime&&(n.value=Math.max(a.startTime-L(),0),n.entries.push(a),r(!0)))});u&&(r=b(e,n,wt,t.reportAllChanges),E(c=>{n=h("FCP"),r=b(e,n,wt,t.reportAllChanges),Y(()=>{n.value=performance.now()-c.timeStamp,r(!0)})}))})},St=[.1,.25],xt=(e,t={})=>{et(tt(()=>{let i,r=h("CLS",0),n=Z(t,q),u=a=>{for(let d of a)n.h(d);n.i>r.value&&(r.value=n.i,r.entries=n.o,i())},c=A("layout-shift",u);c&&(i=b(e,r,St,t.reportAllChanges),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&(u(c.takeRecords()),i(!0))}),E(()=>{n.i=0,r=h("CLS",0),i=b(e,r,St,t.reportAllChanges),Y(()=>i())}),setTimeout(i))}))},Dt=0,K=1/0,M=0,qt=e=>{for(let t of e)t.interactionId&&(K=Math.min(K,t.interactionId),M=Math.max(M,t.interactionId),Dt=M?(M-K)/7+1:0)},j,Ct=()=>{var e;return j?Dt:(e=performance.interactionCount)!=null?e:0},jt=()=>{"interactionCount"in performance||j||(j=A("event",qt,{type:"event",buffered:!0,durationThreshold:0}))},Pt=0,Q=class{constructor(){y(this,"u",[]);y(this,"l",new Map);y(this,"m");y(this,"v")}p(){Pt=Ct(),this.u.length=0,this.l.clear()}P(){let t=Math.min(this.u.length-1,Math.floor((Ct()-Pt)/50));return this.u[t]}h(t){var n,u;if((n=this.m)==null||n.call(this,t),!t.interactionId&&t.entryType!=="first-input")return;let i=this.u.at(-1),r=this.l.get(t.interactionId);if(r||this.u.length<10||t.duration>i.T){if(r?t.duration>r.T?(r.entries=[t],r.T=t.duration):t.duration===r.T&&t.startTime===r.entries[0].startTime&&r.entries.push(t):(r={id:t.interactionId,entries:[t],T:t.duration},this.l.set(r.id,r),this.u.push(r)),this.u.sort((c,a)=>a.T-c.T),this.u.length>10){let c=this.u.splice(10);for(let a of c)this.l.delete(a.id)}(u=this.v)==null||u.call(this,r)}}},Ot=e=>{let t=globalThis.requestIdleCallback||setTimeout;document.visibilityState==="hidden"?e():(e=tt(e),document.addEventListener("visibilitychange",e,{once:!0}),t(()=>{e(),document.removeEventListener("visibilitychange",e)}))},Rt=[200,500],_t=(e,t={})=>{globalThis.PerformanceEventTiming&&"interactionId"in PerformanceEventTiming.prototype&&W(()=>{var a;jt();let i,r=h("INP"),n=Z(t,Q),u=d=>{Ot(()=>{for(let w of d)n.h(w);let f=n.P();f&&f.T!==r.value&&(r.value=f.T,r.entries=f.entries,i())})},c=A("event",u,{durationThreshold:(a=t.durationThreshold)!=null?a:40});i=b(e,r,Rt,t.reportAllChanges),c&&(c.observe({type:"first-input",buffered:!0}),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&(u(c.takeRecords()),i(!0))}),E(()=>{n.p(),r=h("INP"),i=b(e,r,Rt,t.reportAllChanges)}))})},G=class{constructor(){y(this,"m")}h(t){var i;(i=this.m)==null||i.call(this,t)}},Et=[2500,4e3],Mt=(e,t={})=>{W(()=>{let i=At(),r,n=h("LCP"),u=Z(t,G),c=d=>{t.reportAllChanges||(d=d.slice(-1));for(let f of d)u.h(f),f.startTime<i.firstHiddenTime&&(n.value=Math.max(f.startTime-L(),0),n.entries=[f],r())},a=A("largest-contentful-paint",c);if(a){r=b(e,n,Et,t.reportAllChanges);let d=tt(()=>{c(a.takeRecords()),a.disconnect(),r(!0)});for(let f of["keydown","click","visibilitychange"])addEventListener(f,()=>Ot(d),{capture:!0,once:!0});E(f=>{n=h("LCP"),r=b(e,n,Et,t.reportAllChanges),Y(()=>{n.value=performance.now()-f.timeStamp,r(!0)})})}})},It=[800,1800],J=e=>{document.prerendering?W(()=>J(e)):document.readyState!=="complete"?addEventListener("load",()=>J(e),!0):setTimeout(e)},Vt=(e,t={})=>{let i=h("TTFB"),r=b(e,i,It,t.reportAllChanges);J(()=>{let n=X();n&&(i.value=Math.max(n.responseStart-L(),0),i.entries=[n],r(!0),E(()=>{i=h("TTFB",0),r=b(e,i,It,t.reportAllChanges),r(!0)}))})};var U={lcp:null,cls:null,inp:null,fcp:null,ttfb:null},I=!1,H=null;function Qt(){if(I)return;Object.values(U).every(t=>t!==null)&&it()}function it(){I||(I=!0,H&&(clearTimeout(H),H=null),s("Sending web vitals data:",U),p("performance",{eventName:"web-vitals",webVitals:U}))}function x(e){if(I)return;let t=e.name.toLowerCase();U[t]=e.value,s(`Collected ${t}:`,e.value),Qt()}function Wt(){if(!l.trackWebVitals){s("Web vitals tracking is disabled.");return}s("Initializing web vitals tracking...");try{Mt(x),xt(x),_t(x),et(x),Vt(x),H=setTimeout(()=>{I||(s("Web vitals timeout reached, sending collected metrics."),it())},l.webVitalsTimeout||2e4),window.addEventListener("beforeunload",()=>{I||it()}),s("Web vitals tracking initialized successfully.")}catch(e){o("Error setting up web vitals tracking:",e)}}var T=!1,Gt={init:e=>{if(T){o("Rybbit SDK already initialized. Call init() only once.");return}dt(e)&&(T=!0,s("Config:",m({},l)),bt(),ht(),Wt())},pageview:e=>{if(!T){o("Rybbit SDK not initialized. Call rybbit.init() first.");return}p("pageview",{pathOverride:e})},event:(e,t)=>{if(!T){o("Rybbit SDK not initialized. Call rybbit.init() first.");return}if(!e){o("Event name is required and must be a string.");return}p("custom_event",{eventName:e,properties:t})},outbound:(e,t="",i="_self")=>{if(!T){o("Rybbit SDK not initialized. Call rybbit.init() first.");return}if(!e){o("Outbound link URL is required and must be a string.");return}p("outbound",{properties:{url:e,text:t,target:i}})},identify:e=>{if(!T){o("Rybbit SDK not initialized. Call rybbit.init() first.");return}gt(e)},clearUserId:()=>{if(!T){o("Rybbit SDK not initialized. Call rybbit.init() first.");return}pt()},getUserId:()=>T?mt():(o("Rybbit SDK not initialized. Call rybbit.init() first."),null),cleanup:vt},Jt=Gt;
7
+ "use strict";var dt=Object.create;var A=Object.defineProperty;var ft=Object.getOwnPropertyDescriptor;var gt=Object.getOwnPropertyNames,Se=Object.getOwnPropertySymbols,pt=Object.getPrototypeOf,Te=Object.prototype.hasOwnProperty,mt=Object.prototype.propertyIsEnumerable;var G=(e,t,r)=>t in e?A(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,h=(e,t)=>{for(var r in t||(t={}))Te.call(t,r)&&G(e,r,t[r]);if(Se)for(var r of Se(t))mt.call(t,r)&&G(e,r,t[r]);return e};var bt=(e,t)=>{for(var r in t)A(e,r,{get:t[r],enumerable:!0})},Ee=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of gt(t))!Te.call(e,i)&&i!==r&&A(e,i,{get:()=>t[i],enumerable:!(n=ft(t,i))||n.enumerable});return e};var ht=(e,t,r)=>(r=e!=null?dt(pt(e)):{},Ee(t||!e||!e.__esModule?A(r,"default",{value:e,enumerable:!0}):r,e)),yt=e=>Ee(A({},"__esModule",{value:!0}),e);var T=(e,t,r)=>G(e,typeof t!="symbol"?t+"":t,r);var At={};bt(At,{default:()=>Ot});module.exports=yt(At);function we(e,t){let r=null;return function(...n){let i=this;r!==null&&clearTimeout(r),r=setTimeout(()=>{r=null,e.apply(i,n)},t)}}function Re(e){try{let t=window.location.hostname,r=new URL(e,window.location.href).hostname;return!!r&&r!==t}catch(t){return!1}}function vt(e){try{let t="__DOUBLE_ASTERISK_TOKEN__",r="__SINGLE_ASTERISK_TOKEN__",i=e.replace(/\*\*/g,t).replace(/\*/g,r).replace(/[.+?^${}()|[\]\\]/g,"\\$&");i=i.replace(/\//g,"\\/");let u=i.replace(new RegExp(t,"g"),".*").replace(new RegExp(r,"g"),"[^/]+");return new RegExp("^"+u+"$")}catch(t){return a(`Invalid pattern: ${e}`,t),null}}function Y(e,t=[]){if(!t||t.length===0)return null;for(let r of t){let n=vt(r);if(n&&n.test(e))return r}return null}function o(...e){c.debug&&console.log("[Rybbit]",...e)}function a(...e){c.debug&&console.error("[Rybbit Error]",...e)}function I(){let e=new URL(window.location.href),t=e.pathname;return e.hash&&(t+=e.hash),t}var v={debounce:500,skipPatterns:[],maskPatterns:[],debug:!1,replayBufferSize:250,replayBatchInterval:5e3,enableRemoteConfig:!0,remoteConfigTimeout:3e3},E={autoTrackPageviews:!0,autoTrackSpaRoutes:!0,trackQuerystring:!0,trackOutboundLinks:!0,trackWebVitals:!1,captureErrors:!1,enableSessionReplay:!1},N=null,c=new Proxy({},{get:(e,t)=>{var r,n;return N?N[t]:(t!=="debug"&&a("Rybbit SDK accessed before initialization. Call rybbit.init() first."),(n=(r=v[t])!=null?r:E[t])!=null?n:void 0)},set:()=>(a("Rybbit config is read-only after initialization."),!1)});async function kt(e,t,r){var n,i,u,s,l,d,f;try{o("Fetching remote configuration...");let m=new AbortController,w=setTimeout(()=>m.abort(),r),y=await fetch(`${e}/site/${t}/tracking-config`,{signal:m.signal});if(clearTimeout(w),y.ok){let g=await y.json();return o("Remote configuration fetched successfully",g),{autoTrackPageviews:(n=g.trackInitialPageView)!=null?n:E.autoTrackPageviews,autoTrackSpaRoutes:(i=g.trackSpaNavigation)!=null?i:E.autoTrackSpaRoutes,trackQuerystring:(u=g.trackUrlParams)!=null?u:E.trackQuerystring,trackOutboundLinks:(s=g.trackOutbound)!=null?s:E.trackOutboundLinks,trackWebVitals:(l=g.webVitals)!=null?l:E.trackWebVitals,captureErrors:(d=g.trackErrors)!=null?d:E.captureErrors,enableSessionReplay:(f=g.sessionReplay)!=null?f:E.enableSessionReplay}}else return a(`Failed to fetch remote config: ${y.status}`),null}catch(m){return m.name==="AbortError"?a("Remote config fetch timed out"):a("Error fetching remote config:",m),null}}async function Ce(e){var f,m,w,y,g,ve,ke;if(N)return a("Rybbit SDK already initialized."),!1;if(typeof e!="object"||e===null)return a("Invalid configuration provided to rybbit.init(). Expected an object."),!1;let t=e.analyticsHost;if(!t||t.trim()==="")return a("`analyticsHost` is required in Rybbit config and must be a non-empty string."),!1;let r=t.replace(/\/$/,""),n=e.siteId;if(!n||n.trim()==="")return a("`siteId` is required in Rybbit config and must be a non-empty string."),!1;let i=(f=e.enableRemoteConfig)!=null?f:v.enableRemoteConfig,u=null;if(i){let ut=(m=e.remoteConfigTimeout)!=null?m:v.remoteConfigTimeout;u=await kt(r,n,ut)}let s=u||E,l=Array.isArray(e.skipPatterns)?e.skipPatterns:v.skipPatterns,d=Array.isArray(e.maskPatterns)?e.maskPatterns:v.maskPatterns;return N={analyticsHost:r,siteId:n,debounce:Math.max(0,(w=e.debounce)!=null?w:v.debounce),skipPatterns:l,maskPatterns:d,debug:(y=e.debug)!=null?y:v.debug,replayBufferSize:Math.max(1,(g=e.replayBufferSize)!=null?g:v.replayBufferSize),replayBatchInterval:Math.max(1e3,(ve=e.replayBatchInterval)!=null?ve:v.replayBatchInterval),replayPrivacyConfig:e.replayPrivacyConfig,enableRemoteConfig:i,remoteConfigTimeout:Math.max(1e3,(ke=e.remoteConfigTimeout)!=null?ke:v.remoteConfigTimeout),autoTrackPageviews:s.autoTrackPageviews,autoTrackSpaRoutes:s.autoTrackSpaRoutes,trackQuerystring:s.trackQuerystring,trackOutboundLinks:s.trackOutboundLinks,trackWebVitals:s.trackWebVitals,captureErrors:s.captureErrors,enableSessionReplay:s.enableSessionReplay},!0}var R=null,X=!1;try{let e=localStorage.getItem("rybbit-user-id");e&&(R=e),localStorage.getItem("disable-rybbit")!==null&&(X=!0)}catch(e){a("localStorage unavailable")}typeof window!="undefined"&&window.__RYBBIT_OPTOUT__&&(X=!0);function b(e,t={}){if(X){o("Opted out of tracking.");return}if(!c||!c.analyticsHost||!c.siteId){a("Rybbit config not available. Ensure rybbit.init() was called successfully.");return}let{eventName:r,properties:n,pathOverride:i,webVitals:u}=t;if((e==="custom_event"||e==="performance")&&!r){a("Event name is required and must be a string for performance or custom events.");return}try{let s=new URL(window.location.href),l,d="";if(e==="pageview"&&typeof i=="string"&&i.trim()){o(`Using path override: ${i}`);try{let g=new URL(i,"http://dummybase");l=g.pathname,d=g.search||"",o(`Parsed override path: ${l}, search: ${d}`)}catch(g){a(`Invalid pathOverride format: ${i}. Using window location.`),l=I(),d=c.trackQuerystring?s.search:""}}else l=I(),d=c.trackQuerystring?s.search:"";if(e!=="performance"&&Y(l,c.skipPatterns)){o(`Skipping track for path: ${l}`);return}let f=Y(l,c.maskPatterns);f&&e!=="performance"&&(o(`Masking path ${l} as ${f}`),l=f,d="");let m=h(h(h(h({site_id:c.siteId,hostname:s.hostname,pathname:l,querystring:d,screenWidth:window.screen.width,screenHeight:window.screen.height,language:navigator.language,page_title:document.title,referrer:document.referrer||"direct",type:e},(e==="custom_event"||e==="performance")&&{event_name:r}),(e==="custom_event"||e==="outbound")&&Object.keys(n!=null?n:{}).length>0&&{properties:JSON.stringify(n)}),e==="performance"&&u&&h({},u)),R&&{user_id:R});o("Sending track event:",m);let w=JSON.stringify(m),y=`${c.analyticsHost}/track`;navigator.sendBeacon?navigator.sendBeacon(y,new Blob([w],{type:"application/json"}))||(a("sendBeacon failed, falling back to fetch."),Pe(y,w)):Pe(y,w)}catch(s){a("Error during tracking:",s)}}function Pe(e,t){fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:t,mode:"cors",keepalive:!0}).catch(r=>{a("Fetch request failed:",r)})}function Ie(e){if(e.trim()===""){a("User ID must be a non-empty string");return}R=e.trim();try{localStorage.setItem("rybbit-user-id",R),o("User identified:",R)}catch(t){a("Could not persist user ID to localStorage")}}function Le(){R=null;try{localStorage.removeItem("rybbit-user-id"),o("User ID cleared")}catch(e){a("Could not remove user ID from localStorage")}}function Z(){return R}var C,W=!1,M=[],ee="";function De(){if(W){o("Automatic tracking already set up.");return}if(!c.autoTrackPageviews){o("Automatic pageview tracking is disabled.");return}if(o("Setting up automatic tracking..."),ee=I(),C=c.debounce&&c.debounce>0?we(()=>{let e=I();xe(e),b("pageview")},c.debounce):()=>{let e=I();xe(e),b("pageview")},requestAnimationFrame(()=>{C()}),c.autoTrackSpaRoutes){o("Setting up SPA route change tracking.");let e=history.pushState,t=history.replaceState;history.pushState=function(...r){e.apply(this,r),C()},history.replaceState=function(...r){t.apply(this,r),C()},window.addEventListener("popstate",C)}else o("SPA route change tracking is disabled.");window.addEventListener("hashchange",C),W=!0}function Oe(){o("Setting up data attribute and outbound link tracking."),document.addEventListener("click",Ae,!0)}function Ae(e){if(!(e.target instanceof Element))return;let t=e.target;for(;t;){if(t.hasAttribute("data-rybbit-event")){let r=t.getAttribute("data-rybbit-event");if(r){let n={};for(let i of t.attributes)if(i.name.startsWith("data-rybbit-prop-")){let u=i.name.replace("data-rybbit-prop-","");n[u]=i.value}o("Data attribute event triggered:",r,n),b("custom_event",{eventName:r,properties:n})}break}t=t.parentElement}if(c.trackOutboundLinks&&e.target instanceof Element){let r=e.target.closest("a");if(r&&r.href&&Re(r.href)){o("Outbound link clicked:",r.href);let n={url:r.href,text:r.innerText||r.textContent||"",target:r.target||"_self"};b("outbound",{properties:n})}}}function Me(e){return M.push(e),o("Page change callback added"),()=>{M=M.filter(t=>t!==e),o("Page change callback removed")}}function xe(e){let t=ee;ee=e,t!==e&&(o(`Page changed from ${t} to ${e}`),M.forEach(r=>{try{r(e,t)}catch(n){a("Error in page change callback:",n)}}))}function _e(){W&&(o("Cleaning up automatic tracking listeners."),window.removeEventListener("popstate",C),window.removeEventListener("hashchange",C),document.removeEventListener("click",Ae,!0),M=[],W=!1)}var je=-1,x=e=>{addEventListener("pageshow",t=>{t.persisted&&(je=t.timeStamp,e(t))},!0)},k=(e,t,r,n)=>{let i,u;return s=>{t.value>=0&&(s||n)&&(u=t.value-(i!=null?i:0),(u||i===void 0)&&(i=t.value,t.delta=u,t.rating=((l,d)=>l>d[1]?"poor":l>d[0]?"needs-improvement":"good")(t.value,r),e(t)))}},le=e=>{requestAnimationFrame(()=>requestAnimationFrame(()=>e()))},ce=()=>{let e=performance.getEntriesByType("navigation")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},_=()=>{var t;let e=ce();return(t=e==null?void 0:e.activationStart)!=null?t:0},S=(e,t=-1)=>{let r=ce(),n="navigate";return je>=0?n="back-forward-cache":r&&(document.prerendering||_()>0?n="prerender":document.wasDiscarded?n="restore":r.type&&(n=r.type.replace(/_/g,"-"))),{name:e,value:t,rating:"good",delta:0,entries:[],id:`v5-${Date.now()}-${Math.floor(8999999999999*Math.random())+1e12}`,navigationType:n}},te=new WeakMap;function ue(e,t){return te.get(e)||te.set(e,new t),te.get(e)}var ne=class{constructor(){T(this,"t");T(this,"i",0);T(this,"o",[])}h(t){var i;if(t.hadRecentInput)return;let r=this.o[0],n=this.o.at(-1);this.i&&r&&n&&t.startTime-n.startTime<1e3&&t.startTime-r.startTime<5e3?(this.i+=t.value,this.o.push(t)):(this.i=t.value,this.o=[t]),(i=this.t)==null||i.call(this,t)}},U=(e,t,r={})=>{try{if(PerformanceObserver.supportedEntryTypes.includes(e)){let n=new PerformanceObserver(i=>{Promise.resolve().then(()=>{t(i.getEntries())})});return n.observe(h({type:e,buffered:!0},r)),n}}catch(n){}},de=e=>{let t=!1;return()=>{t||(e(),t=!0)}},L=-1,Ue=()=>document.visibilityState!=="hidden"||document.prerendering?1/0:0,V=e=>{document.visibilityState==="hidden"&&L>-1&&(L=e.type==="visibilitychange"?e.timeStamp:0,St())},Be=()=>{addEventListener("visibilitychange",V,!0),addEventListener("prerenderingchange",V,!0)},St=()=>{removeEventListener("visibilitychange",V,!0),removeEventListener("prerenderingchange",V,!0)},He=()=>{var e;if(L<0){let t=_(),r=document.prerendering||(e=globalThis.performance.getEntriesByType("visibility-state").filter(n=>n.name==="hidden"&&n.startTime>t)[0])==null?void 0:e.startTime;L=r!=null?r:Ue(),Be(),x(()=>{setTimeout(()=>{L=Ue(),Be()})})}return{get firstHiddenTime(){return L}}},K=e=>{document.prerendering?addEventListener("prerenderingchange",()=>e(),!0):e()},Fe=[1800,3e3],fe=(e,t={})=>{K(()=>{let r=He(),n,i=S("FCP"),u=U("paint",s=>{for(let l of s)l.name==="first-contentful-paint"&&(u.disconnect(),l.startTime<r.firstHiddenTime&&(i.value=Math.max(l.startTime-_(),0),i.entries.push(l),n(!0)))});u&&(n=k(e,i,Fe,t.reportAllChanges),x(s=>{i=S("FCP"),n=k(e,i,Fe,t.reportAllChanges),le(()=>{i.value=performance.now()-s.timeStamp,n(!0)})}))})},ze=[.1,.25],qe=(e,t={})=>{fe(de(()=>{let r,n=S("CLS",0),i=ue(t,ne),u=l=>{for(let d of l)i.h(d);i.i>n.value&&(n.value=i.i,n.entries=i.o,r())},s=U("layout-shift",u);s&&(r=k(e,n,ze,t.reportAllChanges),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&(u(s.takeRecords()),r(!0))}),x(()=>{i.i=0,n=S("CLS",0),r=k(e,n,ze,t.reportAllChanges),le(()=>r())}),setTimeout(r))}))},Qe=0,re=1/0,$=0,Tt=e=>{for(let t of e)t.interactionId&&(re=Math.min(re,t.interactionId),$=Math.max($,t.interactionId),Qe=$?($-re)/7+1:0)},ie,Ne=()=>{var e;return ie?Qe:(e=performance.interactionCount)!=null?e:0},Et=()=>{"interactionCount"in performance||ie||(ie=U("event",Tt,{type:"event",buffered:!0,durationThreshold:0}))},We=0,ae=class{constructor(){T(this,"u",[]);T(this,"l",new Map);T(this,"m");T(this,"v")}p(){We=Ne(),this.u.length=0,this.l.clear()}P(){let t=Math.min(this.u.length-1,Math.floor((Ne()-We)/50));return this.u[t]}h(t){var i,u;if((i=this.m)==null||i.call(this,t),!t.interactionId&&t.entryType!=="first-input")return;let r=this.u.at(-1),n=this.l.get(t.interactionId);if(n||this.u.length<10||t.duration>r.T){if(n?t.duration>n.T?(n.entries=[t],n.T=t.duration):t.duration===n.T&&t.startTime===n.entries[0].startTime&&n.entries.push(t):(n={id:t.interactionId,entries:[t],T:t.duration},this.l.set(n.id,n),this.u.push(n)),this.u.sort((s,l)=>l.T-s.T),this.u.length>10){let s=this.u.splice(10);for(let l of s)this.l.delete(l.id)}(u=this.v)==null||u.call(this,n)}}},Je=e=>{let t=globalThis.requestIdleCallback||setTimeout;document.visibilityState==="hidden"?e():(e=de(e),document.addEventListener("visibilitychange",e,{once:!0}),t(()=>{e(),document.removeEventListener("visibilitychange",e)}))},$e=[200,500],Ge=(e,t={})=>{globalThis.PerformanceEventTiming&&"interactionId"in PerformanceEventTiming.prototype&&K(()=>{var l;Et();let r,n=S("INP"),i=ue(t,ae),u=d=>{Je(()=>{for(let m of d)i.h(m);let f=i.P();f&&f.T!==n.value&&(n.value=f.T,n.entries=f.entries,r())})},s=U("event",u,{durationThreshold:(l=t.durationThreshold)!=null?l:40});r=k(e,n,$e,t.reportAllChanges),s&&(s.observe({type:"first-input",buffered:!0}),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&(u(s.takeRecords()),r(!0))}),x(()=>{i.p(),n=S("INP"),r=k(e,n,$e,t.reportAllChanges)}))})},oe=class{constructor(){T(this,"m")}h(t){var r;(r=this.m)==null||r.call(this,t)}},Ve=[2500,4e3],Ye=(e,t={})=>{K(()=>{let r=He(),n,i=S("LCP"),u=ue(t,oe),s=d=>{t.reportAllChanges||(d=d.slice(-1));for(let f of d)u.h(f),f.startTime<r.firstHiddenTime&&(i.value=Math.max(f.startTime-_(),0),i.entries=[f],n())},l=U("largest-contentful-paint",s);if(l){n=k(e,i,Ve,t.reportAllChanges);let d=de(()=>{s(l.takeRecords()),l.disconnect(),n(!0)});for(let f of["keydown","click","visibilitychange"])addEventListener(f,()=>Je(d),{capture:!0,once:!0});x(f=>{i=S("LCP"),n=k(e,i,Ve,t.reportAllChanges),le(()=>{i.value=performance.now()-f.timeStamp,n(!0)})})}})},Ke=[800,1800],se=e=>{document.prerendering?K(()=>se(e)):document.readyState!=="complete"?addEventListener("load",()=>se(e),!0):setTimeout(e)},Xe=(e,t={})=>{let r=S("TTFB"),n=k(e,r,Ke,t.reportAllChanges);se(()=>{let i=ce();i&&(r.value=Math.max(i.responseStart-_(),0),r.entries=[i],n(!0),x(()=>{r=S("TTFB",0),n=k(e,r,Ke,t.reportAllChanges),n(!0)}))})};var H={lcp:null,cls:null,inp:null,fcp:null,ttfb:null},D=!1,j=null;function wt(){if(D)return;Object.values(H).every(t=>t!==null)&&ge()}function ge(){D||(D=!0,j&&(clearTimeout(j),j=null),o("Sending web vitals data:",H),b("performance",{eventName:"web-vitals",webVitals:H}))}function B(e){if(D)return;let t=e.name.toLowerCase();H[t]=e.value,o(`Collected ${t}:`,e.value),wt()}function Ze(){if(!c.trackWebVitals){o("Web vitals tracking is disabled.");return}o("Initializing web vitals tracking...");try{Ye(B),qe(B),Ge(B),fe(B),Xe(B),j=setTimeout(()=>{D||(o("Web vitals timeout reached, sending collected metrics."),ge())},2e4),window.addEventListener("beforeunload",()=>{D||ge()}),o("Web vitals tracking initialized successfully.")}catch(e){a("Error setting up web vitals tracking:",e)}}var F=null,z=null;function et(){c.captureErrors&&(o("Setting up error tracking"),F=e=>{Rt(e)},z=e=>{Ct(e)},window.addEventListener("error",F),window.addEventListener("unhandledrejection",z))}function tt(){F&&(window.removeEventListener("error",F),F=null),z&&(window.removeEventListener("unhandledrejection",z),z=null),o("Error tracking cleaned up")}function Rt(e){var u,s;let t=window.location.origin,r=e.filename||"";if(r)try{if(new URL(r).origin!==t){o("Skipping third-party error:",r);return}}catch(l){}let n=((u=e.error)==null?void 0:u.stack)||"";if(!r&&n&&!n.includes(t)){o("Skipping third-party error based on stack trace");return}let i={message:(e.message||"Unknown error").substring(0,500),stack:n.substring(0,2e3),filename:r||void 0,lineno:e.lineno||void 0,colno:e.colno||void 0,timestamp:Date.now()};q(((s=e.error)==null?void 0:s.name)||"Error",i)}function Ct(e){let t="Unhandled promise rejection",r="";e.reason instanceof Error?(t=e.reason.message||t,r=e.reason.stack||""):typeof e.reason=="string"?t=e.reason:e.reason&&typeof e.reason=="object"&&(t=JSON.stringify(e.reason));let n={message:t.substring(0,500),stack:r.substring(0,2e3),timestamp:Date.now()};q("UnhandledRejection",n)}function q(e,t,r){let n=h({error_name:e,message:t.message},r);t.stack&&(n.stack=t.stack),t.filename&&(n.filename=t.filename),t.lineno&&(n.line_number=t.lineno),t.colno&&(n.column_number=t.colno),b("error",{eventName:e,properties:n})}function rt(e,t){var r,n;if(!c.captureErrors){a("Error tracking is not enabled. Set captureErrors: true in config.");return}if(e instanceof ErrorEvent){let i={message:(e.message||"Unknown error").substring(0,500),stack:(((r=e.error)==null?void 0:r.stack)||"").substring(0,2e3),filename:e.filename||void 0,lineno:e.lineno||void 0,colno:e.colno||void 0,timestamp:Date.now()};q(((n=e.error)==null?void 0:n.name)||"Error",i,t)}else{let i={message:(e.message||"Unknown error").substring(0,500),stack:(e.stack||"").substring(0,2e3),timestamp:Date.now()};q(e.name||"Error",i,t)}}var J=null,O=!1,pe=null,P=[],Q,me=null,be;function Pt(){return`${Date.now()}-${Math.random().toString(36).substring(2,15)}`}async function nt(e){if(c.enableSessionReplay){be=e,me=Pt();try{J=(await import("rrweb")).record,o("rrweb loaded successfully"),it()}catch(t){a("Failed to load rrweb. Make sure it's installed as a peer dependency:",t)}}}function it(){var e;if(!(O||!J||!c.enableSessionReplay))try{let t=c.replayPrivacyConfig||{},r={emit:n=>{It({type:n.type,data:n.data,timestamp:n.timestamp||Date.now()})},recordCanvas:!1,collectFonts:!1,checkoutEveryNms:6e4,checkoutEveryNth:500,maskAllInputs:(e=t.maskAllInputs)!=null?e:!0,maskInputOptions:{password:!0,email:!0},slimDOMOptions:{script:!1,comment:!0,headFavicon:!0,headWhitespace:!0,headMetaDescKeywords:!0,headMetaSocial:!0,headMetaRobots:!0,headMetaHttpEquiv:!0,headMetaAuthorship:!0,headMetaVerification:!0},sampling:{mousemove:!1,mouseInteraction:{MouseUp:!1,MouseDown:!1,Click:!0,ContextMenu:!1,DblClick:!0,Focus:!0,Blur:!0,TouchStart:!1,TouchEnd:!1},scroll:500,input:"last",media:800}};t.maskTextSelectors&&t.maskTextSelectors.length>0&&(r.maskTextSelector=t.maskTextSelectors.join(", ")),pe=J(r),O=!0,Lt(),o("Session replay recording started")}catch(t){a("Failed to start session replay recording:",t)}}function at(){if(!c.enableSessionReplay){a("Session replay is not enabled. Enable it via remote config.");return}if(!J){a("rrweb is not loaded. Ensure it's installed as a peer dependency.");return}if(O){o("Session replay is already recording");return}it()}function he(){if(!O){o("Session replay is not currently recording");return}pe&&pe(),O=!1,st(),P.length>0&&ye(),o("Session replay recording stopped")}function ot(){return O}function It(e){var r;P.push(e);let t=(r=c.replayBufferSize)!=null?r:250;P.length>=t&&ye()}function Lt(){var t;st();let e=(t=c.replayBatchInterval)!=null?t:5e3;Q=window.setInterval(()=>{P.length>0&&ye()},e)}function st(){Q!==void 0&&(clearInterval(Q),Q=void 0)}function ye(){if(P.length===0||!me)return;let e=[...P];P=[];let t={sessionId:me,siteId:c.siteId,userId:be,events:e,metadata:{pageUrl:window.location.href,screenWidth:window.screen.width,screenHeight:window.screen.height,language:navigator.language}};xt(t).catch(r=>{a("Failed to send session replay batch:",r),P.unshift(...e)})}async function xt(e){let t=`${c.analyticsHost}/replay`,r=JSON.stringify(e),n=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:r,mode:"cors",keepalive:!0});if(!n.ok)throw new Error(`Failed to send replay batch: ${n.status}`);o(`Session replay batch sent: ${e.events.length} events`)}function lt(e){be=e}function ct(){he()}var p=!1,Dt={init:async e=>{if(p){a("Rybbit SDK already initialized. Call init() only once.");return}await Ce(e)&&(p=!0,o("Config:",h({},c)),De(),Oe(),Ze(),et(),await nt(Z()||void 0))},pageview:e=>{if(!p){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}b("pageview",{pathOverride:e})},event:(e,t)=>{if(!p){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}if(!e){a("Event name is required and must be a string.");return}b("custom_event",{eventName:e,properties:t})},outbound:(e,t="",r="_self")=>{if(!p){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}if(!e){a("Outbound link URL is required and must be a string.");return}b("outbound",{properties:{url:e,text:t,target:r}})},identify:e=>{if(!p){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}Ie(e),lt(e)},clearUserId:()=>{if(!p){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}Le()},getUserId:()=>p?Z():(a("Rybbit SDK not initialized. Call rybbit.init() first."),null),captureError:(e,t)=>{if(!p){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}rt(e,t)},onPageChange:e=>p?Me(e):(a("Rybbit SDK not initialized. Call rybbit.init() first."),()=>{}),startSessionReplay:()=>{if(!p){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}at()},stopSessionReplay:()=>{if(!p){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}he()},isSessionReplayActive:()=>p?ot():(a("Rybbit SDK not initialized. Call rybbit.init() first."),!1),cleanup:()=>{_e(),tt(),ct(),p=!1}},Ot=Dt;
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @rybbit/js v0.2.0
2
+ * @rybbit/js v0.3.0
3
3
  * Rybbit Web SDK
4
4
  * (c) 2025 Rybbit
5
5
  * Released under the AGPL-3.0-only license.
6
6
  */
7
- var Vt=Object.defineProperty;var ot=Object.getOwnPropertySymbols;var Wt=Object.prototype.hasOwnProperty,Ht=Object.prototype.propertyIsEnumerable;var U=(e,t,i)=>t in e?Vt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[t]=i,m=(e,t)=>{for(var i in t||(t={}))Wt.call(t,i)&&U(e,i,t[i]);if(ot)for(var i of ot(t))Ht.call(t,i)&&U(e,i,t[i]);return e};var y=(e,t,i)=>U(e,typeof t!="symbol"?t+"":t,i);function st(e,t){let i=null;return function(...r){let n=this;i!==null&&clearTimeout(i),i=setTimeout(()=>{i=null,e.apply(n,r)},t)}}function lt(e){try{let t=window.location.hostname,i=new URL(e,window.location.href).hostname;return!!i&&i!==t}catch(t){return!1}}function Ut(e){try{let t="__DOUBLE_ASTERISK_TOKEN__",i="__SINGLE_ASTERISK_TOKEN__",n=e.replace(/\*\*/g,t).replace(/\*/g,i).replace(/[.+?^${}()|[\]\\]/g,"\\$&");n=n.replace(/\//g,"\\/");let u=n.replace(new RegExp(t,"g"),".*").replace(new RegExp(i,"g"),"[^/]+");return new RegExp("^"+u+"$")}catch(t){return o(`Invalid pattern: ${e}`,t),null}}function N(e,t=[]){if(!t||t.length===0)return null;for(let i of t){let r=Ut(i);if(r&&r.test(e))return i}return null}function s(...e){l.debug&&console.log("[Rybbit]",...e)}function o(...e){l.debug&&console.error("[Rybbit Error]",...e)}function F(){let e=new URL(window.location.href),t=e.pathname;return l.trackHashRoutes&&e.hash&&(t+=e.hash),t}var g={debounce:500,autoTrackPageviews:!0,autoTrackSpaRoutes:!0,trackQuerystring:!0,trackOutboundLinks:!0,trackHashRoutes:!0,trackDataAttributes:!0,trackWebVitals:!0,webVitalsTimeout:2e4,skipPatterns:[],maskPatterns:[],debug:!1},D=null,l=new Proxy({},{get:(e,t)=>{var i;return D?D[t]:(t!=="debug"&&o("Rybbit SDK accessed before initialization. Call rybbit.init() first."),(i=g[t])!=null?i:void 0)},set:()=>(o("Rybbit config is read-only after initialization."),!1)});function ct(e){var d,f,w,C,P,S,it,rt,nt,at;if(D)return o("Rybbit SDK already initialized."),!1;if(typeof e!="object"||e===null)return o("Invalid configuration provided to rybbit.init(). Expected an object."),!1;let t=e,i=t.analyticsHost;if(!i)return o("`analyticsHost` is required in Rybbit config and must be a string."),!1;let r=i.replace(/\/$/,""),n=t.siteId;if(n==null||String(n).trim()==="")return o("`siteId` is required in Rybbit config and must be a non-empty string or number."),!1;let u=String(n),c=Array.isArray(t.skipPatterns)?t.skipPatterns:g.skipPatterns,a=Array.isArray(t.maskPatterns)?t.maskPatterns:g.maskPatterns;return D={analyticsHost:r,siteId:u,debounce:Math.max(0,(d=t.debounce)!=null?d:g.debounce),autoTrackPageviews:(f=t.autoTrackPageviews)!=null?f:g.autoTrackPageviews,autoTrackSpaRoutes:(w=t.autoTrackSpaRoutes)!=null?w:g.autoTrackSpaRoutes,trackQuerystring:(C=t.trackQuerystring)!=null?C:g.trackQuerystring,trackOutboundLinks:(P=t.trackOutboundLinks)!=null?P:g.trackOutboundLinks,trackHashRoutes:(S=t.trackHashRoutes)!=null?S:g.trackHashRoutes,trackDataAttributes:(it=t.trackDataAttributes)!=null?it:g.trackDataAttributes,trackWebVitals:(rt=t.trackWebVitals)!=null?rt:g.trackWebVitals,webVitalsTimeout:Math.max(1e3,(nt=t.webVitalsTimeout)!=null?nt:g.webVitalsTimeout),skipPatterns:c,maskPatterns:a,debug:(at=t.debug)!=null?at:g.debug},!0}var v=null,z=!1;try{let e=localStorage.getItem("rybbit-user-id");e&&(v=e),localStorage.getItem("disable-rybbit")!==null&&(z=!0)}catch(e){o("localStorage unavailable")}typeof window!="undefined"&&window.__RYBBIT_OPTOUT__&&(z=!0);function p(e,t={}){if(z){s("Opted out of tracking.");return}if(!l||!l.analyticsHost||!l.siteId){o("Rybbit config not available. Ensure rybbit.init() was called successfully.");return}let{eventName:i,properties:r,pathOverride:n,webVitals:u}=t;if((e==="custom_event"||e==="performance")&&!i){o("Event name is required and must be a string for performance or custom events.");return}try{let c=new URL(window.location.href),a,d="";if(e==="pageview"&&typeof n=="string"&&n.trim()){s(`Using path override: ${n}`);try{let S=new URL(n,"http://dummybase");a=S.pathname,d=S.search||"",s(`Parsed override path: ${a}, search: ${d}`)}catch(S){o(`Invalid pathOverride format: ${n}. Using window location.`),a=F(),d=l.trackQuerystring?c.search:""}}else a=F(),d=l.trackQuerystring?c.search:"";if(e!=="performance"&&N(a,l.skipPatterns)){s(`Skipping track for path: ${a}`);return}let f=N(a,l.maskPatterns);f&&e!=="performance"&&(s(`Masking path ${a} as ${f}`),a=f,d="");let w=m(m(m(m({site_id:l.siteId,hostname:c.hostname,pathname:a,querystring:d,screenWidth:window.innerWidth,screenHeight:window.innerHeight,language:navigator.language,page_title:document.title,referrer:document.referrer||"direct",type:e},(e==="custom_event"||e==="performance")&&{event_name:i}),(e==="custom_event"||e==="outbound")&&Object.keys(r!=null?r:{}).length>0&&{properties:JSON.stringify(r)}),e==="performance"&&u&&m({},u)),v&&{user_id:v});s("Sending track event:",w);let C=JSON.stringify(w),P=`${l.analyticsHost}/track`;navigator.sendBeacon?navigator.sendBeacon(P,new Blob([C],{type:"application/json"}))||(o("sendBeacon failed, falling back to fetch."),ut(P,C)):ut(P,C)}catch(c){o("Error during tracking:",c)}}function ut(e,t){fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:t,mode:"cors",keepalive:!0}).catch(i=>{o("Fetch request failed:",i)})}function dt(e){if(e.trim()===""){o("User ID must be a non-empty string");return}v=e.trim();try{localStorage.setItem("rybbit-user-id",v),s("User identified:",v)}catch(t){o("Could not persist user ID to localStorage")}}function ft(){v=null;try{localStorage.removeItem("rybbit-user-id"),s("User ID cleared")}catch(e){o("Could not remove user ID from localStorage")}}function gt(){return v}var k,O=!1;function pt(){if(O){s("Automatic tracking already set up.");return}if(!l.autoTrackPageviews){s("Automatic pageview tracking is disabled.");return}if(s("Setting up automatic tracking..."),k=l.debounce&&l.debounce>0?st(()=>p("pageview"),l.debounce):()=>p("pageview"),requestAnimationFrame(()=>{k()}),l.autoTrackSpaRoutes){s("Setting up SPA route change tracking.");let e=history.pushState,t=history.replaceState;history.pushState=function(...i){e.apply(this,i),k()},history.replaceState=function(...i){t.apply(this,i),k()},window.addEventListener("popstate",k)}else s("SPA route change tracking is disabled.");l.trackHashRoutes?window.addEventListener("hashchange",k):s("Hash route tracking is disabled."),O=!0}function mt(){if(!l.trackDataAttributes){s("Data attribute tracking is disabled.");return}s("Setting up data attribute and outbound link tracking."),document.addEventListener("click",bt,!0)}function bt(e){if(!(e.target instanceof Element))return;let t=e.target;for(;t;){if(t.hasAttribute("data-rybbit-event")){let i=t.getAttribute("data-rybbit-event");if(i){let r={};for(let n of t.attributes)if(n.name.startsWith("data-rybbit-prop-")){let u=n.name.replace("data-rybbit-prop-","");r[u]=n.value}s("Data attribute event triggered:",i,r),p("custom_event",{eventName:i,properties:r})}break}t=t.parentElement}if(l.trackOutboundLinks&&e.target instanceof Element){let i=e.target.closest("a");if(i&&i.href&&lt(i.href)){s("Outbound link clicked:",i.href);let r={url:i.href,text:i.innerText||i.textContent||"",target:i.target||"_self"};p("outbound",{properties:r})}}}function ht(){O&&(s("Cleaning up automatic tracking listeners."),window.removeEventListener("popstate",k),window.removeEventListener("hashchange",k),document.removeEventListener("click",bt,!0),O=!1)}var Et=-1,E=e=>{addEventListener("pageshow",t=>{t.persisted&&(Et=t.timeStamp,e(t))},!0)},b=(e,t,i,r)=>{let n,u;return c=>{t.value>=0&&(c||r)&&(u=t.value-(n!=null?n:0),(u||n===void 0)&&(n=t.value,t.delta=u,t.rating=((a,d)=>a>d[1]?"poor":a>d[0]?"needs-improvement":"good")(t.value,i),e(t)))}},J=e=>{requestAnimationFrame(()=>requestAnimationFrame(()=>e()))},Y=()=>{let e=performance.getEntriesByType("navigation")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},L=()=>{var t;let e=Y();return(t=e==null?void 0:e.activationStart)!=null?t:0},h=(e,t=-1)=>{let i=Y(),r="navigate";return Et>=0?r="back-forward-cache":i&&(document.prerendering||L()>0?r="prerender":document.wasDiscarded?r="restore":i.type&&(r=i.type.replace(/_/g,"-"))),{name:e,value:t,rating:"good",delta:0,entries:[],id:`v5-${Date.now()}-${Math.floor(8999999999999*Math.random())+1e12}`,navigationType:r}},$=new WeakMap;function X(e,t){return $.get(e)||$.set(e,new t),$.get(e)}var K=class{constructor(){y(this,"t");y(this,"i",0);y(this,"o",[])}h(t){var n;if(t.hadRecentInput)return;let i=this.o[0],r=this.o.at(-1);this.i&&i&&r&&t.startTime-r.startTime<1e3&&t.startTime-i.startTime<5e3?(this.i+=t.value,this.o.push(t)):(this.i=t.value,this.o=[t]),(n=this.t)==null||n.call(this,t)}},A=(e,t,i={})=>{try{if(PerformanceObserver.supportedEntryTypes.includes(e)){let r=new PerformanceObserver(n=>{Promise.resolve().then(()=>{t(n.getEntries())})});return r.observe(m({type:e,buffered:!0},i)),r}}catch(r){}},Z=e=>{let t=!1;return()=>{t||(e(),t=!0)}},R=-1,yt=()=>document.visibilityState!=="hidden"||document.prerendering?1/0:0,M=e=>{document.visibilityState==="hidden"&&R>-1&&(R=e.type==="visibilitychange"?e.timeStamp:0,Nt())},vt=()=>{addEventListener("visibilitychange",M,!0),addEventListener("prerenderingchange",M,!0)},Nt=()=>{removeEventListener("visibilitychange",M,!0),removeEventListener("prerenderingchange",M,!0)},It=()=>{var e;if(R<0){let t=L(),i=document.prerendering||(e=globalThis.performance.getEntriesByType("visibility-state").filter(r=>r.name==="hidden"&&r.startTime>t)[0])==null?void 0:e.startTime;R=i!=null?i:yt(),vt(),E(()=>{setTimeout(()=>{R=yt(),vt()})})}return{get firstHiddenTime(){return R}}},V=e=>{document.prerendering?addEventListener("prerenderingchange",()=>e(),!0):e()},kt=[1800,3e3],tt=(e,t={})=>{V(()=>{let i=It(),r,n=h("FCP"),u=A("paint",c=>{for(let a of c)a.name==="first-contentful-paint"&&(u.disconnect(),a.startTime<i.firstHiddenTime&&(n.value=Math.max(a.startTime-L(),0),n.entries.push(a),r(!0)))});u&&(r=b(e,n,kt,t.reportAllChanges),E(c=>{n=h("FCP"),r=b(e,n,kt,t.reportAllChanges),J(()=>{n.value=performance.now()-c.timeStamp,r(!0)})}))})},Tt=[.1,.25],Lt=(e,t={})=>{tt(Z(()=>{let i,r=h("CLS",0),n=X(t,K),u=a=>{for(let d of a)n.h(d);n.i>r.value&&(r.value=n.i,r.entries=n.o,i())},c=A("layout-shift",u);c&&(i=b(e,r,Tt,t.reportAllChanges),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&(u(c.takeRecords()),i(!0))}),E(()=>{n.i=0,r=h("CLS",0),i=b(e,r,Tt,t.reportAllChanges),J(()=>i())}),setTimeout(i))}))},At=0,B=1/0,_=0,Ft=e=>{for(let t of e)t.interactionId&&(B=Math.min(B,t.interactionId),_=Math.max(_,t.interactionId),At=_?(_-B)/7+1:0)},q,wt=()=>{var e;return q?At:(e=performance.interactionCount)!=null?e:0},zt=()=>{"interactionCount"in performance||q||(q=A("event",Ft,{type:"event",buffered:!0,durationThreshold:0}))},St=0,j=class{constructor(){y(this,"u",[]);y(this,"l",new Map);y(this,"m");y(this,"v")}p(){St=wt(),this.u.length=0,this.l.clear()}P(){let t=Math.min(this.u.length-1,Math.floor((wt()-St)/50));return this.u[t]}h(t){var n,u;if((n=this.m)==null||n.call(this,t),!t.interactionId&&t.entryType!=="first-input")return;let i=this.u.at(-1),r=this.l.get(t.interactionId);if(r||this.u.length<10||t.duration>i.T){if(r?t.duration>r.T?(r.entries=[t],r.T=t.duration):t.duration===r.T&&t.startTime===r.entries[0].startTime&&r.entries.push(t):(r={id:t.interactionId,entries:[t],T:t.duration},this.l.set(r.id,r),this.u.push(r)),this.u.sort((c,a)=>a.T-c.T),this.u.length>10){let c=this.u.splice(10);for(let a of c)this.l.delete(a.id)}(u=this.v)==null||u.call(this,r)}}},xt=e=>{let t=globalThis.requestIdleCallback||setTimeout;document.visibilityState==="hidden"?e():(e=Z(e),document.addEventListener("visibilitychange",e,{once:!0}),t(()=>{e(),document.removeEventListener("visibilitychange",e)}))},Ct=[200,500],Dt=(e,t={})=>{globalThis.PerformanceEventTiming&&"interactionId"in PerformanceEventTiming.prototype&&V(()=>{var a;zt();let i,r=h("INP"),n=X(t,j),u=d=>{xt(()=>{for(let w of d)n.h(w);let f=n.P();f&&f.T!==r.value&&(r.value=f.T,r.entries=f.entries,i())})},c=A("event",u,{durationThreshold:(a=t.durationThreshold)!=null?a:40});i=b(e,r,Ct,t.reportAllChanges),c&&(c.observe({type:"first-input",buffered:!0}),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&(u(c.takeRecords()),i(!0))}),E(()=>{n.p(),r=h("INP"),i=b(e,r,Ct,t.reportAllChanges)}))})},Q=class{constructor(){y(this,"m")}h(t){var i;(i=this.m)==null||i.call(this,t)}},Pt=[2500,4e3],Ot=(e,t={})=>{V(()=>{let i=It(),r,n=h("LCP"),u=X(t,Q),c=d=>{t.reportAllChanges||(d=d.slice(-1));for(let f of d)u.h(f),f.startTime<i.firstHiddenTime&&(n.value=Math.max(f.startTime-L(),0),n.entries=[f],r())},a=A("largest-contentful-paint",c);if(a){r=b(e,n,Pt,t.reportAllChanges);let d=Z(()=>{c(a.takeRecords()),a.disconnect(),r(!0)});for(let f of["keydown","click","visibilitychange"])addEventListener(f,()=>xt(d),{capture:!0,once:!0});E(f=>{n=h("LCP"),r=b(e,n,Pt,t.reportAllChanges),J(()=>{n.value=performance.now()-f.timeStamp,r(!0)})})}})},Rt=[800,1800],G=e=>{document.prerendering?V(()=>G(e)):document.readyState!=="complete"?addEventListener("load",()=>G(e),!0):setTimeout(e)},_t=(e,t={})=>{let i=h("TTFB"),r=b(e,i,Rt,t.reportAllChanges);G(()=>{let n=Y();n&&(i.value=Math.max(n.responseStart-L(),0),i.entries=[n],r(!0),E(()=>{i=h("TTFB",0),r=b(e,i,Rt,t.reportAllChanges),r(!0)}))})};var H={lcp:null,cls:null,inp:null,fcp:null,ttfb:null},I=!1,W=null;function $t(){if(I)return;Object.values(H).every(t=>t!==null)&&et()}function et(){I||(I=!0,W&&(clearTimeout(W),W=null),s("Sending web vitals data:",H),p("performance",{eventName:"web-vitals",webVitals:H}))}function x(e){if(I)return;let t=e.name.toLowerCase();H[t]=e.value,s(`Collected ${t}:`,e.value),$t()}function Mt(){if(!l.trackWebVitals){s("Web vitals tracking is disabled.");return}s("Initializing web vitals tracking...");try{Ot(x),Lt(x),Dt(x),tt(x),_t(x),W=setTimeout(()=>{I||(s("Web vitals timeout reached, sending collected metrics."),et())},l.webVitalsTimeout||2e4),window.addEventListener("beforeunload",()=>{I||et()}),s("Web vitals tracking initialized successfully.")}catch(e){o("Error setting up web vitals tracking:",e)}}var T=!1,Bt={init:e=>{if(T){o("Rybbit SDK already initialized. Call init() only once.");return}ct(e)&&(T=!0,s("Config:",m({},l)),pt(),mt(),Mt())},pageview:e=>{if(!T){o("Rybbit SDK not initialized. Call rybbit.init() first.");return}p("pageview",{pathOverride:e})},event:(e,t)=>{if(!T){o("Rybbit SDK not initialized. Call rybbit.init() first.");return}if(!e){o("Event name is required and must be a string.");return}p("custom_event",{eventName:e,properties:t})},outbound:(e,t="",i="_self")=>{if(!T){o("Rybbit SDK not initialized. Call rybbit.init() first.");return}if(!e){o("Outbound link URL is required and must be a string.");return}p("outbound",{properties:{url:e,text:t,target:i}})},identify:e=>{if(!T){o("Rybbit SDK not initialized. Call rybbit.init() first.");return}dt(e)},clearUserId:()=>{if(!T){o("Rybbit SDK not initialized. Call rybbit.init() first.");return}ft()},getUserId:()=>T?gt():(o("Rybbit SDK not initialized. Call rybbit.init() first."),null),cleanup:ht},he=Bt;export{he as default};
7
+ var lt=Object.defineProperty;var ke=Object.getOwnPropertySymbols;var ct=Object.prototype.hasOwnProperty,ut=Object.prototype.propertyIsEnumerable;var J=(e,t,r)=>t in e?lt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,h=(e,t)=>{for(var r in t||(t={}))ct.call(t,r)&&J(e,r,t[r]);if(ke)for(var r of ke(t))ut.call(t,r)&&J(e,r,t[r]);return e};var T=(e,t,r)=>J(e,typeof t!="symbol"?t+"":t,r);function Se(e,t){let r=null;return function(...n){let i=this;r!==null&&clearTimeout(r),r=setTimeout(()=>{r=null,e.apply(i,n)},t)}}function Te(e){try{let t=window.location.hostname,r=new URL(e,window.location.href).hostname;return!!r&&r!==t}catch(t){return!1}}function dt(e){try{let t="__DOUBLE_ASTERISK_TOKEN__",r="__SINGLE_ASTERISK_TOKEN__",i=e.replace(/\*\*/g,t).replace(/\*/g,r).replace(/[.+?^${}()|[\]\\]/g,"\\$&");i=i.replace(/\//g,"\\/");let u=i.replace(new RegExp(t,"g"),".*").replace(new RegExp(r,"g"),"[^/]+");return new RegExp("^"+u+"$")}catch(t){return a(`Invalid pattern: ${e}`,t),null}}function G(e,t=[]){if(!t||t.length===0)return null;for(let r of t){let n=dt(r);if(n&&n.test(e))return r}return null}function o(...e){c.debug&&console.log("[Rybbit]",...e)}function a(...e){c.debug&&console.error("[Rybbit Error]",...e)}function I(){let e=new URL(window.location.href),t=e.pathname;return e.hash&&(t+=e.hash),t}var v={debounce:500,skipPatterns:[],maskPatterns:[],debug:!1,replayBufferSize:250,replayBatchInterval:5e3,enableRemoteConfig:!0,remoteConfigTimeout:3e3},E={autoTrackPageviews:!0,autoTrackSpaRoutes:!0,trackQuerystring:!0,trackOutboundLinks:!0,trackWebVitals:!1,captureErrors:!1,enableSessionReplay:!1},z=null,c=new Proxy({},{get:(e,t)=>{var r,n;return z?z[t]:(t!=="debug"&&a("Rybbit SDK accessed before initialization. Call rybbit.init() first."),(n=(r=v[t])!=null?r:E[t])!=null?n:void 0)},set:()=>(a("Rybbit config is read-only after initialization."),!1)});async function ft(e,t,r){var n,i,u,s,l,d,f;try{o("Fetching remote configuration...");let m=new AbortController,w=setTimeout(()=>m.abort(),r),y=await fetch(`${e}/site/${t}/tracking-config`,{signal:m.signal});if(clearTimeout(w),y.ok){let g=await y.json();return o("Remote configuration fetched successfully",g),{autoTrackPageviews:(n=g.trackInitialPageView)!=null?n:E.autoTrackPageviews,autoTrackSpaRoutes:(i=g.trackSpaNavigation)!=null?i:E.autoTrackSpaRoutes,trackQuerystring:(u=g.trackUrlParams)!=null?u:E.trackQuerystring,trackOutboundLinks:(s=g.trackOutbound)!=null?s:E.trackOutboundLinks,trackWebVitals:(l=g.webVitals)!=null?l:E.trackWebVitals,captureErrors:(d=g.trackErrors)!=null?d:E.captureErrors,enableSessionReplay:(f=g.sessionReplay)!=null?f:E.enableSessionReplay}}else return a(`Failed to fetch remote config: ${y.status}`),null}catch(m){return m.name==="AbortError"?a("Remote config fetch timed out"):a("Error fetching remote config:",m),null}}async function Ee(e){var f,m,w,y,g,ye,ve;if(z)return a("Rybbit SDK already initialized."),!1;if(typeof e!="object"||e===null)return a("Invalid configuration provided to rybbit.init(). Expected an object."),!1;let t=e.analyticsHost;if(!t||t.trim()==="")return a("`analyticsHost` is required in Rybbit config and must be a non-empty string."),!1;let r=t.replace(/\/$/,""),n=e.siteId;if(!n||n.trim()==="")return a("`siteId` is required in Rybbit config and must be a non-empty string."),!1;let i=(f=e.enableRemoteConfig)!=null?f:v.enableRemoteConfig,u=null;if(i){let st=(m=e.remoteConfigTimeout)!=null?m:v.remoteConfigTimeout;u=await ft(r,n,st)}let s=u||E,l=Array.isArray(e.skipPatterns)?e.skipPatterns:v.skipPatterns,d=Array.isArray(e.maskPatterns)?e.maskPatterns:v.maskPatterns;return z={analyticsHost:r,siteId:n,debounce:Math.max(0,(w=e.debounce)!=null?w:v.debounce),skipPatterns:l,maskPatterns:d,debug:(y=e.debug)!=null?y:v.debug,replayBufferSize:Math.max(1,(g=e.replayBufferSize)!=null?g:v.replayBufferSize),replayBatchInterval:Math.max(1e3,(ye=e.replayBatchInterval)!=null?ye:v.replayBatchInterval),replayPrivacyConfig:e.replayPrivacyConfig,enableRemoteConfig:i,remoteConfigTimeout:Math.max(1e3,(ve=e.remoteConfigTimeout)!=null?ve:v.remoteConfigTimeout),autoTrackPageviews:s.autoTrackPageviews,autoTrackSpaRoutes:s.autoTrackSpaRoutes,trackQuerystring:s.trackQuerystring,trackOutboundLinks:s.trackOutboundLinks,trackWebVitals:s.trackWebVitals,captureErrors:s.captureErrors,enableSessionReplay:s.enableSessionReplay},!0}var R=null,Y=!1;try{let e=localStorage.getItem("rybbit-user-id");e&&(R=e),localStorage.getItem("disable-rybbit")!==null&&(Y=!0)}catch(e){a("localStorage unavailable")}typeof window!="undefined"&&window.__RYBBIT_OPTOUT__&&(Y=!0);function b(e,t={}){if(Y){o("Opted out of tracking.");return}if(!c||!c.analyticsHost||!c.siteId){a("Rybbit config not available. Ensure rybbit.init() was called successfully.");return}let{eventName:r,properties:n,pathOverride:i,webVitals:u}=t;if((e==="custom_event"||e==="performance")&&!r){a("Event name is required and must be a string for performance or custom events.");return}try{let s=new URL(window.location.href),l,d="";if(e==="pageview"&&typeof i=="string"&&i.trim()){o(`Using path override: ${i}`);try{let g=new URL(i,"http://dummybase");l=g.pathname,d=g.search||"",o(`Parsed override path: ${l}, search: ${d}`)}catch(g){a(`Invalid pathOverride format: ${i}. Using window location.`),l=I(),d=c.trackQuerystring?s.search:""}}else l=I(),d=c.trackQuerystring?s.search:"";if(e!=="performance"&&G(l,c.skipPatterns)){o(`Skipping track for path: ${l}`);return}let f=G(l,c.maskPatterns);f&&e!=="performance"&&(o(`Masking path ${l} as ${f}`),l=f,d="");let m=h(h(h(h({site_id:c.siteId,hostname:s.hostname,pathname:l,querystring:d,screenWidth:window.screen.width,screenHeight:window.screen.height,language:navigator.language,page_title:document.title,referrer:document.referrer||"direct",type:e},(e==="custom_event"||e==="performance")&&{event_name:r}),(e==="custom_event"||e==="outbound")&&Object.keys(n!=null?n:{}).length>0&&{properties:JSON.stringify(n)}),e==="performance"&&u&&h({},u)),R&&{user_id:R});o("Sending track event:",m);let w=JSON.stringify(m),y=`${c.analyticsHost}/track`;navigator.sendBeacon?navigator.sendBeacon(y,new Blob([w],{type:"application/json"}))||(a("sendBeacon failed, falling back to fetch."),we(y,w)):we(y,w)}catch(s){a("Error during tracking:",s)}}function we(e,t){fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:t,mode:"cors",keepalive:!0}).catch(r=>{a("Fetch request failed:",r)})}function Re(e){if(e.trim()===""){a("User ID must be a non-empty string");return}R=e.trim();try{localStorage.setItem("rybbit-user-id",R),o("User identified:",R)}catch(t){a("Could not persist user ID to localStorage")}}function Ce(){R=null;try{localStorage.removeItem("rybbit-user-id"),o("User ID cleared")}catch(e){a("Could not remove user ID from localStorage")}}function X(){return R}var C,N=!1,A=[],Z="";function Ie(){if(N){o("Automatic tracking already set up.");return}if(!c.autoTrackPageviews){o("Automatic pageview tracking is disabled.");return}if(o("Setting up automatic tracking..."),Z=I(),C=c.debounce&&c.debounce>0?Se(()=>{let e=I();Pe(e),b("pageview")},c.debounce):()=>{let e=I();Pe(e),b("pageview")},requestAnimationFrame(()=>{C()}),c.autoTrackSpaRoutes){o("Setting up SPA route change tracking.");let e=history.pushState,t=history.replaceState;history.pushState=function(...r){e.apply(this,r),C()},history.replaceState=function(...r){t.apply(this,r),C()},window.addEventListener("popstate",C)}else o("SPA route change tracking is disabled.");window.addEventListener("hashchange",C),N=!0}function Le(){o("Setting up data attribute and outbound link tracking."),document.addEventListener("click",xe,!0)}function xe(e){if(!(e.target instanceof Element))return;let t=e.target;for(;t;){if(t.hasAttribute("data-rybbit-event")){let r=t.getAttribute("data-rybbit-event");if(r){let n={};for(let i of t.attributes)if(i.name.startsWith("data-rybbit-prop-")){let u=i.name.replace("data-rybbit-prop-","");n[u]=i.value}o("Data attribute event triggered:",r,n),b("custom_event",{eventName:r,properties:n})}break}t=t.parentElement}if(c.trackOutboundLinks&&e.target instanceof Element){let r=e.target.closest("a");if(r&&r.href&&Te(r.href)){o("Outbound link clicked:",r.href);let n={url:r.href,text:r.innerText||r.textContent||"",target:r.target||"_self"};b("outbound",{properties:n})}}}function De(e){return A.push(e),o("Page change callback added"),()=>{A=A.filter(t=>t!==e),o("Page change callback removed")}}function Pe(e){let t=Z;Z=e,t!==e&&(o(`Page changed from ${t} to ${e}`),A.forEach(r=>{try{r(e,t)}catch(n){a("Error in page change callback:",n)}}))}function Oe(){N&&(o("Cleaning up automatic tracking listeners."),window.removeEventListener("popstate",C),window.removeEventListener("hashchange",C),document.removeEventListener("click",xe,!0),A=[],N=!1)}var $e=-1,x=e=>{addEventListener("pageshow",t=>{t.persisted&&($e=t.timeStamp,e(t))},!0)},k=(e,t,r,n)=>{let i,u;return s=>{t.value>=0&&(s||n)&&(u=t.value-(i!=null?i:0),(u||i===void 0)&&(i=t.value,t.delta=u,t.rating=((l,d)=>l>d[1]?"poor":l>d[0]?"needs-improvement":"good")(t.value,r),e(t)))}},se=e=>{requestAnimationFrame(()=>requestAnimationFrame(()=>e()))},le=()=>{let e=performance.getEntriesByType("navigation")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},M=()=>{var t;let e=le();return(t=e==null?void 0:e.activationStart)!=null?t:0},S=(e,t=-1)=>{let r=le(),n="navigate";return $e>=0?n="back-forward-cache":r&&(document.prerendering||M()>0?n="prerender":document.wasDiscarded?n="restore":r.type&&(n=r.type.replace(/_/g,"-"))),{name:e,value:t,rating:"good",delta:0,entries:[],id:`v5-${Date.now()}-${Math.floor(8999999999999*Math.random())+1e12}`,navigationType:n}},ee=new WeakMap;function ce(e,t){return ee.get(e)||ee.set(e,new t),ee.get(e)}var re=class{constructor(){T(this,"t");T(this,"i",0);T(this,"o",[])}h(t){var i;if(t.hadRecentInput)return;let r=this.o[0],n=this.o.at(-1);this.i&&r&&n&&t.startTime-n.startTime<1e3&&t.startTime-r.startTime<5e3?(this.i+=t.value,this.o.push(t)):(this.i=t.value,this.o=[t]),(i=this.t)==null||i.call(this,t)}},_=(e,t,r={})=>{try{if(PerformanceObserver.supportedEntryTypes.includes(e)){let n=new PerformanceObserver(i=>{Promise.resolve().then(()=>{t(i.getEntries())})});return n.observe(h({type:e,buffered:!0},r)),n}}catch(n){}},ue=e=>{let t=!1;return()=>{t||(e(),t=!0)}},L=-1,Ae=()=>document.visibilityState!=="hidden"||document.prerendering?1/0:0,$=e=>{document.visibilityState==="hidden"&&L>-1&&(L=e.type==="visibilitychange"?e.timeStamp:0,gt())},Me=()=>{addEventListener("visibilitychange",$,!0),addEventListener("prerenderingchange",$,!0)},gt=()=>{removeEventListener("visibilitychange",$,!0),removeEventListener("prerenderingchange",$,!0)},Ve=()=>{var e;if(L<0){let t=M(),r=document.prerendering||(e=globalThis.performance.getEntriesByType("visibility-state").filter(n=>n.name==="hidden"&&n.startTime>t)[0])==null?void 0:e.startTime;L=r!=null?r:Ae(),Me(),x(()=>{setTimeout(()=>{L=Ae(),Me()})})}return{get firstHiddenTime(){return L}}},V=e=>{document.prerendering?addEventListener("prerenderingchange",()=>e(),!0):e()},_e=[1800,3e3],de=(e,t={})=>{V(()=>{let r=Ve(),n,i=S("FCP"),u=_("paint",s=>{for(let l of s)l.name==="first-contentful-paint"&&(u.disconnect(),l.startTime<r.firstHiddenTime&&(i.value=Math.max(l.startTime-M(),0),i.entries.push(l),n(!0)))});u&&(n=k(e,i,_e,t.reportAllChanges),x(s=>{i=S("FCP"),n=k(e,i,_e,t.reportAllChanges),se(()=>{i.value=performance.now()-s.timeStamp,n(!0)})}))})},Ue=[.1,.25],Ke=(e,t={})=>{de(ue(()=>{let r,n=S("CLS",0),i=ce(t,re),u=l=>{for(let d of l)i.h(d);i.i>n.value&&(n.value=i.i,n.entries=i.o,r())},s=_("layout-shift",u);s&&(r=k(e,n,Ue,t.reportAllChanges),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&(u(s.takeRecords()),r(!0))}),x(()=>{i.i=0,n=S("CLS",0),r=k(e,n,Ue,t.reportAllChanges),se(()=>r())}),setTimeout(r))}))},je=0,te=1/0,W=0,pt=e=>{for(let t of e)t.interactionId&&(te=Math.min(te,t.interactionId),W=Math.max(W,t.interactionId),je=W?(W-te)/7+1:0)},ne,Be=()=>{var e;return ne?je:(e=performance.interactionCount)!=null?e:0},mt=()=>{"interactionCount"in performance||ne||(ne=_("event",pt,{type:"event",buffered:!0,durationThreshold:0}))},Fe=0,ie=class{constructor(){T(this,"u",[]);T(this,"l",new Map);T(this,"m");T(this,"v")}p(){Fe=Be(),this.u.length=0,this.l.clear()}P(){let t=Math.min(this.u.length-1,Math.floor((Be()-Fe)/50));return this.u[t]}h(t){var i,u;if((i=this.m)==null||i.call(this,t),!t.interactionId&&t.entryType!=="first-input")return;let r=this.u.at(-1),n=this.l.get(t.interactionId);if(n||this.u.length<10||t.duration>r.T){if(n?t.duration>n.T?(n.entries=[t],n.T=t.duration):t.duration===n.T&&t.startTime===n.entries[0].startTime&&n.entries.push(t):(n={id:t.interactionId,entries:[t],T:t.duration},this.l.set(n.id,n),this.u.push(n)),this.u.sort((s,l)=>l.T-s.T),this.u.length>10){let s=this.u.splice(10);for(let l of s)this.l.delete(l.id)}(u=this.v)==null||u.call(this,n)}}},He=e=>{let t=globalThis.requestIdleCallback||setTimeout;document.visibilityState==="hidden"?e():(e=ue(e),document.addEventListener("visibilitychange",e,{once:!0}),t(()=>{e(),document.removeEventListener("visibilitychange",e)}))},ze=[200,500],qe=(e,t={})=>{globalThis.PerformanceEventTiming&&"interactionId"in PerformanceEventTiming.prototype&&V(()=>{var l;mt();let r,n=S("INP"),i=ce(t,ie),u=d=>{He(()=>{for(let m of d)i.h(m);let f=i.P();f&&f.T!==n.value&&(n.value=f.T,n.entries=f.entries,r())})},s=_("event",u,{durationThreshold:(l=t.durationThreshold)!=null?l:40});r=k(e,n,ze,t.reportAllChanges),s&&(s.observe({type:"first-input",buffered:!0}),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&(u(s.takeRecords()),r(!0))}),x(()=>{i.p(),n=S("INP"),r=k(e,n,ze,t.reportAllChanges)}))})},ae=class{constructor(){T(this,"m")}h(t){var r;(r=this.m)==null||r.call(this,t)}},Ne=[2500,4e3],Qe=(e,t={})=>{V(()=>{let r=Ve(),n,i=S("LCP"),u=ce(t,ae),s=d=>{t.reportAllChanges||(d=d.slice(-1));for(let f of d)u.h(f),f.startTime<r.firstHiddenTime&&(i.value=Math.max(f.startTime-M(),0),i.entries=[f],n())},l=_("largest-contentful-paint",s);if(l){n=k(e,i,Ne,t.reportAllChanges);let d=ue(()=>{s(l.takeRecords()),l.disconnect(),n(!0)});for(let f of["keydown","click","visibilitychange"])addEventListener(f,()=>He(d),{capture:!0,once:!0});x(f=>{i=S("LCP"),n=k(e,i,Ne,t.reportAllChanges),se(()=>{i.value=performance.now()-f.timeStamp,n(!0)})})}})},We=[800,1800],oe=e=>{document.prerendering?V(()=>oe(e)):document.readyState!=="complete"?addEventListener("load",()=>oe(e),!0):setTimeout(e)},Je=(e,t={})=>{let r=S("TTFB"),n=k(e,r,We,t.reportAllChanges);oe(()=>{let i=le();i&&(r.value=Math.max(i.responseStart-M(),0),r.entries=[i],n(!0),x(()=>{r=S("TTFB",0),n=k(e,r,We,t.reportAllChanges),n(!0)}))})};var j={lcp:null,cls:null,inp:null,fcp:null,ttfb:null},D=!1,K=null;function bt(){if(D)return;Object.values(j).every(t=>t!==null)&&fe()}function fe(){D||(D=!0,K&&(clearTimeout(K),K=null),o("Sending web vitals data:",j),b("performance",{eventName:"web-vitals",webVitals:j}))}function U(e){if(D)return;let t=e.name.toLowerCase();j[t]=e.value,o(`Collected ${t}:`,e.value),bt()}function Ge(){if(!c.trackWebVitals){o("Web vitals tracking is disabled.");return}o("Initializing web vitals tracking...");try{Qe(U),Ke(U),qe(U),de(U),Je(U),K=setTimeout(()=>{D||(o("Web vitals timeout reached, sending collected metrics."),fe())},2e4),window.addEventListener("beforeunload",()=>{D||fe()}),o("Web vitals tracking initialized successfully.")}catch(e){a("Error setting up web vitals tracking:",e)}}var B=null,F=null;function Ye(){c.captureErrors&&(o("Setting up error tracking"),B=e=>{ht(e)},F=e=>{yt(e)},window.addEventListener("error",B),window.addEventListener("unhandledrejection",F))}function Xe(){B&&(window.removeEventListener("error",B),B=null),F&&(window.removeEventListener("unhandledrejection",F),F=null),o("Error tracking cleaned up")}function ht(e){var u,s;let t=window.location.origin,r=e.filename||"";if(r)try{if(new URL(r).origin!==t){o("Skipping third-party error:",r);return}}catch(l){}let n=((u=e.error)==null?void 0:u.stack)||"";if(!r&&n&&!n.includes(t)){o("Skipping third-party error based on stack trace");return}let i={message:(e.message||"Unknown error").substring(0,500),stack:n.substring(0,2e3),filename:r||void 0,lineno:e.lineno||void 0,colno:e.colno||void 0,timestamp:Date.now()};H(((s=e.error)==null?void 0:s.name)||"Error",i)}function yt(e){let t="Unhandled promise rejection",r="";e.reason instanceof Error?(t=e.reason.message||t,r=e.reason.stack||""):typeof e.reason=="string"?t=e.reason:e.reason&&typeof e.reason=="object"&&(t=JSON.stringify(e.reason));let n={message:t.substring(0,500),stack:r.substring(0,2e3),timestamp:Date.now()};H("UnhandledRejection",n)}function H(e,t,r){let n=h({error_name:e,message:t.message},r);t.stack&&(n.stack=t.stack),t.filename&&(n.filename=t.filename),t.lineno&&(n.line_number=t.lineno),t.colno&&(n.column_number=t.colno),b("error",{eventName:e,properties:n})}function Ze(e,t){var r,n;if(!c.captureErrors){a("Error tracking is not enabled. Set captureErrors: true in config.");return}if(e instanceof ErrorEvent){let i={message:(e.message||"Unknown error").substring(0,500),stack:(((r=e.error)==null?void 0:r.stack)||"").substring(0,2e3),filename:e.filename||void 0,lineno:e.lineno||void 0,colno:e.colno||void 0,timestamp:Date.now()};H(((n=e.error)==null?void 0:n.name)||"Error",i,t)}else{let i={message:(e.message||"Unknown error").substring(0,500),stack:(e.stack||"").substring(0,2e3),timestamp:Date.now()};H(e.name||"Error",i,t)}}var Q=null,O=!1,ge=null,P=[],q,pe=null,me;function vt(){return`${Date.now()}-${Math.random().toString(36).substring(2,15)}`}async function et(e){if(c.enableSessionReplay){me=e,pe=vt();try{Q=(await import("rrweb")).record,o("rrweb loaded successfully"),tt()}catch(t){a("Failed to load rrweb. Make sure it's installed as a peer dependency:",t)}}}function tt(){var e;if(!(O||!Q||!c.enableSessionReplay))try{let t=c.replayPrivacyConfig||{},r={emit:n=>{kt({type:n.type,data:n.data,timestamp:n.timestamp||Date.now()})},recordCanvas:!1,collectFonts:!1,checkoutEveryNms:6e4,checkoutEveryNth:500,maskAllInputs:(e=t.maskAllInputs)!=null?e:!0,maskInputOptions:{password:!0,email:!0},slimDOMOptions:{script:!1,comment:!0,headFavicon:!0,headWhitespace:!0,headMetaDescKeywords:!0,headMetaSocial:!0,headMetaRobots:!0,headMetaHttpEquiv:!0,headMetaAuthorship:!0,headMetaVerification:!0},sampling:{mousemove:!1,mouseInteraction:{MouseUp:!1,MouseDown:!1,Click:!0,ContextMenu:!1,DblClick:!0,Focus:!0,Blur:!0,TouchStart:!1,TouchEnd:!1},scroll:500,input:"last",media:800}};t.maskTextSelectors&&t.maskTextSelectors.length>0&&(r.maskTextSelector=t.maskTextSelectors.join(", ")),ge=Q(r),O=!0,St(),o("Session replay recording started")}catch(t){a("Failed to start session replay recording:",t)}}function rt(){if(!c.enableSessionReplay){a("Session replay is not enabled. Enable it via remote config.");return}if(!Q){a("rrweb is not loaded. Ensure it's installed as a peer dependency.");return}if(O){o("Session replay is already recording");return}tt()}function be(){if(!O){o("Session replay is not currently recording");return}ge&&ge(),O=!1,it(),P.length>0&&he(),o("Session replay recording stopped")}function nt(){return O}function kt(e){var r;P.push(e);let t=(r=c.replayBufferSize)!=null?r:250;P.length>=t&&he()}function St(){var t;it();let e=(t=c.replayBatchInterval)!=null?t:5e3;q=window.setInterval(()=>{P.length>0&&he()},e)}function it(){q!==void 0&&(clearInterval(q),q=void 0)}function he(){if(P.length===0||!pe)return;let e=[...P];P=[];let t={sessionId:pe,siteId:c.siteId,userId:me,events:e,metadata:{pageUrl:window.location.href,screenWidth:window.screen.width,screenHeight:window.screen.height,language:navigator.language}};Tt(t).catch(r=>{a("Failed to send session replay batch:",r),P.unshift(...e)})}async function Tt(e){let t=`${c.analyticsHost}/replay`,r=JSON.stringify(e),n=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:r,mode:"cors",keepalive:!0});if(!n.ok)throw new Error(`Failed to send replay batch: ${n.status}`);o(`Session replay batch sent: ${e.events.length} events`)}function at(e){me=e}function ot(){be()}var p=!1,Et={init:async e=>{if(p){a("Rybbit SDK already initialized. Call init() only once.");return}await Ee(e)&&(p=!0,o("Config:",h({},c)),Ie(),Le(),Ge(),Ye(),await et(X()||void 0))},pageview:e=>{if(!p){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}b("pageview",{pathOverride:e})},event:(e,t)=>{if(!p){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}if(!e){a("Event name is required and must be a string.");return}b("custom_event",{eventName:e,properties:t})},outbound:(e,t="",r="_self")=>{if(!p){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}if(!e){a("Outbound link URL is required and must be a string.");return}b("outbound",{properties:{url:e,text:t,target:r}})},identify:e=>{if(!p){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}Re(e),at(e)},clearUserId:()=>{if(!p){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}Ce()},getUserId:()=>p?X():(a("Rybbit SDK not initialized. Call rybbit.init() first."),null),captureError:(e,t)=>{if(!p){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}Ze(e,t)},onPageChange:e=>p?De(e):(a("Rybbit SDK not initialized. Call rybbit.init() first."),()=>{}),startSessionReplay:()=>{if(!p){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}rt()},stopSessionReplay:()=>{if(!p){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}be()},isSessionReplayActive:()=>p?nt():(a("Rybbit SDK not initialized. Call rybbit.init() first."),!1),cleanup:()=>{Oe(),Xe(),ot(),p=!1}},or=Et;export{or as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rybbit/js",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Rybbit Web SDK",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -35,8 +35,17 @@
35
35
  "url": "https://github.com/rybbit-io/rybbit-js/issues"
36
36
  },
37
37
  "homepage": "https://github.com/rybbit-io/rybbit-js",
38
+ "peerDependencies": {
39
+ "rrweb": "^2.0.0"
40
+ },
41
+ "peerDependenciesMeta": {
42
+ "rrweb": {
43
+ "optional": true
44
+ }
45
+ },
38
46
  "devDependencies": {
39
47
  "@types/node": "^22.14.1",
48
+ "rrweb": "^2.0.0-alpha.4",
40
49
  "tsup": "^8.5.0",
41
50
  "typescript": "^5.8.3",
42
51
  "web-vitals": "^5.0.3"