@altertable/altertable-js 0.5.6 → 0.5.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,9 @@
1
- /*! @altertable/altertable-js 0.5.6 | MIT License | Altertable | https://github.com/altertable-ai/altertable-js */
2
- var Altertable=(()=>{var $=Object.defineProperty;var ve=Object.getOwnPropertyDescriptor;var Ee=Object.getOwnPropertyNames;var Se=Object.prototype.hasOwnProperty;var Ie=(n,e)=>{for(var t in e)$(n,t,{get:e[t],enumerable:!0})},Te=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Ee(e))!Se.call(n,s)&&s!==t&&$(n,s,{get:()=>e[s],enumerable:!(r=ve(e,s))||r.enumerable});return n};var ye=n=>Te($({},"__esModule",{value:!0}),n);var $e={};Ie($e,{TrackingConsent:()=>o,altertable:()=>F});function z(n,e){return(...t)=>[n,...t].join(e)}var be="atbl",L=z(be,"."),u=L("check"),K="session",G="visitor",ke=1e3*60,Y=100,Q=30*ke,W=1e3,X=5e3,j="$pageview",H="$lib",J="$lib_version",Z="$referer",ee="$release",d="$url",te="$viewport",o={DENIED:"denied",DISMISSED:"dismissed",GRANTED:"granted",PENDING:"pending"},N=["anonymous_id","anonymous","distinct_id","distinctid","false","guest","id","not_authenticated","true","undefined","user_id","user","visitor_id","visitor"],V=new Set(["[object Object]","0","NaN","none","None","null"]);var I=class{_queue=[];_queueMaxSize;constructor(e){this._queueMaxSize=e}enqueue(e,t,r){this._queue.length>=this._queueMaxSize&&this._queue.shift(),this._queue.push({eventType:e,payload:t,context:r,sentAt:new Date})}flush(){let e=[...this._queue];return this._queue=[],e}clear(){this._queue=[]}getSize(){return this._queue.length}};function l(n,e){if(!n)throw new Error("Invariant failed")}function ie(n){return{log:(...e)=>{console.log(`[${n}]`,...e)},logHeader:()=>{let e="Altertable v0.5.6 %c\u2022 Debug mode enabled";T.current[e]||(T.current[e]=!0,console.log(e,"color: #64748b;"))},logEvent:(e,{trackingConsent:t})=>{let[r,s]=ne(e.event==="$pageview"?"Page":"Track"),[i,c]=we(e.event==="$pageview"?String(e.properties[d]):e.event),[g,_]=re(e.environment),[h,R]=De(e.timestamp),[w,A]=se(t);console.groupCollapsed(`[${n}] %c${r}%c ${i} %c[${g}] %c${h} %c${w}`,s,c,_,R,A);let[D,P]=m("User ID"),[x,U]=v(e.user_id??"Not set"),[ge,ue]=m("Visitor ID"),[de,fe]=v(e.visitor_id??"Not set"),[pe,_e]=m("Session ID"),[he,me]=v(e.session_id??"Not set");console.log(`%c${D} %c${x}`,P,U),console.log(`%c${ge} %c${de}`,ue,fe),console.log(`%c${pe} %c${he}`,_e,me),console.table(e.properties),console.groupEnd()},logIdentify:(e,{trackingConsent:t})=>{let[r,s]=ne("Identify"),[i,c]=re(e.environment),[g,_]=se(t);console.groupCollapsed(`[${n}] %c${r}%c ${e.user_id} %c[${i}] %c${g}`,s,"font-weight: 600;",c,_);let[h,R]=m("User ID"),[w,A]=v(e.user_id??"Not set"),[D,P]=m("Visitor ID"),[x,U]=v(e.visitor_id??"Not set");console.log(`%c${h} %c${w}`,R,A),console.log(`%c${D} %c${x}`,P,U),console.table(e.traits),console.groupEnd()},warn:(...e)=>{console.warn(`[${n}]`,...e)},warnDev:(e,...t)=>{},error:(...e)=>{console.error(`[${n}]`,...e)}}}var T={current:{}};function Ce(n){return new Date(n).toLocaleTimeString("en-US",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"})}function Re(n){switch(n){case"Page":return"#64748b";case"Identify":return"#a855f7";case"Track":return"#10b981";default:return"#1e293b"}}function ne(n){return[n,`background: ${Re(n)}; color: #ffffff; padding: 2px 8px; border-radius: 6px; font-weight: 400;`]}function we(n){return[n==="$pageview"?"Page Viewed":n,"font-weight: 600;"]}function re(n){return[n,`color: ${Ae(n)}; font-weight: 400;`]}function Ae(n){switch(n.toLocaleLowerCase().startsWith("prod")?"production":n){case"production":return"#ef4444";default:return"#3b82f6"}}function De(n){return[Ce(n),"color: #64748b; font-weight: 400;"]}function m(n){return[n,"color: #64748b; font-size: 11px;"]}function v(n){return[n,'background: #f8fafc; color: #1e293b; padding: 2px 8px; border: 1px solid #e2e8f0; border-radius: 6px; font-family: "SF Mono", "Monaco", monospace; font-size: 11px;']}function se(n){switch(n){case o.GRANTED:return["",""];case o.DENIED:return["DENIED","background: #ef4444; color: #ffffff; padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: 600;"];case o.PENDING:case o.DISMISSED:return["PENDING","background: #f59e0b; color: #ffffff; padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: 600;"];default:return["UNKNOWN","background: #6b7280; color: #ffffff; padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: 600;"]}}function O(n){try{let e=new URL(n);return{baseUrl:`${e.origin}${e.pathname}`,searchParams:Object.fromEntries(e.searchParams)}}catch{return null}}function oe(){return typeof window<"u"&&typeof navigator<"u"&&typeof navigator.sendBeacon=="function"}var y=class{_config;constructor(e){this._config=e}_constructUrl(e){return`${this._config.baseUrl}${e}?apiKey=${encodeURIComponent(this._config.apiKey)}`}async send(e,t){return oe()?this._sendWithBeacon(e,t):this._sendWithFetch(e,t)}async _sendWithBeacon(e,t){let r=this._constructUrl(e),s=new Blob([JSON.stringify(t)],{type:"application/json"});try{if(!navigator.sendBeacon(r,s))return this._sendWithFetch(e,t)}catch{return this._sendWithFetch(e,t)}}async _sendWithFetch(e,t){let r=this._constructUrl(e),s=new AbortController,i=setTimeout(()=>s.abort(),this._config.requestTimeout);try{let c=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t),keepalive:!0,signal:s.signal});if(!c.ok)throw new Error(`HTTP ${c.status}: ${c.statusText}`)}finally{clearTimeout(i)}}};function a(n,e=()=>{}){return typeof window>"u"?e():n({window})}function M(n){if(typeof globalThis.crypto<"u"&&typeof globalThis.crypto.randomUUID=="function")try{return`${n}-${crypto.randomUUID()}`}catch{}return`${n}-${Math.random().toString(36).substring(2)}`}var b=class{_defaultTrackingConsent;_logger;_sessionData;_storage;_storageKey;constructor(e){this._storage=e.storage,this._storageKey=e.storageKey,this._logger=e.logger,this._defaultTrackingConsent=e.defaultTrackingConsent??o.PENDING,this._sessionData=this._createDefaultSessionData()}init(){let e=this._storage.getItem(this._storageKey);if(!e){this._sessionData=this._createDefaultSessionData(),this._persistToStorage();return}try{let t=JSON.parse(e);this._sessionData={visitorId:t.visitorId||this._generateVisitorId(),sessionId:t.sessionId||this._generateSessionId(),userId:t.userId||null,lastEventAt:t.lastEventAt||null,trackingConsent:Pe(t.trackingConsent)?t.trackingConsent:this._defaultTrackingConsent}}catch{this._logger.warnDev("Failed to parse storage data. Resetting session data."),this._sessionData=this._createDefaultSessionData()}this._persistToStorage()}getVisitorId(){return this._sessionData.visitorId}getSessionId(){return this._sessionData.sessionId}getUserId(){return this._sessionData.userId}getLastEventAt(){return this._sessionData.lastEventAt}getTrackingConsent(){return this._sessionData.trackingConsent}setUserId(e){this._sessionData.userId=e,this._persistToStorage()}setTrackingConsent(e){this._sessionData.trackingConsent=e,this._persistToStorage()}updateLastEventAt(e){this._sessionData.lastEventAt=e,this._persistToStorage()}renewSessionIfNeeded(){return this._shouldRenewSession()?(this._renewSession(),this._persistToStorage(),!0):!1}reset({resetVisitorId:e=!1,resetSessionId:t=!0,resetTrackingConsent:r=!1}={}){e&&(this._sessionData.visitorId=this._generateVisitorId()),t&&(this._sessionData.sessionId=this._generateSessionId()),r&&(this._sessionData.trackingConsent=this._defaultTrackingConsent),this._sessionData.userId=null,this._sessionData.lastEventAt=null,this._persistToStorage()}_createDefaultSessionData(){return{visitorId:this._generateVisitorId(),sessionId:this._generateSessionId(),userId:null,lastEventAt:null,trackingConsent:this._defaultTrackingConsent}}_generateSessionId(){return M(K)}_generateVisitorId(){return M(G)}_shouldRenewSession(){let{lastEventAt:e}=this._sessionData;if(!e)return!0;let t=new Date().getTime(),r=new Date(e).getTime();return t-r>Q}_renewSession(){this._sessionData.sessionId=this._generateSessionId(),this._sessionData.lastEventAt=null}_persistToStorage(){try{this._storage.setItem(this._storageKey,JSON.stringify(this._sessionData))}catch{this._logger.warnDev("Failed to persist session data to storage.")}}};function Pe(n){return typeof n=="string"&&Object.values(o).includes(n)}function q(n,e,t){for(let r of t){let s=e.getItem(r);s!==null&&(n.setItem(r,s),e.removeItem(r))}}var f=class{store={};getItem(e){return this.store[e]??null}setItem(e,t){this.store[e]=t}removeItem(e){delete this.store[e]}migrate(e,t){q(this,e,t)}},S=class{getItem(e){return a(({window:t})=>{let r=t.document.cookie.match(new RegExp("(^| )"+e+"=([^;]+)"));return r?decodeURIComponent(r[2]):null},()=>null)}setItem(e,t){a(({window:r})=>{r.document.cookie=`${e}=${encodeURIComponent(t)}; path=/;`})}removeItem(e){a(({window:t})=>{t.document.cookie=`${e}=; Max-Age=0; path=/;`})}migrate(e,t){q(this,e,t)}},p=class{constructor(e){this.storage=e}getItem(e){return a(({window:t})=>{try{return t[this.storage].getItem(e)}catch{return null}},()=>null)}setItem(e,t){a(({window:r})=>{try{r[this.storage].setItem(e,t)}catch{}})}removeItem(e){a(({window:t})=>{try{t[this.storage].removeItem(e)}catch{}})}migrate(e,t){q(this,e,t)}},B=class{localStore=new p("localStorage");cookieStore=new S;getItem(e){return this.localStore.getItem(e)??this.cookieStore.getItem(e)}setItem(e,t){this.localStore.setItem(e,t),this.cookieStore.setItem(e,t)}removeItem(e){this.localStore.removeItem(e),this.cookieStore.removeItem(e)}migrate(e,t){for(let r of t){let s=e.getItem(r);s!==null&&(this.localStore.setItem(r,s),this.cookieStore.setItem(r,s))}for(let r of t)e.removeItem(r)}};function E(n){return a(({window:e})=>{try{if(n==="cookie"){e.document.cookie=`${u}=1`;let t=e.document.cookie.indexOf(`${u}=`)!==-1;return e.document.cookie=`${u}=; Max-Age=0`,t}else return e[n].setItem(u,"1"),e[n].removeItem(u),!0}catch{return!1}},()=>!1)}function k(n,e){let{onFallback:t}=e;switch(n){case"localStorage":return E("localStorage")?new p("localStorage"):(t("localStorage not supported, falling back to localStorage+cookie."),k("localStorage+cookie",e));case"localStorage+cookie":{let r=E("localStorage"),s=E("cookie");return r&&s?new B:s?(t("localStorage+cookie not fully supported, falling back to cookie."),new S):r?(t("cookie not supported, falling back to localStorage."),new p("localStorage")):(t("Neither localStorage nor cookie supported, falling back to memory."),new f)}case"sessionStorage":return E("sessionStorage")?new p("sessionStorage"):(t("sessionStorage not supported, falling back to memory."),new f);case"cookie":return E("cookie")?new S:(t("cookie not supported, falling back to memory."),new f);case"memory":return new f;default:throw new Error(`Unknown storage type: "${n}". Valid types are: localStorage, sessionStorage, cookie, memory, localStorage+cookie.`)}}var xe=[...N,...V].map(n=>`- "${n}"`).join(`
1
+ /*! @altertable/altertable-js 0.5.7 | MIT License | Altertable | https://github.com/altertable-ai/altertable-js */
2
+ var Altertable=(()=>{var $=Object.defineProperty;var ve=Object.getOwnPropertyDescriptor;var Ee=Object.getOwnPropertyNames;var Se=Object.prototype.hasOwnProperty;var Ie=(n,e)=>{for(var t in e)$(n,t,{get:e[t],enumerable:!0})},Te=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Ee(e))!Se.call(n,s)&&s!==t&&$(n,s,{get:()=>e[s],enumerable:!(r=ve(e,s))||r.enumerable});return n};var ye=n=>Te($({},"__esModule",{value:!0}),n);var $e={};Ie($e,{TrackingConsent:()=>o,altertable:()=>F});function z(n,e){return(...t)=>[n,...t].join(e)}var be="atbl",L=z(be,"."),u=L("check"),K="session",G="visitor",ke=1e3*60,Y=100,Q=30*ke,W=1e3,X=5e3,j="$pageview",H="$lib",J="$lib_version",Z="$referer",ee="$release",d="$url",te="$viewport",o={DENIED:"denied",DISMISSED:"dismissed",GRANTED:"granted",PENDING:"pending"},N=["anonymous_id","anonymous","distinct_id","distinctid","false","guest","id","not_authenticated","true","undefined","user_id","user","visitor_id","visitor"],V=new Set(["[object Object]","0","NaN","none","None","null"]);var I=class{_queue=[];_queueMaxSize;constructor(e){this._queueMaxSize=e}enqueue(e,t,r){this._queue.length>=this._queueMaxSize&&this._queue.shift(),this._queue.push({eventType:e,payload:t,context:r,sentAt:new Date})}flush(){let e=[...this._queue];return this._queue=[],e}clear(){this._queue=[]}getSize(){return this._queue.length}};function l(n,e){if(!n)throw new Error("Invariant failed")}function ie(n){return{log:(...e)=>{console.log(`[${n}]`,...e)},logHeader:()=>{let e="Altertable v0.5.7 %c\u2022 Debug mode enabled";T.current[e]||(T.current[e]=!0,console.log(e,"color: #64748b;"))},logEvent:(e,{trackingConsent:t})=>{let[r,s]=ne(e.event==="$pageview"?"Page":"Track"),[i,c]=we(e.event==="$pageview"?String(e.properties[d]):e.event),[g,_]=re(e.environment),[h,R]=De(e.timestamp),[w,A]=se(t);console.groupCollapsed(`[${n}] %c${r}%c ${i} %c[${g}] %c${h} %c${w}`,s,c,_,R,A);let[D,P]=m("User ID"),[x,U]=v(e.user_id??"Not set"),[ge,ue]=m("Visitor ID"),[de,fe]=v(e.visitor_id??"Not set"),[pe,_e]=m("Session ID"),[he,me]=v(e.session_id??"Not set");console.log(`%c${D} %c${x}`,P,U),console.log(`%c${ge} %c${de}`,ue,fe),console.log(`%c${pe} %c${he}`,_e,me),console.table(e.properties),console.groupEnd()},logIdentify:(e,{trackingConsent:t})=>{let[r,s]=ne("Identify"),[i,c]=re(e.environment),[g,_]=se(t);console.groupCollapsed(`[${n}] %c${r}%c ${e.user_id} %c[${i}] %c${g}`,s,"font-weight: 600;",c,_);let[h,R]=m("User ID"),[w,A]=v(e.user_id??"Not set"),[D,P]=m("Visitor ID"),[x,U]=v(e.visitor_id??"Not set");console.log(`%c${h} %c${w}`,R,A),console.log(`%c${D} %c${x}`,P,U),console.table(e.traits),console.groupEnd()},warn:(...e)=>{console.warn(`[${n}]`,...e)},warnDev:(e,...t)=>{},error:(...e)=>{console.error(`[${n}]`,...e)}}}var T={current:{}};function Ce(n){return new Date(n).toLocaleTimeString("en-US",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"})}function Re(n){switch(n){case"Page":return"#64748b";case"Identify":return"#a855f7";case"Track":return"#10b981";default:return"#1e293b"}}function ne(n){return[n,`background: ${Re(n)}; color: #ffffff; padding: 2px 8px; border-radius: 6px; font-weight: 400;`]}function we(n){return[n==="$pageview"?"Page Viewed":n,"font-weight: 600;"]}function re(n){return[n,`color: ${Ae(n)}; font-weight: 400;`]}function Ae(n){switch(n.toLocaleLowerCase().startsWith("prod")?"production":n){case"production":return"#ef4444";default:return"#3b82f6"}}function De(n){return[Ce(n),"color: #64748b; font-weight: 400;"]}function m(n){return[n,"color: #64748b; font-size: 11px;"]}function v(n){return[n,'background: #f8fafc; color: #1e293b; padding: 2px 8px; border: 1px solid #e2e8f0; border-radius: 6px; font-family: "SF Mono", "Monaco", monospace; font-size: 11px;']}function se(n){switch(n){case o.GRANTED:return["",""];case o.DENIED:return["DENIED","background: #ef4444; color: #ffffff; padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: 600;"];case o.PENDING:case o.DISMISSED:return["PENDING","background: #f59e0b; color: #ffffff; padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: 600;"];default:return["UNKNOWN","background: #6b7280; color: #ffffff; padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: 600;"]}}function O(n){try{let e=new URL(n);return{baseUrl:`${e.origin}${e.pathname}`,searchParams:Object.fromEntries(e.searchParams)}}catch{return null}}function oe(){return typeof window<"u"&&typeof navigator<"u"&&typeof navigator.sendBeacon=="function"}var y=class{_config;constructor(e){this._config=e}_constructUrl(e){return`${this._config.baseUrl}${e}?apiKey=${encodeURIComponent(this._config.apiKey)}`}async send(e,t){return oe()?this._sendWithBeacon(e,t):this._sendWithFetch(e,t)}async _sendWithBeacon(e,t){let r=this._constructUrl(e),s=new Blob([JSON.stringify(t)],{type:"application/json"});try{if(!navigator.sendBeacon(r,s))return this._sendWithFetch(e,t)}catch{return this._sendWithFetch(e,t)}}async _sendWithFetch(e,t){let r=this._constructUrl(e),s=new AbortController,i=setTimeout(()=>s.abort(),this._config.requestTimeout);try{let c=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t),keepalive:!0,signal:s.signal});if(!c.ok)throw new Error(`HTTP ${c.status}: ${c.statusText}`)}finally{clearTimeout(i)}}};function a(n,e=()=>{}){return typeof window>"u"?e():n({window})}function M(n){if(typeof globalThis.crypto<"u"&&typeof globalThis.crypto.randomUUID=="function")try{return`${n}-${crypto.randomUUID()}`}catch{}return`${n}-${Math.random().toString(36).substring(2)}`}var b=class{_defaultTrackingConsent;_logger;_sessionData;_storage;_storageKey;constructor(e){this._storage=e.storage,this._storageKey=e.storageKey,this._logger=e.logger,this._defaultTrackingConsent=e.defaultTrackingConsent??o.PENDING,this._sessionData=this._createDefaultSessionData()}init(){let e=this._storage.getItem(this._storageKey);if(!e){this._sessionData=this._createDefaultSessionData(),this._persistToStorage();return}try{let t=JSON.parse(e);this._sessionData={visitorId:t.visitorId||this._generateVisitorId(),sessionId:t.sessionId||this._generateSessionId(),userId:t.userId||null,lastEventAt:t.lastEventAt||null,trackingConsent:Pe(t.trackingConsent)?t.trackingConsent:this._defaultTrackingConsent}}catch{this._logger.warnDev("Failed to parse storage data. Resetting session data."),this._sessionData=this._createDefaultSessionData()}this._persistToStorage()}getVisitorId(){return this._sessionData.visitorId}getSessionId(){return this._sessionData.sessionId}getUserId(){return this._sessionData.userId}getLastEventAt(){return this._sessionData.lastEventAt}getTrackingConsent(){return this._sessionData.trackingConsent}setUserId(e){this._sessionData.userId=e,this._persistToStorage()}setTrackingConsent(e){this._sessionData.trackingConsent=e,this._persistToStorage()}updateLastEventAt(e){this._sessionData.lastEventAt=e,this._persistToStorage()}renewSessionIfNeeded(){return this._shouldRenewSession()?(this._renewSession(),this._persistToStorage(),!0):!1}reset({resetVisitorId:e=!1,resetSessionId:t=!0,resetTrackingConsent:r=!1}={}){e&&(this._sessionData.visitorId=this._generateVisitorId()),t&&(this._sessionData.sessionId=this._generateSessionId()),r&&(this._sessionData.trackingConsent=this._defaultTrackingConsent),this._sessionData.userId=null,this._sessionData.lastEventAt=null,this._persistToStorage()}_createDefaultSessionData(){return{visitorId:this._generateVisitorId(),sessionId:this._generateSessionId(),userId:null,lastEventAt:null,trackingConsent:this._defaultTrackingConsent}}_generateSessionId(){return M(K)}_generateVisitorId(){return M(G)}_shouldRenewSession(){let{lastEventAt:e}=this._sessionData;if(!e)return!0;let t=new Date().getTime(),r=new Date(e).getTime();return t-r>Q}_renewSession(){this._sessionData.sessionId=this._generateSessionId(),this._sessionData.lastEventAt=null}_persistToStorage(){try{this._storage.setItem(this._storageKey,JSON.stringify(this._sessionData))}catch{this._logger.warnDev("Failed to persist session data to storage.")}}};function Pe(n){return typeof n=="string"&&Object.values(o).includes(n)}function q(n,e,t){for(let r of t){let s=e.getItem(r);s!==null&&(n.setItem(r,s),e.removeItem(r))}}var f=class{store={};getItem(e){return this.store[e]??null}setItem(e,t){this.store[e]=t}removeItem(e){delete this.store[e]}migrate(e,t){q(this,e,t)}},S=class{getItem(e){return a(({window:t})=>{let r=t.document.cookie.match(new RegExp("(^| )"+e+"=([^;]+)"));return r?decodeURIComponent(r[2]):null},()=>null)}setItem(e,t){a(({window:r})=>{r.document.cookie=`${e}=${encodeURIComponent(t)}; path=/;`})}removeItem(e){a(({window:t})=>{t.document.cookie=`${e}=; Max-Age=0; path=/;`})}migrate(e,t){q(this,e,t)}},p=class{constructor(e){this.storage=e}getItem(e){return a(({window:t})=>{try{return t[this.storage].getItem(e)}catch{return null}},()=>null)}setItem(e,t){a(({window:r})=>{try{r[this.storage].setItem(e,t)}catch{}})}removeItem(e){a(({window:t})=>{try{t[this.storage].removeItem(e)}catch{}})}migrate(e,t){q(this,e,t)}},B=class{localStore=new p("localStorage");cookieStore=new S;getItem(e){return this.localStore.getItem(e)??this.cookieStore.getItem(e)}setItem(e,t){this.localStore.setItem(e,t),this.cookieStore.setItem(e,t)}removeItem(e){this.localStore.removeItem(e),this.cookieStore.removeItem(e)}migrate(e,t){for(let r of t){let s=e.getItem(r);s!==null&&(this.localStore.setItem(r,s),this.cookieStore.setItem(r,s))}for(let r of t)e.removeItem(r)}};function E(n){return a(({window:e})=>{try{if(n==="cookie"){e.document.cookie=`${u}=1`;let t=e.document.cookie.indexOf(`${u}=`)!==-1;return e.document.cookie=`${u}=; Max-Age=0`,t}else return e[n].setItem(u,"1"),e[n].removeItem(u),!0}catch{return!1}},()=>!1)}function k(n,e){let{onFallback:t}=e;switch(n){case"localStorage":return E("localStorage")?new p("localStorage"):(t("localStorage not supported, falling back to localStorage+cookie."),k("localStorage+cookie",e));case"localStorage+cookie":{let r=E("localStorage"),s=E("cookie");return r&&s?new B:s?(t("localStorage+cookie not fully supported, falling back to cookie."),new S):r?(t("cookie not supported, falling back to localStorage."),new p("localStorage")):(t("Neither localStorage nor cookie supported, falling back to memory."),new f)}case"sessionStorage":return E("sessionStorage")?new p("sessionStorage"):(t("sessionStorage not supported, falling back to memory."),new f);case"cookie":return E("cookie")?new S:(t("cookie not supported, falling back to memory."),new f);case"memory":return new f;default:throw new Error(`Unknown storage type: "${n}". Valid types are: localStorage, sessionStorage, cookie, memory, localStorage+cookie.`)}}var xe=[...N,...V].map(n=>`- "${n}"`).join(`
3
3
  `),ae=`List of reserved identifiers:
4
4
  ${xe}`;function ce(n){if(!n||n.trim()==="")throw new Error("User ID cannot be empty or contain only whitespace.");if(N.some(r=>n.toLowerCase()===r.toLowerCase()))throw new Error(`User ID "${n}" is a reserved identifier and cannot be used.
5
5
 
6
6
  `+ae);if(V.has(n))throw new Error(`User ID "${n}" is a reserved identifier and cannot be used.
7
7
 
8
- `+ae)}function le(){return a(({window:n})=>`${n.innerWidth}x${n.innerHeight}`,()=>null)}var Ue={autoCapture:!0,baseUrl:"https://api.altertable.ai",debug:!1,environment:"production",persistence:"localStorage+cookie",release:void 0,trackingConsent:o.PENDING},C=class{_cleanupAutoCapture;_config;_eventQueue;_isInitialized=!1;_lastUrl;_logger=ie("Altertable");_referrer;_requester;_sessionManager;_storage;_storageKey;constructor(){this._lastUrl=null,this._referrer=null,this._eventQueue=new I(W)}init(e,t={}){return l(e,"Missing API key"),this._config={...Ue,...t},this._storageKey=L(e,this._config.environment),this._referrer=a(({window:r})=>r.document.referrer||null,()=>null),this._lastUrl=a(({window:r})=>r.location.href||null,()=>null),this._storage=k(this._config.persistence,{onFallback:r=>this._logger.warn(r)}),this._requester=new y({baseUrl:this._config.baseUrl,apiKey:e,requestTimeout:X}),this._sessionManager=new b({storage:this._storage,storageKey:this._storageKey,logger:this._logger,defaultTrackingConsent:this._config.trackingConsent}),this._sessionManager.init(),this._isInitialized=!0,this._config.debug&&this._logger.logHeader(),this._handleAutoCaptureChange(this._config.autoCapture),()=>{this._cleanupAutoCapture?.()}}configure(e){if(l(this._isInitialized,"The client must be initialized with init() before configuring."),e.autoCapture!==void 0&&e.autoCapture!==this._config.autoCapture&&this._handleAutoCaptureChange(e.autoCapture),e.persistence!==void 0&&e.persistence!==this._config.persistence){let r=this._storage;this._storage=k(e.persistence,{onFallback:s=>this._logger.warn(s)}),this._storage.migrate(r,[this._storageKey])}let t=this._sessionManager.getTrackingConsent();if(e.trackingConsent!==void 0&&e.trackingConsent!==t)if(this._sessionManager.setTrackingConsent(e.trackingConsent),t!==o.GRANTED&&e.trackingConsent===o.GRANTED){let r=this._eventQueue.flush();r.length>0&&r.forEach(s=>{this._processEvent(s.eventType,s.payload,s.context)})}else e.trackingConsent===o.DENIED&&this._eventQueue.clear();this._config={...this._config,...e}}_handleAutoCaptureChange(e){if(this._cleanupAutoCapture?.(),e){this._lastUrl&&this.page(this._lastUrl);let t=this._checkForChanges.bind(this),r=setInterval(t,Y);a(({window:s})=>{s.addEventListener("popstate",t),s.addEventListener("hashchange",t)}),this._cleanupAutoCapture=()=>{clearInterval(r),a(({window:s})=>{s.removeEventListener("popstate",t),s.removeEventListener("hashchange",t)})}}else this._cleanupAutoCapture=void 0}identify(e,t={}){l(this._isInitialized,"The client must be initialized with init() before identifying users.");try{ce(e)}catch(i){throw new Error(`[Altertable] ${i.message}`)}this._sessionManager.setUserId(e);let r=this._getContext(),s={environment:r.environment,traits:t,user_id:e,visitor_id:r.visitor_id};if(this._processEvent("identify",s,r),this._config.debug){let i=this._sessionManager.getTrackingConsent();this._logger.logIdentify(s,{trackingConsent:i})}}updateTraits(e){let t=this._sessionManager.getUserId();l(t,"User must be identified with identify() before updating traits.");let r=this._getContext(),s={environment:r.environment,traits:e,user_id:t,visitor_id:r.visitor_id};if(this._processEvent("identify",s,r),this._config.debug){let i=this._sessionManager.getTrackingConsent();this._logger.logIdentify(s,{trackingConsent:i})}}reset({resetVisitorId:e=!1,resetSessionId:t=!0}={}){l(this._isInitialized,"The client must be initialized with init() before resetting."),this._sessionManager.reset({resetVisitorId:e,resetSessionId:t})}page(e){l(this._isInitialized,"The client must be initialized with init() before tracking page views.");let t=O(e),r=t?t.baseUrl:e;this.track(j,{[d]:r,[te]:le(),[Z]:this._referrer,...t?.searchParams})}track(e,t={}){l(this._isInitialized,"The client must be initialized with init() before tracking events."),this._sessionManager.renewSessionIfNeeded();let r=new Date().toISOString();this._sessionManager.updateLastEventAt(r);let s=this._getContext(),i={timestamp:r,event:e,environment:s.environment,user_id:s.user_id,session_id:s.session_id,visitor_id:s.visitor_id,properties:{[H]:"@altertable/altertable-js",[J]:"0.5.6",[ee]:this._config.release,...t[d]===void 0&&(()=>{let c=a(({window:h})=>h.location.href||null,()=>null),g=O(c),_=g?g.baseUrl:c;return{[d]:_}})(),...t}};if(this._processEvent("track",i,s),this._config.debug){let c=this._sessionManager.getTrackingConsent();this._logger.logEvent(i,{trackingConsent:c})}}getTrackingConsent(){return this._sessionManager.getTrackingConsent()}_checkForChanges(){a(({window:e})=>{let t=e.location.href;t!==this._lastUrl&&(this.page(t),this._referrer=this._lastUrl,this._lastUrl=t)})}_getContext(){return{environment:this._config.environment,user_id:this._sessionManager.getUserId(),visitor_id:this._sessionManager.getVisitorId(),session_id:this._sessionManager.getSessionId()}}async _processEvent(e,t,r){switch(this._sessionManager.getTrackingConsent()){case o.GRANTED:try{await this._requester.send(`/${e}`,t)}catch(i){this._logger.error("Failed to send event",{error:i,eventType:e,payload:t})}break;case o.PENDING:case o.DISMISSED:this._eventQueue.enqueue(e,t,r);break;case o.DENIED:break}}};var F=new C;a(({window:n})=>{let e=n.Altertable;if(e&&Array.isArray(e))for(let t of e){let r=t[0],s=t.slice(1);F[r](...s)}n.Altertable=F});return ye($e);})();
8
+ `+ae)}function le(){return a(({window:n})=>`${n.innerWidth}x${n.innerHeight}`,()=>null)}var Ue={autoCapture:!0,baseUrl:"https://api.altertable.ai",debug:!1,environment:"production",persistence:"localStorage+cookie",release:void 0,trackingConsent:o.PENDING},C=class{_cleanupAutoCapture;_config;_eventQueue;_isInitialized=!1;_lastUrl;_logger=ie("Altertable");_referrer;_requester;_sessionManager;_storage;_storageKey;constructor(){this._lastUrl=null,this._referrer=null,this._eventQueue=new I(W)}init(e,t={}){return l(e,"Missing API key"),this._config={...Ue,...t},this._storageKey=L(e,this._config.environment),this._referrer=a(({window:r})=>r.document.referrer||null,()=>null),this._lastUrl=a(({window:r})=>r.location.href||null,()=>null),this._storage=k(this._config.persistence,{onFallback:r=>this._logger.warn(r)}),this._requester=new y({baseUrl:this._config.baseUrl,apiKey:e,requestTimeout:X}),this._sessionManager=new b({storage:this._storage,storageKey:this._storageKey,logger:this._logger,defaultTrackingConsent:this._config.trackingConsent}),this._sessionManager.init(),this._isInitialized=!0,this._config.debug&&this._logger.logHeader(),this._handleAutoCaptureChange(this._config.autoCapture),()=>{this._cleanupAutoCapture?.()}}configure(e){if(l(this._isInitialized,"The client must be initialized with init() before configuring."),e.autoCapture!==void 0&&e.autoCapture!==this._config.autoCapture&&this._handleAutoCaptureChange(e.autoCapture),e.persistence!==void 0&&e.persistence!==this._config.persistence){let r=this._storage;this._storage=k(e.persistence,{onFallback:s=>this._logger.warn(s)}),this._storage.migrate(r,[this._storageKey])}let t=this._sessionManager.getTrackingConsent();if(e.trackingConsent!==void 0&&e.trackingConsent!==t)if(this._sessionManager.setTrackingConsent(e.trackingConsent),t!==o.GRANTED&&e.trackingConsent===o.GRANTED){let r=this._eventQueue.flush();r.length>0&&r.forEach(s=>{this._processEvent(s.eventType,s.payload,s.context)})}else e.trackingConsent===o.DENIED&&this._eventQueue.clear();this._config={...this._config,...e}}_handleAutoCaptureChange(e){if(this._cleanupAutoCapture?.(),e){this._lastUrl&&this.page(this._lastUrl);let t=this._checkForChanges.bind(this),r=setInterval(t,Y);a(({window:s})=>{s.addEventListener("popstate",t),s.addEventListener("hashchange",t)}),this._cleanupAutoCapture=()=>{clearInterval(r),a(({window:s})=>{s.removeEventListener("popstate",t),s.removeEventListener("hashchange",t)})}}else this._cleanupAutoCapture=void 0}identify(e,t={}){l(this._isInitialized,"The client must be initialized with init() before identifying users.");try{ce(e)}catch(i){throw new Error(`[Altertable] ${i.message}`)}this._sessionManager.setUserId(e);let r=this._getContext(),s={environment:r.environment,traits:t,user_id:e,visitor_id:r.visitor_id};if(this._processEvent("identify",s,r),this._config.debug){let i=this._sessionManager.getTrackingConsent();this._logger.logIdentify(s,{trackingConsent:i})}}updateTraits(e){let t=this._sessionManager.getUserId();l(t,"User must be identified with identify() before updating traits.");let r=this._getContext(),s={environment:r.environment,traits:e,user_id:t,visitor_id:r.visitor_id};if(this._processEvent("identify",s,r),this._config.debug){let i=this._sessionManager.getTrackingConsent();this._logger.logIdentify(s,{trackingConsent:i})}}reset({resetVisitorId:e=!1,resetSessionId:t=!0}={}){l(this._isInitialized,"The client must be initialized with init() before resetting."),this._sessionManager.reset({resetVisitorId:e,resetSessionId:t})}page(e){l(this._isInitialized,"The client must be initialized with init() before tracking page views.");let t=O(e),r=t?t.baseUrl:e;this.track(j,{[d]:r,[te]:le(),[Z]:this._referrer,...t?.searchParams})}track(e,t={}){l(this._isInitialized,"The client must be initialized with init() before tracking events."),this._sessionManager.renewSessionIfNeeded();let r=new Date().toISOString();this._sessionManager.updateLastEventAt(r);let s=this._getContext(),i={timestamp:r,event:e,environment:s.environment,user_id:s.user_id,session_id:s.session_id,visitor_id:s.visitor_id,properties:{[H]:"@altertable/altertable-js",[J]:"0.5.7",[ee]:this._config.release,...t[d]===void 0&&(()=>{let c=a(({window:h})=>h.location.href||null,()=>null),g=O(c),_=g?g.baseUrl:c;return{[d]:_}})(),...t}};if(this._processEvent("track",i,s),this._config.debug){let c=this._sessionManager.getTrackingConsent();this._logger.logEvent(i,{trackingConsent:c})}}getTrackingConsent(){return this._sessionManager.getTrackingConsent()}_checkForChanges(){a(({window:e})=>{let t=e.location.href;t!==this._lastUrl&&(this.page(t),this._referrer=this._lastUrl,this._lastUrl=t)})}_getContext(){return{environment:this._config.environment,user_id:this._sessionManager.getUserId(),visitor_id:this._sessionManager.getVisitorId(),session_id:this._sessionManager.getSessionId()}}async _processEvent(e,t,r){switch(this._sessionManager.getTrackingConsent()){case o.GRANTED:try{await this._requester.send(`/${e}`,t)}catch(i){this._logger.error("Failed to send event",{error:i,eventType:e,payload:t})}break;case o.PENDING:case o.DISMISSED:this._eventQueue.enqueue(e,t,r);break;case o.DENIED:break}}};var F=new C;a(({window:n})=>{let e=n.Altertable;if(e&&Array.isArray(e))for(let t of e){let r=t[0],s=t.slice(1);F[r](...s)}n.Altertable=F});return ye($e);})();
9
9
  //# sourceMappingURL=index.global.js.map
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
- /*! @altertable/altertable-js 0.5.6 | MIT License | Altertable | https://github.com/altertable-ai/altertable-js */
2
- var $=Object.defineProperty;var ve=Object.getOwnPropertyDescriptor;var Ee=Object.getOwnPropertyNames;var Se=Object.prototype.hasOwnProperty;var Ie=(n,e)=>{for(var t in e)$(n,t,{get:e[t],enumerable:!0})},Te=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Ee(e))!Se.call(n,s)&&s!==t&&$(n,s,{get:()=>e[s],enumerable:!(r=ve(e,s))||r.enumerable});return n};var ye=n=>Te($({},"__esModule",{value:!0}),n);var $e={};Ie($e,{TrackingConsent:()=>o,altertable:()=>F});module.exports=ye($e);function z(n,e){return(...t)=>[n,...t].join(e)}var be="atbl",L=z(be,"."),u=L("check"),K="session",G="visitor",ke=1e3*60,Y=100,Q=30*ke,W=1e3,X=5e3,j="$pageview",H="$lib",J="$lib_version",Z="$referer",ee="$release",d="$url",te="$viewport",o={DENIED:"denied",DISMISSED:"dismissed",GRANTED:"granted",PENDING:"pending"},N=["anonymous_id","anonymous","distinct_id","distinctid","false","guest","id","not_authenticated","true","undefined","user_id","user","visitor_id","visitor"],V=new Set(["[object Object]","0","NaN","none","None","null"]);var I=class{_queue=[];_queueMaxSize;constructor(e){this._queueMaxSize=e}enqueue(e,t,r){this._queue.length>=this._queueMaxSize&&this._queue.shift(),this._queue.push({eventType:e,payload:t,context:r,sentAt:new Date})}flush(){let e=[...this._queue];return this._queue=[],e}clear(){this._queue=[]}getSize(){return this._queue.length}};function l(n,e){if(!n)throw new Error("Invariant failed")}function ie(n){return{log:(...e)=>{console.log(`[${n}]`,...e)},logHeader:()=>{let e="Altertable v0.5.6 %c\u2022 Debug mode enabled";T.current[e]||(T.current[e]=!0,console.log(e,"color: #64748b;"))},logEvent:(e,{trackingConsent:t})=>{let[r,s]=ne(e.event==="$pageview"?"Page":"Track"),[i,c]=we(e.event==="$pageview"?String(e.properties[d]):e.event),[g,_]=re(e.environment),[h,R]=De(e.timestamp),[w,A]=se(t);console.groupCollapsed(`[${n}] %c${r}%c ${i} %c[${g}] %c${h} %c${w}`,s,c,_,R,A);let[D,P]=m("User ID"),[x,U]=v(e.user_id??"Not set"),[ge,ue]=m("Visitor ID"),[de,fe]=v(e.visitor_id??"Not set"),[pe,_e]=m("Session ID"),[he,me]=v(e.session_id??"Not set");console.log(`%c${D} %c${x}`,P,U),console.log(`%c${ge} %c${de}`,ue,fe),console.log(`%c${pe} %c${he}`,_e,me),console.table(e.properties),console.groupEnd()},logIdentify:(e,{trackingConsent:t})=>{let[r,s]=ne("Identify"),[i,c]=re(e.environment),[g,_]=se(t);console.groupCollapsed(`[${n}] %c${r}%c ${e.user_id} %c[${i}] %c${g}`,s,"font-weight: 600;",c,_);let[h,R]=m("User ID"),[w,A]=v(e.user_id??"Not set"),[D,P]=m("Visitor ID"),[x,U]=v(e.visitor_id??"Not set");console.log(`%c${h} %c${w}`,R,A),console.log(`%c${D} %c${x}`,P,U),console.table(e.traits),console.groupEnd()},warn:(...e)=>{console.warn(`[${n}]`,...e)},warnDev:(e,...t)=>{},error:(...e)=>{console.error(`[${n}]`,...e)}}}var T={current:{}};function Ce(n){return new Date(n).toLocaleTimeString("en-US",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"})}function Re(n){switch(n){case"Page":return"#64748b";case"Identify":return"#a855f7";case"Track":return"#10b981";default:return"#1e293b"}}function ne(n){return[n,`background: ${Re(n)}; color: #ffffff; padding: 2px 8px; border-radius: 6px; font-weight: 400;`]}function we(n){return[n==="$pageview"?"Page Viewed":n,"font-weight: 600;"]}function re(n){return[n,`color: ${Ae(n)}; font-weight: 400;`]}function Ae(n){switch(n.toLocaleLowerCase().startsWith("prod")?"production":n){case"production":return"#ef4444";default:return"#3b82f6"}}function De(n){return[Ce(n),"color: #64748b; font-weight: 400;"]}function m(n){return[n,"color: #64748b; font-size: 11px;"]}function v(n){return[n,'background: #f8fafc; color: #1e293b; padding: 2px 8px; border: 1px solid #e2e8f0; border-radius: 6px; font-family: "SF Mono", "Monaco", monospace; font-size: 11px;']}function se(n){switch(n){case o.GRANTED:return["",""];case o.DENIED:return["DENIED","background: #ef4444; color: #ffffff; padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: 600;"];case o.PENDING:case o.DISMISSED:return["PENDING","background: #f59e0b; color: #ffffff; padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: 600;"];default:return["UNKNOWN","background: #6b7280; color: #ffffff; padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: 600;"]}}function O(n){try{let e=new URL(n);return{baseUrl:`${e.origin}${e.pathname}`,searchParams:Object.fromEntries(e.searchParams)}}catch{return null}}function oe(){return typeof window<"u"&&typeof navigator<"u"&&typeof navigator.sendBeacon=="function"}var y=class{_config;constructor(e){this._config=e}_constructUrl(e){return`${this._config.baseUrl}${e}?apiKey=${encodeURIComponent(this._config.apiKey)}`}async send(e,t){return oe()?this._sendWithBeacon(e,t):this._sendWithFetch(e,t)}async _sendWithBeacon(e,t){let r=this._constructUrl(e),s=new Blob([JSON.stringify(t)],{type:"application/json"});try{if(!navigator.sendBeacon(r,s))return this._sendWithFetch(e,t)}catch{return this._sendWithFetch(e,t)}}async _sendWithFetch(e,t){let r=this._constructUrl(e),s=new AbortController,i=setTimeout(()=>s.abort(),this._config.requestTimeout);try{let c=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t),keepalive:!0,signal:s.signal});if(!c.ok)throw new Error(`HTTP ${c.status}: ${c.statusText}`)}finally{clearTimeout(i)}}};function a(n,e=()=>{}){return typeof window>"u"?e():n({window})}function M(n){if(typeof globalThis.crypto<"u"&&typeof globalThis.crypto.randomUUID=="function")try{return`${n}-${crypto.randomUUID()}`}catch{}return`${n}-${Math.random().toString(36).substring(2)}`}var b=class{_defaultTrackingConsent;_logger;_sessionData;_storage;_storageKey;constructor(e){this._storage=e.storage,this._storageKey=e.storageKey,this._logger=e.logger,this._defaultTrackingConsent=e.defaultTrackingConsent??o.PENDING,this._sessionData=this._createDefaultSessionData()}init(){let e=this._storage.getItem(this._storageKey);if(!e){this._sessionData=this._createDefaultSessionData(),this._persistToStorage();return}try{let t=JSON.parse(e);this._sessionData={visitorId:t.visitorId||this._generateVisitorId(),sessionId:t.sessionId||this._generateSessionId(),userId:t.userId||null,lastEventAt:t.lastEventAt||null,trackingConsent:Pe(t.trackingConsent)?t.trackingConsent:this._defaultTrackingConsent}}catch{this._logger.warnDev("Failed to parse storage data. Resetting session data."),this._sessionData=this._createDefaultSessionData()}this._persistToStorage()}getVisitorId(){return this._sessionData.visitorId}getSessionId(){return this._sessionData.sessionId}getUserId(){return this._sessionData.userId}getLastEventAt(){return this._sessionData.lastEventAt}getTrackingConsent(){return this._sessionData.trackingConsent}setUserId(e){this._sessionData.userId=e,this._persistToStorage()}setTrackingConsent(e){this._sessionData.trackingConsent=e,this._persistToStorage()}updateLastEventAt(e){this._sessionData.lastEventAt=e,this._persistToStorage()}renewSessionIfNeeded(){return this._shouldRenewSession()?(this._renewSession(),this._persistToStorage(),!0):!1}reset({resetVisitorId:e=!1,resetSessionId:t=!0,resetTrackingConsent:r=!1}={}){e&&(this._sessionData.visitorId=this._generateVisitorId()),t&&(this._sessionData.sessionId=this._generateSessionId()),r&&(this._sessionData.trackingConsent=this._defaultTrackingConsent),this._sessionData.userId=null,this._sessionData.lastEventAt=null,this._persistToStorage()}_createDefaultSessionData(){return{visitorId:this._generateVisitorId(),sessionId:this._generateSessionId(),userId:null,lastEventAt:null,trackingConsent:this._defaultTrackingConsent}}_generateSessionId(){return M(K)}_generateVisitorId(){return M(G)}_shouldRenewSession(){let{lastEventAt:e}=this._sessionData;if(!e)return!0;let t=new Date().getTime(),r=new Date(e).getTime();return t-r>Q}_renewSession(){this._sessionData.sessionId=this._generateSessionId(),this._sessionData.lastEventAt=null}_persistToStorage(){try{this._storage.setItem(this._storageKey,JSON.stringify(this._sessionData))}catch{this._logger.warnDev("Failed to persist session data to storage.")}}};function Pe(n){return typeof n=="string"&&Object.values(o).includes(n)}function q(n,e,t){for(let r of t){let s=e.getItem(r);s!==null&&(n.setItem(r,s),e.removeItem(r))}}var f=class{store={};getItem(e){return this.store[e]??null}setItem(e,t){this.store[e]=t}removeItem(e){delete this.store[e]}migrate(e,t){q(this,e,t)}},S=class{getItem(e){return a(({window:t})=>{let r=t.document.cookie.match(new RegExp("(^| )"+e+"=([^;]+)"));return r?decodeURIComponent(r[2]):null},()=>null)}setItem(e,t){a(({window:r})=>{r.document.cookie=`${e}=${encodeURIComponent(t)}; path=/;`})}removeItem(e){a(({window:t})=>{t.document.cookie=`${e}=; Max-Age=0; path=/;`})}migrate(e,t){q(this,e,t)}},p=class{constructor(e){this.storage=e}getItem(e){return a(({window:t})=>{try{return t[this.storage].getItem(e)}catch{return null}},()=>null)}setItem(e,t){a(({window:r})=>{try{r[this.storage].setItem(e,t)}catch{}})}removeItem(e){a(({window:t})=>{try{t[this.storage].removeItem(e)}catch{}})}migrate(e,t){q(this,e,t)}},B=class{localStore=new p("localStorage");cookieStore=new S;getItem(e){return this.localStore.getItem(e)??this.cookieStore.getItem(e)}setItem(e,t){this.localStore.setItem(e,t),this.cookieStore.setItem(e,t)}removeItem(e){this.localStore.removeItem(e),this.cookieStore.removeItem(e)}migrate(e,t){for(let r of t){let s=e.getItem(r);s!==null&&(this.localStore.setItem(r,s),this.cookieStore.setItem(r,s))}for(let r of t)e.removeItem(r)}};function E(n){return a(({window:e})=>{try{if(n==="cookie"){e.document.cookie=`${u}=1`;let t=e.document.cookie.indexOf(`${u}=`)!==-1;return e.document.cookie=`${u}=; Max-Age=0`,t}else return e[n].setItem(u,"1"),e[n].removeItem(u),!0}catch{return!1}},()=>!1)}function k(n,e){let{onFallback:t}=e;switch(n){case"localStorage":return E("localStorage")?new p("localStorage"):(t("localStorage not supported, falling back to localStorage+cookie."),k("localStorage+cookie",e));case"localStorage+cookie":{let r=E("localStorage"),s=E("cookie");return r&&s?new B:s?(t("localStorage+cookie not fully supported, falling back to cookie."),new S):r?(t("cookie not supported, falling back to localStorage."),new p("localStorage")):(t("Neither localStorage nor cookie supported, falling back to memory."),new f)}case"sessionStorage":return E("sessionStorage")?new p("sessionStorage"):(t("sessionStorage not supported, falling back to memory."),new f);case"cookie":return E("cookie")?new S:(t("cookie not supported, falling back to memory."),new f);case"memory":return new f;default:throw new Error(`Unknown storage type: "${n}". Valid types are: localStorage, sessionStorage, cookie, memory, localStorage+cookie.`)}}var xe=[...N,...V].map(n=>`- "${n}"`).join(`
1
+ /*! @altertable/altertable-js 0.5.7 | MIT License | Altertable | https://github.com/altertable-ai/altertable-js */
2
+ var $=Object.defineProperty;var ve=Object.getOwnPropertyDescriptor;var Ee=Object.getOwnPropertyNames;var Se=Object.prototype.hasOwnProperty;var Ie=(n,e)=>{for(var t in e)$(n,t,{get:e[t],enumerable:!0})},Te=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Ee(e))!Se.call(n,s)&&s!==t&&$(n,s,{get:()=>e[s],enumerable:!(r=ve(e,s))||r.enumerable});return n};var ye=n=>Te($({},"__esModule",{value:!0}),n);var $e={};Ie($e,{TrackingConsent:()=>o,altertable:()=>F});module.exports=ye($e);function z(n,e){return(...t)=>[n,...t].join(e)}var be="atbl",L=z(be,"."),u=L("check"),K="session",G="visitor",ke=1e3*60,Y=100,Q=30*ke,W=1e3,X=5e3,j="$pageview",H="$lib",J="$lib_version",Z="$referer",ee="$release",d="$url",te="$viewport",o={DENIED:"denied",DISMISSED:"dismissed",GRANTED:"granted",PENDING:"pending"},N=["anonymous_id","anonymous","distinct_id","distinctid","false","guest","id","not_authenticated","true","undefined","user_id","user","visitor_id","visitor"],V=new Set(["[object Object]","0","NaN","none","None","null"]);var I=class{_queue=[];_queueMaxSize;constructor(e){this._queueMaxSize=e}enqueue(e,t,r){this._queue.length>=this._queueMaxSize&&this._queue.shift(),this._queue.push({eventType:e,payload:t,context:r,sentAt:new Date})}flush(){let e=[...this._queue];return this._queue=[],e}clear(){this._queue=[]}getSize(){return this._queue.length}};function l(n,e){if(!n)throw new Error("Invariant failed")}function ie(n){return{log:(...e)=>{console.log(`[${n}]`,...e)},logHeader:()=>{let e="Altertable v0.5.7 %c\u2022 Debug mode enabled";T.current[e]||(T.current[e]=!0,console.log(e,"color: #64748b;"))},logEvent:(e,{trackingConsent:t})=>{let[r,s]=ne(e.event==="$pageview"?"Page":"Track"),[i,c]=we(e.event==="$pageview"?String(e.properties[d]):e.event),[g,_]=re(e.environment),[h,R]=De(e.timestamp),[w,A]=se(t);console.groupCollapsed(`[${n}] %c${r}%c ${i} %c[${g}] %c${h} %c${w}`,s,c,_,R,A);let[D,P]=m("User ID"),[x,U]=v(e.user_id??"Not set"),[ge,ue]=m("Visitor ID"),[de,fe]=v(e.visitor_id??"Not set"),[pe,_e]=m("Session ID"),[he,me]=v(e.session_id??"Not set");console.log(`%c${D} %c${x}`,P,U),console.log(`%c${ge} %c${de}`,ue,fe),console.log(`%c${pe} %c${he}`,_e,me),console.table(e.properties),console.groupEnd()},logIdentify:(e,{trackingConsent:t})=>{let[r,s]=ne("Identify"),[i,c]=re(e.environment),[g,_]=se(t);console.groupCollapsed(`[${n}] %c${r}%c ${e.user_id} %c[${i}] %c${g}`,s,"font-weight: 600;",c,_);let[h,R]=m("User ID"),[w,A]=v(e.user_id??"Not set"),[D,P]=m("Visitor ID"),[x,U]=v(e.visitor_id??"Not set");console.log(`%c${h} %c${w}`,R,A),console.log(`%c${D} %c${x}`,P,U),console.table(e.traits),console.groupEnd()},warn:(...e)=>{console.warn(`[${n}]`,...e)},warnDev:(e,...t)=>{},error:(...e)=>{console.error(`[${n}]`,...e)}}}var T={current:{}};function Ce(n){return new Date(n).toLocaleTimeString("en-US",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"})}function Re(n){switch(n){case"Page":return"#64748b";case"Identify":return"#a855f7";case"Track":return"#10b981";default:return"#1e293b"}}function ne(n){return[n,`background: ${Re(n)}; color: #ffffff; padding: 2px 8px; border-radius: 6px; font-weight: 400;`]}function we(n){return[n==="$pageview"?"Page Viewed":n,"font-weight: 600;"]}function re(n){return[n,`color: ${Ae(n)}; font-weight: 400;`]}function Ae(n){switch(n.toLocaleLowerCase().startsWith("prod")?"production":n){case"production":return"#ef4444";default:return"#3b82f6"}}function De(n){return[Ce(n),"color: #64748b; font-weight: 400;"]}function m(n){return[n,"color: #64748b; font-size: 11px;"]}function v(n){return[n,'background: #f8fafc; color: #1e293b; padding: 2px 8px; border: 1px solid #e2e8f0; border-radius: 6px; font-family: "SF Mono", "Monaco", monospace; font-size: 11px;']}function se(n){switch(n){case o.GRANTED:return["",""];case o.DENIED:return["DENIED","background: #ef4444; color: #ffffff; padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: 600;"];case o.PENDING:case o.DISMISSED:return["PENDING","background: #f59e0b; color: #ffffff; padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: 600;"];default:return["UNKNOWN","background: #6b7280; color: #ffffff; padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: 600;"]}}function O(n){try{let e=new URL(n);return{baseUrl:`${e.origin}${e.pathname}`,searchParams:Object.fromEntries(e.searchParams)}}catch{return null}}function oe(){return typeof window<"u"&&typeof navigator<"u"&&typeof navigator.sendBeacon=="function"}var y=class{_config;constructor(e){this._config=e}_constructUrl(e){return`${this._config.baseUrl}${e}?apiKey=${encodeURIComponent(this._config.apiKey)}`}async send(e,t){return oe()?this._sendWithBeacon(e,t):this._sendWithFetch(e,t)}async _sendWithBeacon(e,t){let r=this._constructUrl(e),s=new Blob([JSON.stringify(t)],{type:"application/json"});try{if(!navigator.sendBeacon(r,s))return this._sendWithFetch(e,t)}catch{return this._sendWithFetch(e,t)}}async _sendWithFetch(e,t){let r=this._constructUrl(e),s=new AbortController,i=setTimeout(()=>s.abort(),this._config.requestTimeout);try{let c=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t),keepalive:!0,signal:s.signal});if(!c.ok)throw new Error(`HTTP ${c.status}: ${c.statusText}`)}finally{clearTimeout(i)}}};function a(n,e=()=>{}){return typeof window>"u"?e():n({window})}function M(n){if(typeof globalThis.crypto<"u"&&typeof globalThis.crypto.randomUUID=="function")try{return`${n}-${crypto.randomUUID()}`}catch{}return`${n}-${Math.random().toString(36).substring(2)}`}var b=class{_defaultTrackingConsent;_logger;_sessionData;_storage;_storageKey;constructor(e){this._storage=e.storage,this._storageKey=e.storageKey,this._logger=e.logger,this._defaultTrackingConsent=e.defaultTrackingConsent??o.PENDING,this._sessionData=this._createDefaultSessionData()}init(){let e=this._storage.getItem(this._storageKey);if(!e){this._sessionData=this._createDefaultSessionData(),this._persistToStorage();return}try{let t=JSON.parse(e);this._sessionData={visitorId:t.visitorId||this._generateVisitorId(),sessionId:t.sessionId||this._generateSessionId(),userId:t.userId||null,lastEventAt:t.lastEventAt||null,trackingConsent:Pe(t.trackingConsent)?t.trackingConsent:this._defaultTrackingConsent}}catch{this._logger.warnDev("Failed to parse storage data. Resetting session data."),this._sessionData=this._createDefaultSessionData()}this._persistToStorage()}getVisitorId(){return this._sessionData.visitorId}getSessionId(){return this._sessionData.sessionId}getUserId(){return this._sessionData.userId}getLastEventAt(){return this._sessionData.lastEventAt}getTrackingConsent(){return this._sessionData.trackingConsent}setUserId(e){this._sessionData.userId=e,this._persistToStorage()}setTrackingConsent(e){this._sessionData.trackingConsent=e,this._persistToStorage()}updateLastEventAt(e){this._sessionData.lastEventAt=e,this._persistToStorage()}renewSessionIfNeeded(){return this._shouldRenewSession()?(this._renewSession(),this._persistToStorage(),!0):!1}reset({resetVisitorId:e=!1,resetSessionId:t=!0,resetTrackingConsent:r=!1}={}){e&&(this._sessionData.visitorId=this._generateVisitorId()),t&&(this._sessionData.sessionId=this._generateSessionId()),r&&(this._sessionData.trackingConsent=this._defaultTrackingConsent),this._sessionData.userId=null,this._sessionData.lastEventAt=null,this._persistToStorage()}_createDefaultSessionData(){return{visitorId:this._generateVisitorId(),sessionId:this._generateSessionId(),userId:null,lastEventAt:null,trackingConsent:this._defaultTrackingConsent}}_generateSessionId(){return M(K)}_generateVisitorId(){return M(G)}_shouldRenewSession(){let{lastEventAt:e}=this._sessionData;if(!e)return!0;let t=new Date().getTime(),r=new Date(e).getTime();return t-r>Q}_renewSession(){this._sessionData.sessionId=this._generateSessionId(),this._sessionData.lastEventAt=null}_persistToStorage(){try{this._storage.setItem(this._storageKey,JSON.stringify(this._sessionData))}catch{this._logger.warnDev("Failed to persist session data to storage.")}}};function Pe(n){return typeof n=="string"&&Object.values(o).includes(n)}function q(n,e,t){for(let r of t){let s=e.getItem(r);s!==null&&(n.setItem(r,s),e.removeItem(r))}}var f=class{store={};getItem(e){return this.store[e]??null}setItem(e,t){this.store[e]=t}removeItem(e){delete this.store[e]}migrate(e,t){q(this,e,t)}},S=class{getItem(e){return a(({window:t})=>{let r=t.document.cookie.match(new RegExp("(^| )"+e+"=([^;]+)"));return r?decodeURIComponent(r[2]):null},()=>null)}setItem(e,t){a(({window:r})=>{r.document.cookie=`${e}=${encodeURIComponent(t)}; path=/;`})}removeItem(e){a(({window:t})=>{t.document.cookie=`${e}=; Max-Age=0; path=/;`})}migrate(e,t){q(this,e,t)}},p=class{constructor(e){this.storage=e}getItem(e){return a(({window:t})=>{try{return t[this.storage].getItem(e)}catch{return null}},()=>null)}setItem(e,t){a(({window:r})=>{try{r[this.storage].setItem(e,t)}catch{}})}removeItem(e){a(({window:t})=>{try{t[this.storage].removeItem(e)}catch{}})}migrate(e,t){q(this,e,t)}},B=class{localStore=new p("localStorage");cookieStore=new S;getItem(e){return this.localStore.getItem(e)??this.cookieStore.getItem(e)}setItem(e,t){this.localStore.setItem(e,t),this.cookieStore.setItem(e,t)}removeItem(e){this.localStore.removeItem(e),this.cookieStore.removeItem(e)}migrate(e,t){for(let r of t){let s=e.getItem(r);s!==null&&(this.localStore.setItem(r,s),this.cookieStore.setItem(r,s))}for(let r of t)e.removeItem(r)}};function E(n){return a(({window:e})=>{try{if(n==="cookie"){e.document.cookie=`${u}=1`;let t=e.document.cookie.indexOf(`${u}=`)!==-1;return e.document.cookie=`${u}=; Max-Age=0`,t}else return e[n].setItem(u,"1"),e[n].removeItem(u),!0}catch{return!1}},()=>!1)}function k(n,e){let{onFallback:t}=e;switch(n){case"localStorage":return E("localStorage")?new p("localStorage"):(t("localStorage not supported, falling back to localStorage+cookie."),k("localStorage+cookie",e));case"localStorage+cookie":{let r=E("localStorage"),s=E("cookie");return r&&s?new B:s?(t("localStorage+cookie not fully supported, falling back to cookie."),new S):r?(t("cookie not supported, falling back to localStorage."),new p("localStorage")):(t("Neither localStorage nor cookie supported, falling back to memory."),new f)}case"sessionStorage":return E("sessionStorage")?new p("sessionStorage"):(t("sessionStorage not supported, falling back to memory."),new f);case"cookie":return E("cookie")?new S:(t("cookie not supported, falling back to memory."),new f);case"memory":return new f;default:throw new Error(`Unknown storage type: "${n}". Valid types are: localStorage, sessionStorage, cookie, memory, localStorage+cookie.`)}}var xe=[...N,...V].map(n=>`- "${n}"`).join(`
3
3
  `),ae=`List of reserved identifiers:
4
4
  ${xe}`;function ce(n){if(!n||n.trim()==="")throw new Error("User ID cannot be empty or contain only whitespace.");if(N.some(r=>n.toLowerCase()===r.toLowerCase()))throw new Error(`User ID "${n}" is a reserved identifier and cannot be used.
5
5
 
6
6
  `+ae);if(V.has(n))throw new Error(`User ID "${n}" is a reserved identifier and cannot be used.
7
7
 
8
- `+ae)}function le(){return a(({window:n})=>`${n.innerWidth}x${n.innerHeight}`,()=>null)}var Ue={autoCapture:!0,baseUrl:"https://api.altertable.ai",debug:!1,environment:"production",persistence:"localStorage+cookie",release:void 0,trackingConsent:o.PENDING},C=class{_cleanupAutoCapture;_config;_eventQueue;_isInitialized=!1;_lastUrl;_logger=ie("Altertable");_referrer;_requester;_sessionManager;_storage;_storageKey;constructor(){this._lastUrl=null,this._referrer=null,this._eventQueue=new I(W)}init(e,t={}){return l(e,"Missing API key"),this._config={...Ue,...t},this._storageKey=L(e,this._config.environment),this._referrer=a(({window:r})=>r.document.referrer||null,()=>null),this._lastUrl=a(({window:r})=>r.location.href||null,()=>null),this._storage=k(this._config.persistence,{onFallback:r=>this._logger.warn(r)}),this._requester=new y({baseUrl:this._config.baseUrl,apiKey:e,requestTimeout:X}),this._sessionManager=new b({storage:this._storage,storageKey:this._storageKey,logger:this._logger,defaultTrackingConsent:this._config.trackingConsent}),this._sessionManager.init(),this._isInitialized=!0,this._config.debug&&this._logger.logHeader(),this._handleAutoCaptureChange(this._config.autoCapture),()=>{this._cleanupAutoCapture?.()}}configure(e){if(l(this._isInitialized,"The client must be initialized with init() before configuring."),e.autoCapture!==void 0&&e.autoCapture!==this._config.autoCapture&&this._handleAutoCaptureChange(e.autoCapture),e.persistence!==void 0&&e.persistence!==this._config.persistence){let r=this._storage;this._storage=k(e.persistence,{onFallback:s=>this._logger.warn(s)}),this._storage.migrate(r,[this._storageKey])}let t=this._sessionManager.getTrackingConsent();if(e.trackingConsent!==void 0&&e.trackingConsent!==t)if(this._sessionManager.setTrackingConsent(e.trackingConsent),t!==o.GRANTED&&e.trackingConsent===o.GRANTED){let r=this._eventQueue.flush();r.length>0&&r.forEach(s=>{this._processEvent(s.eventType,s.payload,s.context)})}else e.trackingConsent===o.DENIED&&this._eventQueue.clear();this._config={...this._config,...e}}_handleAutoCaptureChange(e){if(this._cleanupAutoCapture?.(),e){this._lastUrl&&this.page(this._lastUrl);let t=this._checkForChanges.bind(this),r=setInterval(t,Y);a(({window:s})=>{s.addEventListener("popstate",t),s.addEventListener("hashchange",t)}),this._cleanupAutoCapture=()=>{clearInterval(r),a(({window:s})=>{s.removeEventListener("popstate",t),s.removeEventListener("hashchange",t)})}}else this._cleanupAutoCapture=void 0}identify(e,t={}){l(this._isInitialized,"The client must be initialized with init() before identifying users.");try{ce(e)}catch(i){throw new Error(`[Altertable] ${i.message}`)}this._sessionManager.setUserId(e);let r=this._getContext(),s={environment:r.environment,traits:t,user_id:e,visitor_id:r.visitor_id};if(this._processEvent("identify",s,r),this._config.debug){let i=this._sessionManager.getTrackingConsent();this._logger.logIdentify(s,{trackingConsent:i})}}updateTraits(e){let t=this._sessionManager.getUserId();l(t,"User must be identified with identify() before updating traits.");let r=this._getContext(),s={environment:r.environment,traits:e,user_id:t,visitor_id:r.visitor_id};if(this._processEvent("identify",s,r),this._config.debug){let i=this._sessionManager.getTrackingConsent();this._logger.logIdentify(s,{trackingConsent:i})}}reset({resetVisitorId:e=!1,resetSessionId:t=!0}={}){l(this._isInitialized,"The client must be initialized with init() before resetting."),this._sessionManager.reset({resetVisitorId:e,resetSessionId:t})}page(e){l(this._isInitialized,"The client must be initialized with init() before tracking page views.");let t=O(e),r=t?t.baseUrl:e;this.track(j,{[d]:r,[te]:le(),[Z]:this._referrer,...t?.searchParams})}track(e,t={}){l(this._isInitialized,"The client must be initialized with init() before tracking events."),this._sessionManager.renewSessionIfNeeded();let r=new Date().toISOString();this._sessionManager.updateLastEventAt(r);let s=this._getContext(),i={timestamp:r,event:e,environment:s.environment,user_id:s.user_id,session_id:s.session_id,visitor_id:s.visitor_id,properties:{[H]:"@altertable/altertable-js",[J]:"0.5.6",[ee]:this._config.release,...t[d]===void 0&&(()=>{let c=a(({window:h})=>h.location.href||null,()=>null),g=O(c),_=g?g.baseUrl:c;return{[d]:_}})(),...t}};if(this._processEvent("track",i,s),this._config.debug){let c=this._sessionManager.getTrackingConsent();this._logger.logEvent(i,{trackingConsent:c})}}getTrackingConsent(){return this._sessionManager.getTrackingConsent()}_checkForChanges(){a(({window:e})=>{let t=e.location.href;t!==this._lastUrl&&(this.page(t),this._referrer=this._lastUrl,this._lastUrl=t)})}_getContext(){return{environment:this._config.environment,user_id:this._sessionManager.getUserId(),visitor_id:this._sessionManager.getVisitorId(),session_id:this._sessionManager.getSessionId()}}async _processEvent(e,t,r){switch(this._sessionManager.getTrackingConsent()){case o.GRANTED:try{await this._requester.send(`/${e}`,t)}catch(i){this._logger.error("Failed to send event",{error:i,eventType:e,payload:t})}break;case o.PENDING:case o.DISMISSED:this._eventQueue.enqueue(e,t,r);break;case o.DENIED:break}}};var F=new C;a(({window:n})=>{let e=n.Altertable;if(e&&Array.isArray(e))for(let t of e){let r=t[0],s=t.slice(1);F[r](...s)}n.Altertable=F});
8
+ `+ae)}function le(){return a(({window:n})=>`${n.innerWidth}x${n.innerHeight}`,()=>null)}var Ue={autoCapture:!0,baseUrl:"https://api.altertable.ai",debug:!1,environment:"production",persistence:"localStorage+cookie",release:void 0,trackingConsent:o.PENDING},C=class{_cleanupAutoCapture;_config;_eventQueue;_isInitialized=!1;_lastUrl;_logger=ie("Altertable");_referrer;_requester;_sessionManager;_storage;_storageKey;constructor(){this._lastUrl=null,this._referrer=null,this._eventQueue=new I(W)}init(e,t={}){return l(e,"Missing API key"),this._config={...Ue,...t},this._storageKey=L(e,this._config.environment),this._referrer=a(({window:r})=>r.document.referrer||null,()=>null),this._lastUrl=a(({window:r})=>r.location.href||null,()=>null),this._storage=k(this._config.persistence,{onFallback:r=>this._logger.warn(r)}),this._requester=new y({baseUrl:this._config.baseUrl,apiKey:e,requestTimeout:X}),this._sessionManager=new b({storage:this._storage,storageKey:this._storageKey,logger:this._logger,defaultTrackingConsent:this._config.trackingConsent}),this._sessionManager.init(),this._isInitialized=!0,this._config.debug&&this._logger.logHeader(),this._handleAutoCaptureChange(this._config.autoCapture),()=>{this._cleanupAutoCapture?.()}}configure(e){if(l(this._isInitialized,"The client must be initialized with init() before configuring."),e.autoCapture!==void 0&&e.autoCapture!==this._config.autoCapture&&this._handleAutoCaptureChange(e.autoCapture),e.persistence!==void 0&&e.persistence!==this._config.persistence){let r=this._storage;this._storage=k(e.persistence,{onFallback:s=>this._logger.warn(s)}),this._storage.migrate(r,[this._storageKey])}let t=this._sessionManager.getTrackingConsent();if(e.trackingConsent!==void 0&&e.trackingConsent!==t)if(this._sessionManager.setTrackingConsent(e.trackingConsent),t!==o.GRANTED&&e.trackingConsent===o.GRANTED){let r=this._eventQueue.flush();r.length>0&&r.forEach(s=>{this._processEvent(s.eventType,s.payload,s.context)})}else e.trackingConsent===o.DENIED&&this._eventQueue.clear();this._config={...this._config,...e}}_handleAutoCaptureChange(e){if(this._cleanupAutoCapture?.(),e){this._lastUrl&&this.page(this._lastUrl);let t=this._checkForChanges.bind(this),r=setInterval(t,Y);a(({window:s})=>{s.addEventListener("popstate",t),s.addEventListener("hashchange",t)}),this._cleanupAutoCapture=()=>{clearInterval(r),a(({window:s})=>{s.removeEventListener("popstate",t),s.removeEventListener("hashchange",t)})}}else this._cleanupAutoCapture=void 0}identify(e,t={}){l(this._isInitialized,"The client must be initialized with init() before identifying users.");try{ce(e)}catch(i){throw new Error(`[Altertable] ${i.message}`)}this._sessionManager.setUserId(e);let r=this._getContext(),s={environment:r.environment,traits:t,user_id:e,visitor_id:r.visitor_id};if(this._processEvent("identify",s,r),this._config.debug){let i=this._sessionManager.getTrackingConsent();this._logger.logIdentify(s,{trackingConsent:i})}}updateTraits(e){let t=this._sessionManager.getUserId();l(t,"User must be identified with identify() before updating traits.");let r=this._getContext(),s={environment:r.environment,traits:e,user_id:t,visitor_id:r.visitor_id};if(this._processEvent("identify",s,r),this._config.debug){let i=this._sessionManager.getTrackingConsent();this._logger.logIdentify(s,{trackingConsent:i})}}reset({resetVisitorId:e=!1,resetSessionId:t=!0}={}){l(this._isInitialized,"The client must be initialized with init() before resetting."),this._sessionManager.reset({resetVisitorId:e,resetSessionId:t})}page(e){l(this._isInitialized,"The client must be initialized with init() before tracking page views.");let t=O(e),r=t?t.baseUrl:e;this.track(j,{[d]:r,[te]:le(),[Z]:this._referrer,...t?.searchParams})}track(e,t={}){l(this._isInitialized,"The client must be initialized with init() before tracking events."),this._sessionManager.renewSessionIfNeeded();let r=new Date().toISOString();this._sessionManager.updateLastEventAt(r);let s=this._getContext(),i={timestamp:r,event:e,environment:s.environment,user_id:s.user_id,session_id:s.session_id,visitor_id:s.visitor_id,properties:{[H]:"@altertable/altertable-js",[J]:"0.5.7",[ee]:this._config.release,...t[d]===void 0&&(()=>{let c=a(({window:h})=>h.location.href||null,()=>null),g=O(c),_=g?g.baseUrl:c;return{[d]:_}})(),...t}};if(this._processEvent("track",i,s),this._config.debug){let c=this._sessionManager.getTrackingConsent();this._logger.logEvent(i,{trackingConsent:c})}}getTrackingConsent(){return this._sessionManager.getTrackingConsent()}_checkForChanges(){a(({window:e})=>{let t=e.location.href;t!==this._lastUrl&&(this.page(t),this._referrer=this._lastUrl,this._lastUrl=t)})}_getContext(){return{environment:this._config.environment,user_id:this._sessionManager.getUserId(),visitor_id:this._sessionManager.getVisitorId(),session_id:this._sessionManager.getSessionId()}}async _processEvent(e,t,r){switch(this._sessionManager.getTrackingConsent()){case o.GRANTED:try{await this._requester.send(`/${e}`,t)}catch(i){this._logger.error("Failed to send event",{error:i,eventType:e,payload:t})}break;case o.PENDING:case o.DISMISSED:this._eventQueue.enqueue(e,t,r);break;case o.DENIED:break}}};var F=new C;a(({window:n})=>{let e=n.Altertable;if(e&&Array.isArray(e))for(let t of e){let r=t[0],s=t.slice(1);F[r](...s)}n.Altertable=F});
9
9
  //# sourceMappingURL=index.js.map
