userlens-analytics-sdk 0.1.83 → 0.1.85

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
@@ -178,7 +178,13 @@ This mode sends events directly to the Userlens API from the frontend.
178
178
  const collector = new EventCollector({
179
179
  userId: "user-123", // ✅ required
180
180
  WRITE_CODE: "your-public-write-code", // ✅ required
181
- userTraits: { plan: "starter" }, // optional
181
+ userTraits: { plan: "starter" }, // ✅ required, pass as many traits as you can so Userlens provides better insights
182
+ groupId: "group-123", // passed to identify a group (e.g. company that the user belongs to)
183
+ groupTraits: {
184
+ domain: "userlens.io",
185
+ title: "Userlens",
186
+ industry: "Software"
187
+ }, // traits that exist on your group object (e.g. company workspace traits)
182
188
  intervalTime: 5000, // optional
183
189
  });
184
190
  ```
@@ -257,8 +263,16 @@ const config = useMemo(
257
263
  // Required only if you're enabling session recording
258
264
  // or using auto-upload mode for EventCollector
259
265
  userId: "user-123",
260
- // Optional — used when letting the SDK handle event uploads automatically
266
+ // Used when letting the SDK handle event uploads automatically. Keeps traits up-to-date.
261
267
  userTraits: { email: "jane@example.com" },
268
+ // Used when letting the SDK handle event uploads automatically. Associates user with a group (e.g. company).
269
+ groupId: "company-123",
270
+ // Used when letting the SDK handle event uploads automatically. Keeps group traits up-to-date.
271
+ groupTraits: {
272
+ domain: "userlens.io",
273
+ title: "Userlens",
274
+ industry: "Software"
275
+ },
262
276
  eventCollector: {
263
277
  // Required when you want to manually handle event forwarding
264
278
  callback: (events) => {
package/dist/main.cjs.js CHANGED
@@ -5,5 +5,5 @@
5
5
  * MIT License | (c) Dustin Diaz 2012-2015
6
6
  * MIT License | (c) Denis Demchenko 2015-2019
7
7
  */class Iw{static getParser(e,t=!1){if("string"!=typeof e)throw new Error("UserAgent should be a string");return new Cw(e,t)}static parse(e){return new Cw(e).getResult()}static get BROWSER_MAP(){return pw}static get ENGINE_MAP(){return mw}static get OS_MAP(){return fw}static get PLATFORMS_MAP(){return dw}}var xw="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function kw(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Ow,Mw={exports:{}},Aw=Mw.exports;
8
- /*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */function Ew(){return Ow||(Ow=1,e=Mw,function(t){e.exports=function(e){if(e.CSS&&e.CSS.escape)return e.CSS.escape;var t=function(e){if(0==arguments.length)throw new TypeError("`CSS.escape` requires an argument.");for(var t,r=String(e),s=r.length,n=-1,i="",o=r.charCodeAt(0);++n<s;)0!=(t=r.charCodeAt(n))?i+=t>=1&&t<=31||127==t||0==n&&t>=48&&t<=57||1==n&&t>=48&&t<=57&&45==o?"\\"+t.toString(16)+" ":0==n&&1==s&&45==t||!(t>=128||45==t||95==t||t>=48&&t<=57||t>=65&&t<=90||t>=97&&t<=122)?"\\"+r.charAt(n):r.charAt(n):i+="�";return i};return e.CSS||(e.CSS={}),e.CSS.escape=t,t}(t)}(void 0!==xw?xw:Aw)),Mw.exports;var e}var Rw,Nw,Tw,Pw={};var Fw,Dw,Lw,Bw,_w,Uw,jw,zw,Ww,Vw,Gw,Zw,Yw,Jw,$w,Xw,Hw,Kw,Qw,qw=function(){if(Tw)return Nw;Tw=1,Ew();const{ShadowRootTypes:e,nodeNameInCorrectCase:t,NodeType:r}=(Rw||(Rw=1,Pw.nodeNameInCorrectCase=function(e){const t=e.shadowRoot&&e.shadowRoot.mode;return t?"#shadow-root ("+t+")":e.localName?e.localName.length!==e.nodeName.length?e.nodeName:e.localName:e.nodeName},Pw.shadowRootType=function(e){const t=e.ancestorShadowRoot();return t?t.mode:null},Pw.NodeType={ELEMENT_NODE:1,ATTRIBUTE_NODE:2,TEXT_NODE:3,CDATA_SECTION_NODE:4,PROCESSING_INSTRUCTION_NODE:7,COMMENT_NODE:8,DOCUMENT_NODE:9},Pw.ShadowRootTypes={UserAgent:"user-agent",Open:"open",Closed:"closed"}),Pw);let s={DOMPath:{}};return s.DOMPath.fullQualifiedSelector=function(e,t){try{return e.nodeType!==r.ELEMENT_NODE?e.localName||e.nodeName.toLowerCase():s.DOMPath.cssPath(e,t)}catch(e){return null}},s.DOMPath.cssPath=function(e,t){if(e.nodeType!==r.ELEMENT_NODE)return"";const n=[];let i=e;for(;i;){const r=s.DOMPath._cssPathStep(i,!!t,i===e);if(!r)break;if(n.push(r),r.optimized)break;i=i.parentNode}return n.reverse(),n.join(" > ")},s.DOMPath.canGetJSPath=function(t){let r=t;for(;r;){if(r.shadowRoot&&r.shadowRoot.mode!==e.Open)return!1;r=r.shadowRoot&&r.shadowRoot.host}return!0},s.DOMPath.jsPath=function(e,t){if(e.nodeType!==r.ELEMENT_NODE)return"";const n=[];let i=e;for(;i;)n.push(s.DOMPath.cssPath(i,t)),i=i.shadowRoot&&i.shadowRoot.host;n.reverse();let o="";for(let e=0;e<n.length;++e){const t=JSON.stringify(n[e]);o+=e?`.shadowRoot.querySelector(${t})`:`document.querySelector(${t})`}return o},s.DOMPath._cssPathStep=function(e,n,i){if(e.nodeType!==r.ELEMENT_NODE)return null;const o=e.getAttribute("id");if(n){if(o)return new s.DOMPath.Step(h(o),!0);const r=e.nodeName.toLowerCase();if("body"===r||"head"===r||"html"===r)return new s.DOMPath.Step(t(e),!0)}const a=t(e);if(o)return new s.DOMPath.Step(a+h(o),!0);const l=e.parentNode;if(!l||l.nodeType===r.DOCUMENT_NODE)return new s.DOMPath.Step(a,!0);function c(e){const t=e.getAttribute("class");return t?t.split(/\s+/g).filter(Boolean).map(function(e){return"$"+e}):[]}function h(e){return"#"+CSS.escape(e)}const u=c(e);let p=!1,d=!1,f=-1,m=-1;const g=l.children;for(let s=0;(-1===f||!d)&&s<g.length;++s){const n=g[s];if(n.nodeType!==r.ELEMENT_NODE)continue;if(m+=1,n===e){f=m;continue}if(d)continue;if(t(n)!==a)continue;p=!0;const i=new Set(u);if(!i.size){d=!0;continue}const o=c(n);for(let e=0;e<o.length;++e){const t=o[e];if(i.has(t)&&(i.delete(t),!i.size)){d=!0;break}}}let y=a;if(i&&"input"===a.toLowerCase()&&e.getAttribute("type")&&!e.getAttribute("id")&&!e.getAttribute("class")&&(y+="[type="+CSS.escape(e.getAttribute("type"))+"]"),d)y+=":nth-child("+(f+1)+")";else if(p)for(const e of u)y+="."+CSS.escape(e.slice(1));return new s.DOMPath.Step(y,!1)},s.DOMPath.xPath=function(e,t){if(e.nodeType===r.DOCUMENT_NODE)return"/";const n=[];let i=e;for(;i;){const e=s.DOMPath._xPathValue(i,t);if(!e)break;if(n.push(e),e.optimized)break;i=i.parentNode}return n.reverse(),(n.length&&n[0].optimized?"":"/")+n.join("/")},s.DOMPath._xPathValue=function(e,t){let n;const i=s.DOMPath._xPathIndex(e);if(-1===i)return null;switch(e.nodeType){case r.ELEMENT_NODE:if(t&&e.getAttribute("id"))return new s.DOMPath.Step('//*[@id="'+e.getAttribute("id")+'"]',!0);n=e.localName;break;case r.ATTRIBUTE_NODE:n="@"+e.nodeName;break;case r.TEXT_NODE:case r.CDATA_SECTION_NODE:n="text()";break;case r.PROCESSING_INSTRUCTION_NODE:n="processing-instruction()";break;case r.COMMENT_NODE:n="comment()";break;case r.DOCUMENT_NODE:default:n=""}return i>0&&(n+="["+i+"]"),new s.DOMPath.Step(n,e.nodeType===r.DOCUMENT_NODE)},s.DOMPath._xPathIndex=function(e){function t(e,t){if(e===t)return!0;if(e.nodeType===r.ELEMENT_NODE&&t.nodeType===r.ELEMENT_NODE)return e.localName===t.localName;if(e.nodeType===t.nodeType)return!0;return(e.nodeType===r.CDATA_SECTION_NODE?r.TEXT_NODE:e.nodeType)===(t.nodeType===r.CDATA_SECTION_NODE?r.TEXT_NODE:t.nodeType)}const s=e.parentNode?e.parentNode.children:null;if(!s)return 0;let n;for(let r=0;r<s.length;++r)if(t(e,s[r])&&s[r]!==e){n=!0;break}if(!n)return 0;let i=1;for(let r=0;r<s.length;++r)if(t(e,s[r])){if(s[r]===e)return i;++i}return-1},s.DOMPath.Step=class{constructor(e,t){this.value=e,this.optimized=t||!1}toString(){return this.value}},Nw=s.DOMPath}(),eb=kw(qw);Dw=new WeakMap,Lw=new WeakMap,Bw=new WeakMap,_w=new WeakMap,Uw=new WeakMap,$w=new WeakMap,Fw=new WeakSet,jw=function(){document.addEventListener("click",e(this,_w,"f"),!0)},zw=function(t){try{const r=t.target;if(!(r instanceof HTMLElement))return;const s=eb.xPath(r,!0),n=this.useLighterSnapshot?e(this,Fw,"m",Ww).call(this,r):e(this,Fw,"m",Vw).call(this,r),i={event:s,is_raw:!0,snapshot:n?[n]:[],properties:{...this.getUserContext(),...this.getPageMetadata()}};this.userId&&(i.userId=this.userId),this.events.push(i),this.events.length>100&&(this.events=this.events.slice(-100))}catch(e){}},Ww=function(t){if(!(t instanceof HTMLElement))return null;const r=document.body;if(!r)return null;const s=[];let n=t;for(;n&&1===n.nodeType&&n!==r;)s.unshift(n),n=n.parentElement;const i=[r,...s.filter(e=>e!==r)];let o=null,a=null;for(let t=0;t<i.length;t++){const r=i[t],s=t===i.length-1,n=e(this,Fw,"m",Gw).call(this,r,{isTarget:s,leadsToTarget:!s});o||(o=n),a&&(a.children||(a.children=[]),a.children.push(n)),a=n}const l=a;return l&&t.children.length>0&&(l.children=Array.from(t.children).filter(e=>e instanceof HTMLElement).map(t=>e(this,Fw,"m",Gw).call(this,t,{includeChildren:!0})).filter(Boolean)),o},Vw=function(t){if(!(t instanceof HTMLElement))return null;const r=[];let s=t;for(;s&&1===s.nodeType;)r.unshift(s),s=s.parentElement;let n=null,i=null;for(let t=0;t<r.length;t++){const s=r[t],o=t>=r.length-3,a=t===r.length-1,l=e(this,Fw,"m",Gw).call(this,s,{isTarget:a,leadsToTarget:!0});let c=[l];if(o&&s.parentElement){c=[l,...Array.from(s.parentElement.children).filter(e=>e!==s&&e instanceof HTMLElement).map(t=>e(this,Fw,"m",Gw).call(this,t,{includeChildren:!0})).filter(Boolean)]}n||(n=l),i&&(i.children||(i.children=[]),i.children.push(...c)),i=l}return n},Gw=function t(r,{isTarget:s=!1,includeChildren:n=!1,leadsToTarget:i=!1}={}){var o,a;const l=r.tagName.toLowerCase(),c=r.classList.length?Array.from(r.classList):null,h=r.id||null,u=r.getAttribute("href")||null,p=Array.from((null===(o=r.parentNode)||void 0===o?void 0:o.children)||[]).indexOf(r)+1,d=Array.from((null===(a=r.parentNode)||void 0===a?void 0:a.children)||[]).filter(e=>e instanceof HTMLElement&&e.tagName===r.tagName).indexOf(r)+1,f={};for(let e of Array.from(r.attributes))f[`attr__${e.name}`]=e.value;const m=Array.from(r.childNodes).filter(e=>e.nodeType===Node.TEXT_NODE),g=m.map(e=>{var t;return null===(t=e.textContent)||void 0===t?void 0:t.trim()}).filter(Boolean).join(" ")||null,y={tag_name:l,nth_child:p,nth_of_type:d,attributes:f,...c?{attr_class:c}:{},...h?{attr_id:h}:{},...u?{href:u}:{},...g?{text:g}:{},...s?{is_target:!0}:{},...i&&!s?{leads_to_target:!0}:{}};return(n&&r.children.length>0||s)&&(y.children=Array.from(r.children).filter(e=>e instanceof HTMLElement).map(r=>e(this,Fw,"m",t).call(this,r,{includeChildren:!0})).filter(Boolean)),y},Zw=function(){t(this,Dw,setInterval(()=>{e(this,$w,"f").call(this)},this.intervalTime),"f")},Yw=function(){t(this,Lw,history.pushState,"f"),t(this,Bw,history.replaceState,"f"),history.pushState=(...t)=>{e(this,Lw,"f").apply(history,t),e(this,Fw,"m",Jw).call(this)},history.replaceState=(...t)=>{e(this,Bw,"f").apply(history,t),e(this,Fw,"m",Jw).call(this)},window.addEventListener("popstate",e(this,Uw,"f"))},Jw=function(){if(function(){if("undefined"==typeof window)return!1;const e=window.location.hostname;return"localhost"===e||"127.0.0.1"===e||"::1"===e||e.endsWith(".localhost")}())return;const e={event:"$ul_pageview",properties:this.getPageMetadata()};this.userId&&(e.userId=this.userId),this.events.push(e)},Xw=function(){this.events=[]},Hw=function(){document.removeEventListener("click",e(this,_w,"f"),!0)},Kw=function(){e(this,$w,"f").call(this),clearInterval(e(this,Dw,"f")),e(this,Fw,"m",Xw).call(this)},Qw=function(){history.pushState=e(this,Lw,"f"),history.replaceState=e(this,Bw,"f"),window.removeEventListener("popstate",e(this,Uw,"f"))},exports.EventCollector=class{constructor(t){if(Fw.add(this),this.useLighterSnapshot=!1,this.userContext=null,Dw.set(this,void 0),Lw.set(this,void 0),Bw.set(this,void 0),_w.set(this,e(this,Fw,"m",zw).bind(this)),Uw.set(this,e(this,Fw,"m",Jw).bind(this)),$w.set(this,()=>{if(0===this.events.length)return;const t=[...this.events];if(this.callback){try{this.callback(t)}catch(e){}e(this,Fw,"m",Xw).call(this)}else Promise.allSettled([this.userId&&this.userTraits?Xy({userId:this.userId,traits:this.userTraits}):null,this.groupId?Hy({groupId:this.groupId,traits:this.groupTraits,userId:this.userId}):null,Ky(t)]),e(this,Fw,"m",Xw).call(this)}),"undefined"==typeof window)return;const{userId:r,WRITE_CODE:s,callback:n,intervalTime:i=5e3,skipRawEvents:o=!1,useLighterSnapshot:a=!1}=t,l=t.userTraits,c=t.groupId,h=t.groupTraits;this.autoUploadModeEnabled=!n,this.autoUploadModeEnabled&&!(null==r?void 0:r.length)||this.autoUploadModeEnabled&&!(null==s?void 0:s.length)||(this.autoUploadModeEnabled&&Qy(s),(this.autoUploadModeEnabled||"function"==typeof n)&&(this.userId=r,this.userTraits="object"==typeof l&&null!==l?l:{},this.callback=n,this.intervalTime=i,this.events=[],c&&(this.groupId=c,this.groupTraits="object"==typeof h&&null!==h?h:{}),o||(this.useLighterSnapshot=a,e(this,Fw,"m",jw).call(this),e(this,Fw,"m",Yw).call(this)),e(this,Fw,"m",Zw).call(this),this.userContext=this.getUserContext()))}pushEvent(e){const t={is_raw:!1,...e,properties:{...null==e?void 0:e.properties,...this.getUserContext(),...this.getPageMetadata()}};this.userId&&(t.userId=this.userId),this.events.push(t)}identify(e,t){return Xy({userId:e,traits:t})}group(e,t){return Hy({groupId:e,traits:t,userId:this.userId})}updateUserTraits(e){this.userTraits=e}updateGroupTraits(e){this.groupTraits=e}stop(){e(this,Fw,"m",Hw).call(this),e(this,Fw,"m",Kw).call(this),e(this,Fw,"m",Qw).call(this)}getUserContext(){var e,t,r,s,n,i,o;if(this.userContext)return this.userContext;const a=Iw.getParser(window.navigator.userAgent),l=a.getBrowser(),c=a.getOS(),h={$ul_browser:null!==(e=l.name)&&void 0!==e?e:"Unknown",$ul_browser_version:null!==(t=l.version)&&void 0!==t?t:"Unknown",$ul_os:null!==(r=c.name)&&void 0!==r?r:"Unknown",$ul_os_version:null!==(s=c.versionName)&&void 0!==s?s:"Unknown",$ul_browser_language:null!==(n=navigator.language)&&void 0!==n?n:"en-US",$ul_browser_language_prefix:null!==(o=null===(i=navigator.language)||void 0===i?void 0:i.split("-")[0])&&void 0!==o?o:"en",$ul_screen_width:window.screen.width,$ul_screen_height:window.screen.height,$ul_viewport_width:window.innerWidth,$ul_viewport_height:window.innerHeight,$ul_lib:"userlens.js",$ul_lib_version:"0.1.83",$ul_device_type:/Mobi|Android/i.test(navigator.userAgent)?"Mobile":"Desktop",$ul_timezone:Intl.DateTimeFormat().resolvedOptions().timeZone};return this.userContext=h,h}getPageMetadata(){try{const e=new URL(window.location.href);let t=document.referrer||"$direct",r="$direct";try{t&&/^https?:\/\//.test(t)&&(r=new URL(t).hostname)}catch(e){}const s=e.search.slice(1);return{$ul_page:e.origin+e.pathname,$ul_pathname:e.pathname,$ul_host:e.host,$ul_referrer:t,$ul_referring_domain:r,$ul_query:s}}catch(e){return{$ul_page:"",$ul_pathname:"",$ul_host:"",$ul_referrer:"",$ul_referring_domain:"",$ul_query:""}}}},exports.SessionRecorder=class{constructor({WRITE_CODE:r,userId:s,recordingOptions:n={}}){if(qy.add(this),this.sessionEvents=[],this.rrwebStop=null,ew.set(this,void 0),iw.set(this,()=>{document.visibilityState&&gc()}),"undefined"==typeof window&&console.error("Userlens SDK error: unavailable outside of browser environment."),!(null==r?void 0:r.trim()))throw new Error("Userlens SDK Error: WRITE_CODE is required and must be a string");(null==s?void 0:s.trim())||console.error("Userlens SDK Error: userId is required to identify session user.");const{TIMEOUT:i=18e5,BUFFER_SIZE:o=10,maskingOptions:a=["passwords"]}=n;if("string"!=typeof r)throw new Error("WRITE_CODE must be a string to base64 encode it");Qy(r),this.userId=s,this.TIMEOUT=i,this.BUFFER_SIZE=o,this.maskingOptions=a,this.sessionEvents=[],t(this,ew,e(this,qy,"m",aw).call(this,()=>{e(this,qy,"m",lw).call(this)},5e3),"f"),e(this,qy,"m",tw).call(this)}stop(){this.rrwebStop&&(this.rrwebStop(),this.rrwebStop=null,e(this,qy,"m",cw).call(this),e(this,qy,"m",hw).call(this),window.removeEventListener("visibilitychange",e(this,iw,"f")))}};
8
+ /*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */function Ew(){return Ow||(Ow=1,e=Mw,function(t){e.exports=function(e){if(e.CSS&&e.CSS.escape)return e.CSS.escape;var t=function(e){if(0==arguments.length)throw new TypeError("`CSS.escape` requires an argument.");for(var t,r=String(e),s=r.length,n=-1,i="",o=r.charCodeAt(0);++n<s;)0!=(t=r.charCodeAt(n))?i+=t>=1&&t<=31||127==t||0==n&&t>=48&&t<=57||1==n&&t>=48&&t<=57&&45==o?"\\"+t.toString(16)+" ":0==n&&1==s&&45==t||!(t>=128||45==t||95==t||t>=48&&t<=57||t>=65&&t<=90||t>=97&&t<=122)?"\\"+r.charAt(n):r.charAt(n):i+="�";return i};return e.CSS||(e.CSS={}),e.CSS.escape=t,t}(t)}(void 0!==xw?xw:Aw)),Mw.exports;var e}var Rw,Nw,Tw,Pw={};var Fw,Dw,Lw,Bw,_w,Uw,jw,zw,Ww,Vw,Gw,Zw,Yw,Jw,$w,Xw,Hw,Kw,Qw,qw=function(){if(Tw)return Nw;Tw=1,Ew();const{ShadowRootTypes:e,nodeNameInCorrectCase:t,NodeType:r}=(Rw||(Rw=1,Pw.nodeNameInCorrectCase=function(e){const t=e.shadowRoot&&e.shadowRoot.mode;return t?"#shadow-root ("+t+")":e.localName?e.localName.length!==e.nodeName.length?e.nodeName:e.localName:e.nodeName},Pw.shadowRootType=function(e){const t=e.ancestorShadowRoot();return t?t.mode:null},Pw.NodeType={ELEMENT_NODE:1,ATTRIBUTE_NODE:2,TEXT_NODE:3,CDATA_SECTION_NODE:4,PROCESSING_INSTRUCTION_NODE:7,COMMENT_NODE:8,DOCUMENT_NODE:9},Pw.ShadowRootTypes={UserAgent:"user-agent",Open:"open",Closed:"closed"}),Pw);let s={DOMPath:{}};return s.DOMPath.fullQualifiedSelector=function(e,t){try{return e.nodeType!==r.ELEMENT_NODE?e.localName||e.nodeName.toLowerCase():s.DOMPath.cssPath(e,t)}catch(e){return null}},s.DOMPath.cssPath=function(e,t){if(e.nodeType!==r.ELEMENT_NODE)return"";const n=[];let i=e;for(;i;){const r=s.DOMPath._cssPathStep(i,!!t,i===e);if(!r)break;if(n.push(r),r.optimized)break;i=i.parentNode}return n.reverse(),n.join(" > ")},s.DOMPath.canGetJSPath=function(t){let r=t;for(;r;){if(r.shadowRoot&&r.shadowRoot.mode!==e.Open)return!1;r=r.shadowRoot&&r.shadowRoot.host}return!0},s.DOMPath.jsPath=function(e,t){if(e.nodeType!==r.ELEMENT_NODE)return"";const n=[];let i=e;for(;i;)n.push(s.DOMPath.cssPath(i,t)),i=i.shadowRoot&&i.shadowRoot.host;n.reverse();let o="";for(let e=0;e<n.length;++e){const t=JSON.stringify(n[e]);o+=e?`.shadowRoot.querySelector(${t})`:`document.querySelector(${t})`}return o},s.DOMPath._cssPathStep=function(e,n,i){if(e.nodeType!==r.ELEMENT_NODE)return null;const o=e.getAttribute("id");if(n){if(o)return new s.DOMPath.Step(h(o),!0);const r=e.nodeName.toLowerCase();if("body"===r||"head"===r||"html"===r)return new s.DOMPath.Step(t(e),!0)}const a=t(e);if(o)return new s.DOMPath.Step(a+h(o),!0);const l=e.parentNode;if(!l||l.nodeType===r.DOCUMENT_NODE)return new s.DOMPath.Step(a,!0);function c(e){const t=e.getAttribute("class");return t?t.split(/\s+/g).filter(Boolean).map(function(e){return"$"+e}):[]}function h(e){return"#"+CSS.escape(e)}const u=c(e);let p=!1,d=!1,f=-1,m=-1;const g=l.children;for(let s=0;(-1===f||!d)&&s<g.length;++s){const n=g[s];if(n.nodeType!==r.ELEMENT_NODE)continue;if(m+=1,n===e){f=m;continue}if(d)continue;if(t(n)!==a)continue;p=!0;const i=new Set(u);if(!i.size){d=!0;continue}const o=c(n);for(let e=0;e<o.length;++e){const t=o[e];if(i.has(t)&&(i.delete(t),!i.size)){d=!0;break}}}let y=a;if(i&&"input"===a.toLowerCase()&&e.getAttribute("type")&&!e.getAttribute("id")&&!e.getAttribute("class")&&(y+="[type="+CSS.escape(e.getAttribute("type"))+"]"),d)y+=":nth-child("+(f+1)+")";else if(p)for(const e of u)y+="."+CSS.escape(e.slice(1));return new s.DOMPath.Step(y,!1)},s.DOMPath.xPath=function(e,t){if(e.nodeType===r.DOCUMENT_NODE)return"/";const n=[];let i=e;for(;i;){const e=s.DOMPath._xPathValue(i,t);if(!e)break;if(n.push(e),e.optimized)break;i=i.parentNode}return n.reverse(),(n.length&&n[0].optimized?"":"/")+n.join("/")},s.DOMPath._xPathValue=function(e,t){let n;const i=s.DOMPath._xPathIndex(e);if(-1===i)return null;switch(e.nodeType){case r.ELEMENT_NODE:if(t&&e.getAttribute("id"))return new s.DOMPath.Step('//*[@id="'+e.getAttribute("id")+'"]',!0);n=e.localName;break;case r.ATTRIBUTE_NODE:n="@"+e.nodeName;break;case r.TEXT_NODE:case r.CDATA_SECTION_NODE:n="text()";break;case r.PROCESSING_INSTRUCTION_NODE:n="processing-instruction()";break;case r.COMMENT_NODE:n="comment()";break;case r.DOCUMENT_NODE:default:n=""}return i>0&&(n+="["+i+"]"),new s.DOMPath.Step(n,e.nodeType===r.DOCUMENT_NODE)},s.DOMPath._xPathIndex=function(e){function t(e,t){if(e===t)return!0;if(e.nodeType===r.ELEMENT_NODE&&t.nodeType===r.ELEMENT_NODE)return e.localName===t.localName;if(e.nodeType===t.nodeType)return!0;return(e.nodeType===r.CDATA_SECTION_NODE?r.TEXT_NODE:e.nodeType)===(t.nodeType===r.CDATA_SECTION_NODE?r.TEXT_NODE:t.nodeType)}const s=e.parentNode?e.parentNode.children:null;if(!s)return 0;let n;for(let r=0;r<s.length;++r)if(t(e,s[r])&&s[r]!==e){n=!0;break}if(!n)return 0;let i=1;for(let r=0;r<s.length;++r)if(t(e,s[r])){if(s[r]===e)return i;++i}return-1},s.DOMPath.Step=class{constructor(e,t){this.value=e,this.optimized=t||!1}toString(){return this.value}},Nw=s.DOMPath}(),eb=kw(qw);Dw=new WeakMap,Lw=new WeakMap,Bw=new WeakMap,_w=new WeakMap,Uw=new WeakMap,$w=new WeakMap,Fw=new WeakSet,jw=function(){this.debug&&console.log("Userlens EventCollector: adding click event listener"),document.addEventListener("click",e(this,_w,"f"),!0),this.debug&&console.log("Userlens EventCollector: click event listener added")},zw=function(t){try{const r=t.target;if(!(r instanceof HTMLElement))return;const s=eb.xPath(r,!0),n=this.useLighterSnapshot?e(this,Fw,"m",Ww).call(this,r):e(this,Fw,"m",Vw).call(this,r),i={event:s,is_raw:!0,snapshot:n?[n]:[],properties:{...this.getUserContext(),...this.getPageMetadata()}};this.userId&&(i.userId=this.userId),this.events.push(i),this.events.length>100&&(this.events=this.events.slice(-100))}catch(e){console.warn("Userlens EventCollector error: click event handling failed",e)}},Ww=function(t){if(!(t instanceof HTMLElement))return null;const r=document.body;if(!r)return null;const s=[];let n=t;for(;n&&1===n.nodeType&&n!==r;)s.unshift(n),n=n.parentElement;const i=[r,...s.filter(e=>e!==r)];let o=null,a=null;for(let t=0;t<i.length;t++){const r=i[t],s=t===i.length-1,n=e(this,Fw,"m",Gw).call(this,r,{isTarget:s,leadsToTarget:!s});o||(o=n),a&&(a.children||(a.children=[]),a.children.push(n)),a=n}const l=a;return l&&t.children.length>0&&(l.children=Array.from(t.children).filter(e=>e instanceof HTMLElement).map(t=>e(this,Fw,"m",Gw).call(this,t,{includeChildren:!0})).filter(Boolean)),o},Vw=function(t){if(!(t instanceof HTMLElement))return null;const r=[];let s=t;for(;s&&1===s.nodeType;)r.unshift(s),s=s.parentElement;let n=null,i=null;for(let t=0;t<r.length;t++){const s=r[t],o=t>=r.length-3,a=t===r.length-1,l=e(this,Fw,"m",Gw).call(this,s,{isTarget:a,leadsToTarget:!0});let c=[l];if(o&&s.parentElement){c=[l,...Array.from(s.parentElement.children).filter(e=>e!==s&&e instanceof HTMLElement).map(t=>e(this,Fw,"m",Gw).call(this,t,{includeChildren:!0})).filter(Boolean)]}n||(n=l),i&&(i.children||(i.children=[]),i.children.push(...c)),i=l}return n},Gw=function t(r,{isTarget:s=!1,includeChildren:n=!1,leadsToTarget:i=!1}={}){var o,a;const l=r.tagName.toLowerCase(),c=r.classList.length?Array.from(r.classList):null,h=r.id||null,u=r.getAttribute("href")||null,p=Array.from((null===(o=r.parentNode)||void 0===o?void 0:o.children)||[]).indexOf(r)+1,d=Array.from((null===(a=r.parentNode)||void 0===a?void 0:a.children)||[]).filter(e=>e instanceof HTMLElement&&e.tagName===r.tagName).indexOf(r)+1,f={};for(let e of Array.from(r.attributes))f[`attr__${e.name}`]=e.value;const m=Array.from(r.childNodes).filter(e=>e.nodeType===Node.TEXT_NODE),g=m.map(e=>{var t;return null===(t=e.textContent)||void 0===t?void 0:t.trim()}).filter(Boolean).join(" ")||null,y={tag_name:l,nth_child:p,nth_of_type:d,attributes:f,...c?{attr_class:c}:{},...h?{attr_id:h}:{},...u?{href:u}:{},...g?{text:g}:{},...s?{is_target:!0}:{},...i&&!s?{leads_to_target:!0}:{}};return(n&&r.children.length>0||s)&&(y.children=Array.from(r.children).filter(e=>e instanceof HTMLElement).map(r=>e(this,Fw,"m",t).call(this,r,{includeChildren:!0})).filter(Boolean)),y},Zw=function(){t(this,Dw,setInterval(()=>{e(this,$w,"f").call(this)},this.intervalTime),"f")},Yw=function(){t(this,Lw,history.pushState,"f"),t(this,Bw,history.replaceState,"f"),history.pushState=(...t)=>{e(this,Lw,"f").apply(history,t),e(this,Fw,"m",Jw).call(this)},history.replaceState=(...t)=>{e(this,Bw,"f").apply(history,t),e(this,Fw,"m",Jw).call(this)},window.addEventListener("popstate",e(this,Uw,"f"))},Jw=function(){if(function(){if("undefined"==typeof window)return!1;const e=window.location.hostname;return"localhost"===e||"127.0.0.1"===e||"::1"===e||e.endsWith(".localhost")}())return;const e={event:"$ul_pageview",properties:this.getPageMetadata()};this.userId&&(e.userId=this.userId),this.events.push(e)},Xw=function(){this.events=[]},Hw=function(){document.removeEventListener("click",e(this,_w,"f"),!0)},Kw=function(){e(this,$w,"f").call(this),clearInterval(e(this,Dw,"f")),e(this,Fw,"m",Xw).call(this)},Qw=function(){history.pushState=e(this,Lw,"f"),history.replaceState=e(this,Bw,"f"),window.removeEventListener("popstate",e(this,Uw,"f"))},exports.EventCollector=class{constructor(t){if(Fw.add(this),this.useLighterSnapshot=!1,this.userContext=null,Dw.set(this,void 0),Lw.set(this,void 0),Bw.set(this,void 0),_w.set(this,e(this,Fw,"m",zw).bind(this)),Uw.set(this,e(this,Fw,"m",Jw).bind(this)),$w.set(this,()=>{if(0===this.events.length)return;const t=[...this.events];if(this.callback){try{this.callback(t)}catch(e){}e(this,Fw,"m",Xw).call(this)}else Promise.allSettled([this.userId&&this.userTraits?Xy({userId:this.userId,traits:this.userTraits}):null,this.groupId?Hy({groupId:this.groupId,traits:this.groupTraits,userId:this.userId}):null,Ky(t)]),e(this,Fw,"m",Xw).call(this)}),"undefined"==typeof window)return void console.error("Userlens EventCollector error: unavailable outside of browser environment.");const{userId:r,WRITE_CODE:s,callback:n,intervalTime:i=5e3,skipRawEvents:o=!1,useLighterSnapshot:a=!1,debug:l=!1}=t,c=t.userTraits,h=t.groupId,u=t.groupTraits;this.autoUploadModeEnabled=!n,!this.autoUploadModeEnabled||(null==r?void 0:r.length)?!this.autoUploadModeEnabled||(null==s?void 0:s.length)?(this.autoUploadModeEnabled&&Qy(s),this.autoUploadModeEnabled||"function"==typeof n?(this.userId=r,this.userTraits="object"==typeof c&&null!==c?c:{},this.callback=n,this.intervalTime=i,this.events=[],this.debug=l,h&&(this.groupId=h,this.groupTraits="object"==typeof u&&null!==u?u:{}),o||(this.useLighterSnapshot=a,e(this,Fw,"m",jw).call(this),e(this,Fw,"m",Yw).call(this)),e(this,Fw,"m",Zw).call(this),this.userContext=this.getUserContext()):this.debug&&console.error("Userlens EventCollector error: callback is not a function.")):this.debug&&console.error("Userlens EventCollector error: WRITE_CODE is missing."):this.debug&&console.error("Userlens EventCollector error: userId is missing.")}pushEvent(e){const t={is_raw:!1,...e,properties:{...null==e?void 0:e.properties,...this.getUserContext(),...this.getPageMetadata()}};this.userId&&(t.userId=this.userId),this.events.push(t)}identify(e,t){return Xy({userId:e,traits:t})}group(e,t){return Hy({groupId:e,traits:t,userId:this.userId})}updateUserTraits(e){this.userTraits=e}updateGroupTraits(e){this.groupTraits=e}stop(){e(this,Fw,"m",Hw).call(this),e(this,Fw,"m",Kw).call(this),e(this,Fw,"m",Qw).call(this)}getUserContext(){var e,t,r,s,n,i,o;if(this.userContext)return this.userContext;const a=Iw.getParser(window.navigator.userAgent),l=a.getBrowser(),c=a.getOS(),h={$ul_browser:null!==(e=l.name)&&void 0!==e?e:"Unknown",$ul_browser_version:null!==(t=l.version)&&void 0!==t?t:"Unknown",$ul_os:null!==(r=c.name)&&void 0!==r?r:"Unknown",$ul_os_version:null!==(s=c.versionName)&&void 0!==s?s:"Unknown",$ul_browser_language:null!==(n=navigator.language)&&void 0!==n?n:"en-US",$ul_browser_language_prefix:null!==(o=null===(i=navigator.language)||void 0===i?void 0:i.split("-")[0])&&void 0!==o?o:"en",$ul_screen_width:window.screen.width,$ul_screen_height:window.screen.height,$ul_viewport_width:window.innerWidth,$ul_viewport_height:window.innerHeight,$ul_lib:"userlens.js",$ul_lib_version:"0.1.85",$ul_device_type:/Mobi|Android/i.test(navigator.userAgent)?"Mobile":"Desktop",$ul_timezone:Intl.DateTimeFormat().resolvedOptions().timeZone};return this.userContext=h,h}getPageMetadata(){try{const e=new URL(window.location.href);let t=document.referrer||"$direct",r="$direct";try{t&&/^https?:\/\//.test(t)&&(r=new URL(t).hostname)}catch(e){}const s=e.search.slice(1);return{$ul_page:e.origin+e.pathname,$ul_pathname:e.pathname,$ul_host:e.host,$ul_referrer:t,$ul_referring_domain:r,$ul_query:s}}catch(e){return{$ul_page:"",$ul_pathname:"",$ul_host:"",$ul_referrer:"",$ul_referring_domain:"",$ul_query:""}}}},exports.SessionRecorder=class{constructor({WRITE_CODE:r,userId:s,recordingOptions:n={}}){if(qy.add(this),this.sessionEvents=[],this.rrwebStop=null,ew.set(this,void 0),iw.set(this,()=>{document.visibilityState&&gc()}),"undefined"==typeof window&&console.error("Userlens SDK error: unavailable outside of browser environment."),!(null==r?void 0:r.trim()))throw new Error("Userlens SDK Error: WRITE_CODE is required and must be a string");(null==s?void 0:s.trim())||console.error("Userlens SDK Error: userId is required to identify session user.");const{TIMEOUT:i=18e5,BUFFER_SIZE:o=10,maskingOptions:a=["passwords"]}=n;if("string"!=typeof r)throw new Error("WRITE_CODE must be a string to base64 encode it");Qy(r),this.userId=s,this.TIMEOUT=i,this.BUFFER_SIZE=o,this.maskingOptions=a,this.sessionEvents=[],t(this,ew,e(this,qy,"m",aw).call(this,()=>{e(this,qy,"m",lw).call(this)},5e3),"f"),e(this,qy,"m",tw).call(this)}stop(){this.rrwebStop&&(this.rrwebStop(),this.rrwebStop=null,e(this,qy,"m",cw).call(this),e(this,qy,"m",hw).call(this),window.removeEventListener("visibilitychange",e(this,iw,"f")))}};
9
9
  //# sourceMappingURL=main.cjs.js.map