@rybbit/js 0.4.0 → 0.6.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/README.md CHANGED
@@ -9,4 +9,4 @@ For usage instructions, see the [docs](https://www.rybbit.io/docs/sdks/web).
9
9
  ```bash
10
10
  npm install @rybbit/js
11
11
  # or
12
- yarn add @rybbit/js
12
+ yarn add @rybbit/js
package/dist/index.d.mts CHANGED
@@ -1,13 +1,22 @@
1
1
  interface RybbitConfig {
2
2
  analyticsHost: string;
3
3
  siteId: string;
4
- debounce?: number;
4
+ debounceDuration?: number;
5
5
  skipPatterns?: string[];
6
6
  maskPatterns?: string[];
7
7
  debug?: boolean;
8
8
  replayPrivacyConfig?: {
9
9
  maskAllInputs?: boolean;
10
10
  maskTextSelectors?: string[];
11
+ blockClass?: string;
12
+ blockSelector?: string;
13
+ ignoreClass?: string;
14
+ ignoreSelector?: string;
15
+ maskTextClass?: string;
16
+ collectFonts?: boolean;
17
+ slimDOMOptions?: Record<string, boolean> | boolean;
18
+ batchSize?: number;
19
+ batchInterval?: number;
11
20
  };
12
21
  }
13
22
  type PropertyValue = string | number | boolean;
@@ -19,12 +28,13 @@ interface RybbitAPI {
19
28
  init: (config: RybbitConfig) => Promise<void>;
20
29
  pageview: (path?: string) => void;
21
30
  event: (name: string, properties?: TrackProperties) => void;
22
- outbound: (url: string, text?: string, target?: string) => void;
23
- identify: (userId: string) => void;
31
+ trackOutbound: (url: string, text?: string, target?: string) => void;
32
+ identify: (userId: string, traits?: Record<string, unknown>) => void;
33
+ setTraits: (traits: Record<string, unknown>) => void;
24
34
  clearUserId: () => void;
25
35
  getUserId: () => string | null;
26
36
  cleanup: () => void;
27
- captureError: (error: Error | ErrorEvent, context?: TrackProperties) => void;
37
+ error: (error: Error | ErrorEvent, context?: TrackProperties) => void;
28
38
  onPageChange: (callback: PageChangeCallback) => () => void;
29
39
  startSessionReplay: () => void;
30
40
  stopSessionReplay: () => void;
package/dist/index.d.ts CHANGED
@@ -1,13 +1,22 @@
1
1
  interface RybbitConfig {
2
2
  analyticsHost: string;
3
3
  siteId: string;
4
- debounce?: number;
4
+ debounceDuration?: number;
5
5
  skipPatterns?: string[];
6
6
  maskPatterns?: string[];
7
7
  debug?: boolean;
8
8
  replayPrivacyConfig?: {
9
9
  maskAllInputs?: boolean;
10
10
  maskTextSelectors?: string[];
11
+ blockClass?: string;
12
+ blockSelector?: string;
13
+ ignoreClass?: string;
14
+ ignoreSelector?: string;
15
+ maskTextClass?: string;
16
+ collectFonts?: boolean;
17
+ slimDOMOptions?: Record<string, boolean> | boolean;
18
+ batchSize?: number;
19
+ batchInterval?: number;
11
20
  };
12
21
  }
13
22
  type PropertyValue = string | number | boolean;
@@ -19,12 +28,13 @@ interface RybbitAPI {
19
28
  init: (config: RybbitConfig) => Promise<void>;
20
29
  pageview: (path?: string) => void;
21
30
  event: (name: string, properties?: TrackProperties) => void;
22
- outbound: (url: string, text?: string, target?: string) => void;
23
- identify: (userId: string) => void;
31
+ trackOutbound: (url: string, text?: string, target?: string) => void;
32
+ identify: (userId: string, traits?: Record<string, unknown>) => void;
33
+ setTraits: (traits: Record<string, unknown>) => void;
24
34
  clearUserId: () => void;
25
35
  getUserId: () => string | null;
26
36
  cleanup: () => void;
27
- captureError: (error: Error | ErrorEvent, context?: TrackProperties) => void;
37
+ error: (error: Error | ErrorEvent, context?: TrackProperties) => void;
28
38
  onPageChange: (callback: PageChangeCallback) => () => void;
29
39
  startSessionReplay: () => void;
30
40
  stopSessionReplay: () => void;
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @rybbit/js v0.4.0
2
+ * @rybbit/js v0.6.0
3
3
  * Rybbit Web SDK
4
- * (c) 2025 Rybbit
4
+ * (c) 2026 Rybbit
5
5
  * Released under the AGPL-3.0-only license.
6
6
  */
7
- "use strict";var lt=Object.create;var D=Object.defineProperty;var ct=Object.getOwnPropertyDescriptor;var ut=Object.getOwnPropertyNames,ve=Object.getOwnPropertySymbols,dt=Object.getPrototypeOf,ke=Object.prototype.hasOwnProperty,ft=Object.prototype.propertyIsEnumerable;var G=(e,t,r)=>t in e?D(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,b=(e,t)=>{for(var r in t||(t={}))ke.call(t,r)&&G(e,r,t[r]);if(ve)for(var r of ve(t))ft.call(t,r)&&G(e,r,t[r]);return e};var gt=(e,t)=>{for(var r in t)D(e,r,{get:t[r],enumerable:!0})},Ee=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of ut(t))!ke.call(e,i)&&i!==r&&D(e,i,{get:()=>t[i],enumerable:!(n=ct(t,i))||n.enumerable});return e};var pt=(e,t,r)=>(r=e!=null?lt(dt(e)):{},Ee(t||!e||!e.__esModule?D(r,"default",{value:e,enumerable:!0}):r,e)),mt=e=>Ee(D({},"__esModule",{value:!0}),e);var v=(e,t,r)=>G(e,typeof t!="symbol"?t+"":t,r);var xt={};gt(xt,{default:()=>Lt});module.exports=mt(xt);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 bt(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 s=i.replace(new RegExp(t,"g"),".*").replace(new RegExp(r,"g"),"[^/]+");return new RegExp("^"+s+"$")}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=bt(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 R(){let e=new URL(window.location.href),t=e.pathname;return e.hash&&(t+=e.hash),t}var O={debounce:500,skipPatterns:[],maskPatterns:[],debug:!1},k={autoTrackPageviews:!0,autoTrackSpaRoutes:!0,trackQuerystring:!0,trackOutboundLinks:!0,trackWebVitals:!1,captureErrors:!1,enableSessionReplay:!1},$=null,c=new Proxy({},{get:(e,t)=>{var r,n;return $?$[t]:(t!=="debug"&&a("Rybbit SDK accessed before initialization. Call rybbit.init() first."),(n=(r=O[t])!=null?r:k[t])!=null?n:void 0)},set:()=>(a("Rybbit config is read-only after initialization."),!1)});async function ht(e,t){var r,n,i,s,u,l,f;try{o("Fetching remote configuration...");let d=new AbortController,C=setTimeout(()=>d.abort(),3e3),w=await fetch(`${e}/site/${t}/tracking-config`,{signal:d.signal});if(clearTimeout(C),w.ok){let m=await w.json();return o("Remote configuration fetched successfully",m),{autoTrackPageviews:(r=m.trackInitialPageView)!=null?r:k.autoTrackPageviews,autoTrackSpaRoutes:(n=m.trackSpaNavigation)!=null?n:k.autoTrackSpaRoutes,trackQuerystring:(i=m.trackUrlParams)!=null?i:k.trackQuerystring,trackOutboundLinks:(s=m.trackOutbound)!=null?s:k.trackOutboundLinks,trackWebVitals:(u=m.webVitals)!=null?u:k.trackWebVitals,captureErrors:(l=m.trackErrors)!=null?l:k.captureErrors,enableSessionReplay:(f=m.sessionReplay)!=null?f:k.enableSessionReplay}}else return a(`Failed to fetch remote config: ${w.status}`),null}catch(d){return d.name==="AbortError"?a("Remote config fetch timed out"):a("Error fetching remote config:",d),null}}async function we(e){var f,d;if($)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 s=await ht(r,n)||k,u=Array.isArray(e.skipPatterns)?e.skipPatterns:O.skipPatterns,l=Array.isArray(e.maskPatterns)?e.maskPatterns:O.maskPatterns;return $={analyticsHost:r,siteId:n,debounce:Math.max(0,(f=e.debounce)!=null?f:O.debounce),skipPatterns:u,maskPatterns:l,debug:(d=e.debug)!=null?d:O.debug,replayPrivacyConfig:e.replayPrivacyConfig,autoTrackPageviews:s.autoTrackPageviews,autoTrackSpaRoutes:s.autoTrackSpaRoutes,trackQuerystring:s.trackQuerystring,trackOutboundLinks:s.trackOutboundLinks,trackWebVitals:s.trackWebVitals,captureErrors:s.captureErrors,enableSessionReplay:s.enableSessionReplay},!0}var E=null,X=!1;try{let e=localStorage.getItem("rybbit-user-id");e&&(E=e),localStorage.getItem("disable-rybbit")!==null&&(X=!0)}catch(e){a("localStorage unavailable")}typeof window!="undefined"&&window.__RYBBIT_OPTOUT__&&(X=!0);function p(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:s}=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 u=new URL(window.location.href),l,f="";if(e==="pageview"&&typeof i=="string"&&i.trim()){o(`Using path override: ${i}`);try{let W=new URL(i,"http://dummybase");l=W.pathname,f=W.search||"",o(`Parsed override path: ${l}, search: ${f}`)}catch(W){a(`Invalid pathOverride format: ${i}. Using window location.`),l=R(),f=c.trackQuerystring?u.search:""}}else l=R(),f=c.trackQuerystring?u.search:"";if(e!=="performance"&&Y(l,c.skipPatterns)){o(`Skipping track for path: ${l}`);return}let d=Y(l,c.maskPatterns);d&&e!=="performance"&&(o(`Masking path ${l} as ${d}`),l=d,f="");let C=b(b(b(b({site_id:c.siteId,hostname:u.hostname,pathname:l,querystring:f,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"&&s&&b({},s)),E&&{user_id:E});o("Sending track event:",C);let w=JSON.stringify(C),m=`${c.analyticsHost}/track`;navigator.sendBeacon?navigator.sendBeacon(m,new Blob([w],{type:"application/json"}))||(a("sendBeacon failed, falling back to fetch."),Re(m,w)):Re(m,w)}catch(u){a("Error during tracking:",u)}}function Re(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 Ce(e){if(e.trim()===""){a("User ID must be a non-empty string");return}E=e.trim();try{localStorage.setItem("rybbit-user-id",E),o("User identified:",E)}catch(t){a("Could not persist user ID to localStorage")}}function Pe(){E=null;try{localStorage.removeItem("rybbit-user-id"),o("User ID cleared")}catch(e){a("Could not remove user ID from localStorage")}}function Z(){return E}var S,V=!1,A=[],ee="";function Le(){if(V){o("Automatic tracking already set up.");return}if(!c.autoTrackPageviews){o("Automatic pageview tracking is disabled.");return}if(o("Setting up automatic tracking..."),ee=R(),S=c.debounce&&c.debounce>0?Se(()=>{let e=R();Ie(e),p("pageview")},c.debounce):()=>{let e=R();Ie(e),p("pageview")},requestAnimationFrame(()=>{S()}),c.autoTrackSpaRoutes){o("Setting up SPA route change tracking.");let e=history.pushState,t=history.replaceState;history.pushState=function(...r){e.apply(this,r),S()},history.replaceState=function(...r){t.apply(this,r),S()},window.addEventListener("popstate",S)}else o("SPA route change tracking is disabled.");window.addEventListener("hashchange",S),V=!0}function xe(){o("Setting up data attribute and outbound link tracking."),document.addEventListener("click",De,!0)}function De(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 s=i.name.replace("data-rybbit-prop-","");n[s]=i.value}o("Data attribute event triggered:",r,n),p("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"};p("outbound",{properties:n})}}}function Oe(e){return A.push(e),o("Page change callback added"),()=>{A=A.filter(t=>t!==e),o("Page change callback removed")}}function Ie(e){let t=ee;ee=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 Ae(){V&&(o("Cleaning up automatic tracking listeners."),window.removeEventListener("popstate",S),window.removeEventListener("hashchange",S),document.removeEventListener("click",De,!0),A=[],V=!1)}var ze=-1,I=e=>{addEventListener("pageshow",t=>{t.persisted&&(ze=t.timeStamp,e(t))},!0)},h=(e,t,r,n)=>{let i,s;return u=>{t.value>=0&&(u||n)&&(s=t.value-(i!=null?i:0),(s||i===void 0)&&(i=t.value,t.delta=s,t.rating=((l,f)=>l>f[1]?"poor":l>f[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},y=(e,t=-1)=>{let r=ce(),n="navigate";return ze>=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(){v(this,"t");v(this,"i",0);v(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)}},M=(e,t,r={})=>{try{if(PerformanceObserver.supportedEntryTypes.includes(e)){let n=new PerformanceObserver(i=>{Promise.resolve().then(()=>{t(i.getEntries())})});return n.observe(b({type:e,buffered:!0},r)),n}}catch(n){}},de=e=>{let t=!1;return()=>{t||(e(),t=!0)}},P=-1,_e=()=>document.visibilityState!=="hidden"||document.prerendering?1/0:0,z=e=>{document.visibilityState==="hidden"&&P>-1&&(P=e.type==="visibilitychange"?e.timeStamp:0,yt())},Me=()=>{addEventListener("visibilitychange",z,!0),addEventListener("prerenderingchange",z,!0)},yt=()=>{removeEventListener("visibilitychange",z,!0),removeEventListener("prerenderingchange",z,!0)},Ke=()=>{var e;if(P<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;P=r!=null?r:_e(),Me(),I(()=>{setTimeout(()=>{P=_e(),Me()})})}return{get firstHiddenTime(){return P}}},K=e=>{document.prerendering?addEventListener("prerenderingchange",()=>e(),!0):e()},Ue=[1800,3e3],fe=(e,t={})=>{K(()=>{let r=Ke(),n,i=y("FCP"),s=M("paint",u=>{for(let l of u)l.name==="first-contentful-paint"&&(s.disconnect(),l.startTime<r.firstHiddenTime&&(i.value=Math.max(l.startTime-_(),0),i.entries.push(l),n(!0)))});s&&(n=h(e,i,Ue,t.reportAllChanges),I(u=>{i=y("FCP"),n=h(e,i,Ue,t.reportAllChanges),le(()=>{i.value=performance.now()-u.timeStamp,n(!0)})}))})},Fe=[.1,.25],je=(e,t={})=>{fe(de(()=>{let r,n=y("CLS",0),i=ue(t,ne),s=l=>{for(let f of l)i.h(f);i.i>n.value&&(n.value=i.i,n.entries=i.o,r())},u=M("layout-shift",s);u&&(r=h(e,n,Fe,t.reportAllChanges),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&(s(u.takeRecords()),r(!0))}),I(()=>{i.i=0,n=y("CLS",0),r=h(e,n,Fe,t.reportAllChanges),le(()=>r())}),setTimeout(r))}))},He=0,re=1/0,B=0,vt=e=>{for(let t of e)t.interactionId&&(re=Math.min(re,t.interactionId),B=Math.max(B,t.interactionId),He=B?(B-re)/7+1:0)},ie,Ne=()=>{var e;return ie?He:(e=performance.interactionCount)!=null?e:0},kt=()=>{"interactionCount"in performance||ie||(ie=M("event",vt,{type:"event",buffered:!0,durationThreshold:0}))},We=0,ae=class{constructor(){v(this,"u",[]);v(this,"l",new Map);v(this,"m");v(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,s;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((u,l)=>l.T-u.T),this.u.length>10){let u=this.u.splice(10);for(let l of u)this.l.delete(l.id)}(s=this.v)==null||s.call(this,n)}}},qe=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],Qe=(e,t={})=>{globalThis.PerformanceEventTiming&&"interactionId"in PerformanceEventTiming.prototype&&K(()=>{var l;kt();let r,n=y("INP"),i=ue(t,ae),s=f=>{qe(()=>{for(let C of f)i.h(C);let d=i.P();d&&d.T!==n.value&&(n.value=d.T,n.entries=d.entries,r())})},u=M("event",s,{durationThreshold:(l=t.durationThreshold)!=null?l:40});r=h(e,n,$e,t.reportAllChanges),u&&(u.observe({type:"first-input",buffered:!0}),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&(s(u.takeRecords()),r(!0))}),I(()=>{i.p(),n=y("INP"),r=h(e,n,$e,t.reportAllChanges)}))})},oe=class{constructor(){v(this,"m")}h(t){var r;(r=this.m)==null||r.call(this,t)}},Ve=[2500,4e3],Je=(e,t={})=>{K(()=>{let r=Ke(),n,i=y("LCP"),s=ue(t,oe),u=f=>{t.reportAllChanges||(f=f.slice(-1));for(let d of f)s.h(d),d.startTime<r.firstHiddenTime&&(i.value=Math.max(d.startTime-_(),0),i.entries=[d],n())},l=M("largest-contentful-paint",u);if(l){n=h(e,i,Ve,t.reportAllChanges);let f=de(()=>{u(l.takeRecords()),l.disconnect(),n(!0)});for(let d of["keydown","click","visibilitychange"])addEventListener(d,()=>qe(f),{capture:!0,once:!0});I(d=>{i=y("LCP"),n=h(e,i,Ve,t.reportAllChanges),le(()=>{i.value=performance.now()-d.timeStamp,n(!0)})})}})},Be=[800,1800],se=e=>{document.prerendering?K(()=>se(e)):document.readyState!=="complete"?addEventListener("load",()=>se(e),!0):setTimeout(e)},Ge=(e,t={})=>{let r=y("TTFB"),n=h(e,r,Be,t.reportAllChanges);se(()=>{let i=ce();i&&(r.value=Math.max(i.responseStart-_(),0),r.entries=[i],n(!0),I(()=>{r=y("TTFB",0),n=h(e,r,Be,t.reportAllChanges),n(!0)}))})};var H={lcp:null,cls:null,inp:null,fcp:null,ttfb:null},L=!1,j=null;function Et(){if(L)return;Object.values(H).every(t=>t!==null)&&ge()}function ge(){L||(L=!0,j&&(clearTimeout(j),j=null),o("Sending web vitals data:",H),p("performance",{eventName:"web-vitals",webVitals:H}))}function U(e){if(L)return;let t=e.name.toLowerCase();H[t]=e.value,o(`Collected ${t}:`,e.value),Et()}function Ye(){if(!c.trackWebVitals){o("Web vitals tracking is disabled.");return}o("Initializing web vitals tracking...");try{Je(U),je(U),Qe(U),fe(U),Ge(U),j=setTimeout(()=>{L||(o("Web vitals timeout reached, sending collected metrics."),ge())},2e4),window.addEventListener("beforeunload",()=>{L||ge()}),o("Web vitals tracking initialized successfully.")}catch(e){a("Error setting up web vitals tracking:",e)}}var F=null,N=null;function Xe(){c.captureErrors&&(o("Setting up error tracking"),F=e=>{St(e)},N=e=>{Tt(e)},window.addEventListener("error",F),window.addEventListener("unhandledrejection",N))}function Ze(){F&&(window.removeEventListener("error",F),F=null),N&&(window.removeEventListener("unhandledrejection",N),N=null),o("Error tracking cleaned up")}function St(e){var s,u;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=((s=e.error)==null?void 0:s.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(((u=e.error)==null?void 0:u.name)||"Error",i)}function Tt(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=b({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),p("error",{eventName:e,properties:n})}function et(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,x=!1,pe=null,T=[],Q,me=null,be;function wt(){return`${Date.now()}-${Math.random().toString(36).substring(2,15)}`}async function tt(e){if(c.enableSessionReplay){be=e,me=wt();try{J=(await import("rrweb")).record,o("rrweb loaded successfully"),rt()}catch(t){a("Failed to load rrweb. Make sure it's installed as a peer dependency:",t)}}}function rt(){var e;if(!(x||!J||!c.enableSessionReplay))try{let t=c.replayPrivacyConfig||{},r={emit:n=>{Rt({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),x=!0,Ct(),o("Session replay recording started")}catch(t){a("Failed to start session replay recording:",t)}}function nt(){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(x){o("Session replay is already recording");return}rt()}function he(){if(!x){o("Session replay is not currently recording");return}pe&&pe(),x=!1,at(),T.length>0&&ye(),o("Session replay recording stopped")}function it(){return x}function Rt(e){T.push(e),T.length>=250&&ye()}function Ct(){at(),Q=window.setInterval(()=>{T.length>0&&ye()},5e3)}function at(){Q!==void 0&&(clearInterval(Q),Q=void 0)}function ye(){if(T.length===0||!me)return;let e=[...T];T=[];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}};Pt(t).catch(r=>{a("Failed to send session replay batch:",r),T.unshift(...e)})}async function Pt(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 ot(e){be=e}function st(){he()}var g=!1,It={init:async e=>{if(g){a("Rybbit SDK already initialized. Call init() only once.");return}await we(e)&&(g=!0,o("Config:",b({},c)),Le(),xe(),Ye(),Xe(),await tt(Z()||void 0))},pageview:e=>{if(!g){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}p("pageview",{pathOverride:e})},event:(e,t)=>{if(!g){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}if(!e){a("Event name is required and must be a string.");return}p("custom_event",{eventName:e,properties:t})},outbound:(e,t="",r="_self")=>{if(!g){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}if(!e){a("Outbound link URL is required and must be a string.");return}p("outbound",{properties:{url:e,text:t,target:r}})},identify:e=>{if(!g){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}Ce(e),ot(e)},clearUserId:()=>{if(!g){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}Pe()},getUserId:()=>g?Z():(a("Rybbit SDK not initialized. Call rybbit.init() first."),null),captureError:(e,t)=>{if(!g){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}et(e,t)},onPageChange:e=>g?Oe(e):(a("Rybbit SDK not initialized. Call rybbit.init() first."),()=>{}),startSessionReplay:()=>{if(!g){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}nt()},stopSessionReplay:()=>{if(!g){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}he()},isSessionReplayActive:()=>g?it():(a("Rybbit SDK not initialized. Call rybbit.init() first."),!1),cleanup:()=>{Ae(),Ze(),st(),g=!1}},Lt=It;
7
+ "use strict";var Ct=Object.create;var A=Object.defineProperty,wt=Object.defineProperties,St=Object.getOwnPropertyDescriptor,Rt=Object.getOwnPropertyDescriptors,Pt=Object.getOwnPropertyNames,we=Object.getOwnPropertySymbols,It=Object.getPrototypeOf,Se=Object.prototype.hasOwnProperty,Lt=Object.prototype.propertyIsEnumerable;var re=(e,t,r)=>t in e?A(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,g=(e,t)=>{for(var r in t||(t={}))Se.call(t,r)&&re(e,r,t[r]);if(we)for(var r of we(t))Lt.call(t,r)&&re(e,r,t[r]);return e},Re=(e,t)=>wt(e,Rt(t));var xt=(e,t)=>{for(var r in t)A(e,r,{get:t[r],enumerable:!0})},Pe=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Pt(t))!Se.call(e,i)&&i!==r&&A(e,i,{get:()=>t[i],enumerable:!(n=St(t,i))||n.enumerable});return e};var Dt=(e,t,r)=>(r=e!=null?Ct(It(e)):{},Pe(t||!e||!e.__esModule?A(r,"default",{value:e,enumerable:!0}):r,e)),Ot=e=>Pe(A({},"__esModule",{value:!0}),e);var w=(e,t,r)=>re(e,typeof t!="symbol"?t+"":t,r);var Yt={};xt(Yt,{default:()=>Xt});module.exports=Ot(Yt);function Ie(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 Le(e){try{let t=window.location.hostname,r=new URL(e,window.location.href).hostname;return!!r&&r!==t}catch(t){return!1}}function At(e){try{let t="re:";if(e.startsWith(t)){let c=e.slice(t.length);if(!c)throw new Error("Empty regex pattern");return new RegExp(c)}let r="__DOUBLE_ASTERISK_TOKEN__",n="__SINGLE_ASTERISK_TOKEN__",o=e.replace(/\*\*/g,r).replace(/\*/g,n).replace(/[.+?^${}()|[\]\\]/g,"\\$&");o=o.replace(/\//g,"\\/"),o=o.replace(new RegExp("\\\\/"+r+"\\\\/","g"),"(?:\\/.*)?\\/");let d=o.replace(new RegExp(r,"g"),".*").replace(new RegExp(n,"g"),"[^/]+");return new RegExp("^"+d+"$")}catch(t){return a(`Invalid pattern: ${e}`,t),null}}function ne(e,t=[]){if(!t||t.length===0)return null;for(let r of t){let n=At(r);if(n&&n.test(e))return r}return null}function s(...e){l.debug&&console.log("[Rybbit]",...e)}function a(...e){l.debug&&console.error("[Rybbit Error]",...e)}function P(){let e=new URL(window.location.href),t=e.pathname;return e.hash&&(t+=e.hash),t}var M={debounceDuration:500,skipPatterns:[],maskPatterns:[],debug:!1},h={autoTrackPageview:!0,autoTrackSpa:!0,trackQuerystring:!0,trackOutbound:!0,enableWebVitals:!1,trackErrors:!1,enableSessionReplay:!1,trackButtonClicks:!1,trackCopy:!1,trackFormInteractions:!1},j=null,l=new Proxy({},{get:(e,t)=>{var r,n;return j?j[t]:(t!=="debug"&&a("Rybbit SDK accessed before initialization. Call rybbit.init() first."),(n=(r=M[t])!=null?r:h[t])!=null?n:void 0)},set:()=>(a("Rybbit config is read-only after initialization."),!1)});async function Mt(e,t){var r,n,i,o,d,c,u,f,T,C;try{s("Fetching remote configuration...");let b=new AbortController,I=setTimeout(()=>b.abort(),3e3),te=await fetch(`${e}/site/tracking-config/${t}`,{signal:b.signal});if(clearTimeout(I),te.ok){let y=await te.json();return s("Remote configuration fetched successfully",y),{autoTrackPageview:(r=y.trackInitialPageView)!=null?r:h.autoTrackPageview,autoTrackSpa:(n=y.trackSpaNavigation)!=null?n:h.autoTrackSpa,trackQuerystring:(i=y.trackUrlParams)!=null?i:h.trackQuerystring,trackOutbound:(o=y.trackOutbound)!=null?o:h.trackOutbound,enableWebVitals:(d=y.webVitals)!=null?d:h.enableWebVitals,trackErrors:(c=y.trackErrors)!=null?c:h.trackErrors,enableSessionReplay:(u=y.sessionReplay)!=null?u:h.enableSessionReplay,trackButtonClicks:(f=y.trackButtonClicks)!=null?f:h.trackButtonClicks,trackCopy:(T=y.trackCopy)!=null?T:h.trackCopy,trackFormInteractions:(C=y.trackFormInteractions)!=null?C:h.trackFormInteractions}}else return a(`Failed to fetch remote config: ${te.status}`),null}catch(b){return b.name==="AbortError"?a("Remote config fetch timed out"):a("Error fetching remote config:",b),null}}async function xe(e){var u,f;if(j)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 o=await Mt(r,n)||h,d=Array.isArray(e.skipPatterns)?e.skipPatterns:M.skipPatterns,c=Array.isArray(e.maskPatterns)?e.maskPatterns:M.maskPatterns;return j={analyticsHost:r,siteId:n,debounceDuration:Math.max(0,(u=e.debounceDuration)!=null?u:M.debounceDuration),skipPatterns:d,maskPatterns:c,debug:(f=e.debug)!=null?f:M.debug,replayPrivacyConfig:e.replayPrivacyConfig,autoTrackPageview:o.autoTrackPageview,autoTrackSpa:o.autoTrackSpa,trackQuerystring:o.trackQuerystring,trackOutbound:o.trackOutbound,enableWebVitals:o.enableWebVitals,trackErrors:o.trackErrors,enableSessionReplay:o.enableSessionReplay,trackButtonClicks:o.trackButtonClicks,trackCopy:o.trackCopy,trackFormInteractions:o.trackFormInteractions},!0}var k=null,ie=!1;try{let e=localStorage.getItem("rybbit-user-id");e&&(k=e),localStorage.getItem("disable-rybbit")!==null&&(ie=!0)}catch(e){a("localStorage unavailable")}typeof window!="undefined"&&window.__RYBBIT_OPTOUT__&&(ie=!0);function p(e,t={}){if(ie){s("Opted out of tracking.");return}if(!l||!l.analyticsHost||!l.siteId){a("Rybbit config not available. Ensure rybbit.init() was called successfully.");return}let{eventName:r,properties:n,pathOverride:i,webVitals:o}=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 d=new URL(window.location.href),c,u="";if(e==="pageview"&&typeof i=="string"&&i.trim()){s(`Using path override: ${i}`);try{if(!/^\//.test(i.trim())&&!/^https?:\/\//.test(i.trim()))throw new Error("pathOverride must start with /");let I=new URL(i.trim(),"http://dummybase");c=I.pathname,u=I.search||"",s(`Parsed override path: ${c}, search: ${u}`)}catch(I){a(`Invalid pathOverride format: ${i}. Using window location.`),c=P(),u=l.trackQuerystring?d.search:""}}else c=P(),u=l.trackQuerystring?d.search:"";if(e!=="performance"&&ne(c,l.skipPatterns)){s(`Skipping track for path: ${c}`);return}let f=ne(c,l.maskPatterns);f&&e!=="performance"&&(s(`Masking path ${c} as ${f}`),c=f,u="");let T=g(g(g(g({site_id:l.siteId,hostname:d.hostname,pathname:c,querystring:u,screenWidth:window.screen.width,screenHeight:window.screen.height,language:navigator.language,page_title:document.title,referrer:document.referrer,type:e},(e==="custom_event"||e==="performance"||e==="error")&&{event_name:r}),(e==="custom_event"||e==="outbound"||e==="error"||e==="button_click"||e==="copy"||e==="form_submit"||e==="input_change")&&Object.keys(n!=null?n:{}).length>0&&{properties:JSON.stringify(n)}),e==="performance"&&o&&g({},o)),k&&{user_id:k});s("Sending track event:",T);let C=JSON.stringify(T),b=`${l.analyticsHost}/track`;navigator.sendBeacon?navigator.sendBeacon(b,new Blob([C],{type:"application/json"}))||(a("sendBeacon failed, falling back to fetch."),De(b,C)):De(b,C)}catch(d){a("Error during tracking:",d)}}function De(e,t){fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:t,mode:"cors",keepalive:!0}).catch(r=>{a("Fetch request failed:",r)})}async function Oe(e,t,r=!0){if(!l||!l.analyticsHost||!l.siteId){a("Rybbit config not available. Ensure rybbit.init() was called successfully.");return}try{await fetch(`${l.analyticsHost}/identify`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({site_id:l.siteId,user_id:e,traits:t,is_new_identify:r}),mode:"cors",keepalive:!0}),s("Identify event sent:",{userId:e,traits:t,isNewIdentify:r})}catch(n){a("Failed to send identify event:",n)}}function Ae(e,t){if(e.trim()===""){a("User ID must be a non-empty string");return}k=e.trim();try{localStorage.setItem("rybbit-user-id",k),s("User identified:",k)}catch(r){a("Could not persist user ID to localStorage")}Oe(k,t,!0)}function Me(e){if(!e||typeof e!="object"){a("Traits must be an object");return}let t=k;if(!t){a("Cannot set traits without identifying user first. Call identify() first.");return}Oe(t,e,!1)}function _e(){k=null;try{localStorage.removeItem("rybbit-user-id"),s("User ID cleared")}catch(e){a("Could not remove user ID from localStorage")}}function oe(){return k}var S,K=!1,_=[],ae="";function Ue(){if(K){s("Automatic tracking already set up.");return}if(!l.autoTrackPageview){s("Automatic pageview tracking is disabled.");return}if(s("Setting up automatic tracking..."),ae=P(),S=l.debounceDuration&&l.debounceDuration>0?Ie(()=>{let e=P();Fe(e),p("pageview")},l.debounceDuration):()=>{let e=P();Fe(e),p("pageview")},requestAnimationFrame(()=>{S()}),l.autoTrackSpa){s("Setting up SPA route change tracking.");let e=history.pushState,t=history.replaceState;history.pushState=function(...r){e.apply(this,r),S()},history.replaceState=function(...r){t.apply(this,r),S()},window.addEventListener("popstate",S)}else s("SPA route change tracking is disabled.");window.addEventListener("hashchange",S),K=!0}function Ne(){s("Setting up data attribute and outbound link tracking."),document.addEventListener("click",Be,!0)}function Be(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 o=i.name.replace("data-rybbit-prop-","");n[o]=i.value}s("Data attribute event triggered:",r,n),p("custom_event",{eventName:r,properties:n})}break}t=t.parentElement}if(l.trackOutbound&&e.target instanceof Element){let r=e.target.closest("a");if(r&&r.href&&Le(r.href)){s("Outbound link clicked:",r.href);let n={url:r.href,text:r.innerText||r.textContent||"",target:r.target||"_self"};p("outbound",{properties:n})}}}function He(e){return _.push(e),s("Page change callback added"),()=>{_=_.filter(t=>t!==e),s("Page change callback removed")}}function Fe(e){let t=ae;ae=e,t!==e&&(s(`Page changed from ${t} to ${e}`),_.forEach(r=>{try{r(e,t)}catch(n){a("Error in page change callback:",n)}}))}function We(){K&&(s("Cleaning up automatic tracking listeners."),window.removeEventListener("popstate",S),window.removeEventListener("hashchange",S),document.removeEventListener("click",Be,!0),_=[],K=!1)}var Xe=-1,x=e=>{addEventListener("pageshow",t=>{t.persisted&&(Xe=t.timeStamp,e(t))},!0)},v=(e,t,r,n)=>{let i,o;return d=>{t.value>=0&&(d||n)&&(o=t.value-(i!=null?i:0),(o||i===void 0)&&(i=t.value,t.delta=o,t.rating=((c,u)=>c>u[1]?"poor":c>u[0]?"needs-improvement":"good")(t.value,r),e(t)))}},ge=e=>{requestAnimationFrame(()=>requestAnimationFrame(()=>e()))},me=()=>{let e=performance.getEntriesByType("navigation")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},F=()=>{var t;let e=me();return(t=e==null?void 0:e.activationStart)!=null?t:0},E=(e,t=-1)=>{let r=me(),n="navigate";return Xe>=0?n="back-forward-cache":r&&(document.prerendering||F()>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}},se=new WeakMap;function be(e,t){return se.get(e)||se.set(e,new t),se.get(e)}var le=class{constructor(){w(this,"t");w(this,"i",0);w(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(g({type:e,buffered:!0},r)),n}}catch(n){}},he=e=>{let t=!1;return()=>{t||(e(),t=!0)}},L=-1,$e=()=>document.visibilityState!=="hidden"||document.prerendering?1/0:0,Q=e=>{document.visibilityState==="hidden"&&L>-1&&(L=e.type==="visibilitychange"?e.timeStamp:0,_t())},Ve=()=>{addEventListener("visibilitychange",Q,!0),addEventListener("prerenderingchange",Q,!0)},_t=()=>{removeEventListener("visibilitychange",Q,!0),removeEventListener("prerenderingchange",Q,!0)},Ye=()=>{var e;if(L<0){let t=F(),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:$e(),Ve(),x(()=>{setTimeout(()=>{L=$e(),Ve()})})}return{get firstHiddenTime(){return L}}},J=e=>{document.prerendering?addEventListener("prerenderingchange",()=>e(),!0):e()},ze=[1800,3e3],ye=(e,t={})=>{J(()=>{let r=Ye(),n,i=E("FCP"),o=U("paint",d=>{for(let c of d)c.name==="first-contentful-paint"&&(o.disconnect(),c.startTime<r.firstHiddenTime&&(i.value=Math.max(c.startTime-F(),0),i.entries.push(c),n(!0)))});o&&(n=v(e,i,ze,t.reportAllChanges),x(d=>{i=E("FCP"),n=v(e,i,ze,t.reportAllChanges),ge(()=>{i.value=performance.now()-d.timeStamp,n(!0)})}))})},je=[.1,.25],Ze=(e,t={})=>{ye(he(()=>{let r,n=E("CLS",0),i=be(t,le),o=c=>{for(let u of c)i.h(u);i.i>n.value&&(n.value=i.i,n.entries=i.o,r())},d=U("layout-shift",o);d&&(r=v(e,n,je,t.reportAllChanges),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&(o(d.takeRecords()),r(!0))}),x(()=>{i.i=0,n=E("CLS",0),r=v(e,n,je,t.reportAllChanges),ge(()=>r())}),setTimeout(r))}))},et=0,ce=1/0,q=0,Ft=e=>{for(let t of e)t.interactionId&&(ce=Math.min(ce,t.interactionId),q=Math.max(q,t.interactionId),et=q?(q-ce)/7+1:0)},ue,Ke=()=>{var e;return ue?et:(e=performance.interactionCount)!=null?e:0},Ut=()=>{"interactionCount"in performance||ue||(ue=U("event",Ft,{type:"event",buffered:!0,durationThreshold:0}))},qe=0,de=class{constructor(){w(this,"u",[]);w(this,"l",new Map);w(this,"m");w(this,"v")}p(){qe=Ke(),this.u.length=0,this.l.clear()}P(){let t=Math.min(this.u.length-1,Math.floor((Ke()-qe)/50));return this.u[t]}h(t){var i,o;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((d,c)=>c.T-d.T),this.u.length>10){let d=this.u.splice(10);for(let c of d)this.l.delete(c.id)}(o=this.v)==null||o.call(this,n)}}},tt=e=>{let t=globalThis.requestIdleCallback||setTimeout;document.visibilityState==="hidden"?e():(e=he(e),document.addEventListener("visibilitychange",e,{once:!0}),t(()=>{e(),document.removeEventListener("visibilitychange",e)}))},Qe=[200,500],rt=(e,t={})=>{globalThis.PerformanceEventTiming&&"interactionId"in PerformanceEventTiming.prototype&&J(()=>{var c;Ut();let r,n=E("INP"),i=be(t,de),o=u=>{tt(()=>{for(let T of u)i.h(T);let f=i.P();f&&f.T!==n.value&&(n.value=f.T,n.entries=f.entries,r())})},d=U("event",o,{durationThreshold:(c=t.durationThreshold)!=null?c:40});r=v(e,n,Qe,t.reportAllChanges),d&&(d.observe({type:"first-input",buffered:!0}),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&(o(d.takeRecords()),r(!0))}),x(()=>{i.p(),n=E("INP"),r=v(e,n,Qe,t.reportAllChanges)}))})},fe=class{constructor(){w(this,"m")}h(t){var r;(r=this.m)==null||r.call(this,t)}},Je=[2500,4e3],nt=(e,t={})=>{J(()=>{let r=Ye(),n,i=E("LCP"),o=be(t,fe),d=u=>{t.reportAllChanges||(u=u.slice(-1));for(let f of u)o.h(f),f.startTime<r.firstHiddenTime&&(i.value=Math.max(f.startTime-F(),0),i.entries=[f],n())},c=U("largest-contentful-paint",d);if(c){n=v(e,i,Je,t.reportAllChanges);let u=he(()=>{d(c.takeRecords()),c.disconnect(),n(!0)});for(let f of["keydown","click","visibilitychange"])addEventListener(f,()=>tt(u),{capture:!0,once:!0});x(f=>{i=E("LCP"),n=v(e,i,Je,t.reportAllChanges),ge(()=>{i.value=performance.now()-f.timeStamp,n(!0)})})}})},Ge=[800,1800],pe=e=>{document.prerendering?J(()=>pe(e)):document.readyState!=="complete"?addEventListener("load",()=>pe(e),!0):setTimeout(e)},it=(e,t={})=>{let r=E("TTFB"),n=v(e,r,Ge,t.reportAllChanges);pe(()=>{let i=me();i&&(r.value=Math.max(i.responseStart-F(),0),r.entries=[i],n(!0),x(()=>{r=E("TTFB",0),n=v(e,r,Ge,t.reportAllChanges),n(!0)}))})};var X={lcp:null,cls:null,inp:null,fcp:null,ttfb:null},D=!1,G=null;function Nt(){if(D)return;Object.values(X).every(t=>t!==null)&&ke()}function ke(){D||(D=!0,G&&(clearTimeout(G),G=null),s("Sending web vitals data:",X),p("performance",{eventName:"web-vitals",webVitals:X}))}function N(e){if(D)return;let t=e.name.toLowerCase();X[t]=e.value,s(`Collected ${t}:`,e.value),Nt()}function ot(){if(!l.enableWebVitals){s("Web vitals tracking is disabled.");return}s("Initializing web vitals tracking...");try{nt(N),Ze(N),rt(N),ye(N),it(N),G=setTimeout(()=>{D||(s("Web vitals timeout reached, sending collected metrics."),ke())},2e4),window.addEventListener("beforeunload",()=>{D||ke()}),s("Web vitals tracking initialized successfully.")}catch(e){a("Error setting up web vitals tracking:",e)}}var B=null,H=null;function at(){l.trackErrors&&(s("Setting up error tracking"),B=e=>{Bt(e)},H=e=>{Ht(e)},window.addEventListener("error",B),window.addEventListener("unhandledrejection",H))}function st(){B&&(window.removeEventListener("error",B),B=null),H&&(window.removeEventListener("unhandledrejection",H),H=null),s("Error tracking cleaned up")}function Bt(e){var o,d;let t=window.location.origin,r=e.filename||"";if(r)try{if(new URL(r).origin!==t){s("Skipping third-party error:",r);return}}catch(c){}let n=((o=e.error)==null?void 0:o.stack)||"";if(!r&&n&&!n.includes(t)){s("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()};Y(((d=e.error)==null?void 0:d.name)||"Error",i)}function Ht(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()};Y("UnhandledRejection",n)}function Y(e,t,r){let n=g({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),p("error",{eventName:e,properties:n})}function ct(e,t){var r,n;if(!l.trackErrors){a("Error tracking is not enabled. Enable it via remote 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()};Y(((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()};Y(e.name||"Error",i,t)}}var W=null;function lt(){l.trackButtonClicks&&(s("Setting up button click tracking"),W=e=>{Wt(e)},document.addEventListener("click",W,!0))}function ut(){W&&(document.removeEventListener("click",W,!0),W=null)}function Wt(e){var o;let t=e.target;if(!t)return;let r=$t(t);if(!r||r.hasAttribute("data-rybbit-event"))return;let n=g({},Vt(r)),i=(o=r.textContent)==null?void 0:o.trim().substring(0,100);i&&(n.text=i),p("button_click",{properties:n})}function $t(e){var n;if(e.tagName==="BUTTON"||e.getAttribute("role")==="button")return e;if(e.tagName==="INPUT"){let i=(n=e.type)==null?void 0:n.toLowerCase();if(i==="submit"||i==="button")return e}let t=e.parentElement,r=0;for(;t&&r<3;){if(t.tagName==="BUTTON"||t.getAttribute("role")==="button")return t;t=t.parentElement,r++}return null}function Vt(e){let t={};for(let r of e.attributes)if(r.name.startsWith("data-rybbit-prop-")){let n=r.name.replace("data-rybbit-prop-","");t[n]=r.value}return t}var $=null;function dt(){l.trackCopy&&(s("Setting up copy tracking"),$=()=>{zt()},document.addEventListener("copy",$))}function ft(){$&&(document.removeEventListener("copy",$),$=null)}function zt(){let e=window.getSelection();if(!e||e.isCollapsed)return;let t=e.toString(),r=t.length;if(r===0)return;let n=e.anchorNode,i=n instanceof HTMLElement?n:n==null?void 0:n.parentElement;if(!i)return;let o=Re(g({text:t.substring(0,500)},r>500&&{textLength:r}),{sourceElement:i.tagName.toLowerCase()});p("copy",{properties:o})}var V=null,z=null;function pt(){l.trackFormInteractions&&(s("Setting up form tracking"),V=e=>{jt(e)},z=e=>{Kt(e)},document.addEventListener("submit",V,!0),document.addEventListener("change",z,!0))}function gt(){V&&(document.removeEventListener("submit",V,!0),V=null),z&&(document.removeEventListener("change",z,!0),z=null)}function jt(e){let t=e.target;if(t.tagName!=="FORM")return;let r=g({formId:t.id||"",formName:t.name||"",formAction:t.getAttribute("action")||"",method:(t.method||"get").toUpperCase(),fieldCount:t.elements.length},mt(t));p("form_submit",{properties:r})}function Kt(e){var o,d,c;let t=e.target,r=t.tagName.toUpperCase();if(!["INPUT","SELECT","TEXTAREA"].includes(r))return;if(r==="INPUT"){let u=(o=t.type)==null?void 0:o.toLowerCase();if(u==="hidden"||u==="password")return}let n=g({element:r.toLowerCase(),inputName:t.name||t.id||""},mt(t));r==="INPUT"&&(n.inputType=(d=t.type)==null?void 0:d.toLowerCase());let i=(c=t.form)==null?void 0:c.id;i&&(n.formId=i),p("input_change",{properties:n})}function mt(e){let t={};for(let r of e.attributes)if(r.name.startsWith("data-rybbit-prop-")){let n=r.name.replace("data-rybbit-prop-","");t[n]=r.value}return t}var ee=null,O=!1,ve=null,R=[],Z,Ee;async function bt(e){if(l.enableSessionReplay){Ee=e;try{ee=(await import("rrweb")).record,s("rrweb loaded successfully"),ht()}catch(t){a("Failed to load rrweb. Make sure it's installed as a peer dependency:",t)}}}function ht(){var e,t,r,n,i,o,d,c;if(!(O||!ee||!l.enableSessionReplay))try{let u=l.replayPrivacyConfig||{},f={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={script:!1,comment:!0,headFavicon:!0,headWhitespace:!0,headMetaDescKeywords:!0,headMetaSocial:!0,headMetaRobots:!0,headMetaHttpEquiv:!0,headMetaAuthorship:!0,headMetaVerification:!0},C={emit:b=>{qt({type:b.type,data:b.data,timestamp:b.timestamp||Date.now()})},recordCanvas:!1,checkoutEveryNms:6e4,checkoutEveryNth:500,blockClass:(e=u.blockClass)!=null?e:"rr-block",blockSelector:(t=u.blockSelector)!=null?t:void 0,ignoreClass:(r=u.ignoreClass)!=null?r:"rr-ignore",ignoreSelector:(n=u.ignoreSelector)!=null?n:void 0,maskTextClass:(i=u.maskTextClass)!=null?i:"rr-mask",maskAllInputs:(o=u.maskAllInputs)!=null?o:!0,maskInputOptions:{password:!0,email:!0},collectFonts:(d=u.collectFonts)!=null?d:!0,sampling:f,slimDOMOptions:(c=u.slimDOMOptions)!=null?c:T};u.maskTextSelectors&&u.maskTextSelectors.length>0&&(C.maskTextSelector=u.maskTextSelectors.join(", ")),ve=ee(C),O=!0,Qt(),s("Session replay recording started")}catch(u){a("Failed to start session replay recording:",u)}}function yt(){if(!l.enableSessionReplay){a("Session replay is not enabled. Enable it via remote config.");return}if(!ee){a("rrweb is not loaded. Ensure it's installed as a peer dependency.");return}if(O){s("Session replay is already recording");return}ht()}function Te(){if(!O){s("Session replay is not currently recording");return}ve&&ve(),O=!1,vt(),R.length>0&&Ce(),s("Session replay recording stopped")}function kt(){return O}function qt(e){R.push(e),R.length>=250&&Ce()}function Qt(){vt(),Z=window.setInterval(()=>{R.length>0&&Ce()},5e3)}function vt(){Z!==void 0&&(clearInterval(Z),Z=void 0)}function Ce(){if(R.length===0)return;let e=[...R];R=[];let t={userId:Ee||"",events:e,metadata:{pageUrl:window.location.href,viewportWidth:screen.width,viewportHeight:screen.height,language:navigator.language}};Jt(t).catch(r=>{a("Failed to send session replay batch:",r),R.unshift(...e)})}async function Jt(e){let t=`${l.analyticsHost}/session-replay/record/${l.siteId}`,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}`);s(`Session replay batch sent: ${e.events.length} events`)}function Et(e){Ee=e}function Tt(){Te()}var m=!1,Gt={init:async e=>{if(m){a("Rybbit SDK already initialized. Call init() only once.");return}await xe(e)&&(m=!0,s("Config:",g({},l)),Ue(),Ne(),ot(),at(),lt(),dt(),pt(),await bt(oe()||void 0))},pageview:e=>{if(!m){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}p("pageview",{pathOverride:e})},event:(e,t)=>{if(!m){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}if(!e){a("Event name is required and must be a string.");return}p("custom_event",{eventName:e,properties:t})},trackOutbound:(e,t="",r="_self")=>{if(!m){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}if(!e){a("Outbound link URL is required and must be a string.");return}p("outbound",{properties:{url:e,text:t,target:r}})},identify:(e,t)=>{if(!m){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}Ae(e,t),Et(e)},setTraits:e=>{if(!m){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}Me(e)},clearUserId:()=>{if(!m){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}_e()},getUserId:()=>m?oe():(a("Rybbit SDK not initialized. Call rybbit.init() first."),null),error:(e,t)=>{if(!m){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}ct(e,t)},onPageChange:e=>m?He(e):(a("Rybbit SDK not initialized. Call rybbit.init() first."),()=>{}),startSessionReplay:()=>{if(!m){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}yt()},stopSessionReplay:()=>{if(!m){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}Te()},isSessionReplayActive:()=>m?kt():(a("Rybbit SDK not initialized. Call rybbit.init() first."),!1),cleanup:()=>{We(),st(),ut(),ft(),gt(),Tt(),m=!1}},Xt=Gt;
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @rybbit/js v0.4.0
2
+ * @rybbit/js v0.6.0
3
3
  * Rybbit Web SDK