package/dist/index.mjs CHANGED
@@ -1,9 +1,9 @@
1
- /*! @altertable/altertable-js 0.5.6 | MIT License | Altertable | https://github.com/altertable-ai/altertable-js */
2
- function q(n,e){return(...t)=>[n,...t].join(e)}var me="atbl",$=q(me,"."),u=$("check"),F="session",z="visitor",ve=1e3*60,K=100,G=30*ve,Y=1e3,Q=5e3,W="$pageview",X="$lib",j="$lib_version",H="$referer",J="$release",d="$url",Z="$viewport",a={DENIED:"denied",DISMISSED:"dismissed",GRANTED:"granted",PENDING:"pending"},L=["anonymous_id","anonymous","distinct_id","distinctid","false","guest","id","not_authenticated","true","undefined","user_id","user","visitor_id","visitor"],N=new Set(["[object Object]","0","NaN","none","None","null"]);var I=class{_queue=[];_queueMaxSize;constructor(e){this._queueMaxSize=e}enqueue(e,t,r){this._queue.length>=this._queueMaxSize&&this._queue.shift(),this._queue.push({eventType:e,payload:t,context:r,sentAt:new Date})}flush(){let e=[...this._queue];return this._queue=[],e}clear(){this._queue=[]}getSize(){return this._queue.length}};function l(n,e){if(!n)throw new Error("Invariant failed")}function re(n){return{log:(...e)=>{console.log(`[${n}]`,...e)},logHeader:()=>{let e="Altertable v0.5.6 %c\u2022 Debug mode enabled";T.current[e]||(T.current[e]=!0,console.log(e,"color: #64748b;"))},logEvent:(e,{trackingConsent:t})=>{let[r,s]=ee(e.event==="$pageview"?"Page":"Track"),[i,c]=Ie(e.event==="$pageview"?String(e.properties[d]):e.event),[g,_]=te(e.environment),[h,R]=ye(e.timestamp),[w,A]=ne(t);console.groupCollapsed(`[${n}] %c${r}%c ${i} %c[${g}] %c${h} %c${w}`,s,c,_,R,A);let[D,P]=m("User ID"),[x,U]=v(e.user_id??"Not set"),[le,ge]=m("Visitor ID"),[ue,de]=v(e.visitor_id??"Not set"),[fe,pe]=m("Session ID"),[_e,he]=v(e.session_id??"Not set");console.log(`%c${D} %c${x}`,P,U),console.log(`%c${le} %c${ue}`,ge,de),console.log(`%c${fe} %c${_e}`,pe,he),console.table(e.properties),console.groupEnd()},logIdentify:(e,{trackingConsent:t})=>{let[r,s]=ee("Identify"),[i,c]=te(e.environment),[g,_]=ne(t);console.groupCollapsed(`[${n}] %c${r}%c ${e.user_id} %c[${i}] %c${g}`,s,"font-weight: 600;",c,_);let[h,R]=m("User ID"),[w,A]=v(e.user_id??"Not set"),[D,P]=m("Visitor ID"),[x,U]=v(e.visitor_id??"Not set");console.log(`%c${h} %c${w}`,R,A),console.log(`%c${D} %c${x}`,P,U),console.table(e.traits),console.groupEnd()},warn:(...e)=>{console.warn(`[${n}]`,...e)},warnDev:(e,...t)=>{},error:(...e)=>{console.error(`[${n}]`,...e)}}}var T={current:{}};function Ee(n){return new Date(n).toLocaleTimeString("en-US",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"})}function Se(n){switch(n){case"Page":return"#64748b";case"Identify":return"#a855f7";case"Track":return"#10b981";default:return"#1e293b"}}function ee(n){return[n,`background: ${Se(n)}; color: #ffffff; padding: 2px 8px; border-radius: 6px; font-weight: 400;`]}function Ie(n){return[n==="$pageview"?"Page Viewed":n,"font-weight: 600;"]}function te(n){return[n,`color: ${Te(n)}; font-weight: 400;`]}function Te(n){switch(n.toLocaleLowerCase().startsWith("prod")?"production":n){case"production":return"#ef4444";default:return"#3b82f6"}}function ye(n){return[Ee(n),"color: #64748b; font-weight: 400;"]}function m(n){return[n,"color: #64748b; font-size: 11px;"]}function v(n){return[n,'background: #f8fafc; color: #1e293b; padding: 2px 8px; border: 1px solid #e2e8f0; border-radius: 6px; font-family: "SF Mono", "Monaco", monospace; font-size: 11px;']}function ne(n){switch(n){case a.GRANTED:return["",""];case a.DENIED:return["DENIED","background: #ef4444; color: #ffffff; padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: 600;"];case a.PENDING:case a.DISMISSED:return["PENDING","background: #f59e0b; color: #ffffff; padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: 600;"];default:return["UNKNOWN","background: #6b7280; color: #ffffff; padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: 600;"]}}function V(n){try{let e=new URL(n);return{baseUrl:`${e.origin}${e.pathname}`,searchParams:Object.fromEntries(e.searchParams)}}catch{return null}}function se(){return typeof window<"u"&&typeof navigator<"u"&&typeof navigator.sendBeacon=="function"}var y=class{_config;constructor(e){this._config=e}_constructUrl(e){return`${this._config.baseUrl}${e}?apiKey=${encodeURIComponent(this._config.apiKey)}`}async send(e,t){return se()?this._sendWithBeacon(e,t):this._sendWithFetch(e,t)}async _sendWithBeacon(e,t){let r=this._constructUrl(e),s=new Blob([JSON.stringify(t)],{type:"application/json"});try{if(!navigator.sendBeacon(r,s))return this._sendWithFetch(e,t)}catch{return this._sendWithFetch(e,t)}}async _sendWithFetch(e,t){let r=this._constructUrl(e),s=new AbortController,i=setTimeout(()=>s.abort(),this._config.requestTimeout);try{let c=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t),keepalive:!0,signal:s.signal});if(!c.ok)throw new Error(`HTTP ${c.status}: ${c.statusText}`)}finally{clearTimeout(i)}}};function o(n,e=()=>{}){return typeof window>"u"?e():n({window})}function O(n){if(typeof globalThis.crypto<"u"&&typeof globalThis.crypto.randomUUID=="function")try{return`${n}-${crypto.randomUUID()}`}catch{}return`${n}-${Math.random().toString(36).substring(2)}`}var b=class{_defaultTrackingConsent;_logger;_sessionData;_storage;_storageKey;constructor(e){this._storage=e.storage,this._storageKey=e.storageKey,this._logger=e.logger,this._defaultTrackingConsent=e.defaultTrackingConsent??a.PENDING,this._sessionData=this._createDefaultSessionData()}init(){let e=this._storage.getItem(this._storageKey);if(!e){this._sessionData=this._createDefaultSessionData(),this._persistToStorage();return}try{let t=JSON.parse(e);this._sessionData={visitorId:t.visitorId||this._generateVisitorId(),sessionId:t.sessionId||this._generateSessionId(),userId:t.userId||null,lastEventAt:t.lastEventAt||null,trackingConsent:be(t.trackingConsent)?t.trackingConsent:this._defaultTrackingConsent}}catch{this._logger.warnDev("Failed to parse storage data. Resetting session data."),this._sessionData=this._createDefaultSessionData()}this._persistToStorage()}getVisitorId(){return this._sessionData.visitorId}getSessionId(){return this._sessionData.sessionId}getUserId(){return this._sessionData.userId}getLastEventAt(){return this._sessionData.lastEventAt}getTrackingConsent(){return this._sessionData.trackingConsent}setUserId(e){this._sessionData.userId=e,this._persistToStorage()}setTrackingConsent(e){this._sessionData.trackingConsent=e,this._persistToStorage()}updateLastEventAt(e){this._sessionData.lastEventAt=e,this._persistToStorage()}renewSessionIfNeeded(){return this._shouldRenewSession()?(this._renewSession(),this._persistToStorage(),!0):!1}reset({resetVisitorId:e=!1,resetSessionId:t=!0,resetTrackingConsent:r=!1}={}){e&&(this._sessionData.visitorId=this._generateVisitorId()),t&&(this._sessionData.sessionId=this._generateSessionId()),r&&(this._sessionData.trackingConsent=this._defaultTrackingConsent),this._sessionData.userId=null,this._sessionData.lastEventAt=null,this._persistToStorage()}_createDefaultSessionData(){return{visitorId:this._generateVisitorId(),sessionId:this._generateSessionId(),userId:null,lastEventAt:null,trackingConsent:this._defaultTrackingConsent}}_generateSessionId(){return O(F)}_generateVisitorId(){return O(z)}_shouldRenewSession(){let{lastEventAt:e}=this._sessionData;if(!e)return!0;let t=new Date().getTime(),r=new Date(e).getTime();return t-r>G}_renewSession(){this._sessionData.sessionId=this._generateSessionId(),this._sessionData.lastEventAt=null}_persistToStorage(){try{this._storage.setItem(this._storageKey,JSON.stringify(this._sessionData))}catch{this._logger.warnDev("Failed to persist session data to storage.")}}};function be(n){return typeof n=="string"&&Object.values(a).includes(n)}function B(n,e,t){for(let r of t){let s=e.getItem(r);s!==null&&(n.setItem(r,s),e.removeItem(r))}}var f=class{store={};getItem(e){return this.store[e]??null}setItem(e,t){this.store[e]=t}removeItem(e){delete this.store[e]}migrate(e,t){B(this,e,t)}},S=class{getItem(e){return o(({window:t})=>{let r=t.document.cookie.match(new RegExp("(^| )"+e+"=([^;]+)"));return r?decodeURIComponent(r[2]):null},()=>null)}setItem(e,t){o(({window:r})=>{r.document.cookie=`${e}=${encodeURIComponent(t)}; path=/;`})}removeItem(e){o(({window:t})=>{t.document.cookie=`${e}=; Max-Age=0; path=/;`})}migrate(e,t){B(this,e,t)}},p=class{constructor(e){this.storage=e}getItem(e){return o(({window:t})=>{try{return t[this.storage].getItem(e)}catch{return null}},()=>null)}setItem(e,t){o(({window:r})=>{try{r[this.storage].setItem(e,t)}catch{}})}removeItem(e){o(({window:t})=>{try{t[this.storage].removeItem(e)}catch{}})}migrate(e,t){B(this,e,t)}},M=class{localStore=new p("localStorage");cookieStore=new S;getItem(e){return this.localStore.getItem(e)??this.cookieStore.getItem(e)}setItem(e,t){this.localStore.setItem(e,t),this.cookieStore.setItem(e,t)}removeItem(e){this.localStore.removeItem(e),this.cookieStore.removeItem(e)}migrate(e,t){for(let r of t){let s=e.getItem(r);s!==null&&(this.localStore.setItem(r,s),this.cookieStore.setItem(r,s))}for(let r of t)e.removeItem(r)}};function E(n){return o(({window:e})=>{try{if(n==="cookie"){e.document.cookie=`${u}=1`;let t=e.document.cookie.indexOf(`${u}=`)!==-1;return e.document.cookie=`${u}=; Max-Age=0`,t}else return e[n].setItem(u,"1"),e[n].removeItem(u),!0}catch{return!1}},()=>!1)}function k(n,e){let{onFallback:t}=e;switch(n){case"localStorage":return E("localStorage")?new p("localStorage"):(t("localStorage not supported, falling back to localStorage+cookie."),k("localStorage+cookie",e));case"localStorage+cookie":{let r=E("localStorage"),s=E("cookie");return r&&s?new M:s?(t("localStorage+cookie not fully supported, falling back to cookie."),new S):r?(t("cookie not supported, falling back to localStorage."),new p("localStorage")):(t("Neither localStorage nor cookie supported, falling back to memory."),new f)}case"sessionStorage":return E("sessionStorage")?new p("sessionStorage"):(t("sessionStorage not supported, falling back to memory."),new f);case"cookie":return E("cookie")?new S:(t("cookie not supported, falling back to memory."),new f);case"memory":return new f;default:throw new Error(`Unknown storage type: "${n}". Valid types are: localStorage, sessionStorage, cookie, memory, localStorage+cookie.`)}}var ke=[...L,...N].map(n=>`- "${n}"`).join(`
1
+ /*! @altertable/altertable-js 0.5.7 | MIT License | Altertable | https://github.com/altertable-ai/altertable-js */
2
+ function q(n,e){return(...t)=>[n,...t].join(e)}var me="atbl",$=q(me,"."),u=$("check"),F="session",z="visitor",ve=1e3*60,K=100,G=30*ve,Y=1e3,Q=5e3,W="$pageview",X="$lib",j="$lib_version",H="$referer",J="$release",d="$url",Z="$viewport",a={DENIED:"denied",DISMISSED:"dismissed",GRANTED:"granted",PENDING:"pending"},L=["anonymous_id","anonymous","distinct_id","distinctid","false","guest","id","not_authenticated","true","undefined","user_id","user","visitor_id","visitor"],N=new Set(["[object Object]","0","NaN","none","None","null"]);var I=class{_queue=[];_queueMaxSize;constructor(e){this._queueMaxSize=e}enqueue(e,t,r){this._queue.length>=this._queueMaxSize&&this._queue.shift(),this._queue.push({eventType:e,payload:t,context:r,sentAt:new Date})}flush(){let e=[...this._queue];return this._queue=[],e}clear(){this._queue=[]}getSize(){return this._queue.length}};function l(n,e){if(!n)throw new Error("Invariant failed")}function re(n){return{log:(...e)=>{console.log(`[${n}]`,...e)},logHeader:()=>{let e="Altertable v0.5.7 %c\u2022 Debug mode enabled";T.current[e]||(T.current[e]=!0,console.log(e,"color: #64748b;"))},logEvent:(e,{trackingConsent:t})=>{let[r,s]=ee(e.event==="$pageview"?"Page":"Track"),[i,c]=Ie(e.event==="$pageview"?String(e.properties[d]):e.event),[g,_]=te(e.environment),[h,R]=ye(e.timestamp),[w,A]=ne(t);console.groupCollapsed(`[${n}] %c${r}%c ${i} %c[${g}] %c${h} %c${w}`,s,c,_,R,A);let[D,P]=m("User ID"),[x,U]=v(e.user_id??"Not set"),[le,ge]=m("Visitor ID"),[ue,de]=v(e.visitor_id??"Not set"),[fe,pe]=m("Session ID"),[_e,he]=v(e.session_id??"Not set");console.log(`%c${D} %c${x}`,P,U),console.log(`%c${le} %c${ue}`,ge,de),console.log(`%c${fe} %c${_e}`,pe,he),console.table(e.properties),console.groupEnd()},logIdentify:(e,{trackingConsent:t})=>{let[r,s]=ee("Identify"),[i,c]=te(e.environment),[g,_]=ne(t);console.groupCollapsed(`[${n}] %c${r}%c ${e.user_id} %c[${i}] %c${g}`,s,"font-weight: 600;",c,_);let[h,R]=m("User ID"),[w,A]=v(e.user_id??"Not set"),[D,P]=m("Visitor ID"),[x,U]=v(e.visitor_id??"Not set");console.log(`%c${h} %c${w}`,R,A),console.log(`%c${D} %c${x}`,P,U),console.table(e.traits),console.groupEnd()},warn:(...e)=>{console.warn(`[${n}]`,...e)},warnDev:(e,...t)=>{},error:(...e)=>{console.error(`[${n}]`,...e)}}}var T={current:{}};function Ee(n){return new Date(n).toLocaleTimeString("en-US",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"})}function Se(n){switch(n){case"Page":return"#64748b";case"Identify":return"#a855f7";case"Track":return"#10b981";default:return"#1e293b"}}function ee(n){return[n,`background: ${Se(n)}; color: #ffffff; padding: 2px 8px; border-radius: 6px; font-weight: 400;`]}function Ie(n){return[n==="$pageview"?"Page Viewed":n,"font-weight: 600;"]}function te(n){return[n,`color: ${Te(n)}; font-weight: 400;`]}function Te(n){switch(n.toLocaleLowerCase().startsWith("prod")?"production":n){case"production":return"#ef4444";default:return"#3b82f6"}}function ye(n){return[Ee(n),"color: #64748b; font-weight: 400;"]}function m(n){return[n,"color: #64748b; font-size: 11px;"]}function v(n){return[n,'background: #f8fafc; color: #1e293b; padding: 2px 8px; border: 1px solid #e2e8f0; border-radius: 6px; font-family: "SF Mono", "Monaco", monospace; font-size: 11px;']}function ne(n){switch(n){case a.GRANTED:return["",""];case a.DENIED:return["DENIED","background: #ef4444; color: #ffffff; padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: 600;"];case a.PENDING:case a.DISMISSED:return["PENDING","background: #f59e0b; color: #ffffff; padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: 600;"];default:return["UNKNOWN","background: #6b7280; color: #ffffff; padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: 600;"]}}function V(n){try{let e=new URL(n);return{baseUrl:`${e.origin}${e.pathname}`,searchParams:Object.fromEntries(e.searchParams)}}catch{return null}}function se(){return typeof window<"u"&&typeof navigator<"u"&&typeof navigator.sendBeacon=="function"}var y=class{_config;constructor(e){this._config=e}_constructUrl(e){return`${this._config.baseUrl}${e}?apiKey=${encodeURIComponent(this._config.apiKey)}`}async send(e,t){return se()?this._sendWithBeacon(e,t):this._sendWithFetch(e,t)}async _sendWithBeacon(e,t){let r=this._constructUrl(e),s=new Blob([JSON.stringify(t)],{type:"application/json"});try{if(!navigator.sendBeacon(r,s))return this._sendWithFetch(e,t)}catch{return this._sendWithFetch(e,t)}}async _sendWithFetch(e,t){let r=this._constructUrl(e),s=new AbortController,i=setTimeout(()=>s.abort(),this._config.requestTimeout);try{let c=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t),keepalive:!0,signal:s.signal});if(!c.ok)throw new Error(`HTTP ${c.status}: ${c.statusText}`)}finally{clearTimeout(i)}}};function o(n,e=()=>{}){return typeof window>"u"?e():n({window})}function O(n){if(typeof globalThis.crypto<"u"&&typeof globalThis.crypto.randomUUID=="function")try{return`${n}-${crypto.randomUUID()}`}catch{}return`${n}-${Math.random().toString(36).substring(2)}`}var b=class{_defaultTrackingConsent;_logger;_sessionData;_storage;_storageKey;constructor(e){this._storage=e.storage,this._storageKey=e.storageKey,this._logger=e.logger,this._defaultTrackingConsent=e.defaultTrackingConsent??a.PENDING,this._sessionData=this._createDefaultSessionData()}init(){let e=this._storage.getItem(this._storageKey);if(!e){this._sessionData=this._createDefaultSessionData(),this._persistToStorage();return}try{let t=JSON.parse(e);this._sessionData={visitorId:t.visitorId||this._generateVisitorId(),sessionId:t.sessionId||this._generateSessionId(),userId:t.userId||null,lastEventAt:t.lastEventAt||null,trackingConsent:be(t.trackingConsent)?t.trackingConsent:this._defaultTrackingConsent}}catch{this._logger.warnDev("Failed to parse storage data. Resetting session data."),this._sessionData=this._createDefaultSessionData()}this._persistToStorage()}getVisitorId(){return this._sessionData.visitorId}getSessionId(){return this._sessionData.sessionId}getUserId(){return this._sessionData.userId}getLastEventAt(){return this._sessionData.lastEventAt}getTrackingConsent(){return this._sessionData.trackingConsent}setUserId(e){this._sessionData.userId=e,this._persistToStorage()}setTrackingConsent(e){this._sessionData.trackingConsent=e,this._persistToStorage()}updateLastEventAt(e){this._sessionData.lastEventAt=e,this._persistToStorage()}renewSessionIfNeeded(){return this._shouldRenewSession()?(this._renewSession(),this._persistToStorage(),!0):!1}reset({resetVisitorId:e=!1,resetSessionId:t=!0,resetTrackingConsent:r=!1}={}){e&&(this._sessionData.visitorId=this._generateVisitorId()),t&&(this._sessionData.sessionId=this._generateSessionId()),r&&(this._sessionData.trackingConsent=this._defaultTrackingConsent),this._sessionData.userId=null,this._sessionData.lastEventAt=null,this._persistToStorage()}_createDefaultSessionData(){return{visitorId:this._generateVisitorId(),sessionId:this._generateSessionId(),userId:null,lastEventAt:null,trackingConsent:this._defaultTrackingConsent}}_generateSessionId(){return O(F)}_generateVisitorId(){return O(z)}_shouldRenewSession(){let{lastEventAt:e}=this._sessionData;if(!e)return!0;let t=new Date().getTime(),r=new Date(e).getTime();return t-r>G}_renewSession(){this._sessionData.sessionId=this._generateSessionId(),this._sessionData.lastEventAt=null}_persistToStorage(){try{this._storage.setItem(this._storageKey,JSON.stringify(this._sessionData))}catch{this._logger.warnDev("Failed to persist session data to storage.")}}};function be(n){return typeof n=="string"&&Object.values(a).includes(n)}function B(n,e,t){for(let r of t){let s=e.getItem(r);s!==null&&(n.setItem(r,s),e.removeItem(r))}}var f=class{store={};getItem(e){return this.store[e]??null}setItem(e,t){this.store[e]=t}removeItem(e){delete this.store[e]}migrate(e,t){B(this,e,t)}},S=class{getItem(e){return o(({window:t})=>{let r=t.document.cookie.match(new RegExp("(^| )"+e+"=([^;]+)"));return r?decodeURIComponent(r[2]):null},()=>null)}setItem(e,t){o(({window:r})=>{r.document.cookie=`${e}=${encodeURIComponent(t)}; path=/;`})}removeItem(e){o(({window:t})=>{t.document.cookie=`${e}=; Max-Age=0; path=/;`})}migrate(e,t){B(this,e,t)}},p=class{constructor(e){this.storage=e}getItem(e){return o(({window:t})=>{try{return t[this.storage].getItem(e)}catch{return null}},()=>null)}setItem(e,t){o(({window:r})=>{try{r[this.storage].setItem(e,t)}catch{}})}removeItem(e){o(({window:t})=>{try{t[this.storage].removeItem(e)}catch{}})}migrate(e,t){B(this,e,t)}},M=class{localStore=new p("localStorage");cookieStore=new S;getItem(e){return this.localStore.getItem(e)??this.cookieStore.getItem(e)}setItem(e,t){this.localStore.setItem(e,t),this.cookieStore.setItem(e,t)}removeItem(e){this.localStore.removeItem(e),this.cookieStore.removeItem(e)}migrate(e,t){for(let r of t){let s=e.getItem(r);s!==null&&(this.localStore.setItem(r,s),this.cookieStore.setItem(r,s))}for(let r of t)e.removeItem(r)}};function E(n){return o(({window:e})=>{try{if(n==="cookie"){e.document.cookie=`${u}=1`;let t=e.document.cookie.indexOf(`${u}=`)!==-1;return e.document.cookie=`${u}=; Max-Age=0`,t}else return e[n].setItem(u,"1"),e[n].removeItem(u),!0}catch{return!1}},()=>!1)}function k(n,e){let{onFallback:t}=e;switch(n){case"localStorage":return E("localStorage")?new p("localStorage"):(t("localStorage not supported, falling back to localStorage+cookie."),k("localStorage+cookie",e));case"localStorage+cookie":{let r=E("localStorage"),s=E("cookie");return r&&s?new M:s?(t("localStorage+cookie not fully supported, falling back to cookie."),new S):r?(t("cookie not supported, falling back to localStorage."),new p("localStorage")):(t("Neither localStorage nor cookie supported, falling back to memory."),new f)}case"sessionStorage":return E("sessionStorage")?new p("sessionStorage"):(t("sessionStorage not supported, falling back to memory."),new f);case"cookie":return E("cookie")?new S:(t("cookie not supported, falling back to memory."),new f);case"memory":return new f;default:throw new Error(`Unknown storage type: "${n}". Valid types are: localStorage, sessionStorage, cookie, memory, localStorage+cookie.`)}}var ke=[...L,...N].map(n=>`- "${n}"`).join(`
3
3
  `),ie=`List of reserved identifiers:
4
4
  ${ke}`;function oe(n){if(!n||n.trim()==="")throw new Error("User ID cannot be empty or contain only whitespace.");if(L.some(r=>n.toLowerCase()===r.toLowerCase()))throw new Error(`User ID "${n}" is a reserved identifier and cannot be used.
5
5
 
6
6
  `+ie);if(N.has(n))throw new Error(`User ID "${n}" is a reserved identifier and cannot be used.
7
7
 
8
- `+ie)}function ae(){return o(({window:n})=>`${n.innerWidth}x${n.innerHeight}`,()=>null)}var Ce={autoCapture:!0,baseUrl:"https://api.altertable.ai",debug:!1,environment:"production",persistence:"localStorage+cookie",release:void 0,trackingConsent:a.PENDING},C=class{_cleanupAutoCapture;_config;_eventQueue;_isInitialized=!1;_lastUrl;_logger=re("Altertable");_referrer;_requester;_sessionManager;_storage;_storageKey;constructor(){this._lastUrl=null,this._referrer=null,this._eventQueue=new I(Y)}init(e,t={}){return l(e,"Missing API key"),this._config={...Ce,...t},this._storageKey=$(e,this._config.environment),this._referrer=o(({window:r})=>r.document.referrer||null,()=>null),this._lastUrl=o(({window:r})=>r.location.href||null,()=>null),this._storage=k(this._config.persistence,{onFallback:r=>this._logger.warn(r)}),this._requester=new y({baseUrl:this._config.baseUrl,apiKey:e,requestTimeout:Q}),this._sessionManager=new b({storage:this._storage,storageKey:this._storageKey,logger:this._logger,defaultTrackingConsent:this._config.trackingConsent}),this._sessionManager.init(),this._isInitialized=!0,this._config.debug&&this._logger.logHeader(),this._handleAutoCaptureChange(this._config.autoCapture),()=>{this._cleanupAutoCapture?.()}}configure(e){if(l(this._isInitialized,"The client must be initialized with init() before configuring."),e.autoCapture!==void 0&&e.autoCapture!==this._config.autoCapture&&this._handleAutoCaptureChange(e.autoCapture),e.persistence!==void 0&&e.persistence!==this._config.persistence){let r=this._storage;this._storage=k(e.persistence,{onFallback:s=>this._logger.warn(s)}),this._storage.migrate(r,[this._storageKey])}let t=this._sessionManager.getTrackingConsent();if(e.trackingConsent!==void 0&&e.trackingConsent!==t)if(this._sessionManager.setTrackingConsent(e.trackingConsent),t!==a.GRANTED&&e.trackingConsent===a.GRANTED){let r=this._eventQueue.flush();r.length>0&&r.forEach(s=>{this._processEvent(s.eventType,s.payload,s.context)})}else e.trackingConsent===a.DENIED&&this._eventQueue.clear();this._config={...this._config,...e}}_handleAutoCaptureChange(e){if(this._cleanupAutoCapture?.(),e){this._lastUrl&&this.page(this._lastUrl);let t=this._checkForChanges.bind(this),r=setInterval(t,K);o(({window:s})=>{s.addEventListener("popstate",t),s.addEventListener("hashchange",t)}),this._cleanupAutoCapture=()=>{clearInterval(r),o(({window:s})=>{s.removeEventListener("popstate",t),s.removeEventListener("hashchange",t)})}}else this._cleanupAutoCapture=void 0}identify(e,t={}){l(this._isInitialized,"The client must be initialized with init() before identifying users.");try{oe(e)}catch(i){throw new Error(`[Altertable] ${i.message}`)}this._sessionManager.setUserId(e);let r=this._getContext(),s={environment:r.environment,traits:t,user_id:e,visitor_id:r.visitor_id};if(this._processEvent("identify",s,r),this._config.debug){let i=this._sessionManager.getTrackingConsent();this._logger.logIdentify(s,{trackingConsent:i})}}updateTraits(e){let t=this._sessionManager.getUserId();l(t,"User must be identified with identify() before updating traits.");let r=this._getContext(),s={environment:r.environment,traits:e,user_id:t,visitor_id:r.visitor_id};if(this._processEvent("identify",s,r),this._config.debug){let i=this._sessionManager.getTrackingConsent();this._logger.logIdentify(s,{trackingConsent:i})}}reset({resetVisitorId:e=!1,resetSessionId:t=!0}={}){l(this._isInitialized,"The client must be initialized with init() before resetting."),this._sessionManager.reset({resetVisitorId:e,resetSessionId:t})}page(e){l(this._isInitialized,"The client must be initialized with init() before tracking page views.");let t=V(e),r=t?t.baseUrl:e;this.track(W,{[d]:r,[Z]:ae(),[H]:this._referrer,...t?.searchParams})}track(e,t={}){l(this._isInitialized,"The client must be initialized with init() before tracking events."),this._sessionManager.renewSessionIfNeeded();let r=new Date().toISOString();this._sessionManager.updateLastEventAt(r);let s=this._getContext(),i={timestamp:r,event:e,environment:s.environment,user_id:s.user_id,session_id:s.session_id,visitor_id:s.visitor_id,properties:{[X]:"@altertable/altertable-js",[j]:"0.5.6",[J]:this._config.release,...t[d]===void 0&&(()=>{let c=o(({window:h})=>h.location.href||null,()=>null),g=V(c),_=g?g.baseUrl:c;return{[d]:_}})(),...t}};if(this._processEvent("track",i,s),this._config.debug){let c=this._sessionManager.getTrackingConsent();this._logger.logEvent(i,{trackingConsent:c})}}getTrackingConsent(){return this._sessionManager.getTrackingConsent()}_checkForChanges(){o(({window:e})=>{let t=e.location.href;t!==this._lastUrl&&(this.page(t),this._referrer=this._lastUrl,this._lastUrl=t)})}_getContext(){return{environment:this._config.environment,user_id:this._sessionManager.getUserId(),visitor_id:this._sessionManager.getVisitorId(),session_id:this._sessionManager.getSessionId()}}async _processEvent(e,t,r){switch(this._sessionManager.getTrackingConsent()){case a.GRANTED:try{await this._requester.send(`/${e}`,t)}catch(i){this._logger.error("Failed to send event",{error:i,eventType:e,payload:t})}break;case a.PENDING:case a.DISMISSED:this._eventQueue.enqueue(e,t,r);break;case a.DENIED:break}}};var ce=new C;o(({window:n})=>{let e=n.Altertable;if(e&&Array.isArray(e))for(let t of e){let r=t[0],s=t.slice(1);ce[r](...s)}n.Altertable=ce});export{a as TrackingConsent,ce as altertable};
8
+ `+ie)}function ae(){return o(({window:n})=>`${n.innerWidth}x${n.innerHeight}`,()=>null)}var Ce={autoCapture:!0,baseUrl:"https://api.altertable.ai",debug:!1,environment:"production",persistence:"localStorage+cookie",release:void 0,trackingConsent:a.PENDING},C=class{_cleanupAutoCapture;_config;_eventQueue;_isInitialized=!1;_lastUrl;_logger=re("Altertable");_referrer;_requester;_sessionManager;_storage;_storageKey;constructor(){this._lastUrl=null,this._referrer=null,this._eventQueue=new I(Y)}init(e,t={}){return l(e,"Missing API key"),this._config={...Ce,...t},this._storageKey=$(e,this._config.environment),this._referrer=o(({window:r})=>r.document.referrer||null,()=>null),this._lastUrl=o(({window:r})=>r.location.href||null,()=>null),this._storage=k(this._config.persistence,{onFallback:r=>this._logger.warn(r)}),this._requester=new y({baseUrl:this._config.baseUrl,apiKey:e,requestTimeout:Q}),this._sessionManager=new b({storage:this._storage,storageKey:this._storageKey,logger:this._logger,defaultTrackingConsent:this._config.trackingConsent}),this._sessionManager.init(),this._isInitialized=!0,this._config.debug&&this._logger.logHeader(),this._handleAutoCaptureChange(this._config.autoCapture),()=>{this._cleanupAutoCapture?.()}}configure(e){if(l(this._isInitialized,"The client must be initialized with init() before configuring."),e.autoCapture!==void 0&&e.autoCapture!==this._config.autoCapture&&this._handleAutoCaptureChange(e.autoCapture),e.persistence!==void 0&&e.persistence!==this._config.persistence){let r=this._storage;this._storage=k(e.persistence,{onFallback:s=>this._logger.warn(s)}),this._storage.migrate(r,[this._storageKey])}let t=this._sessionManager.getTrackingConsent();if(e.trackingConsent!==void 0&&e.trackingConsent!==t)if(this._sessionManager.setTrackingConsent(e.trackingConsent),t!==a.GRANTED&&e.trackingConsent===a.GRANTED){let r=this._eventQueue.flush();r.length>0&&r.forEach(s=>{this._processEvent(s.eventType,s.payload,s.context)})}else e.trackingConsent===a.DENIED&&this._eventQueue.clear();this._config={...this._config,...e}}_handleAutoCaptureChange(e){if(this._cleanupAutoCapture?.(),e){this._lastUrl&&this.page(this._lastUrl);let t=this._checkForChanges.bind(this),r=setInterval(t,K);o(({window:s})=>{s.addEventListener("popstate",t),s.addEventListener("hashchange",t)}),this._cleanupAutoCapture=()=>{clearInterval(r),o(({window:s})=>{s.removeEventListener("popstate",t),s.removeEventListener("hashchange",t)})}}else this._cleanupAutoCapture=void 0}identify(e,t={}){l(this._isInitialized,"The client must be initialized with init() before identifying users.");try{oe(e)}catch(i){throw new Error(`[Altertable] ${i.message}`)}this._sessionManager.setUserId(e);let r=this._getContext(),s={environment:r.environment,traits:t,user_id:e,visitor_id:r.visitor_id};if(this._processEvent("identify",s,r),this._config.debug){let i=this._sessionManager.getTrackingConsent();this._logger.logIdentify(s,{trackingConsent:i})}}updateTraits(e){let t=this._sessionManager.getUserId();l(t,"User must be identified with identify() before updating traits.");let r=this._getContext(),s={environment:r.environment,traits:e,user_id:t,visitor_id:r.visitor_id};if(this._processEvent("identify",s,r),this._config.debug){let i=this._sessionManager.getTrackingConsent();this._logger.logIdentify(s,{trackingConsent:i})}}reset({resetVisitorId:e=!1,resetSessionId:t=!0}={}){l(this._isInitialized,"The client must be initialized with init() before resetting."),this._sessionManager.reset({resetVisitorId:e,resetSessionId:t})}page(e){l(this._isInitialized,"The client must be initialized with init() before tracking page views.");let t=V(e),r=t?t.baseUrl:e;this.track(W,{[d]:r,[Z]:ae(),[H]:this._referrer,...t?.searchParams})}track(e,t={}){l(this._isInitialized,"The client must be initialized with init() before tracking events."),this._sessionManager.renewSessionIfNeeded();let r=new Date().toISOString();this._sessionManager.updateLastEventAt(r);let s=this._getContext(),i={timestamp:r,event:e,environment:s.environment,user_id:s.user_id,session_id:s.session_id,visitor_id:s.visitor_id,properties:{[X]:"@altertable/altertable-js",[j]:"0.5.7",[J]:this._config.release,...t[d]===void 0&&(()=>{let c=o(({window:h})=>h.location.href||null,()=>null),g=V(c),_=g?g.baseUrl:c;return{[d]:_}})(),...t}};if(this._processEvent("track",i,s),this._config.debug){let c=this._sessionManager.getTrackingConsent();this._logger.logEvent(i,{trackingConsent:c})}}getTrackingConsent(){return this._sessionManager.getTrackingConsent()}_checkForChanges(){o(({window:e})=>{let t=e.location.href;t!==this._lastUrl&&(this.page(t),this._referrer=this._lastUrl,this._lastUrl=t)})}_getContext(){return{environment:this._config.environment,user_id:this._sessionManager.getUserId(),visitor_id:this._sessionManager.getVisitorId(),session_id:this._sessionManager.getSessionId()}}async _processEvent(e,t,r){switch(this._sessionManager.getTrackingConsent()){case a.GRANTED:try{await this._requester.send(`/${e}`,t)}catch(i){this._logger.error("Failed to send event",{error:i,eventType:e,payload:t})}break;case a.PENDING:case a.DISMISSED:this._eventQueue.enqueue(e,t,r);break;case a.DENIED:break}}};var ce=new C;o(({window:n})=>{let e=n.Altertable;if(e&&Array.isArray(e))for(let t of e){let r=t[0],s=t.slice(1);ce[r](...s)}n.Altertable=ce});export{a as TrackingConsent,ce as altertable};
9
9
  //# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@altertable/altertable-js",
3
3
  "description": "JavaScript SDK to capture and send events to Altertable.",
4
- "version": "0.5.6",
4
+ "version": "0.5.7",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/altertable-ai/altertable-js",
7
7
  "repository": "altertable-ai/altertable-js",