@altertable/altertable-js 0.5.3 → 0.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.global.js +3 -3
- package/dist/index.js +3 -3
- package/dist/index.mjs +3 -3
- package/package.json +9 -2
package/dist/index.global.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
/*! @altertable/altertable-js 0.5.
|
|
2
|
-
var Altertable=(()=>{var I=Object.defineProperty;var de=Object.getOwnPropertyDescriptor;var pe=Object.getOwnPropertyNames;var _e=Object.prototype.hasOwnProperty;var he=(n,e)=>{for(var t in e)I(n,t,{get:e[t],enumerable:!0})},fe=(n,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of pe(e))!_e.call(n,r)&&r!==t&&I(n,r,{get:()=>e[r],enumerable:!(s=de(e,r))||s.enumerable});return n};var Ee=n=>fe(I({},"__esModule",{value:!0}),n);var Ae={};he(Ae,{TrackingConsent:()=>i,altertable:()=>w});function x(n,e){return(...t)=>[n,...t].join(e)}var P="https://api.altertable.ai",S="production",U="localStorage+cookie",me="atbl",T=x(me,"."),c=T("check"),N="session",L="visitor",ve=1e3*60,$=100,V=30*ve,O=1e3,M="$pageview",B="$lib",z="$lib_version",F="$referer",K="$release",q="$url",G="$viewport",i={DENIED:"denied",DISMISSED:"dismissed",GRANTED:"granted",PENDING:"pending"},y=["anonymous_id","anonymous","distinct_id","distinctid","false","guest","id","not_authenticated","true","undefined","user_id","user","visitor_id","visitor"],k=new Set(["[object Object]","0","NaN","none","None","null"]);var h=class{_queue=[];_queueMaxSize;constructor(e){this._queueMaxSize=e}enqueue(e,t,s){this._queue.length>=this._queueMaxSize&&this._queue.shift(),this._queue.push({eventType:e,payload:t,context:s,sentAt:new Date})}flush(){let e=[...this._queue];return this._queue=[],e}clear(){this._queue=[]}getSize(){return this._queue.length}};function o(n,e=()=>{}){return typeof window>"u"?e():n({window})}function Y(){return o(({window:n})=>`${n.innerWidth}x${n.innerHeight}`,()=>null)}function a(n,e){if(!n)throw new Error("Invariant failed")}function Q(n){return{log:(...e)=>{console.log(`[${n}]`,...e)},logHeader:()=>{let e="Altertable v0.5.
|
|
1
|
+
/*! @altertable/altertable-js 0.5.4 | MIT License | Altertable | https://github.com/altertable-ai/altertable-js */
|
|
2
|
+
var Altertable=(()=>{var I=Object.defineProperty;var de=Object.getOwnPropertyDescriptor;var pe=Object.getOwnPropertyNames;var _e=Object.prototype.hasOwnProperty;var he=(n,e)=>{for(var t in e)I(n,t,{get:e[t],enumerable:!0})},fe=(n,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of pe(e))!_e.call(n,r)&&r!==t&&I(n,r,{get:()=>e[r],enumerable:!(s=de(e,r))||s.enumerable});return n};var Ee=n=>fe(I({},"__esModule",{value:!0}),n);var Ae={};he(Ae,{TrackingConsent:()=>i,altertable:()=>w});function x(n,e){return(...t)=>[n,...t].join(e)}var P="https://api.altertable.ai",S="production",U="localStorage+cookie",me="atbl",T=x(me,"."),c=T("check"),N="session",L="visitor",ve=1e3*60,$=100,V=30*ve,O=1e3,M="$pageview",B="$lib",z="$lib_version",F="$referer",K="$release",q="$url",G="$viewport",i={DENIED:"denied",DISMISSED:"dismissed",GRANTED:"granted",PENDING:"pending"},y=["anonymous_id","anonymous","distinct_id","distinctid","false","guest","id","not_authenticated","true","undefined","user_id","user","visitor_id","visitor"],k=new Set(["[object Object]","0","NaN","none","None","null"]);var h=class{_queue=[];_queueMaxSize;constructor(e){this._queueMaxSize=e}enqueue(e,t,s){this._queue.length>=this._queueMaxSize&&this._queue.shift(),this._queue.push({eventType:e,payload:t,context:s,sentAt:new Date})}flush(){let e=[...this._queue];return this._queue=[],e}clear(){this._queue=[]}getSize(){return this._queue.length}};function o(n,e=()=>{}){return typeof window>"u"?e():n({window})}function Y(){return o(({window:n})=>`${n.innerWidth}x${n.innerHeight}`,()=>null)}function a(n,e){if(!n)throw new Error("Invariant failed")}function Q(n){return{log:(...e)=>{console.log(`[${n}]`,...e)},logHeader:()=>{let e="Altertable v0.5.4 %c\u2022 Debug mode enabled";f.current[e]||(f.current[e]=!0,console.log(e,"color: #64748b;"))},logEvent:(e,{trackingConsent:t})=>{let[s,r]=Se(e.event),[g,l]=Te(e.environment),[W,H]=ke(e.timestamp),[J,Z]=be(t);console.groupCollapsed(`[${n}] %c${s}%c [${g}] %c(${W}) %c${J}`,r,l,H,Z);let[ee,te]=b("User ID"),[ne,se]=C(e.user_id??"Not set"),[re,ie]=b("Visitor ID"),[oe,ae]=C(e.visitor_id??"Not set"),[ge,le]=b("Session ID"),[ce,ue]=C(e.session_id??"Not set");console.log(`%c${ee} %c${ne}`,te,se),console.log(`%c${re} %c${oe}`,ie,ae),console.log(`%c${ge} %c${ce}`,le,ue),console.table(e.properties),console.groupEnd()},warn:(...e)=>{console.warn(`[${n}]`,...e)},warnDev:(e,...t)=>{return;if(!r){f.current[s]=!0;let g=`[${n}] ${s}`;console.warn(g,...t);try{throw new Error(g)}catch{}}},error:(...e)=>{console.error(`[${n}]`,...e)}}}var f={current:{}};function Ie(n){return new Date(n).toLocaleTimeString("en-US",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"})}function Se(n){return[n,"background: #1e293b; color: #f1f5f9; padding: 2px 8px; border-radius: 6px; font-weight: 400;"]}function Te(n){return[n,`color: ${ye(n)}; font-weight: 400;`]}function ye(n){switch(n.toLocaleLowerCase().startsWith("prod")?"production":n){case"production":return"#ef4444";default:return"#3b82f6"}}function ke(n){return[Ie(n),"color: #64748b; font-weight: 400;"]}function b(n){return[n,"color: #64748b; font-size: 11px;"]}function C(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 be(n){switch(n){case i.GRANTED:return["",""];case i.DENIED:return["DENIED","background: #ef4444; color: #ffffff; padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: 600;"];case i.PENDING:case i.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 R(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 E=class{_defaultTrackingConsent;_logger;_sessionData;_storage;_storageKey;constructor(e){this._storage=e.storage,this._storageKey=e.storageKey,this._logger=e.logger,this._defaultTrackingConsent=e.defaultTrackingConsent??i.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:Ce(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:s=!1}={}){e&&(this._sessionData.visitorId=this._generateVisitorId()),t&&(this._sessionData.sessionId=this._generateSessionId()),s&&(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 R(N)}_generateVisitorId(){return R(L)}_shouldRenewSession(){let{lastEventAt:e}=this._sessionData;if(!e)return!0;let t=new Date().getTime(),s=new Date(e).getTime();return t-s>V}_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 Ce(n){return typeof n=="string"&&Object.values(i).includes(n)}function D(n,e,t){for(let s of t){let r=e.getItem(s);r!==null&&(n.setItem(s,r),e.removeItem(s))}}var u=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){D(this,e,t)}},_=class{getItem(e){return o(({window:t})=>{let s=t.document.cookie.match(new RegExp("(^| )"+e+"=([^;]+)"));return s?decodeURIComponent(s[2]):null},()=>null)}setItem(e,t){o(({window:s})=>{s.document.cookie=`${e}=${encodeURIComponent(t)}; path=/;`})}removeItem(e){o(({window:t})=>{t.document.cookie=`${e}=; Max-Age=0; path=/;`})}migrate(e,t){D(this,e,t)}},d=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:s})=>{try{s[this.storage].setItem(e,t)}catch{}})}removeItem(e){o(({window:t})=>{try{t[this.storage].removeItem(e)}catch{}})}migrate(e,t){D(this,e,t)}},A=class{localStore=new d("localStorage");cookieStore=new _;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 s of t){let r=e.getItem(s);r!==null&&(this.localStore.setItem(s,r),this.cookieStore.setItem(s,r))}for(let s of t)e.removeItem(s)}};function p(n){return o(({window:e})=>{try{if(n==="cookie"){e.document.cookie=`${c}=1`;let t=e.document.cookie.indexOf(`${c}=`)!==-1;return e.document.cookie=`${c}=; Max-Age=0`,t}else return e[n].setItem(c,"1"),e[n].removeItem(c),!0}catch{return!1}},()=>!1)}function m(n,e){let{onFallback:t}=e;switch(n){case"localStorage":return p("localStorage")?new d("localStorage"):(t("localStorage not supported, falling back to localStorage+cookie."),m("localStorage+cookie",e));case"localStorage+cookie":{let s=p("localStorage"),r=p("cookie");return s&&r?new A:r?(t("localStorage+cookie not fully supported, falling back to cookie."),new _):s?(t("cookie not supported, falling back to localStorage."),new d("localStorage")):(t("Neither localStorage nor cookie supported, falling back to memory."),new u)}case"sessionStorage":return p("sessionStorage")?new d("sessionStorage"):(t("sessionStorage not supported, falling back to memory."),new u);case"cookie":return p("cookie")?new _:(t("cookie not supported, falling back to memory."),new u);case"memory":return new u;default:throw new Error(`Unknown storage type: "${n}". Valid types are: localStorage, sessionStorage, cookie, memory, localStorage+cookie.`)}}var Re=[...y,...k].map(n=>`- "${n}"`).join(`
|
|
3
3
|
`),X=`List of reserved identifiers:
|
|
4
4
|
${Re}`;function j(n){if(!n||n.trim()==="")throw new Error("User ID cannot be empty or contain only whitespace.");if(y.some(s=>n.toLowerCase()===s.toLowerCase()))throw new Error(`User ID "${n}" is a reserved identifier and cannot be used.
|
|
5
5
|
|
|
6
6
|
`+X);if(k.has(n))throw new Error(`User ID "${n}" is a reserved identifier and cannot be used.
|
|
7
7
|
|
|
8
|
-
`+X)}var v=class{_apiKey;_cleanupAutoCapture;_config;_eventQueue;_isInitialized=!1;_lastUrl;_logger=Q("Altertable");_referrer;_sessionManager;_storage;_storageKey;constructor(){this._lastUrl=null,this._referrer=null,this._eventQueue=new h(O)}init(e,t={}){a(e,"Missing API key"),this._apiKey=e,this._config=t,this._storageKey=T(e,this._config.environment||S),this._referrer=o(({window:r})=>r.document.referrer||null,()=>null),this._lastUrl=o(({window:r})=>r.location.href||null,()=>null);let s=t.persistence??U;return this._storage=m(s,{onFallback:r=>this._logger.warn(r)}),this._sessionManager=new E({storage:this._storage,storageKey:this._storageKey,logger:this._logger,defaultTrackingConsent:t.trackingConsent??i.PENDING}),this._sessionManager.init(),this._isInitialized=!0,this._config.debug&&this._logger.logHeader(),this._handleAutoCaptureChange(t.autoCapture??!0),()=>{this._cleanupAutoCapture?.()}}configure(e){if(a(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 s=this._storage;this._storage=m(e.persistence,{onFallback:r=>this._logger.warn(r)}),this._storage.migrate(s,[this._storageKey])}let t=this._sessionManager.getTrackingConsent();if(e.trackingConsent!==void 0&&e.trackingConsent!==t)if(this._sessionManager.setTrackingConsent(e.trackingConsent),t!==i.GRANTED&&e.trackingConsent===i.GRANTED){let s=this._eventQueue.flush();s.length>0&&s.forEach(r=>{this._processEvent(r.eventType,r.payload,r.context)})}else e.trackingConsent===i.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),s=setInterval(t,$);o(({window:r})=>{r.addEventListener("popstate",t),r.addEventListener("hashchange",t)}),this._cleanupAutoCapture=()=>{clearInterval(s),o(({window:r})=>{r.removeEventListener("popstate",t),r.removeEventListener("hashchange",t)})}}else this._cleanupAutoCapture=void 0}identify(e,t={}){a(this._isInitialized,"The client must be initialized with init() before identifying users.");try{j(e)}catch(r){throw new Error(`[Altertable] ${r.message}`)}this._sessionManager.setUserId(e);let s=this._getEventContext();this._processEvent("identify",{environment:s.environment,traits:t,user_id:e,visitor_id:s.visitor_id},s)}updateTraits(e){let t=this._sessionManager.getUserId();a(t,"User must be identified with identify() before updating traits.");let s=this._getEventContext();this._processEvent("identify",{environment:s.environment,traits:e,user_id:t,visitor_id:s.visitor_id},s)}reset({resetVisitorId:e=!1,resetSessionId:t=!0}={}){a(this._isInitialized,"The client must be initialized with init() before resetting."),this._sessionManager.reset({resetVisitorId:e,resetSessionId:t})}page(e){a(this._isInitialized,"The client must be initialized with init() before tracking page views.");let t=new URL(e),s=`${t.origin}${t.pathname}`;this.track(M,{[q]:s,[G]:Y(),[F]:this._referrer,...Object.fromEntries(t.searchParams)})}track(e,t={}){a(this._isInitialized,"The client must be initialized with init() before tracking events."),this._sessionManager.renewSessionIfNeeded();let s=new Date().toISOString();this._sessionManager.updateLastEventAt(s);let r=this._getEventContext(),g={timestamp:s,event:e,environment:r.environment,user_id:r.user_id,session_id:r.session_id,visitor_id:r.visitor_id,properties:{[B]:"@altertable/altertable-js",[z]:"0.5.
|
|
8
|
+
`+X)}var v=class{_apiKey;_cleanupAutoCapture;_config;_eventQueue;_isInitialized=!1;_lastUrl;_logger=Q("Altertable");_referrer;_sessionManager;_storage;_storageKey;constructor(){this._lastUrl=null,this._referrer=null,this._eventQueue=new h(O)}init(e,t={}){a(e,"Missing API key"),this._apiKey=e,this._config=t,this._storageKey=T(e,this._config.environment||S),this._referrer=o(({window:r})=>r.document.referrer||null,()=>null),this._lastUrl=o(({window:r})=>r.location.href||null,()=>null);let s=t.persistence??U;return this._storage=m(s,{onFallback:r=>this._logger.warn(r)}),this._sessionManager=new E({storage:this._storage,storageKey:this._storageKey,logger:this._logger,defaultTrackingConsent:t.trackingConsent??i.PENDING}),this._sessionManager.init(),this._isInitialized=!0,this._config.debug&&this._logger.logHeader(),this._handleAutoCaptureChange(t.autoCapture??!0),()=>{this._cleanupAutoCapture?.()}}configure(e){if(a(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 s=this._storage;this._storage=m(e.persistence,{onFallback:r=>this._logger.warn(r)}),this._storage.migrate(s,[this._storageKey])}let t=this._sessionManager.getTrackingConsent();if(e.trackingConsent!==void 0&&e.trackingConsent!==t)if(this._sessionManager.setTrackingConsent(e.trackingConsent),t!==i.GRANTED&&e.trackingConsent===i.GRANTED){let s=this._eventQueue.flush();s.length>0&&s.forEach(r=>{this._processEvent(r.eventType,r.payload,r.context)})}else e.trackingConsent===i.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),s=setInterval(t,$);o(({window:r})=>{r.addEventListener("popstate",t),r.addEventListener("hashchange",t)}),this._cleanupAutoCapture=()=>{clearInterval(s),o(({window:r})=>{r.removeEventListener("popstate",t),r.removeEventListener("hashchange",t)})}}else this._cleanupAutoCapture=void 0}identify(e,t={}){a(this._isInitialized,"The client must be initialized with init() before identifying users.");try{j(e)}catch(r){throw new Error(`[Altertable] ${r.message}`)}this._sessionManager.setUserId(e);let s=this._getEventContext();this._processEvent("identify",{environment:s.environment,traits:t,user_id:e,visitor_id:s.visitor_id},s)}updateTraits(e){let t=this._sessionManager.getUserId();a(t,"User must be identified with identify() before updating traits.");let s=this._getEventContext();this._processEvent("identify",{environment:s.environment,traits:e,user_id:t,visitor_id:s.visitor_id},s)}reset({resetVisitorId:e=!1,resetSessionId:t=!0}={}){a(this._isInitialized,"The client must be initialized with init() before resetting."),this._sessionManager.reset({resetVisitorId:e,resetSessionId:t})}page(e){a(this._isInitialized,"The client must be initialized with init() before tracking page views.");let t=new URL(e),s=`${t.origin}${t.pathname}`;this.track(M,{[q]:s,[G]:Y(),[F]:this._referrer,...Object.fromEntries(t.searchParams)})}track(e,t={}){a(this._isInitialized,"The client must be initialized with init() before tracking events."),this._sessionManager.renewSessionIfNeeded();let s=new Date().toISOString();this._sessionManager.updateLastEventAt(s);let r=this._getEventContext(),g={timestamp:s,event:e,environment:r.environment,user_id:r.user_id,session_id:r.session_id,visitor_id:r.visitor_id,properties:{[B]:"@altertable/altertable-js",[z]:"0.5.4",[K]:this._config.release,...t}};if(this._processEvent("track",g,r),this._config.debug){let l=this._sessionManager.getTrackingConsent();this._logger.logEvent(g,{trackingConsent:l})}}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)})}_getEventContext(){return{environment:this._config.environment||S,user_id:this._sessionManager.getUserId(),visitor_id:this._sessionManager.getVisitorId(),session_id:this._sessionManager.getSessionId()}}_processEvent(e,t,s){switch(this._sessionManager.getTrackingConsent()){case i.GRANTED:this._request(`/${e}`,t);break;case i.PENDING:case i.DISMISSED:this._eventQueue.enqueue(e,t,s);break;case i.DENIED:break}}_request(e,t){a(this._apiKey,"Missing API key"),a(this._config,"Missing configuration");let s=`${this._config.baseUrl||P}${e}`,r=JSON.stringify(t);if(typeof navigator<"u"&&navigator.sendBeacon){let g=`${s}?apiKey=${encodeURIComponent(this._apiKey)}`,l=new Blob([r],{type:"application/json"});navigator.sendBeacon(g,l)}else fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this._apiKey}`},body:r})}};var w=new v;o(({window:n})=>{let e=n.Altertable;if(e&&Array.isArray(e))for(let t of e){let s=t[0],r=t.slice(1);w[s](...r)}n.Altertable=w});return Ee(Ae);})();
|
|
9
9
|
//# sourceMappingURL=index.global.js.map
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
/*! @altertable/altertable-js 0.5.
|
|
2
|
-
var I=Object.defineProperty;var de=Object.getOwnPropertyDescriptor;var pe=Object.getOwnPropertyNames;var _e=Object.prototype.hasOwnProperty;var he=(n,e)=>{for(var t in e)I(n,t,{get:e[t],enumerable:!0})},fe=(n,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of pe(e))!_e.call(n,r)&&r!==t&&I(n,r,{get:()=>e[r],enumerable:!(s=de(e,r))||s.enumerable});return n};var Ee=n=>fe(I({},"__esModule",{value:!0}),n);var Ae={};he(Ae,{TrackingConsent:()=>i,altertable:()=>w});module.exports=Ee(Ae);function x(n,e){return(...t)=>[n,...t].join(e)}var P="https://api.altertable.ai",S="production",U="localStorage+cookie",me="atbl",T=x(me,"."),c=T("check"),N="session",L="visitor",ve=1e3*60,$=100,V=30*ve,O=1e3,M="$pageview",B="$lib",z="$lib_version",F="$referer",K="$release",q="$url",G="$viewport",i={DENIED:"denied",DISMISSED:"dismissed",GRANTED:"granted",PENDING:"pending"},y=["anonymous_id","anonymous","distinct_id","distinctid","false","guest","id","not_authenticated","true","undefined","user_id","user","visitor_id","visitor"],k=new Set(["[object Object]","0","NaN","none","None","null"]);var h=class{_queue=[];_queueMaxSize;constructor(e){this._queueMaxSize=e}enqueue(e,t,s){this._queue.length>=this._queueMaxSize&&this._queue.shift(),this._queue.push({eventType:e,payload:t,context:s,sentAt:new Date})}flush(){let e=[...this._queue];return this._queue=[],e}clear(){this._queue=[]}getSize(){return this._queue.length}};function o(n,e=()=>{}){return typeof window>"u"?e():n({window})}function Y(){return o(({window:n})=>`${n.innerWidth}x${n.innerHeight}`,()=>null)}function a(n,e){if(!n)throw new Error("Invariant failed")}function Q(n){return{log:(...e)=>{console.log(`[${n}]`,...e)},logHeader:()=>{let e="Altertable v0.5.
|
|
1
|
+
/*! @altertable/altertable-js 0.5.4 | MIT License | Altertable | https://github.com/altertable-ai/altertable-js */
|
|
2
|
+
var I=Object.defineProperty;var de=Object.getOwnPropertyDescriptor;var pe=Object.getOwnPropertyNames;var _e=Object.prototype.hasOwnProperty;var he=(n,e)=>{for(var t in e)I(n,t,{get:e[t],enumerable:!0})},fe=(n,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of pe(e))!_e.call(n,r)&&r!==t&&I(n,r,{get:()=>e[r],enumerable:!(s=de(e,r))||s.enumerable});return n};var Ee=n=>fe(I({},"__esModule",{value:!0}),n);var Ae={};he(Ae,{TrackingConsent:()=>i,altertable:()=>w});module.exports=Ee(Ae);function x(n,e){return(...t)=>[n,...t].join(e)}var P="https://api.altertable.ai",S="production",U="localStorage+cookie",me="atbl",T=x(me,"."),c=T("check"),N="session",L="visitor",ve=1e3*60,$=100,V=30*ve,O=1e3,M="$pageview",B="$lib",z="$lib_version",F="$referer",K="$release",q="$url",G="$viewport",i={DENIED:"denied",DISMISSED:"dismissed",GRANTED:"granted",PENDING:"pending"},y=["anonymous_id","anonymous","distinct_id","distinctid","false","guest","id","not_authenticated","true","undefined","user_id","user","visitor_id","visitor"],k=new Set(["[object Object]","0","NaN","none","None","null"]);var h=class{_queue=[];_queueMaxSize;constructor(e){this._queueMaxSize=e}enqueue(e,t,s){this._queue.length>=this._queueMaxSize&&this._queue.shift(),this._queue.push({eventType:e,payload:t,context:s,sentAt:new Date})}flush(){let e=[...this._queue];return this._queue=[],e}clear(){this._queue=[]}getSize(){return this._queue.length}};function o(n,e=()=>{}){return typeof window>"u"?e():n({window})}function Y(){return o(({window:n})=>`${n.innerWidth}x${n.innerHeight}`,()=>null)}function a(n,e){if(!n)throw new Error("Invariant failed")}function Q(n){return{log:(...e)=>{console.log(`[${n}]`,...e)},logHeader:()=>{let e="Altertable v0.5.4 %c\u2022 Debug mode enabled";f.current[e]||(f.current[e]=!0,console.log(e,"color: #64748b;"))},logEvent:(e,{trackingConsent:t})=>{let[s,r]=Se(e.event),[g,l]=Te(e.environment),[W,H]=ke(e.timestamp),[J,Z]=be(t);console.groupCollapsed(`[${n}] %c${s}%c [${g}] %c(${W}) %c${J}`,r,l,H,Z);let[ee,te]=b("User ID"),[ne,se]=C(e.user_id??"Not set"),[re,ie]=b("Visitor ID"),[oe,ae]=C(e.visitor_id??"Not set"),[ge,le]=b("Session ID"),[ce,ue]=C(e.session_id??"Not set");console.log(`%c${ee} %c${ne}`,te,se),console.log(`%c${re} %c${oe}`,ie,ae),console.log(`%c${ge} %c${ce}`,le,ue),console.table(e.properties),console.groupEnd()},warn:(...e)=>{console.warn(`[${n}]`,...e)},warnDev:(e,...t)=>{return;if(!r){f.current[s]=!0;let g=`[${n}] ${s}`;console.warn(g,...t);try{throw new Error(g)}catch{}}},error:(...e)=>{console.error(`[${n}]`,...e)}}}var f={current:{}};function Ie(n){return new Date(n).toLocaleTimeString("en-US",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"})}function Se(n){return[n,"background: #1e293b; color: #f1f5f9; padding: 2px 8px; border-radius: 6px; font-weight: 400;"]}function Te(n){return[n,`color: ${ye(n)}; font-weight: 400;`]}function ye(n){switch(n.toLocaleLowerCase().startsWith("prod")?"production":n){case"production":return"#ef4444";default:return"#3b82f6"}}function ke(n){return[Ie(n),"color: #64748b; font-weight: 400;"]}function b(n){return[n,"color: #64748b; font-size: 11px;"]}function C(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 be(n){switch(n){case i.GRANTED:return["",""];case i.DENIED:return["DENIED","background: #ef4444; color: #ffffff; padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: 600;"];case i.PENDING:case i.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 R(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 E=class{_defaultTrackingConsent;_logger;_sessionData;_storage;_storageKey;constructor(e){this._storage=e.storage,this._storageKey=e.storageKey,this._logger=e.logger,this._defaultTrackingConsent=e.defaultTrackingConsent??i.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:Ce(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:s=!1}={}){e&&(this._sessionData.visitorId=this._generateVisitorId()),t&&(this._sessionData.sessionId=this._generateSessionId()),s&&(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 R(N)}_generateVisitorId(){return R(L)}_shouldRenewSession(){let{lastEventAt:e}=this._sessionData;if(!e)return!0;let t=new Date().getTime(),s=new Date(e).getTime();return t-s>V}_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 Ce(n){return typeof n=="string"&&Object.values(i).includes(n)}function D(n,e,t){for(let s of t){let r=e.getItem(s);r!==null&&(n.setItem(s,r),e.removeItem(s))}}var u=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){D(this,e,t)}},_=class{getItem(e){return o(({window:t})=>{let s=t.document.cookie.match(new RegExp("(^| )"+e+"=([^;]+)"));return s?decodeURIComponent(s[2]):null},()=>null)}setItem(e,t){o(({window:s})=>{s.document.cookie=`${e}=${encodeURIComponent(t)}; path=/;`})}removeItem(e){o(({window:t})=>{t.document.cookie=`${e}=; Max-Age=0; path=/;`})}migrate(e,t){D(this,e,t)}},d=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:s})=>{try{s[this.storage].setItem(e,t)}catch{}})}removeItem(e){o(({window:t})=>{try{t[this.storage].removeItem(e)}catch{}})}migrate(e,t){D(this,e,t)}},A=class{localStore=new d("localStorage");cookieStore=new _;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 s of t){let r=e.getItem(s);r!==null&&(this.localStore.setItem(s,r),this.cookieStore.setItem(s,r))}for(let s of t)e.removeItem(s)}};function p(n){return o(({window:e})=>{try{if(n==="cookie"){e.document.cookie=`${c}=1`;let t=e.document.cookie.indexOf(`${c}=`)!==-1;return e.document.cookie=`${c}=; Max-Age=0`,t}else return e[n].setItem(c,"1"),e[n].removeItem(c),!0}catch{return!1}},()=>!1)}function m(n,e){let{onFallback:t}=e;switch(n){case"localStorage":return p("localStorage")?new d("localStorage"):(t("localStorage not supported, falling back to localStorage+cookie."),m("localStorage+cookie",e));case"localStorage+cookie":{let s=p("localStorage"),r=p("cookie");return s&&r?new A:r?(t("localStorage+cookie not fully supported, falling back to cookie."),new _):s?(t("cookie not supported, falling back to localStorage."),new d("localStorage")):(t("Neither localStorage nor cookie supported, falling back to memory."),new u)}case"sessionStorage":return p("sessionStorage")?new d("sessionStorage"):(t("sessionStorage not supported, falling back to memory."),new u);case"cookie":return p("cookie")?new _:(t("cookie not supported, falling back to memory."),new u);case"memory":return new u;default:throw new Error(`Unknown storage type: "${n}". Valid types are: localStorage, sessionStorage, cookie, memory, localStorage+cookie.`)}}var Re=[...y,...k].map(n=>`- "${n}"`).join(`
|
|
3
3
|
`),X=`List of reserved identifiers:
|
|
4
4
|
${Re}`;function j(n){if(!n||n.trim()==="")throw new Error("User ID cannot be empty or contain only whitespace.");if(y.some(s=>n.toLowerCase()===s.toLowerCase()))throw new Error(`User ID "${n}" is a reserved identifier and cannot be used.
|
|
5
5
|
|
|
6
6
|
`+X);if(k.has(n))throw new Error(`User ID "${n}" is a reserved identifier and cannot be used.
|
|
7
7
|
|
|
8
|
-
`+X)}var v=class{_apiKey;_cleanupAutoCapture;_config;_eventQueue;_isInitialized=!1;_lastUrl;_logger=Q("Altertable");_referrer;_sessionManager;_storage;_storageKey;constructor(){this._lastUrl=null,this._referrer=null,this._eventQueue=new h(O)}init(e,t={}){a(e,"Missing API key"),this._apiKey=e,this._config=t,this._storageKey=T(e,this._config.environment||S),this._referrer=o(({window:r})=>r.document.referrer||null,()=>null),this._lastUrl=o(({window:r})=>r.location.href||null,()=>null);let s=t.persistence??U;return this._storage=m(s,{onFallback:r=>this._logger.warn(r)}),this._sessionManager=new E({storage:this._storage,storageKey:this._storageKey,logger:this._logger,defaultTrackingConsent:t.trackingConsent??i.PENDING}),this._sessionManager.init(),this._isInitialized=!0,this._config.debug&&this._logger.logHeader(),this._handleAutoCaptureChange(t.autoCapture??!0),()=>{this._cleanupAutoCapture?.()}}configure(e){if(a(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 s=this._storage;this._storage=m(e.persistence,{onFallback:r=>this._logger.warn(r)}),this._storage.migrate(s,[this._storageKey])}let t=this._sessionManager.getTrackingConsent();if(e.trackingConsent!==void 0&&e.trackingConsent!==t)if(this._sessionManager.setTrackingConsent(e.trackingConsent),t!==i.GRANTED&&e.trackingConsent===i.GRANTED){let s=this._eventQueue.flush();s.length>0&&s.forEach(r=>{this._processEvent(r.eventType,r.payload,r.context)})}else e.trackingConsent===i.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),s=setInterval(t,$);o(({window:r})=>{r.addEventListener("popstate",t),r.addEventListener("hashchange",t)}),this._cleanupAutoCapture=()=>{clearInterval(s),o(({window:r})=>{r.removeEventListener("popstate",t),r.removeEventListener("hashchange",t)})}}else this._cleanupAutoCapture=void 0}identify(e,t={}){a(this._isInitialized,"The client must be initialized with init() before identifying users.");try{j(e)}catch(r){throw new Error(`[Altertable] ${r.message}`)}this._sessionManager.setUserId(e);let s=this._getEventContext();this._processEvent("identify",{environment:s.environment,traits:t,user_id:e,visitor_id:s.visitor_id},s)}updateTraits(e){let t=this._sessionManager.getUserId();a(t,"User must be identified with identify() before updating traits.");let s=this._getEventContext();this._processEvent("identify",{environment:s.environment,traits:e,user_id:t,visitor_id:s.visitor_id},s)}reset({resetVisitorId:e=!1,resetSessionId:t=!0}={}){a(this._isInitialized,"The client must be initialized with init() before resetting."),this._sessionManager.reset({resetVisitorId:e,resetSessionId:t})}page(e){a(this._isInitialized,"The client must be initialized with init() before tracking page views.");let t=new URL(e),s=`${t.origin}${t.pathname}`;this.track(M,{[q]:s,[G]:Y(),[F]:this._referrer,...Object.fromEntries(t.searchParams)})}track(e,t={}){a(this._isInitialized,"The client must be initialized with init() before tracking events."),this._sessionManager.renewSessionIfNeeded();let s=new Date().toISOString();this._sessionManager.updateLastEventAt(s);let r=this._getEventContext(),g={timestamp:s,event:e,environment:r.environment,user_id:r.user_id,session_id:r.session_id,visitor_id:r.visitor_id,properties:{[B]:"@altertable/altertable-js",[z]:"0.5.
|
|
8
|
+
`+X)}var v=class{_apiKey;_cleanupAutoCapture;_config;_eventQueue;_isInitialized=!1;_lastUrl;_logger=Q("Altertable");_referrer;_sessionManager;_storage;_storageKey;constructor(){this._lastUrl=null,this._referrer=null,this._eventQueue=new h(O)}init(e,t={}){a(e,"Missing API key"),this._apiKey=e,this._config=t,this._storageKey=T(e,this._config.environment||S),this._referrer=o(({window:r})=>r.document.referrer||null,()=>null),this._lastUrl=o(({window:r})=>r.location.href||null,()=>null);let s=t.persistence??U;return this._storage=m(s,{onFallback:r=>this._logger.warn(r)}),this._sessionManager=new E({storage:this._storage,storageKey:this._storageKey,logger:this._logger,defaultTrackingConsent:t.trackingConsent??i.PENDING}),this._sessionManager.init(),this._isInitialized=!0,this._config.debug&&this._logger.logHeader(),this._handleAutoCaptureChange(t.autoCapture??!0),()=>{this._cleanupAutoCapture?.()}}configure(e){if(a(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 s=this._storage;this._storage=m(e.persistence,{onFallback:r=>this._logger.warn(r)}),this._storage.migrate(s,[this._storageKey])}let t=this._sessionManager.getTrackingConsent();if(e.trackingConsent!==void 0&&e.trackingConsent!==t)if(this._sessionManager.setTrackingConsent(e.trackingConsent),t!==i.GRANTED&&e.trackingConsent===i.GRANTED){let s=this._eventQueue.flush();s.length>0&&s.forEach(r=>{this._processEvent(r.eventType,r.payload,r.context)})}else e.trackingConsent===i.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),s=setInterval(t,$);o(({window:r})=>{r.addEventListener("popstate",t),r.addEventListener("hashchange",t)}),this._cleanupAutoCapture=()=>{clearInterval(s),o(({window:r})=>{r.removeEventListener("popstate",t),r.removeEventListener("hashchange",t)})}}else this._cleanupAutoCapture=void 0}identify(e,t={}){a(this._isInitialized,"The client must be initialized with init() before identifying users.");try{j(e)}catch(r){throw new Error(`[Altertable] ${r.message}`)}this._sessionManager.setUserId(e);let s=this._getEventContext();this._processEvent("identify",{environment:s.environment,traits:t,user_id:e,visitor_id:s.visitor_id},s)}updateTraits(e){let t=this._sessionManager.getUserId();a(t,"User must be identified with identify() before updating traits.");let s=this._getEventContext();this._processEvent("identify",{environment:s.environment,traits:e,user_id:t,visitor_id:s.visitor_id},s)}reset({resetVisitorId:e=!1,resetSessionId:t=!0}={}){a(this._isInitialized,"The client must be initialized with init() before resetting."),this._sessionManager.reset({resetVisitorId:e,resetSessionId:t})}page(e){a(this._isInitialized,"The client must be initialized with init() before tracking page views.");let t=new URL(e),s=`${t.origin}${t.pathname}`;this.track(M,{[q]:s,[G]:Y(),[F]:this._referrer,...Object.fromEntries(t.searchParams)})}track(e,t={}){a(this._isInitialized,"The client must be initialized with init() before tracking events."),this._sessionManager.renewSessionIfNeeded();let s=new Date().toISOString();this._sessionManager.updateLastEventAt(s);let r=this._getEventContext(),g={timestamp:s,event:e,environment:r.environment,user_id:r.user_id,session_id:r.session_id,visitor_id:r.visitor_id,properties:{[B]:"@altertable/altertable-js",[z]:"0.5.4",[K]:this._config.release,...t}};if(this._processEvent("track",g,r),this._config.debug){let l=this._sessionManager.getTrackingConsent();this._logger.logEvent(g,{trackingConsent:l})}}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)})}_getEventContext(){return{environment:this._config.environment||S,user_id:this._sessionManager.getUserId(),visitor_id:this._sessionManager.getVisitorId(),session_id:this._sessionManager.getSessionId()}}_processEvent(e,t,s){switch(this._sessionManager.getTrackingConsent()){case i.GRANTED:this._request(`/${e}`,t);break;case i.PENDING:case i.DISMISSED:this._eventQueue.enqueue(e,t,s);break;case i.DENIED:break}}_request(e,t){a(this._apiKey,"Missing API key"),a(this._config,"Missing configuration");let s=`${this._config.baseUrl||P}${e}`,r=JSON.stringify(t);if(typeof navigator<"u"&&navigator.sendBeacon){let g=`${s}?apiKey=${encodeURIComponent(this._apiKey)}`,l=new Blob([r],{type:"application/json"});navigator.sendBeacon(g,l)}else fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this._apiKey}`},body:r})}};var w=new v;o(({window:n})=>{let e=n.Altertable;if(e&&Array.isArray(e))for(let t of e){let s=t[0],r=t.slice(1);w[s](...r)}n.Altertable=w});
|
|
9
9
|
//# sourceMappingURL=index.js.map
|
package/dist/index.mjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
/*! @altertable/altertable-js 0.5.
|
|
2
|
-
function D(n,e){return(...t)=>[n,...t].join(e)}var w="https://api.altertable.ai",I="production",x="localStorage+cookie",ue="atbl",S=D(ue,"."),c=S("check"),P="session",U="visitor",de=1e3*60,N=100,L=30*de,$=1e3,V="$pageview",O="$lib",M="$lib_version",B="$referer",z="$release",F="$url",K="$viewport",i={DENIED:"denied",DISMISSED:"dismissed",GRANTED:"granted",PENDING:"pending"},T=["anonymous_id","anonymous","distinct_id","distinctid","false","guest","id","not_authenticated","true","undefined","user_id","user","visitor_id","visitor"],y=new Set(["[object Object]","0","NaN","none","None","null"]);var h=class{_queue=[];_queueMaxSize;constructor(e){this._queueMaxSize=e}enqueue(e,t,s){this._queue.length>=this._queueMaxSize&&this._queue.shift(),this._queue.push({eventType:e,payload:t,context:s,sentAt:new Date})}flush(){let e=[...this._queue];return this._queue=[],e}clear(){this._queue=[]}getSize(){return this._queue.length}};function o(n,e=()=>{}){return typeof window>"u"?e():n({window})}function q(){return o(({window:n})=>`${n.innerWidth}x${n.innerHeight}`,()=>null)}function a(n,e){if(!n)throw new Error("Invariant failed")}function G(n){return{log:(...e)=>{console.log(`[${n}]`,...e)},logHeader:()=>{let e="Altertable v0.5.
|
|
1
|
+
/*! @altertable/altertable-js 0.5.4 | MIT License | Altertable | https://github.com/altertable-ai/altertable-js */
|
|
2
|
+
function D(n,e){return(...t)=>[n,...t].join(e)}var w="https://api.altertable.ai",I="production",x="localStorage+cookie",ue="atbl",S=D(ue,"."),c=S("check"),P="session",U="visitor",de=1e3*60,N=100,L=30*de,$=1e3,V="$pageview",O="$lib",M="$lib_version",B="$referer",z="$release",F="$url",K="$viewport",i={DENIED:"denied",DISMISSED:"dismissed",GRANTED:"granted",PENDING:"pending"},T=["anonymous_id","anonymous","distinct_id","distinctid","false","guest","id","not_authenticated","true","undefined","user_id","user","visitor_id","visitor"],y=new Set(["[object Object]","0","NaN","none","None","null"]);var h=class{_queue=[];_queueMaxSize;constructor(e){this._queueMaxSize=e}enqueue(e,t,s){this._queue.length>=this._queueMaxSize&&this._queue.shift(),this._queue.push({eventType:e,payload:t,context:s,sentAt:new Date})}flush(){let e=[...this._queue];return this._queue=[],e}clear(){this._queue=[]}getSize(){return this._queue.length}};function o(n,e=()=>{}){return typeof window>"u"?e():n({window})}function q(){return o(({window:n})=>`${n.innerWidth}x${n.innerHeight}`,()=>null)}function a(n,e){if(!n)throw new Error("Invariant failed")}function G(n){return{log:(...e)=>{console.log(`[${n}]`,...e)},logHeader:()=>{let e="Altertable v0.5.4 %c\u2022 Debug mode enabled";f.current[e]||(f.current[e]=!0,console.log(e,"color: #64748b;"))},logEvent:(e,{trackingConsent:t})=>{let[s,r]=_e(e.event),[g,l]=he(e.environment),[j,W]=Ee(e.timestamp),[H,J]=me(t);console.groupCollapsed(`[${n}] %c${s}%c [${g}] %c(${j}) %c${H}`,r,l,W,J);let[Z,ee]=k("User ID"),[te,ne]=b(e.user_id??"Not set"),[se,re]=k("Visitor ID"),[ie,oe]=b(e.visitor_id??"Not set"),[ae,ge]=k("Session ID"),[le,ce]=b(e.session_id??"Not set");console.log(`%c${Z} %c${te}`,ee,ne),console.log(`%c${se} %c${ie}`,re,oe),console.log(`%c${ae} %c${le}`,ge,ce),console.table(e.properties),console.groupEnd()},warn:(...e)=>{console.warn(`[${n}]`,...e)},warnDev:(e,...t)=>{return;if(!r){f.current[s]=!0;let g=`[${n}] ${s}`;console.warn(g,...t);try{throw new Error(g)}catch{}}},error:(...e)=>{console.error(`[${n}]`,...e)}}}var f={current:{}};function pe(n){return new Date(n).toLocaleTimeString("en-US",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"})}function _e(n){return[n,"background: #1e293b; color: #f1f5f9; padding: 2px 8px; border-radius: 6px; font-weight: 400;"]}function he(n){return[n,`color: ${fe(n)}; font-weight: 400;`]}function fe(n){switch(n.toLocaleLowerCase().startsWith("prod")?"production":n){case"production":return"#ef4444";default:return"#3b82f6"}}function Ee(n){return[pe(n),"color: #64748b; font-weight: 400;"]}function k(n){return[n,"color: #64748b; font-size: 11px;"]}function b(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 me(n){switch(n){case i.GRANTED:return["",""];case i.DENIED:return["DENIED","background: #ef4444; color: #ffffff; padding: 2px 6px; border-radius: 4px; font-size: 10px; font-weight: 600;"];case i.PENDING:case i.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 C(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 E=class{_defaultTrackingConsent;_logger;_sessionData;_storage;_storageKey;constructor(e){this._storage=e.storage,this._storageKey=e.storageKey,this._logger=e.logger,this._defaultTrackingConsent=e.defaultTrackingConsent??i.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:ve(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:s=!1}={}){e&&(this._sessionData.visitorId=this._generateVisitorId()),t&&(this._sessionData.sessionId=this._generateSessionId()),s&&(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 C(P)}_generateVisitorId(){return C(U)}_shouldRenewSession(){let{lastEventAt:e}=this._sessionData;if(!e)return!0;let t=new Date().getTime(),s=new Date(e).getTime();return t-s>L}_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 ve(n){return typeof n=="string"&&Object.values(i).includes(n)}function A(n,e,t){for(let s of t){let r=e.getItem(s);r!==null&&(n.setItem(s,r),e.removeItem(s))}}var u=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){A(this,e,t)}},_=class{getItem(e){return o(({window:t})=>{let s=t.document.cookie.match(new RegExp("(^| )"+e+"=([^;]+)"));return s?decodeURIComponent(s[2]):null},()=>null)}setItem(e,t){o(({window:s})=>{s.document.cookie=`${e}=${encodeURIComponent(t)}; path=/;`})}removeItem(e){o(({window:t})=>{t.document.cookie=`${e}=; Max-Age=0; path=/;`})}migrate(e,t){A(this,e,t)}},d=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:s})=>{try{s[this.storage].setItem(e,t)}catch{}})}removeItem(e){o(({window:t})=>{try{t[this.storage].removeItem(e)}catch{}})}migrate(e,t){A(this,e,t)}},R=class{localStore=new d("localStorage");cookieStore=new _;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 s of t){let r=e.getItem(s);r!==null&&(this.localStore.setItem(s,r),this.cookieStore.setItem(s,r))}for(let s of t)e.removeItem(s)}};function p(n){return o(({window:e})=>{try{if(n==="cookie"){e.document.cookie=`${c}=1`;let t=e.document.cookie.indexOf(`${c}=`)!==-1;return e.document.cookie=`${c}=; Max-Age=0`,t}else return e[n].setItem(c,"1"),e[n].removeItem(c),!0}catch{return!1}},()=>!1)}function m(n,e){let{onFallback:t}=e;switch(n){case"localStorage":return p("localStorage")?new d("localStorage"):(t("localStorage not supported, falling back to localStorage+cookie."),m("localStorage+cookie",e));case"localStorage+cookie":{let s=p("localStorage"),r=p("cookie");return s&&r?new R:r?(t("localStorage+cookie not fully supported, falling back to cookie."),new _):s?(t("cookie not supported, falling back to localStorage."),new d("localStorage")):(t("Neither localStorage nor cookie supported, falling back to memory."),new u)}case"sessionStorage":return p("sessionStorage")?new d("sessionStorage"):(t("sessionStorage not supported, falling back to memory."),new u);case"cookie":return p("cookie")?new _:(t("cookie not supported, falling back to memory."),new u);case"memory":return new u;default:throw new Error(`Unknown storage type: "${n}". Valid types are: localStorage, sessionStorage, cookie, memory, localStorage+cookie.`)}}var Ie=[...T,...y].map(n=>`- "${n}"`).join(`
|
|
3
3
|
`),Y=`List of reserved identifiers:
|
|
4
4
|
${Ie}`;function Q(n){if(!n||n.trim()==="")throw new Error("User ID cannot be empty or contain only whitespace.");if(T.some(s=>n.toLowerCase()===s.toLowerCase()))throw new Error(`User ID "${n}" is a reserved identifier and cannot be used.
|
|
5
5
|
|
|
6
6
|
`+Y);if(y.has(n))throw new Error(`User ID "${n}" is a reserved identifier and cannot be used.
|
|
7
7
|
|
|
8
|
-
`+Y)}var v=class{_apiKey;_cleanupAutoCapture;_config;_eventQueue;_isInitialized=!1;_lastUrl;_logger=G("Altertable");_referrer;_sessionManager;_storage;_storageKey;constructor(){this._lastUrl=null,this._referrer=null,this._eventQueue=new h($)}init(e,t={}){a(e,"Missing API key"),this._apiKey=e,this._config=t,this._storageKey=S(e,this._config.environment||I),this._referrer=o(({window:r})=>r.document.referrer||null,()=>null),this._lastUrl=o(({window:r})=>r.location.href||null,()=>null);let s=t.persistence??x;return this._storage=m(s,{onFallback:r=>this._logger.warn(r)}),this._sessionManager=new E({storage:this._storage,storageKey:this._storageKey,logger:this._logger,defaultTrackingConsent:t.trackingConsent??i.PENDING}),this._sessionManager.init(),this._isInitialized=!0,this._config.debug&&this._logger.logHeader(),this._handleAutoCaptureChange(t.autoCapture??!0),()=>{this._cleanupAutoCapture?.()}}configure(e){if(a(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 s=this._storage;this._storage=m(e.persistence,{onFallback:r=>this._logger.warn(r)}),this._storage.migrate(s,[this._storageKey])}let t=this._sessionManager.getTrackingConsent();if(e.trackingConsent!==void 0&&e.trackingConsent!==t)if(this._sessionManager.setTrackingConsent(e.trackingConsent),t!==i.GRANTED&&e.trackingConsent===i.GRANTED){let s=this._eventQueue.flush();s.length>0&&s.forEach(r=>{this._processEvent(r.eventType,r.payload,r.context)})}else e.trackingConsent===i.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),s=setInterval(t,N);o(({window:r})=>{r.addEventListener("popstate",t),r.addEventListener("hashchange",t)}),this._cleanupAutoCapture=()=>{clearInterval(s),o(({window:r})=>{r.removeEventListener("popstate",t),r.removeEventListener("hashchange",t)})}}else this._cleanupAutoCapture=void 0}identify(e,t={}){a(this._isInitialized,"The client must be initialized with init() before identifying users.");try{Q(e)}catch(r){throw new Error(`[Altertable] ${r.message}`)}this._sessionManager.setUserId(e);let s=this._getEventContext();this._processEvent("identify",{environment:s.environment,traits:t,user_id:e,visitor_id:s.visitor_id},s)}updateTraits(e){let t=this._sessionManager.getUserId();a(t,"User must be identified with identify() before updating traits.");let s=this._getEventContext();this._processEvent("identify",{environment:s.environment,traits:e,user_id:t,visitor_id:s.visitor_id},s)}reset({resetVisitorId:e=!1,resetSessionId:t=!0}={}){a(this._isInitialized,"The client must be initialized with init() before resetting."),this._sessionManager.reset({resetVisitorId:e,resetSessionId:t})}page(e){a(this._isInitialized,"The client must be initialized with init() before tracking page views.");let t=new URL(e),s=`${t.origin}${t.pathname}`;this.track(V,{[F]:s,[K]:q(),[B]:this._referrer,...Object.fromEntries(t.searchParams)})}track(e,t={}){a(this._isInitialized,"The client must be initialized with init() before tracking events."),this._sessionManager.renewSessionIfNeeded();let s=new Date().toISOString();this._sessionManager.updateLastEventAt(s);let r=this._getEventContext(),g={timestamp:s,event:e,environment:r.environment,user_id:r.user_id,session_id:r.session_id,visitor_id:r.visitor_id,properties:{[O]:"@altertable/altertable-js",[M]:"0.5.
|
|
8
|
+
`+Y)}var v=class{_apiKey;_cleanupAutoCapture;_config;_eventQueue;_isInitialized=!1;_lastUrl;_logger=G("Altertable");_referrer;_sessionManager;_storage;_storageKey;constructor(){this._lastUrl=null,this._referrer=null,this._eventQueue=new h($)}init(e,t={}){a(e,"Missing API key"),this._apiKey=e,this._config=t,this._storageKey=S(e,this._config.environment||I),this._referrer=o(({window:r})=>r.document.referrer||null,()=>null),this._lastUrl=o(({window:r})=>r.location.href||null,()=>null);let s=t.persistence??x;return this._storage=m(s,{onFallback:r=>this._logger.warn(r)}),this._sessionManager=new E({storage:this._storage,storageKey:this._storageKey,logger:this._logger,defaultTrackingConsent:t.trackingConsent??i.PENDING}),this._sessionManager.init(),this._isInitialized=!0,this._config.debug&&this._logger.logHeader(),this._handleAutoCaptureChange(t.autoCapture??!0),()=>{this._cleanupAutoCapture?.()}}configure(e){if(a(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 s=this._storage;this._storage=m(e.persistence,{onFallback:r=>this._logger.warn(r)}),this._storage.migrate(s,[this._storageKey])}let t=this._sessionManager.getTrackingConsent();if(e.trackingConsent!==void 0&&e.trackingConsent!==t)if(this._sessionManager.setTrackingConsent(e.trackingConsent),t!==i.GRANTED&&e.trackingConsent===i.GRANTED){let s=this._eventQueue.flush();s.length>0&&s.forEach(r=>{this._processEvent(r.eventType,r.payload,r.context)})}else e.trackingConsent===i.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),s=setInterval(t,N);o(({window:r})=>{r.addEventListener("popstate",t),r.addEventListener("hashchange",t)}),this._cleanupAutoCapture=()=>{clearInterval(s),o(({window:r})=>{r.removeEventListener("popstate",t),r.removeEventListener("hashchange",t)})}}else this._cleanupAutoCapture=void 0}identify(e,t={}){a(this._isInitialized,"The client must be initialized with init() before identifying users.");try{Q(e)}catch(r){throw new Error(`[Altertable] ${r.message}`)}this._sessionManager.setUserId(e);let s=this._getEventContext();this._processEvent("identify",{environment:s.environment,traits:t,user_id:e,visitor_id:s.visitor_id},s)}updateTraits(e){let t=this._sessionManager.getUserId();a(t,"User must be identified with identify() before updating traits.");let s=this._getEventContext();this._processEvent("identify",{environment:s.environment,traits:e,user_id:t,visitor_id:s.visitor_id},s)}reset({resetVisitorId:e=!1,resetSessionId:t=!0}={}){a(this._isInitialized,"The client must be initialized with init() before resetting."),this._sessionManager.reset({resetVisitorId:e,resetSessionId:t})}page(e){a(this._isInitialized,"The client must be initialized with init() before tracking page views.");let t=new URL(e),s=`${t.origin}${t.pathname}`;this.track(V,{[F]:s,[K]:q(),[B]:this._referrer,...Object.fromEntries(t.searchParams)})}track(e,t={}){a(this._isInitialized,"The client must be initialized with init() before tracking events."),this._sessionManager.renewSessionIfNeeded();let s=new Date().toISOString();this._sessionManager.updateLastEventAt(s);let r=this._getEventContext(),g={timestamp:s,event:e,environment:r.environment,user_id:r.user_id,session_id:r.session_id,visitor_id:r.visitor_id,properties:{[O]:"@altertable/altertable-js",[M]:"0.5.4",[z]:this._config.release,...t}};if(this._processEvent("track",g,r),this._config.debug){let l=this._sessionManager.getTrackingConsent();this._logger.logEvent(g,{trackingConsent:l})}}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)})}_getEventContext(){return{environment:this._config.environment||I,user_id:this._sessionManager.getUserId(),visitor_id:this._sessionManager.getVisitorId(),session_id:this._sessionManager.getSessionId()}}_processEvent(e,t,s){switch(this._sessionManager.getTrackingConsent()){case i.GRANTED:this._request(`/${e}`,t);break;case i.PENDING:case i.DISMISSED:this._eventQueue.enqueue(e,t,s);break;case i.DENIED:break}}_request(e,t){a(this._apiKey,"Missing API key"),a(this._config,"Missing configuration");let s=`${this._config.baseUrl||w}${e}`,r=JSON.stringify(t);if(typeof navigator<"u"&&navigator.sendBeacon){let g=`${s}?apiKey=${encodeURIComponent(this._apiKey)}`,l=new Blob([r],{type:"application/json"});navigator.sendBeacon(g,l)}else fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this._apiKey}`},body:r})}};var X=new v;o(({window:n})=>{let e=n.Altertable;if(e&&Array.isArray(e))for(let t of e){let s=t[0],r=t.slice(1);X[s](...r)}n.Altertable=X});export{i as TrackingConsent,X 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.
|
|
4
|
+
"version": "0.5.4",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://github.com/altertable-ai/altertable-js",
|
|
7
7
|
"repository": "altertable-ai/altertable-js",
|
|
@@ -20,8 +20,15 @@
|
|
|
20
20
|
"sideEffects": false,
|
|
21
21
|
"main": "dist/index.js",
|
|
22
22
|
"module": "dist/index.mjs",
|
|
23
|
-
"browser": "dist/index.global.js",
|
|
24
23
|
"typings": "dist/index.d.ts",
|
|
24
|
+
"exports": {
|
|
25
|
+
".": {
|
|
26
|
+
"types": "./dist/index.d.ts",
|
|
27
|
+
"module": "./dist/index.mjs",
|
|
28
|
+
"import": "./dist/index.mjs",
|
|
29
|
+
"require": "./dist/index.js"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
25
32
|
"scripts": {
|
|
26
33
|
"build": "tsup --env.mode production",
|
|
27
34
|
"dev": "tsup --watch --env.mode development",
|