4
- * (c) 2025 Rybbit
4
+ * (c) 2026 Rybbit
5
5
  * Released under the AGPL-3.0-only license.
6
6
  */
7
- var at=Object.defineProperty;var ye=Object.getOwnPropertySymbols;var ot=Object.prototype.hasOwnProperty,st=Object.prototype.propertyIsEnumerable;var J=(e,t,r)=>t in e?at(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,b=(e,t)=>{for(var r in t||(t={}))ot.call(t,r)&&J(e,r,t[r]);if(ye)for(var r of ye(t))st.call(t,r)&&J(e,r,t[r]);return e};var v=(e,t,r)=>J(e,typeof t!="symbol"?t+"":t,r);function ve(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 ke(e){try{let t=window.location.hostname,r=new URL(e,window.location.href).hostname;return!!r&&r!==t}catch(t){return!1}}function lt(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 s=i.replace(new RegExp(t,"g"),".*").replace(new RegExp(r,"g"),"[^/]+");return new RegExp("^"+s+"$")}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=lt(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 R(){let e=new URL(window.location.href),t=e.pathname;return e.hash&&(t+=e.hash),t}var D={debounce:500,skipPatterns:[],maskPatterns:[],debug:!1},k={autoTrackPageviews:!0,autoTrackSpaRoutes:!0,trackQuerystring:!0,trackOutboundLinks:!0,trackWebVitals:!1,captureErrors:!1,enableSessionReplay:!1},W=null,c=new Proxy({},{get:(e,t)=>{var r,n;return W?W[t]:(t!=="debug"&&a("Rybbit SDK accessed before initialization. Call rybbit.init() first."),(n=(r=D[t])!=null?r:k[t])!=null?n:void 0)},set:()=>(a("Rybbit config is read-only after initialization."),!1)});async function ct(e,t){var r,n,i,s,u,l,f;try{o("Fetching remote configuration...");let d=new AbortController,C=setTimeout(()=>d.abort(),3e3),w=await fetch(`${e}/site/${t}/tracking-config`,{signal:d.signal});if(clearTimeout(C),w.ok){let m=await w.json();return o("Remote configuration fetched successfully",m),{autoTrackPageviews:(r=m.trackInitialPageView)!=null?r:k.autoTrackPageviews,autoTrackSpaRoutes:(n=m.trackSpaNavigation)!=null?n:k.autoTrackSpaRoutes,trackQuerystring:(i=m.trackUrlParams)!=null?i:k.trackQuerystring,trackOutboundLinks:(s=m.trackOutbound)!=null?s:k.trackOutboundLinks,trackWebVitals:(u=m.webVitals)!=null?u:k.trackWebVitals,captureErrors:(l=m.trackErrors)!=null?l:k.captureErrors,enableSessionReplay:(f=m.sessionReplay)!=null?f:k.enableSessionReplay}}else return a(`Failed to fetch remote config: ${w.status}`),null}catch(d){return d.name==="AbortError"?a("Remote config fetch timed out"):a("Error fetching remote config:",d),null}}async function Ee(e){var f,d;if(W)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 s=await ct(r,n)||k,u=Array.isArray(e.skipPatterns)?e.skipPatterns:D.skipPatterns,l=Array.isArray(e.maskPatterns)?e.maskPatterns:D.maskPatterns;return W={analyticsHost:r,siteId:n,debounce:Math.max(0,(f=e.debounce)!=null?f:D.debounce),skipPatterns:u,maskPatterns:l,debug:(d=e.debug)!=null?d:D.debug,replayPrivacyConfig:e.replayPrivacyConfig,autoTrackPageviews:s.autoTrackPageviews,autoTrackSpaRoutes:s.autoTrackSpaRoutes,trackQuerystring:s.trackQuerystring,trackOutboundLinks:s.trackOutboundLinks,trackWebVitals:s.trackWebVitals,captureErrors:s.captureErrors,enableSessionReplay:s.enableSessionReplay},!0}var E=null,Y=!1;try{let e=localStorage.getItem("rybbit-user-id");e&&(E=e),localStorage.getItem("disable-rybbit")!==null&&(Y=!0)}catch(e){a("localStorage unavailable")}typeof window!="undefined"&&window.__RYBBIT_OPTOUT__&&(Y=!0);function p(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:s}=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 u=new URL(window.location.href),l,f="";if(e==="pageview"&&typeof i=="string"&&i.trim()){o(`Using path override: ${i}`);try{let N=new URL(i,"http://dummybase");l=N.pathname,f=N.search||"",o(`Parsed override path: ${l}, search: ${f}`)}catch(N){a(`Invalid pathOverride format: ${i}. Using window location.`),l=R(),f=c.trackQuerystring?u.search:""}}else l=R(),f=c.trackQuerystring?u.search:"";if(e!=="performance"&&G(l,c.skipPatterns)){o(`Skipping track for path: ${l}`);return}let d=G(l,c.maskPatterns);d&&e!=="performance"&&(o(`Masking path ${l} as ${d}`),l=d,f="");let C=b(b(b(b({site_id:c.siteId,hostname:u.hostname,pathname:l,querystring:f,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"&&s&&b({},s)),E&&{user_id:E});o("Sending track event:",C);let w=JSON.stringify(C),m=`${c.analyticsHost}/track`;navigator.sendBeacon?navigator.sendBeacon(m,new Blob([w],{type:"application/json"}))||(a("sendBeacon failed, falling back to fetch."),Se(m,w)):Se(m,w)}catch(u){a("Error during tracking:",u)}}function Se(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 Te(e){if(e.trim()===""){a("User ID must be a non-empty string");return}E=e.trim();try{localStorage.setItem("rybbit-user-id",E),o("User identified:",E)}catch(t){a("Could not persist user ID to localStorage")}}function we(){E=null;try{localStorage.removeItem("rybbit-user-id"),o("User ID cleared")}catch(e){a("Could not remove user ID from localStorage")}}function X(){return E}var S,$=!1,O=[],Z="";function Ce(){if($){o("Automatic tracking already set up.");return}if(!c.autoTrackPageviews){o("Automatic pageview tracking is disabled.");return}if(o("Setting up automatic tracking..."),Z=R(),S=c.debounce&&c.debounce>0?ve(()=>{let e=R();Re(e),p("pageview")},c.debounce):()=>{let e=R();Re(e),p("pageview")},requestAnimationFrame(()=>{S()}),c.autoTrackSpaRoutes){o("Setting up SPA route change tracking.");let e=history.pushState,t=history.replaceState;history.pushState=function(...r){e.apply(this,r),S()},history.replaceState=function(...r){t.apply(this,r),S()},window.addEventListener("popstate",S)}else o("SPA route change tracking is disabled.");window.addEventListener("hashchange",S),$=!0}function Pe(){o("Setting up data attribute and outbound link tracking."),document.addEventListener("click",Ie,!0)}function Ie(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 s=i.name.replace("data-rybbit-prop-","");n[s]=i.value}o("Data attribute event triggered:",r,n),p("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&&ke(r.href)){o("Outbound link clicked:",r.href);let n={url:r.href,text:r.innerText||r.textContent||"",target:r.target||"_self"};p("outbound",{properties:n})}}}function Le(e){return O.push(e),o("Page change callback added"),()=>{O=O.filter(t=>t!==e),o("Page change callback removed")}}function Re(e){let t=Z;Z=e,t!==e&&(o(`Page changed from ${t} to ${e}`),O.forEach(r=>{try{r(e,t)}catch(n){a("Error in page change callback:",n)}}))}function xe(){$&&(o("Cleaning up automatic tracking listeners."),window.removeEventListener("popstate",S),window.removeEventListener("hashchange",S),document.removeEventListener("click",Ie,!0),O=[],$=!1)}var $e=-1,I=e=>{addEventListener("pageshow",t=>{t.persisted&&($e=t.timeStamp,e(t))},!0)},h=(e,t,r,n)=>{let i,s;return u=>{t.value>=0&&(u||n)&&(s=t.value-(i!=null?i:0),(s||i===void 0)&&(i=t.value,t.delta=s,t.rating=((l,f)=>l>f[1]?"poor":l>f[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},A=()=>{var t;let e=le();return(t=e==null?void 0:e.activationStart)!=null?t:0},y=(e,t=-1)=>{let r=le(),n="navigate";return $e>=0?n="back-forward-cache":r&&(document.prerendering||A()>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(){v(this,"t");v(this,"i",0);v(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(b({type:e,buffered:!0},r)),n}}catch(n){}},ue=e=>{let t=!1;return()=>{t||(e(),t=!0)}},P=-1,De=()=>document.visibilityState!=="hidden"||document.prerendering?1/0:0,B=e=>{document.visibilityState==="hidden"&&P>-1&&(P=e.type==="visibilitychange"?e.timeStamp:0,ut())},Oe=()=>{addEventListener("visibilitychange",B,!0),addEventListener("prerenderingchange",B,!0)},ut=()=>{removeEventListener("visibilitychange",B,!0),removeEventListener("prerenderingchange",B,!0)},Ve=()=>{var e;if(P<0){let t=A(),r=document.prerendering||(e=globalThis.performance.getEntriesByType("visibility-state").filter(n=>n.name==="hidden"&&n.startTime>t)[0])==null?void 0:e.startTime;P=r!=null?r:De(),Oe(),I(()=>{setTimeout(()=>{P=De(),Oe()})})}return{get firstHiddenTime(){return P}}},z=e=>{document.prerendering?addEventListener("prerenderingchange",()=>e(),!0):e()},Ae=[1800,3e3],de=(e,t={})=>{z(()=>{let r=Ve(),n,i=y("FCP"),s=_("paint",u=>{for(let l of u)l.name==="first-contentful-paint"&&(s.disconnect(),l.startTime<r.firstHiddenTime&&(i.value=Math.max(l.startTime-A(),0),i.entries.push(l),n(!0)))});s&&(n=h(e,i,Ae,t.reportAllChanges),I(u=>{i=y("FCP"),n=h(e,i,Ae,t.reportAllChanges),se(()=>{i.value=performance.now()-u.timeStamp,n(!0)})}))})},_e=[.1,.25],Be=(e,t={})=>{de(ue(()=>{let r,n=y("CLS",0),i=ce(t,re),s=l=>{for(let f of l)i.h(f);i.i>n.value&&(n.value=i.i,n.entries=i.o,r())},u=_("layout-shift",s);u&&(r=h(e,n,_e,t.reportAllChanges),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&(s(u.takeRecords()),r(!0))}),I(()=>{i.i=0,n=y("CLS",0),r=h(e,n,_e,t.reportAllChanges),se(()=>r())}),setTimeout(r))}))},ze=0,te=1/0,V=0,dt=e=>{for(let t of e)t.interactionId&&(te=Math.min(te,t.interactionId),V=Math.max(V,t.interactionId),ze=V?(V-te)/7+1:0)},ne,Me=()=>{var e;return ne?ze:(e=performance.interactionCount)!=null?e:0},ft=()=>{"interactionCount"in performance||ne||(ne=_("event",dt,{type:"event",buffered:!0,durationThreshold:0}))},Ue=0,ie=class{constructor(){v(this,"u",[]);v(this,"l",new Map);v(this,"m");v(this,"v")}p(){Ue=Me(),this.u.length=0,this.l.clear()}P(){let t=Math.min(this.u.length-1,Math.floor((Me()-Ue)/50));return this.u[t]}h(t){var i,s;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((u,l)=>l.T-u.T),this.u.length>10){let u=this.u.splice(10);for(let l of u)this.l.delete(l.id)}(s=this.v)==null||s.call(this,n)}}},Ke=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)}))},Fe=[200,500],je=(e,t={})=>{globalThis.PerformanceEventTiming&&"interactionId"in PerformanceEventTiming.prototype&&z(()=>{var l;ft();let r,n=y("INP"),i=ce(t,ie),s=f=>{Ke(()=>{for(let C of f)i.h(C);let d=i.P();d&&d.T!==n.value&&(n.value=d.T,n.entries=d.entries,r())})},u=_("event",s,{durationThreshold:(l=t.durationThreshold)!=null?l:40});r=h(e,n,Fe,t.reportAllChanges),u&&(u.observe({type:"first-input",buffered:!0}),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&(s(u.takeRecords()),r(!0))}),I(()=>{i.p(),n=y("INP"),r=h(e,n,Fe,t.reportAllChanges)}))})},ae=class{constructor(){v(this,"m")}h(t){var r;(r=this.m)==null||r.call(this,t)}},Ne=[2500,4e3],He=(e,t={})=>{z(()=>{let r=Ve(),n,i=y("LCP"),s=ce(t,ae),u=f=>{t.reportAllChanges||(f=f.slice(-1));for(let d of f)s.h(d),d.startTime<r.firstHiddenTime&&(i.value=Math.max(d.startTime-A(),0),i.entries=[d],n())},l=_("largest-contentful-paint",u);if(l){n=h(e,i,Ne,t.reportAllChanges);let f=ue(()=>{u(l.takeRecords()),l.disconnect(),n(!0)});for(let d of["keydown","click","visibilitychange"])addEventListener(d,()=>Ke(f),{capture:!0,once:!0});I(d=>{i=y("LCP"),n=h(e,i,Ne,t.reportAllChanges),se(()=>{i.value=performance.now()-d.timeStamp,n(!0)})})}})},We=[800,1800],oe=e=>{document.prerendering?z(()=>oe(e)):document.readyState!=="complete"?addEventListener("load",()=>oe(e),!0):setTimeout(e)},qe=(e,t={})=>{let r=y("TTFB"),n=h(e,r,We,t.reportAllChanges);oe(()=>{let i=le();i&&(r.value=Math.max(i.responseStart-A(),0),r.entries=[i],n(!0),I(()=>{r=y("TTFB",0),n=h(e,r,We,t.reportAllChanges),n(!0)}))})};var j={lcp:null,cls:null,inp:null,fcp:null,ttfb:null},L=!1,K=null;function gt(){if(L)return;Object.values(j).every(t=>t!==null)&&fe()}function fe(){L||(L=!0,K&&(clearTimeout(K),K=null),o("Sending web vitals data:",j),p("performance",{eventName:"web-vitals",webVitals:j}))}function M(e){if(L)return;let t=e.name.toLowerCase();j[t]=e.value,o(`Collected ${t}:`,e.value),gt()}function Qe(){if(!c.trackWebVitals){o("Web vitals tracking is disabled.");return}o("Initializing web vitals tracking...");try{He(M),Be(M),je(M),de(M),qe(M),K=setTimeout(()=>{L||(o("Web vitals timeout reached, sending collected metrics."),fe())},2e4),window.addEventListener("beforeunload",()=>{L||fe()}),o("Web vitals tracking initialized successfully.")}catch(e){a("Error setting up web vitals tracking:",e)}}var U=null,F=null;function Je(){c.captureErrors&&(o("Setting up error tracking"),U=e=>{pt(e)},F=e=>{mt(e)},window.addEventListener("error",U),window.addEventListener("unhandledrejection",F))}function Ge(){U&&(window.removeEventListener("error",U),U=null),F&&(window.removeEventListener("unhandledrejection",F),F=null),o("Error tracking cleaned up")}function pt(e){var s,u;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=((s=e.error)==null?void 0:s.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(((u=e.error)==null?void 0:u.name)||"Error",i)}function mt(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=b({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),p("error",{eventName:e,properties:n})}function Ye(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,x=!1,ge=null,T=[],q,pe=null,me;function bt(){return`${Date.now()}-${Math.random().toString(36).substring(2,15)}`}async function Xe(e){if(c.enableSessionReplay){me=e,pe=bt();try{Q=(await import("rrweb")).record,o("rrweb loaded successfully"),Ze()}catch(t){a("Failed to load rrweb. Make sure it's installed as a peer dependency:",t)}}}function Ze(){var e;if(!(x||!Q||!c.enableSessionReplay))try{let t=c.replayPrivacyConfig||{},r={emit:n=>{ht({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),x=!0,yt(),o("Session replay recording started")}catch(t){a("Failed to start session replay recording:",t)}}function et(){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(x){o("Session replay is already recording");return}Ze()}function be(){if(!x){o("Session replay is not currently recording");return}ge&&ge(),x=!1,rt(),T.length>0&&he(),o("Session replay recording stopped")}function tt(){return x}function ht(e){T.push(e),T.length>=250&&he()}function yt(){rt(),q=window.setInterval(()=>{T.length>0&&he()},5e3)}function rt(){q!==void 0&&(clearInterval(q),q=void 0)}function he(){if(T.length===0||!pe)return;let e=[...T];T=[];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}};vt(t).catch(r=>{a("Failed to send session replay batch:",r),T.unshift(...e)})}async function vt(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 nt(e){me=e}function it(){be()}var g=!1,kt={init:async e=>{if(g){a("Rybbit SDK already initialized. Call init() only once.");return}await Ee(e)&&(g=!0,o("Config:",b({},c)),Ce(),Pe(),Qe(),Je(),await Xe(X()||void 0))},pageview:e=>{if(!g){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}p("pageview",{pathOverride:e})},event:(e,t)=>{if(!g){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}if(!e){a("Event name is required and must be a string.");return}p("custom_event",{eventName:e,properties:t})},outbound:(e,t="",r="_self")=>{if(!g){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}if(!e){a("Outbound link URL is required and must be a string.");return}p("outbound",{properties:{url:e,text:t,target:r}})},identify:e=>{if(!g){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}Te(e),nt(e)},clearUserId:()=>{if(!g){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}we()},getUserId:()=>g?X():(a("Rybbit SDK not initialized. Call rybbit.init() first."),null),captureError:(e,t)=>{if(!g){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}Ye(e,t)},onPageChange:e=>g?Le(e):(a("Rybbit SDK not initialized. Call rybbit.init() first."),()=>{}),startSessionReplay:()=>{if(!g){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}et()},stopSessionReplay:()=>{if(!g){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}be()},isSessionReplayActive:()=>g?tt():(a("Rybbit SDK not initialized. Call rybbit.init() first."),!1),cleanup:()=>{xe(),Ge(),it(),g=!1}},nr=kt;export{nr as default};
7
+ var vt=Object.defineProperty,Et=Object.defineProperties;var Tt=Object.getOwnPropertyDescriptors;var Ce=Object.getOwnPropertySymbols;var Ct=Object.prototype.hasOwnProperty,wt=Object.prototype.propertyIsEnumerable;var te=(e,t,r)=>t in e?vt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,g=(e,t)=>{for(var r in t||(t={}))Ct.call(t,r)&&te(e,r,t[r]);if(Ce)for(var r of Ce(t))wt.call(t,r)&&te(e,r,t[r]);return e},we=(e,t)=>Et(e,Tt(t));var w=(e,t,r)=>te(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 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 St(e){try{let t="re:";if(e.startsWith(t)){let c=e.slice(t.length);if(!c)throw new Error("Empty regex pattern");return new RegExp(c)}let r="__DOUBLE_ASTERISK_TOKEN__",n="__SINGLE_ASTERISK_TOKEN__",o=e.replace(/\*\*/g,r).replace(/\*/g,n).replace(/[.+?^${}()|[\]\\]/g,"\\$&");o=o.replace(/\//g,"\\/"),o=o.replace(new RegExp("\\\\/"+r+"\\\\/","g"),"(?:\\/.*)?\\/");let d=o.replace(new RegExp(r,"g"),".*").replace(new RegExp(n,"g"),"[^/]+");return new RegExp("^"+d+"$")}catch(t){return a(`Invalid pattern: ${e}`,t),null}}function re(e,t=[]){if(!t||t.length===0)return null;for(let r of t){let n=St(r);if(n&&n.test(e))return r}return null}function s(...e){l.debug&&console.log("[Rybbit]",...e)}function a(...e){l.debug&&console.error("[Rybbit Error]",...e)}function P(){let e=new URL(window.location.href),t=e.pathname;return e.hash&&(t+=e.hash),t}var A={debounceDuration:500,skipPatterns:[],maskPatterns:[],debug:!1},h={autoTrackPageview:!0,autoTrackSpa:!0,trackQuerystring:!0,trackOutbound:!0,enableWebVitals:!1,trackErrors:!1,enableSessionReplay:!1,trackButtonClicks:!1,trackCopy:!1,trackFormInteractions:!1},z=null,l=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=A[t])!=null?r:h[t])!=null?n:void 0)},set:()=>(a("Rybbit config is read-only after initialization."),!1)});async function Rt(e,t){var r,n,i,o,d,c,u,f,T,C;try{s("Fetching remote configuration...");let b=new AbortController,I=setTimeout(()=>b.abort(),3e3),ee=await fetch(`${e}/site/tracking-config/${t}`,{signal:b.signal});if(clearTimeout(I),ee.ok){let y=await ee.json();return s("Remote configuration fetched successfully",y),{autoTrackPageview:(r=y.trackInitialPageView)!=null?r:h.autoTrackPageview,autoTrackSpa:(n=y.trackSpaNavigation)!=null?n:h.autoTrackSpa,trackQuerystring:(i=y.trackUrlParams)!=null?i:h.trackQuerystring,trackOutbound:(o=y.trackOutbound)!=null?o:h.trackOutbound,enableWebVitals:(d=y.webVitals)!=null?d:h.enableWebVitals,trackErrors:(c=y.trackErrors)!=null?c:h.trackErrors,enableSessionReplay:(u=y.sessionReplay)!=null?u:h.enableSessionReplay,trackButtonClicks:(f=y.trackButtonClicks)!=null?f:h.trackButtonClicks,trackCopy:(T=y.trackCopy)!=null?T:h.trackCopy,trackFormInteractions:(C=y.trackFormInteractions)!=null?C:h.trackFormInteractions}}else return a(`Failed to fetch remote config: ${ee.status}`),null}catch(b){return b.name==="AbortError"?a("Remote config fetch timed out"):a("Error fetching remote config:",b),null}}async function Pe(e){var u,f;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 o=await Rt(r,n)||h,d=Array.isArray(e.skipPatterns)?e.skipPatterns:A.skipPatterns,c=Array.isArray(e.maskPatterns)?e.maskPatterns:A.maskPatterns;return z={analyticsHost:r,siteId:n,debounceDuration:Math.max(0,(u=e.debounceDuration)!=null?u:A.debounceDuration),skipPatterns:d,maskPatterns:c,debug:(f=e.debug)!=null?f:A.debug,replayPrivacyConfig:e.replayPrivacyConfig,autoTrackPageview:o.autoTrackPageview,autoTrackSpa:o.autoTrackSpa,trackQuerystring:o.trackQuerystring,trackOutbound:o.trackOutbound,enableWebVitals:o.enableWebVitals,trackErrors:o.trackErrors,enableSessionReplay:o.enableSessionReplay,trackButtonClicks:o.trackButtonClicks,trackCopy:o.trackCopy,trackFormInteractions:o.trackFormInteractions},!0}var k=null,ne=!1;try{let e=localStorage.getItem("rybbit-user-id");e&&(k=e),localStorage.getItem("disable-rybbit")!==null&&(ne=!0)}catch(e){a("localStorage unavailable")}typeof window!="undefined"&&window.__RYBBIT_OPTOUT__&&(ne=!0);function p(e,t={}){if(ne){s("Opted out of tracking.");return}if(!l||!l.analyticsHost||!l.siteId){a("Rybbit config not available. Ensure rybbit.init() was called successfully.");return}let{eventName:r,properties:n,pathOverride:i,webVitals:o}=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 d=new URL(window.location.href),c,u="";if(e==="pageview"&&typeof i=="string"&&i.trim()){s(`Using path override: ${i}`);try{if(!/^\//.test(i.trim())&&!/^https?:\/\//.test(i.trim()))throw new Error("pathOverride must start with /");let I=new URL(i.trim(),"http://dummybase");c=I.pathname,u=I.search||"",s(`Parsed override path: ${c}, search: ${u}`)}catch(I){a(`Invalid pathOverride format: ${i}. Using window location.`),c=P(),u=l.trackQuerystring?d.search:""}}else c=P(),u=l.trackQuerystring?d.search:"";if(e!=="performance"&&re(c,l.skipPatterns)){s(`Skipping track for path: ${c}`);return}let f=re(c,l.maskPatterns);f&&e!=="performance"&&(s(`Masking path ${c} as ${f}`),c=f,u="");let T=g(g(g(g({site_id:l.siteId,hostname:d.hostname,pathname:c,querystring:u,screenWidth:window.screen.width,screenHeight:window.screen.height,language:navigator.language,page_title:document.title,referrer:document.referrer,type:e},(e==="custom_event"||e==="performance"||e==="error")&&{event_name:r}),(e==="custom_event"||e==="outbound"||e==="error"||e==="button_click"||e==="copy"||e==="form_submit"||e==="input_change")&&Object.keys(n!=null?n:{}).length>0&&{properties:JSON.stringify(n)}),e==="performance"&&o&&g({},o)),k&&{user_id:k});s("Sending track event:",T);let C=JSON.stringify(T),b=`${l.analyticsHost}/track`;navigator.sendBeacon?navigator.sendBeacon(b,new Blob([C],{type:"application/json"}))||(a("sendBeacon failed, falling back to fetch."),Ie(b,C)):Ie(b,C)}catch(d){a("Error during tracking:",d)}}function Ie(e,t){fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:t,mode:"cors",keepalive:!0}).catch(r=>{a("Fetch request failed:",r)})}async function Le(e,t,r=!0){if(!l||!l.analyticsHost||!l.siteId){a("Rybbit config not available. Ensure rybbit.init() was called successfully.");return}try{await fetch(`${l.analyticsHost}/identify`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({site_id:l.siteId,user_id:e,traits:t,is_new_identify:r}),mode:"cors",keepalive:!0}),s("Identify event sent:",{userId:e,traits:t,isNewIdentify:r})}catch(n){a("Failed to send identify event:",n)}}function xe(e,t){if(e.trim()===""){a("User ID must be a non-empty string");return}k=e.trim();try{localStorage.setItem("rybbit-user-id",k),s("User identified:",k)}catch(r){a("Could not persist user ID to localStorage")}Le(k,t,!0)}function De(e){if(!e||typeof e!="object"){a("Traits must be an object");return}let t=k;if(!t){a("Cannot set traits without identifying user first. Call identify() first.");return}Le(t,e,!1)}function Oe(){k=null;try{localStorage.removeItem("rybbit-user-id"),s("User ID cleared")}catch(e){a("Could not remove user ID from localStorage")}}function ie(){return k}var S,j=!1,M=[],oe="";function Me(){if(j){s("Automatic tracking already set up.");return}if(!l.autoTrackPageview){s("Automatic pageview tracking is disabled.");return}if(s("Setting up automatic tracking..."),oe=P(),S=l.debounceDuration&&l.debounceDuration>0?Se(()=>{let e=P();Ae(e),p("pageview")},l.debounceDuration):()=>{let e=P();Ae(e),p("pageview")},requestAnimationFrame(()=>{S()}),l.autoTrackSpa){s("Setting up SPA route change tracking.");let e=history.pushState,t=history.replaceState;history.pushState=function(...r){e.apply(this,r),S()},history.replaceState=function(...r){t.apply(this,r),S()},window.addEventListener("popstate",S)}else s("SPA route change tracking is disabled.");window.addEventListener("hashchange",S),j=!0}function _e(){s("Setting up data attribute and outbound link tracking."),document.addEventListener("click",Fe,!0)}function Fe(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 o=i.name.replace("data-rybbit-prop-","");n[o]=i.value}s("Data attribute event triggered:",r,n),p("custom_event",{eventName:r,properties:n})}break}t=t.parentElement}if(l.trackOutbound&&e.target instanceof Element){let r=e.target.closest("a");if(r&&r.href&&Re(r.href)){s("Outbound link clicked:",r.href);let n={url:r.href,text:r.innerText||r.textContent||"",target:r.target||"_self"};p("outbound",{properties:n})}}}function Ue(e){return M.push(e),s("Page change callback added"),()=>{M=M.filter(t=>t!==e),s("Page change callback removed")}}function Ae(e){let t=oe;oe=e,t!==e&&(s(`Page changed from ${t} to ${e}`),M.forEach(r=>{try{r(e,t)}catch(n){a("Error in page change callback:",n)}}))}function Ne(){j&&(s("Cleaning up automatic tracking listeners."),window.removeEventListener("popstate",S),window.removeEventListener("hashchange",S),document.removeEventListener("click",Fe,!0),M=[],j=!1)}var Qe=-1,x=e=>{addEventListener("pageshow",t=>{t.persisted&&(Qe=t.timeStamp,e(t))},!0)},v=(e,t,r,n)=>{let i,o;return d=>{t.value>=0&&(d||n)&&(o=t.value-(i!=null?i:0),(o||i===void 0)&&(i=t.value,t.delta=o,t.rating=((c,u)=>c>u[1]?"poor":c>u[0]?"needs-improvement":"good")(t.value,r),e(t)))}},pe=e=>{requestAnimationFrame(()=>requestAnimationFrame(()=>e()))},ge=()=>{let e=performance.getEntriesByType("navigation")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},_=()=>{var t;let e=ge();return(t=e==null?void 0:e.activationStart)!=null?t:0},E=(e,t=-1)=>{let r=ge(),n="navigate";return Qe>=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}},ae=new WeakMap;function me(e,t){return ae.get(e)||ae.set(e,new t),ae.get(e)}var ce=class{constructor(){w(this,"t");w(this,"i",0);w(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)}},F=(e,t,r={})=>{try{if(PerformanceObserver.supportedEntryTypes.includes(e)){let n=new PerformanceObserver(i=>{Promise.resolve().then(()=>{t(i.getEntries())})});return n.observe(g({type:e,buffered:!0},r)),n}}catch(n){}},be=e=>{let t=!1;return()=>{t||(e(),t=!0)}},L=-1,Be=()=>document.visibilityState!=="hidden"||document.prerendering?1/0:0,q=e=>{document.visibilityState==="hidden"&&L>-1&&(L=e.type==="visibilitychange"?e.timeStamp:0,Pt())},He=()=>{addEventListener("visibilitychange",q,!0),addEventListener("prerenderingchange",q,!0)},Pt=()=>{removeEventListener("visibilitychange",q,!0),removeEventListener("prerenderingchange",q,!0)},Je=()=>{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:Be(),He(),x(()=>{setTimeout(()=>{L=Be(),He()})})}return{get firstHiddenTime(){return L}}},Q=e=>{document.prerendering?addEventListener("prerenderingchange",()=>e(),!0):e()},We=[1800,3e3],he=(e,t={})=>{Q(()=>{let r=Je(),n,i=E("FCP"),o=F("paint",d=>{for(let c of d)c.name==="first-contentful-paint"&&(o.disconnect(),c.startTime<r.firstHiddenTime&&(i.value=Math.max(c.startTime-_(),0),i.entries.push(c),n(!0)))});o&&(n=v(e,i,We,t.reportAllChanges),x(d=>{i=E("FCP"),n=v(e,i,We,t.reportAllChanges),pe(()=>{i.value=performance.now()-d.timeStamp,n(!0)})}))})},$e=[.1,.25],Ge=(e,t={})=>{he(be(()=>{let r,n=E("CLS",0),i=me(t,ce),o=c=>{for(let u of c)i.h(u);i.i>n.value&&(n.value=i.i,n.entries=i.o,r())},d=F("layout-shift",o);d&&(r=v(e,n,$e,t.reportAllChanges),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&(o(d.takeRecords()),r(!0))}),x(()=>{i.i=0,n=E("CLS",0),r=v(e,n,$e,t.reportAllChanges),pe(()=>r())}),setTimeout(r))}))},Xe=0,se=1/0,K=0,It=e=>{for(let t of e)t.interactionId&&(se=Math.min(se,t.interactionId),K=Math.max(K,t.interactionId),Xe=K?(K-se)/7+1:0)},le,Ve=()=>{var e;return le?Xe:(e=performance.interactionCount)!=null?e:0},Lt=()=>{"interactionCount"in performance||le||(le=F("event",It,{type:"event",buffered:!0,durationThreshold:0}))},ze=0,ue=class{constructor(){w(this,"u",[]);w(this,"l",new Map);w(this,"m");w(this,"v")}p(){ze=Ve(),this.u.length=0,this.l.clear()}P(){let t=Math.min(this.u.length-1,Math.floor((Ve()-ze)/50));return this.u[t]}h(t){var i,o;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((d,c)=>c.T-d.T),this.u.length>10){let d=this.u.splice(10);for(let c of d)this.l.delete(c.id)}(o=this.v)==null||o.call(this,n)}}},Ye=e=>{let t=globalThis.requestIdleCallback||setTimeout;document.visibilityState==="hidden"?e():(e=be(e),document.addEventListener("visibilitychange",e,{once:!0}),t(()=>{e(),document.removeEventListener("visibilitychange",e)}))},je=[200,500],Ze=(e,t={})=>{globalThis.PerformanceEventTiming&&"interactionId"in PerformanceEventTiming.prototype&&Q(()=>{var c;Lt();let r,n=E("INP"),i=me(t,ue),o=u=>{Ye(()=>{for(let T of u)i.h(T);let f=i.P();f&&f.T!==n.value&&(n.value=f.T,n.entries=f.entries,r())})},d=F("event",o,{durationThreshold:(c=t.durationThreshold)!=null?c:40});r=v(e,n,je,t.reportAllChanges),d&&(d.observe({type:"first-input",buffered:!0}),document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&(o(d.takeRecords()),r(!0))}),x(()=>{i.p(),n=E("INP"),r=v(e,n,je,t.reportAllChanges)}))})},de=class{constructor(){w(this,"m")}h(t){var r;(r=this.m)==null||r.call(this,t)}},Ke=[2500,4e3],et=(e,t={})=>{Q(()=>{let r=Je(),n,i=E("LCP"),o=me(t,de),d=u=>{t.reportAllChanges||(u=u.slice(-1));for(let f of u)o.h(f),f.startTime<r.firstHiddenTime&&(i.value=Math.max(f.startTime-_(),0),i.entries=[f],n())},c=F("largest-contentful-paint",d);if(c){n=v(e,i,Ke,t.reportAllChanges);let u=be(()=>{d(c.takeRecords()),c.disconnect(),n(!0)});for(let f of["keydown","click","visibilitychange"])addEventListener(f,()=>Ye(u),{capture:!0,once:!0});x(f=>{i=E("LCP"),n=v(e,i,Ke,t.reportAllChanges),pe(()=>{i.value=performance.now()-f.timeStamp,n(!0)})})}})},qe=[800,1800],fe=e=>{document.prerendering?Q(()=>fe(e)):document.readyState!=="complete"?addEventListener("load",()=>fe(e),!0):setTimeout(e)},tt=(e,t={})=>{let r=E("TTFB"),n=v(e,r,qe,t.reportAllChanges);fe(()=>{let i=ge();i&&(r.value=Math.max(i.responseStart-_(),0),r.entries=[i],n(!0),x(()=>{r=E("TTFB",0),n=v(e,r,qe,t.reportAllChanges),n(!0)}))})};var G={lcp:null,cls:null,inp:null,fcp:null,ttfb:null},D=!1,J=null;function xt(){if(D)return;Object.values(G).every(t=>t!==null)&&ye()}function ye(){D||(D=!0,J&&(clearTimeout(J),J=null),s("Sending web vitals data:",G),p("performance",{eventName:"web-vitals",webVitals:G}))}function U(e){if(D)return;let t=e.name.toLowerCase();G[t]=e.value,s(`Collected ${t}:`,e.value),xt()}function rt(){if(!l.enableWebVitals){s("Web vitals tracking is disabled.");return}s("Initializing web vitals tracking...");try{et(U),Ge(U),Ze(U),he(U),tt(U),J=setTimeout(()=>{D||(s("Web vitals timeout reached, sending collected metrics."),ye())},2e4),window.addEventListener("beforeunload",()=>{D||ye()}),s("Web vitals tracking initialized successfully.")}catch(e){a("Error setting up web vitals tracking:",e)}}var N=null,B=null;function nt(){l.trackErrors&&(s("Setting up error tracking"),N=e=>{Dt(e)},B=e=>{Ot(e)},window.addEventListener("error",N),window.addEventListener("unhandledrejection",B))}function it(){N&&(window.removeEventListener("error",N),N=null),B&&(window.removeEventListener("unhandledrejection",B),B=null),s("Error tracking cleaned up")}function Dt(e){var o,d;let t=window.location.origin,r=e.filename||"";if(r)try{if(new URL(r).origin!==t){s("Skipping third-party error:",r);return}}catch(c){}let n=((o=e.error)==null?void 0:o.stack)||"";if(!r&&n&&!n.includes(t)){s("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()};X(((d=e.error)==null?void 0:d.name)||"Error",i)}function Ot(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()};X("UnhandledRejection",n)}function X(e,t,r){let n=g({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),p("error",{eventName:e,properties:n})}function ot(e,t){var r,n;if(!l.trackErrors){a("Error tracking is not enabled. Enable it via remote 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()};X(((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()};X(e.name||"Error",i,t)}}var H=null;function at(){l.trackButtonClicks&&(s("Setting up button click tracking"),H=e=>{At(e)},document.addEventListener("click",H,!0))}function st(){H&&(document.removeEventListener("click",H,!0),H=null)}function At(e){var o;let t=e.target;if(!t)return;let r=Mt(t);if(!r||r.hasAttribute("data-rybbit-event"))return;let n=g({},_t(r)),i=(o=r.textContent)==null?void 0:o.trim().substring(0,100);i&&(n.text=i),p("button_click",{properties:n})}function Mt(e){var n;if(e.tagName==="BUTTON"||e.getAttribute("role")==="button")return e;if(e.tagName==="INPUT"){let i=(n=e.type)==null?void 0:n.toLowerCase();if(i==="submit"||i==="button")return e}let t=e.parentElement,r=0;for(;t&&r<3;){if(t.tagName==="BUTTON"||t.getAttribute("role")==="button")return t;t=t.parentElement,r++}return null}function _t(e){let t={};for(let r of e.attributes)if(r.name.startsWith("data-rybbit-prop-")){let n=r.name.replace("data-rybbit-prop-","");t[n]=r.value}return t}var W=null;function ct(){l.trackCopy&&(s("Setting up copy tracking"),W=()=>{Ft()},document.addEventListener("copy",W))}function lt(){W&&(document.removeEventListener("copy",W),W=null)}function Ft(){let e=window.getSelection();if(!e||e.isCollapsed)return;let t=e.toString(),r=t.length;if(r===0)return;let n=e.anchorNode,i=n instanceof HTMLElement?n:n==null?void 0:n.parentElement;if(!i)return;let o=we(g({text:t.substring(0,500)},r>500&&{textLength:r}),{sourceElement:i.tagName.toLowerCase()});p("copy",{properties:o})}var $=null,V=null;function ut(){l.trackFormInteractions&&(s("Setting up form tracking"),$=e=>{Ut(e)},V=e=>{Nt(e)},document.addEventListener("submit",$,!0),document.addEventListener("change",V,!0))}function dt(){$&&(document.removeEventListener("submit",$,!0),$=null),V&&(document.removeEventListener("change",V,!0),V=null)}function Ut(e){let t=e.target;if(t.tagName!=="FORM")return;let r=g({formId:t.id||"",formName:t.name||"",formAction:t.getAttribute("action")||"",method:(t.method||"get").toUpperCase(),fieldCount:t.elements.length},ft(t));p("form_submit",{properties:r})}function Nt(e){var o,d,c;let t=e.target,r=t.tagName.toUpperCase();if(!["INPUT","SELECT","TEXTAREA"].includes(r))return;if(r==="INPUT"){let u=(o=t.type)==null?void 0:o.toLowerCase();if(u==="hidden"||u==="password")return}let n=g({element:r.toLowerCase(),inputName:t.name||t.id||""},ft(t));r==="INPUT"&&(n.inputType=(d=t.type)==null?void 0:d.toLowerCase());let i=(c=t.form)==null?void 0:c.id;i&&(n.formId=i),p("input_change",{properties:n})}function ft(e){let t={};for(let r of e.attributes)if(r.name.startsWith("data-rybbit-prop-")){let n=r.name.replace("data-rybbit-prop-","");t[n]=r.value}return t}var Z=null,O=!1,ke=null,R=[],Y,ve;async function pt(e){if(l.enableSessionReplay){ve=e;try{Z=(await import("rrweb")).record,s("rrweb loaded successfully"),gt()}catch(t){a("Failed to load rrweb. Make sure it's installed as a peer dependency:",t)}}}function gt(){var e,t,r,n,i,o,d,c;if(!(O||!Z||!l.enableSessionReplay))try{let u=l.replayPrivacyConfig||{},f={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={script:!1,comment:!0,headFavicon:!0,headWhitespace:!0,headMetaDescKeywords:!0,headMetaSocial:!0,headMetaRobots:!0,headMetaHttpEquiv:!0,headMetaAuthorship:!0,headMetaVerification:!0},C={emit:b=>{Bt({type:b.type,data:b.data,timestamp:b.timestamp||Date.now()})},recordCanvas:!1,checkoutEveryNms:6e4,checkoutEveryNth:500,blockClass:(e=u.blockClass)!=null?e:"rr-block",blockSelector:(t=u.blockSelector)!=null?t:void 0,ignoreClass:(r=u.ignoreClass)!=null?r:"rr-ignore",ignoreSelector:(n=u.ignoreSelector)!=null?n:void 0,maskTextClass:(i=u.maskTextClass)!=null?i:"rr-mask",maskAllInputs:(o=u.maskAllInputs)!=null?o:!0,maskInputOptions:{password:!0,email:!0},collectFonts:(d=u.collectFonts)!=null?d:!0,sampling:f,slimDOMOptions:(c=u.slimDOMOptions)!=null?c:T};u.maskTextSelectors&&u.maskTextSelectors.length>0&&(C.maskTextSelector=u.maskTextSelectors.join(", ")),ke=Z(C),O=!0,Ht(),s("Session replay recording started")}catch(u){a("Failed to start session replay recording:",u)}}function mt(){if(!l.enableSessionReplay){a("Session replay is not enabled. Enable it via remote config.");return}if(!Z){a("rrweb is not loaded. Ensure it's installed as a peer dependency.");return}if(O){s("Session replay is already recording");return}gt()}function Ee(){if(!O){s("Session replay is not currently recording");return}ke&&ke(),O=!1,ht(),R.length>0&&Te(),s("Session replay recording stopped")}function bt(){return O}function Bt(e){R.push(e),R.length>=250&&Te()}function Ht(){ht(),Y=window.setInterval(()=>{R.length>0&&Te()},5e3)}function ht(){Y!==void 0&&(clearInterval(Y),Y=void 0)}function Te(){if(R.length===0)return;let e=[...R];R=[];let t={userId:ve||"",events:e,metadata:{pageUrl:window.location.href,viewportWidth:screen.width,viewportHeight:screen.height,language:navigator.language}};Wt(t).catch(r=>{a("Failed to send session replay batch:",r),R.unshift(...e)})}async function Wt(e){let t=`${l.analyticsHost}/session-replay/record/${l.siteId}`,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}`);s(`Session replay batch sent: ${e.events.length} events`)}function yt(e){ve=e}function kt(){Ee()}var m=!1,$t={init:async e=>{if(m){a("Rybbit SDK already initialized. Call init() only once.");return}await Pe(e)&&(m=!0,s("Config:",g({},l)),Me(),_e(),rt(),nt(),at(),ct(),ut(),await pt(ie()||void 0))},pageview:e=>{if(!m){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}p("pageview",{pathOverride:e})},event:(e,t)=>{if(!m){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}if(!e){a("Event name is required and must be a string.");return}p("custom_event",{eventName:e,properties:t})},trackOutbound:(e,t="",r="_self")=>{if(!m){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}if(!e){a("Outbound link URL is required and must be a string.");return}p("outbound",{properties:{url:e,text:t,target:r}})},identify:(e,t)=>{if(!m){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}xe(e,t),yt(e)},setTraits:e=>{if(!m){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}De(e)},clearUserId:()=>{if(!m){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}Oe()},getUserId:()=>m?ie():(a("Rybbit SDK not initialized. Call rybbit.init() first."),null),error:(e,t)=>{if(!m){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}ot(e,t)},onPageChange:e=>m?Ue(e):(a("Rybbit SDK not initialized. Call rybbit.init() first."),()=>{}),startSessionReplay:()=>{if(!m){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}mt()},stopSessionReplay:()=>{if(!m){a("Rybbit SDK not initialized. Call rybbit.init() first.");return}Ee()},isSessionReplayActive:()=>m?bt():(a("Rybbit SDK not initialized. Call rybbit.init() first."),!1),cleanup:()=>{Ne(),it(),st(),lt(),dt(),kt(),m=!1}},Vr=$t;export{Vr as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rybbit/js",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "Rybbit Web SDK",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -15,7 +15,9 @@
15
15
  ],
16
16
  "scripts": {
17
17
  "build": "tsup",
18
- "typecheck": "tsc --noEmit"
18
+ "typecheck": "tsc --noEmit",
19
+ "test": "vitest",
20
+ "test:run": "vitest run"
19
21
  },
20
22
  "repository": {
21
23
  "type": "git",
@@ -48,6 +50,8 @@
48
50
  "rrweb": "^2.0.0-alpha.4",
49
51
  "tsup": "^8.5.0",
50
52
  "typescript": "^5.8.3",
51
- "web-vitals": "^5.0.3"
53
+ "vitest": "^3.2.4",
54
+ "web-vitals": "^5.0.3",
55
+ "jsdom": "^26.0.0"
52
56
  }
53
57
  }