@rudderstack/analytics-js 3.0.0-beta.15 → 3.0.0-beta.16
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/CHANGELOG.md +14 -0
 - package/dist/npm/index.d.ts +2 -1
 - package/dist/npm/legacy/cjs/index.js +95 -90
 - package/dist/npm/legacy/esm/index.js +95 -90
 - package/dist/npm/legacy/umd/index.js +95 -90
 - package/dist/npm/modern/bundled/cjs/index.js +15 -10
 - package/dist/npm/modern/bundled/esm/index.js +15 -10
 - package/dist/npm/modern/bundled/umd/index.js +15 -10
 - package/dist/npm/modern/cjs/index.js +14 -9
 - package/dist/npm/modern/esm/index.js +14 -9
 - package/dist/npm/modern/umd/index.js +14 -9
 - package/package.json +1 -1
 
| 
         @@ -404,7 +404,7 @@ if(isDefined(payload.groupId)){payload.groupId=tryStringify(payload.groupId);}el 
     | 
|
| 
       404 
404 
     | 
    
         | 
| 
       405 
405 
     | 
    
         
             
            const CAPABILITIES_MANAGER='CapabilitiesManager';const CONFIG_MANAGER='ConfigManager';const EVENT_MANAGER='EventManager';const PLUGINS_MANAGER='PluginsManager';const USER_SESSION_MANAGER='UserSessionManager';const ERROR_HANDLER='ErrorHandler';const PLUGIN_ENGINE='PluginEngine';const STORE_MANAGER='StoreManager';const READY_API='readyApi';const EVENT_REPOSITORY='EventRepository';const EXTERNAL_SRC_LOADER='ExternalSrcLoader';const HTTP_CLIENT='HttpClient';const RS_APP='RudderStackApplication';const ANALYTICS_CORE='AnalyticsCore';
         
     | 
| 
       406 
406 
     | 
    
         | 
| 
       407 
     | 
    
         
            -
            const APP_NAME='RudderLabs JavaScript SDK';const APP_VERSION='3.0.0-beta. 
     | 
| 
      
 407 
     | 
    
         
            +
            const APP_NAME='RudderLabs JavaScript SDK';const APP_VERSION='3.0.0-beta.16';const APP_NAMESPACE='com.rudderlabs.javascript';const MODULE_TYPE='npm';const ADBLOCK_PAGE_CATEGORY='RudderJS-Initiated';const ADBLOCK_PAGE_NAME='ad-block page request';const ADBLOCK_PAGE_PATH='/ad-blocked';const GLOBAL_PRELOAD_BUFFER='preloadedEventsBuffer';const CONSENT_TRACK_EVENT_NAME='Consent Management Interaction';
         
     | 
| 
       408 
408 
     | 
    
         | 
| 
       409 
409 
     | 
    
         
             
            const QUERY_PARAM_TRAIT_PREFIX='ajs_trait_';const QUERY_PARAM_PROPERTY_PREFIX='ajs_prop_';const QUERY_PARAM_ANONYMOUS_ID_KEY='ajs_aid';const QUERY_PARAM_USER_ID_KEY='ajs_uid';const QUERY_PARAM_TRACK_EVENT_NAME_KEY='ajs_event';
         
     | 
| 
       410 
410 
     | 
    
         | 
| 
         @@ -570,7 +570,7 @@ const consentsState={enabled:a(false),initialized:a(false),data:a({}),activeCons 
     | 
|
| 
       570 
570 
     | 
    
         | 
| 
       571 
571 
     | 
    
         
             
            const metricsState={retries:a(0),dropped:a(0),sent:a(0),queued:a(0),triggered:a(0)};
         
     | 
| 
       572 
572 
     | 
    
         | 
| 
       573 
     | 
    
         
            -
            const contextState={app:a({name:APP_NAME,namespace:APP_NAMESPACE,version:APP_VERSION}),traits:a(null),library:a({name:APP_NAME,version:APP_VERSION}),userAgent:a(''),device:a(null),network:a(null),os:a({name:'',version:''}),locale:a(null),screen:a({density:0,width:0,height:0,innerWidth:0,innerHeight:0}),'ua-ch':a(undefined),timezone:a(undefined)};
         
     | 
| 
      
 573 
     | 
    
         
            +
            const contextState={app:a({name:APP_NAME,namespace:APP_NAMESPACE,version:APP_VERSION}),traits:a(null),library:a({name:APP_NAME,version:APP_VERSION,snippetVersion:globalThis.RudderSnippetVersion}),userAgent:a(''),device:a(null),network:a(null),os:a({name:'',version:''}),locale:a(null),screen:a({density:0,width:0,height:0,innerWidth:0,innerHeight:0}),'ua-ch':a(undefined),timezone:a(undefined)};
         
     | 
| 
       574 
574 
     | 
    
         | 
| 
       575 
575 
     | 
    
         
             
            const nativeDestinationsState={configuredDestinations:a([]),activeDestinations:a([]),loadOnlyIntegrations:a({}),failedDestinations:a([]),loadIntegration:a(true),initializedDestinations:a([]),clientDestinationsReady:a(false),integrationsConfig:a({})};
         
     | 
| 
       576 
576 
     | 
    
         | 
| 
         @@ -638,7 +638,7 @@ destination.config.useNativeSDK===true);const isHybridModeDestination=destinatio 
     | 
|
| 
       638 
638 
     | 
    
         
             
             */const pluginNamesList=['BeaconQueue','Bugsnag','CustomConsentManager','DeviceModeDestinations','DeviceModeTransformation','ErrorReporting','ExternalAnonymousId','GoogleLinker','KetchConsentManager','NativeDestinationQueue','OneTrustConsentManager','StorageEncryption','StorageEncryptionLegacy','StorageMigrator','XhrQueue'];
         
     | 
| 
       639 
639 
     | 
    
         | 
| 
       640 
640 
     | 
    
         
             
            const remotesMap = {
         
     | 
| 
       641 
     | 
    
         
            -
            'rudderAnalyticsRemotePlugins':{url:()=>Promise.resolve(window.RudderStackGlobals && window.RudderStackGlobals.app && window.RudderStackGlobals.app.pluginsCDNPath ? "" + window.RudderStackGlobals.app.pluginsCDNPath + "/rsa-plugins.js" : "https://cdn.rudderlabs.com/3.0.0-beta. 
     | 
| 
      
 641 
     | 
    
         
            +
            'rudderAnalyticsRemotePlugins':{url:()=>Promise.resolve(window.RudderStackGlobals && window.RudderStackGlobals.app && window.RudderStackGlobals.app.pluginsCDNPath ? "" + window.RudderStackGlobals.app.pluginsCDNPath + "/rsa-plugins.js" : "https://cdn.rudderlabs.com/3.0.0-beta.16/modern/plugins/rsa-plugins.js"),format:'esm',from:'vite'}
         
     | 
| 
       642 
642 
     | 
    
         
             
            };
         
     | 
| 
       643 
643 
     | 
    
         
             
                            const loadJS = async (url, fn) => {
         
     | 
| 
       644 
644 
     | 
    
         
             
                                const resolvedUrl = typeof url === 'function' ? await url() : url;
         
     | 
| 
         @@ -813,7 +813,7 @@ const hasCrypto$1=()=>!isNullOrUndefined(globalThis.crypto)&&isFunction(globalTh 
     | 
|
| 
       813 
813 
     | 
    
         | 
| 
       814 
814 
     | 
    
         
             
            const getUserAgentClientHint=(callback,level='none')=>{if(level==='none'){callback(undefined);}if(level==='default'){callback(navigator.userAgentData);}if(level==='full'){navigator.userAgentData?.getHighEntropyValues(['architecture','bitness','brands','mobile','model','platform','platformVersion','uaFullVersion','fullVersionList','wow64']).then(ua=>{callback(ua);}).catch(()=>{callback();});}};
         
     | 
| 
       815 
815 
     | 
    
         | 
| 
       816 
     | 
    
         
            -
            const isDatasetAvailable=()=>{const testElement=document.createElement('div');testElement.setAttribute('data-a-b','c');return testElement.dataset?testElement.dataset.aB==='c':false;};const legacyJSEngineRequiredPolyfills={ 
     | 
| 
      
 816 
     | 
    
         
            +
            const isDatasetAvailable=()=>{const testElement=document.createElement('div');testElement.setAttribute('data-a-b','c');return testElement.dataset?testElement.dataset.aB==='c':false;};const legacyJSEngineRequiredPolyfills={URL:()=>!isFunction(globalThis.URL)||!globalThis.URLSearchParams,MutationObserver:()=>isUndefined(MutationObserver),Promise:()=>isUndefined(Promise),'Number.isNaN':()=>!Number.isNaN,'Number.isInteger':()=>!Number.isInteger,'Array.from':()=>!Array.from,'Array.prototype.find':()=>!Array.prototype.find,'Array.prototype.includes':()=>!Array.prototype.includes,'String.prototype.endsWith':()=>!String.prototype.endsWith,'String.prototype.startsWith':()=>!String.prototype.startsWith,'String.prototype.includes':()=>!String.prototype.includes,'Object.entries':()=>!Object.entries,'Object.values':()=>!Object.values,'Object.assign':()=>typeof Object.assign!=='function','Element.prototype.dataset':()=>!isDatasetAvailable(),'String.prototype.replaceAll':()=>!String.prototype.replaceAll,TextEncoder:()=>isUndefined(TextEncoder)||isUndefined(TextDecoder),'String.fromCodePoint':()=>!String.fromCodePoint,requestAnimationFrame:()=>!isFunction(globalThis.requestAnimationFrame)||!isFunction(globalThis.cancelAnimationFrame),CustomEvent:()=>!isFunction(globalThis.CustomEvent),/* eslint-disable-next-line */'navigator.sendBeacon':()=>!isFunction(navigator.sendBeacon),ArrayBuffer:()=>!isFunction(Uint8Array)};const isLegacyJSEngine=()=>{const requiredCapabilitiesList=Object.keys(legacyJSEngineRequiredPolyfills);let needsPolyfill=false;/* eslint-disable-next-line unicorn/no-for-loop */for(let i=0;i<requiredCapabilitiesList.length;i++){const isCapabilityMissing=legacyJSEngineRequiredPolyfills[requiredCapabilitiesList[i]];if(isFunction(isCapabilityMissing)&&isCapabilityMissing()){needsPolyfill=true;break;}}return needsPolyfill;};
         
     | 
| 
       817 
817 
     | 
    
         | 
| 
       818 
818 
     | 
    
         
             
            const getScreenDetails=()=>{let screenDetails={density:0,width:0,height:0,innerWidth:0,innerHeight:0};screenDetails={width:globalThis.screen.width,height:globalThis.screen.height,density:globalThis.devicePixelRatio,innerWidth:globalThis.innerWidth,innerHeight:globalThis.innerHeight};return screenDetails;};
         
     | 
| 
       819 
819 
     | 
    
         | 
| 
         @@ -1062,6 +1062,11 @@ if(dataplanes&&Object.keys(dataplanes).length>0){const region=validateResidencyS 
     | 
|
| 
       1062 
1062 
     | 
    
         
             
            if(serverUrl){return serverUrl;}// return undefined if data plane url can not be determined
         
     | 
| 
       1063 
1063 
     | 
    
         
             
            return undefined;};
         
     | 
| 
       1064 
1064 
     | 
    
         | 
| 
      
 1065 
     | 
    
         
            +
            /**
         
     | 
| 
      
 1066 
     | 
    
         
            +
             * Determines if the SDK is running inside a chrome extension
         
     | 
| 
      
 1067 
     | 
    
         
            +
             * @returns boolean
         
     | 
| 
      
 1068 
     | 
    
         
            +
             */const isSDKRunningInChromeExtension=()=>!!(window.chrome&&window.chrome.runtime&&window.chrome.runtime.id);
         
     | 
| 
      
 1069 
     | 
    
         
            +
             
     | 
| 
       1065 
1070 
     | 
    
         
             
            const DEFAULT_PRE_CONSENT_STORAGE_STRATEGY='none';const DEFAULT_PRE_CONSENT_EVENTS_DELIVERY_TYPE='immediate';
         
     | 
| 
       1066 
1071 
     | 
    
         | 
| 
       1067 
1072 
     | 
    
         
             
            const isErrorReportingEnabled=sourceConfig=>sourceConfig?.statsCollection?.errors?.enabled===true;const getErrorReportingProviderNameFromConfig=sourceConfig=>sourceConfig?.statsCollection?.errors?.provider;const isMetricsReportingEnabled=sourceConfig=>sourceConfig?.statsCollection?.metrics?.enabled===true;
         
     | 
| 
         @@ -1099,7 +1104,7 @@ enabled=enabled&&Boolean(consentManagerPluginName);return {provider,consentManag 
     | 
|
| 
       1099 
1104 
     | 
    
         
             
             * Updates the reporting state variables from the source config data
         
     | 
| 
       1100 
1105 
     | 
    
         
             
             * @param res Source config
         
     | 
| 
       1101 
1106 
     | 
    
         
             
             * @param logger Logger instance
         
     | 
| 
       1102 
     | 
    
         
            -
             */const updateReportingState=(res,logger)=>{state.reporting.isErrorReportingEnabled.value=isErrorReportingEnabled(res.source.config);state.reporting.isMetricsReportingEnabled.value=isMetricsReportingEnabled(res.source.config);if(state.reporting.isErrorReportingEnabled.value){const errReportingProvider=getErrorReportingProviderNameFromConfig(res.source.config);// Get the corresponding plugin name of the selected error reporting provider from the supported error reporting providers
         
     | 
| 
      
 1107 
     | 
    
         
            +
             */const updateReportingState=(res,logger)=>{state.reporting.isErrorReportingEnabled.value=isErrorReportingEnabled(res.source.config)&&!isSDKRunningInChromeExtension();state.reporting.isMetricsReportingEnabled.value=isMetricsReportingEnabled(res.source.config);if(state.reporting.isErrorReportingEnabled.value){const errReportingProvider=getErrorReportingProviderNameFromConfig(res.source.config);// Get the corresponding plugin name of the selected error reporting provider from the supported error reporting providers
         
     | 
| 
       1103 
1108 
     | 
    
         
             
            const errReportingProviderPlugin=errReportingProvider?ErrorReportingProvidersToPluginNameMap[errReportingProvider]:undefined;if(!isUndefined(errReportingProvider)&&!errReportingProviderPlugin){// set the default error reporting provider
         
     | 
| 
       1104 
1109 
     | 
    
         
             
            logger?.warn(UNSUPPORTED_ERROR_REPORTING_PROVIDER_WARNING(CONFIG_MANAGER,errReportingProvider,ErrorReportingProvidersToPluginNameMap,DEFAULT_ERROR_REPORTING_PROVIDER));}state.reporting.errorReportingProviderPluginName.value=errReportingProviderPlugin??ErrorReportingProvidersToPluginNameMap[DEFAULT_ERROR_REPORTING_PROVIDER];}};const updateStorageStateFromLoadOptions=logger=>{const storageOptsFromLoad=state.loadOptions.value.storage;let storageType=storageOptsFromLoad?.type;if(isDefined(storageType)&&!isValidStorageType(storageType)){logger?.warn(STORAGE_TYPE_VALIDATION_WARNING(CONFIG_MANAGER,storageType,DEFAULT_STORAGE_TYPE));storageType=DEFAULT_STORAGE_TYPE;}let storageEncryptionVersion=storageOptsFromLoad?.encryption?.version;const encryptionPluginName=storageEncryptionVersion&&StorageEncryptionVersionsToPluginNameMap[storageEncryptionVersion];if(!isUndefined(storageEncryptionVersion)&&isUndefined(encryptionPluginName)){// set the default encryption plugin
         
     | 
| 
       1105 
1110 
     | 
    
         
             
            logger?.warn(UNSUPPORTED_STORAGE_ENCRYPTION_VERSION_WARNING(CONFIG_MANAGER,storageEncryptionVersion,StorageEncryptionVersionsToPluginNameMap,DEFAULT_STORAGE_ENCRYPTION_VERSION));storageEncryptionVersion=DEFAULT_STORAGE_ENCRYPTION_VERSION;}else if(isUndefined(storageEncryptionVersion)){storageEncryptionVersion=DEFAULT_STORAGE_ENCRYPTION_VERSION;}// Allow migration only if the configured encryption version is the default encryption version
         
     | 
| 
         @@ -1184,7 +1189,7 @@ if(canonicalUrl){try{const urlObj=new URL(canonicalUrl);// If existing, query pa 
     | 
|
| 
       1184 
1189 
     | 
    
         
             
            if(urlObj.search===''){pageUrl=canonicalUrl+search;}else {pageUrl=canonicalUrl;}path=urlObj.pathname;}catch(err){// Do nothing
         
     | 
| 
       1185 
1190 
     | 
    
         
             
            }}const url=getUrlWithoutHash(pageUrl);const{title}=document;const referrer=getReferrer();return {path,referrer,referring_domain:getReferringDomain(referrer),search,title,url,tab_url:tabUrl};};
         
     | 
| 
       1186 
1191 
     | 
    
         | 
| 
       1187 
     | 
    
         
            -
            const POLYFILL_URL=`https://polyfill.io/v3/polyfill.min.js?features=${Object.keys(legacyJSEngineRequiredPolyfills).join('%2C')}`;const POLYFILL_LOAD_TIMEOUT=10*1000;// 10 seconds
         
     | 
| 
      
 1192 
     | 
    
         
            +
            const POLYFILL_URL=`https://polyfill.io/v3/polyfill.min.js?version=3.111.0&features=${Object.keys(legacyJSEngineRequiredPolyfills).join('%2C')}`;const POLYFILL_LOAD_TIMEOUT=10*1000;// 10 seconds
         
     | 
| 
       1188 
1193 
     | 
    
         
             
            const POLYFILL_SCRIPT_ID='rudderstackPolyfill';
         
     | 
| 
       1189 
1194 
     | 
    
         | 
| 
       1190 
1195 
     | 
    
         
             
            class CapabilitiesManager{constructor(errorHandler,logger){this.logger=logger;this.errorHandler=errorHandler;this.externalSrcLoader=new ExternalSrcLoader(this.errorHandler,this.logger);this.onError=this.onError.bind(this);this.onReady=this.onReady.bind(this);}init(){try{this.prepareBrowserCapabilities();this.attachWindowListeners();}catch(err){this.onError(err);}}/**
         
     | 
| 
         @@ -1541,7 +1546,7 @@ setExposedGlobal('state',state,writeKey);// Configure initial config of any serv 
     | 
|
| 
       1541 
1546 
     | 
    
         
             
            this.startLifecycle();}// Start lifecycle methods
         
     | 
| 
       1542 
1547 
     | 
    
         
             
            /**
         
     | 
| 
       1543 
1548 
     | 
    
         
             
               * Orchestrate the lifecycle of the application phases/status
         
     | 
| 
       1544 
     | 
    
         
            -
               */startLifecycle(){O(()=>{try{switch(state.lifecycle.status.value){case'mounted':this.onMounted();break;case'browserCapabilitiesReady':this.onBrowserCapabilitiesReady();break;case'configured':this.onConfigured();break;case'pluginsLoading':break;case'pluginsReady':this.onPluginsReady();break;case'initialized':this.onInitialized();break;case'loaded':this.onLoaded();break;case'destinationsLoading':break;case'destinationsReady':this.onDestinationsReady();break;case'ready':this.onReady();break;default:break;}}catch(err){const issue='Failed to load the SDK';this.errorHandler.onError(getMutatedError(err,issue),ANALYTICS_CORE);}});}onBrowserCapabilitiesReady(){// initialize the preloaded events enqueuing
         
     | 
| 
      
 1549 
     | 
    
         
            +
               */startLifecycle(){O(()=>{try{switch(state.lifecycle.status.value){case'mounted':this.onMounted();break;case'browserCapabilitiesReady':this.onBrowserCapabilitiesReady();break;case'configured':this.onConfigured();break;case'pluginsLoading':break;case'pluginsReady':this.onPluginsReady();break;case'initialized':this.onInitialized();break;case'loaded':this.onLoaded();break;case'destinationsLoading':break;case'destinationsReady':this.onDestinationsReady();break;case'ready':this.onReady();break;case'readyExecuted':default:break;}}catch(err){const issue='Failed to load the SDK';this.errorHandler.onError(getMutatedError(err,issue),ANALYTICS_CORE);}});}onBrowserCapabilitiesReady(){// initialize the preloaded events enqueuing
         
     | 
| 
       1545 
1550 
     | 
    
         
             
            retrievePreloadBufferEvents(this);this.prepareInternalServices();this.loadConfig();}onLoaded(){this.processBufferedEvents();// Short-circuit the life cycle and move to the ready state if pre-consent behavior is enabled
         
     | 
| 
       1546 
1551 
     | 
    
         
             
            if(state.consents.preConsent.value.enabled===true){state.lifecycle.status.value='ready';}else {this.loadDestinations();}}/**
         
     | 
| 
       1547 
1552 
     | 
    
         
             
               * Load browser polyfill if required
         
     | 
| 
         @@ -1572,7 +1577,7 @@ n(()=>{state.lifecycle.loaded.value=true;state.lifecycle.status.value='loaded';} 
     | 
|
| 
       1572 
1577 
     | 
    
         
             
            dispatchSDKEvent('RSA_Initialised');}/**
         
     | 
| 
       1573 
1578 
     | 
    
         
             
               * Emit ready event
         
     | 
| 
       1574 
1579 
     | 
    
         
             
               */ // eslint-disable-next-line class-methods-use-this
         
     | 
| 
       1575 
     | 
    
         
            -
            onReady(){state.eventBuffer.readyCallbacksArray.value.forEach(callback=>{try{callback();}catch(err){this.errorHandler.onError(err,ANALYTICS_CORE,READY_CALLBACK_INVOKE_ERROR);}});// Emit an event to use as substitute to the ready callback
         
     | 
| 
      
 1580 
     | 
    
         
            +
            onReady(){state.lifecycle.status.value='readyExecuted';state.eventBuffer.readyCallbacksArray.value.forEach(callback=>{try{callback();}catch(err){this.errorHandler.onError(err,ANALYTICS_CORE,READY_CALLBACK_INVOKE_ERROR);}});// Emit an event to use as substitute to the ready callback
         
     | 
| 
       1576 
1581 
     | 
    
         
             
            dispatchSDKEvent('RSA_Ready');}/**
         
     | 
| 
       1577 
1582 
     | 
    
         
             
               * Consume preloaded events buffer
         
     | 
| 
       1578 
1583 
     | 
    
         
             
               */processBufferedEvents(){// This logic has been intentionally implemented without a simple
         
     | 
| 
         @@ -1595,7 +1600,7 @@ ready(callback,isBufferedInvocation=false){const type='ready';if(!state.lifecycl 
     | 
|
| 
       1595 
1600 
     | 
    
         
             
                 * If destinations are loaded or no integration is available for loading
         
     | 
| 
       1596 
1601 
     | 
    
         
             
                 * execute the callback immediately else push the callbacks to a queue that
         
     | 
| 
       1597 
1602 
     | 
    
         
             
                 * will be executed after loading completes
         
     | 
| 
       1598 
     | 
    
         
            -
                 */if(state.lifecycle.status.value==='ready'){try{callback();}catch(err){this.errorHandler.onError(err,ANALYTICS_CORE,READY_CALLBACK_INVOKE_ERROR);}}else {state.eventBuffer.readyCallbacksArray.value. 
     | 
| 
      
 1603 
     | 
    
         
            +
                 */if(state.lifecycle.status.value==='ready'){try{callback();}catch(err){this.errorHandler.onError(err,ANALYTICS_CORE,READY_CALLBACK_INVOKE_ERROR);}}else {state.eventBuffer.readyCallbacksArray.value=[...state.eventBuffer.readyCallbacksArray.value,callback];}}page(payload,isBufferedInvocation=false){const type='page';if(!state.lifecycle.loaded.value){state.eventBuffer.toBeProcessedArray.value=[...state.eventBuffer.toBeProcessedArray.value,[type,payload]];return;}this.errorHandler.leaveBreadcrumb(`New ${type} event`);state.metrics.triggered.value+=1;this.eventManager?.addEvent({type:'page',category:payload.category,name:payload.name,properties:payload.properties,options:payload.options,callback:payload.callback});// TODO: Maybe we should alter the behavior to send the ad-block page event even if the SDK is still loaded. It'll be pushed into the to be processed queue.
         
     | 
| 
       1599 
1604 
     | 
    
         
             
            // Send automatic ad blocked page event if ad-blockers are detected on the page
         
     | 
| 
       1600 
1605 
     | 
    
         
             
            // Check page category to avoid infinite loop
         
     | 
| 
       1601 
1606 
     | 
    
         
             
            if(state.capabilities.isAdBlocked.value===true&&payload.category!==ADBLOCK_PAGE_CATEGORY){this.page(pageArgumentsToCallOptions(ADBLOCK_PAGE_CATEGORY,ADBLOCK_PAGE_NAME,{// 'title' is intentionally omitted as it does not make sense
         
     | 
| 
         @@ -410,7 +410,7 @@ 
     | 
|
| 
       410 
410 
     | 
    
         | 
| 
       411 
411 
     | 
    
         
             
              const CAPABILITIES_MANAGER='CapabilitiesManager';const CONFIG_MANAGER='ConfigManager';const EVENT_MANAGER='EventManager';const PLUGINS_MANAGER='PluginsManager';const USER_SESSION_MANAGER='UserSessionManager';const ERROR_HANDLER='ErrorHandler';const PLUGIN_ENGINE='PluginEngine';const STORE_MANAGER='StoreManager';const READY_API='readyApi';const EVENT_REPOSITORY='EventRepository';const EXTERNAL_SRC_LOADER='ExternalSrcLoader';const HTTP_CLIENT='HttpClient';const RS_APP='RudderStackApplication';const ANALYTICS_CORE='AnalyticsCore';
         
     | 
| 
       412 
412 
     | 
    
         | 
| 
       413 
     | 
    
         
            -
              const APP_NAME='RudderLabs JavaScript SDK';const APP_VERSION='3.0.0-beta. 
     | 
| 
      
 413 
     | 
    
         
            +
              const APP_NAME='RudderLabs JavaScript SDK';const APP_VERSION='3.0.0-beta.16';const APP_NAMESPACE='com.rudderlabs.javascript';const MODULE_TYPE='npm';const ADBLOCK_PAGE_CATEGORY='RudderJS-Initiated';const ADBLOCK_PAGE_NAME='ad-block page request';const ADBLOCK_PAGE_PATH='/ad-blocked';const GLOBAL_PRELOAD_BUFFER='preloadedEventsBuffer';const CONSENT_TRACK_EVENT_NAME='Consent Management Interaction';
         
     | 
| 
       414 
414 
     | 
    
         | 
| 
       415 
415 
     | 
    
         
             
              const QUERY_PARAM_TRAIT_PREFIX='ajs_trait_';const QUERY_PARAM_PROPERTY_PREFIX='ajs_prop_';const QUERY_PARAM_ANONYMOUS_ID_KEY='ajs_aid';const QUERY_PARAM_USER_ID_KEY='ajs_uid';const QUERY_PARAM_TRACK_EVENT_NAME_KEY='ajs_event';
         
     | 
| 
       416 
416 
     | 
    
         | 
| 
         @@ -576,7 +576,7 @@ 
     | 
|
| 
       576 
576 
     | 
    
         | 
| 
       577 
577 
     | 
    
         
             
              const metricsState={retries:a(0),dropped:a(0),sent:a(0),queued:a(0),triggered:a(0)};
         
     | 
| 
       578 
578 
     | 
    
         | 
| 
       579 
     | 
    
         
            -
              const contextState={app:a({name:APP_NAME,namespace:APP_NAMESPACE,version:APP_VERSION}),traits:a(null),library:a({name:APP_NAME,version:APP_VERSION}),userAgent:a(''),device:a(null),network:a(null),os:a({name:'',version:''}),locale:a(null),screen:a({density:0,width:0,height:0,innerWidth:0,innerHeight:0}),'ua-ch':a(undefined),timezone:a(undefined)};
         
     | 
| 
      
 579 
     | 
    
         
            +
              const contextState={app:a({name:APP_NAME,namespace:APP_NAMESPACE,version:APP_VERSION}),traits:a(null),library:a({name:APP_NAME,version:APP_VERSION,snippetVersion:globalThis.RudderSnippetVersion}),userAgent:a(''),device:a(null),network:a(null),os:a({name:'',version:''}),locale:a(null),screen:a({density:0,width:0,height:0,innerWidth:0,innerHeight:0}),'ua-ch':a(undefined),timezone:a(undefined)};
         
     | 
| 
       580 
580 
     | 
    
         | 
| 
       581 
581 
     | 
    
         
             
              const nativeDestinationsState={configuredDestinations:a([]),activeDestinations:a([]),loadOnlyIntegrations:a({}),failedDestinations:a([]),loadIntegration:a(true),initializedDestinations:a([]),clientDestinationsReady:a(false),integrationsConfig:a({})};
         
     | 
| 
       582 
582 
     | 
    
         | 
| 
         @@ -644,7 +644,7 @@ 
     | 
|
| 
       644 
644 
     | 
    
         
             
               */const pluginNamesList=['BeaconQueue','Bugsnag','CustomConsentManager','DeviceModeDestinations','DeviceModeTransformation','ErrorReporting','ExternalAnonymousId','GoogleLinker','KetchConsentManager','NativeDestinationQueue','OneTrustConsentManager','StorageEncryption','StorageEncryptionLegacy','StorageMigrator','XhrQueue'];
         
     | 
| 
       645 
645 
     | 
    
         | 
| 
       646 
646 
     | 
    
         
             
              const remotesMap = {
         
     | 
| 
       647 
     | 
    
         
            -
              'rudderAnalyticsRemotePlugins':{url:()=>Promise.resolve(window.RudderStackGlobals && window.RudderStackGlobals.app && window.RudderStackGlobals.app.pluginsCDNPath ? "" + window.RudderStackGlobals.app.pluginsCDNPath + "/rsa-plugins.js" : "https://cdn.rudderlabs.com/3.0.0-beta. 
     | 
| 
      
 647 
     | 
    
         
            +
              'rudderAnalyticsRemotePlugins':{url:()=>Promise.resolve(window.RudderStackGlobals && window.RudderStackGlobals.app && window.RudderStackGlobals.app.pluginsCDNPath ? "" + window.RudderStackGlobals.app.pluginsCDNPath + "/rsa-plugins.js" : "https://cdn.rudderlabs.com/3.0.0-beta.16/modern/plugins/rsa-plugins.js"),format:'esm',from:'vite'}
         
     | 
| 
       648 
648 
     | 
    
         
             
              };
         
     | 
| 
       649 
649 
     | 
    
         
             
                              const loadJS = async (url, fn) => {
         
     | 
| 
       650 
650 
     | 
    
         
             
                                  const resolvedUrl = typeof url === 'function' ? await url() : url;
         
     | 
| 
         @@ -819,7 +819,7 @@ 
     | 
|
| 
       819 
819 
     | 
    
         | 
| 
       820 
820 
     | 
    
         
             
              const getUserAgentClientHint=(callback,level='none')=>{if(level==='none'){callback(undefined);}if(level==='default'){callback(navigator.userAgentData);}if(level==='full'){navigator.userAgentData?.getHighEntropyValues(['architecture','bitness','brands','mobile','model','platform','platformVersion','uaFullVersion','fullVersionList','wow64']).then(ua=>{callback(ua);}).catch(()=>{callback();});}};
         
     | 
| 
       821 
821 
     | 
    
         | 
| 
       822 
     | 
    
         
            -
              const isDatasetAvailable=()=>{const testElement=document.createElement('div');testElement.setAttribute('data-a-b','c');return testElement.dataset?testElement.dataset.aB==='c':false;};const legacyJSEngineRequiredPolyfills={ 
     | 
| 
      
 822 
     | 
    
         
            +
              const isDatasetAvailable=()=>{const testElement=document.createElement('div');testElement.setAttribute('data-a-b','c');return testElement.dataset?testElement.dataset.aB==='c':false;};const legacyJSEngineRequiredPolyfills={URL:()=>!isFunction(globalThis.URL)||!globalThis.URLSearchParams,MutationObserver:()=>isUndefined(MutationObserver),Promise:()=>isUndefined(Promise),'Number.isNaN':()=>!Number.isNaN,'Number.isInteger':()=>!Number.isInteger,'Array.from':()=>!Array.from,'Array.prototype.find':()=>!Array.prototype.find,'Array.prototype.includes':()=>!Array.prototype.includes,'String.prototype.endsWith':()=>!String.prototype.endsWith,'String.prototype.startsWith':()=>!String.prototype.startsWith,'String.prototype.includes':()=>!String.prototype.includes,'Object.entries':()=>!Object.entries,'Object.values':()=>!Object.values,'Object.assign':()=>typeof Object.assign!=='function','Element.prototype.dataset':()=>!isDatasetAvailable(),'String.prototype.replaceAll':()=>!String.prototype.replaceAll,TextEncoder:()=>isUndefined(TextEncoder)||isUndefined(TextDecoder),'String.fromCodePoint':()=>!String.fromCodePoint,requestAnimationFrame:()=>!isFunction(globalThis.requestAnimationFrame)||!isFunction(globalThis.cancelAnimationFrame),CustomEvent:()=>!isFunction(globalThis.CustomEvent),/* eslint-disable-next-line */'navigator.sendBeacon':()=>!isFunction(navigator.sendBeacon),ArrayBuffer:()=>!isFunction(Uint8Array)};const isLegacyJSEngine=()=>{const requiredCapabilitiesList=Object.keys(legacyJSEngineRequiredPolyfills);let needsPolyfill=false;/* eslint-disable-next-line unicorn/no-for-loop */for(let i=0;i<requiredCapabilitiesList.length;i++){const isCapabilityMissing=legacyJSEngineRequiredPolyfills[requiredCapabilitiesList[i]];if(isFunction(isCapabilityMissing)&&isCapabilityMissing()){needsPolyfill=true;break;}}return needsPolyfill;};
         
     | 
| 
       823 
823 
     | 
    
         | 
| 
       824 
824 
     | 
    
         
             
              const getScreenDetails=()=>{let screenDetails={density:0,width:0,height:0,innerWidth:0,innerHeight:0};screenDetails={width:globalThis.screen.width,height:globalThis.screen.height,density:globalThis.devicePixelRatio,innerWidth:globalThis.innerWidth,innerHeight:globalThis.innerHeight};return screenDetails;};
         
     | 
| 
       825 
825 
     | 
    
         | 
| 
         @@ -1068,6 +1068,11 @@ 
     | 
|
| 
       1068 
1068 
     | 
    
         
             
              if(serverUrl){return serverUrl;}// return undefined if data plane url can not be determined
         
     | 
| 
       1069 
1069 
     | 
    
         
             
              return undefined;};
         
     | 
| 
       1070 
1070 
     | 
    
         | 
| 
      
 1071 
     | 
    
         
            +
              /**
         
     | 
| 
      
 1072 
     | 
    
         
            +
               * Determines if the SDK is running inside a chrome extension
         
     | 
| 
      
 1073 
     | 
    
         
            +
               * @returns boolean
         
     | 
| 
      
 1074 
     | 
    
         
            +
               */const isSDKRunningInChromeExtension=()=>!!(window.chrome&&window.chrome.runtime&&window.chrome.runtime.id);
         
     | 
| 
      
 1075 
     | 
    
         
            +
             
     | 
| 
       1071 
1076 
     | 
    
         
             
              const DEFAULT_PRE_CONSENT_STORAGE_STRATEGY='none';const DEFAULT_PRE_CONSENT_EVENTS_DELIVERY_TYPE='immediate';
         
     | 
| 
       1072 
1077 
     | 
    
         | 
| 
       1073 
1078 
     | 
    
         
             
              const isErrorReportingEnabled=sourceConfig=>sourceConfig?.statsCollection?.errors?.enabled===true;const getErrorReportingProviderNameFromConfig=sourceConfig=>sourceConfig?.statsCollection?.errors?.provider;const isMetricsReportingEnabled=sourceConfig=>sourceConfig?.statsCollection?.metrics?.enabled===true;
         
     | 
| 
         @@ -1105,7 +1110,7 @@ 
     | 
|
| 
       1105 
1110 
     | 
    
         
             
               * Updates the reporting state variables from the source config data
         
     | 
| 
       1106 
1111 
     | 
    
         
             
               * @param res Source config
         
     | 
| 
       1107 
1112 
     | 
    
         
             
               * @param logger Logger instance
         
     | 
| 
       1108 
     | 
    
         
            -
               */const updateReportingState=(res,logger)=>{state.reporting.isErrorReportingEnabled.value=isErrorReportingEnabled(res.source.config);state.reporting.isMetricsReportingEnabled.value=isMetricsReportingEnabled(res.source.config);if(state.reporting.isErrorReportingEnabled.value){const errReportingProvider=getErrorReportingProviderNameFromConfig(res.source.config);// Get the corresponding plugin name of the selected error reporting provider from the supported error reporting providers
         
     | 
| 
      
 1113 
     | 
    
         
            +
               */const updateReportingState=(res,logger)=>{state.reporting.isErrorReportingEnabled.value=isErrorReportingEnabled(res.source.config)&&!isSDKRunningInChromeExtension();state.reporting.isMetricsReportingEnabled.value=isMetricsReportingEnabled(res.source.config);if(state.reporting.isErrorReportingEnabled.value){const errReportingProvider=getErrorReportingProviderNameFromConfig(res.source.config);// Get the corresponding plugin name of the selected error reporting provider from the supported error reporting providers
         
     | 
| 
       1109 
1114 
     | 
    
         
             
              const errReportingProviderPlugin=errReportingProvider?ErrorReportingProvidersToPluginNameMap[errReportingProvider]:undefined;if(!isUndefined(errReportingProvider)&&!errReportingProviderPlugin){// set the default error reporting provider
         
     | 
| 
       1110 
1115 
     | 
    
         
             
              logger?.warn(UNSUPPORTED_ERROR_REPORTING_PROVIDER_WARNING(CONFIG_MANAGER,errReportingProvider,ErrorReportingProvidersToPluginNameMap,DEFAULT_ERROR_REPORTING_PROVIDER));}state.reporting.errorReportingProviderPluginName.value=errReportingProviderPlugin??ErrorReportingProvidersToPluginNameMap[DEFAULT_ERROR_REPORTING_PROVIDER];}};const updateStorageStateFromLoadOptions=logger=>{const storageOptsFromLoad=state.loadOptions.value.storage;let storageType=storageOptsFromLoad?.type;if(isDefined(storageType)&&!isValidStorageType(storageType)){logger?.warn(STORAGE_TYPE_VALIDATION_WARNING(CONFIG_MANAGER,storageType,DEFAULT_STORAGE_TYPE));storageType=DEFAULT_STORAGE_TYPE;}let storageEncryptionVersion=storageOptsFromLoad?.encryption?.version;const encryptionPluginName=storageEncryptionVersion&&StorageEncryptionVersionsToPluginNameMap[storageEncryptionVersion];if(!isUndefined(storageEncryptionVersion)&&isUndefined(encryptionPluginName)){// set the default encryption plugin
         
     | 
| 
       1111 
1116 
     | 
    
         
             
              logger?.warn(UNSUPPORTED_STORAGE_ENCRYPTION_VERSION_WARNING(CONFIG_MANAGER,storageEncryptionVersion,StorageEncryptionVersionsToPluginNameMap,DEFAULT_STORAGE_ENCRYPTION_VERSION));storageEncryptionVersion=DEFAULT_STORAGE_ENCRYPTION_VERSION;}else if(isUndefined(storageEncryptionVersion)){storageEncryptionVersion=DEFAULT_STORAGE_ENCRYPTION_VERSION;}// Allow migration only if the configured encryption version is the default encryption version
         
     | 
| 
         @@ -1190,7 +1195,7 @@ 
     | 
|
| 
       1190 
1195 
     | 
    
         
             
              if(urlObj.search===''){pageUrl=canonicalUrl+search;}else {pageUrl=canonicalUrl;}path=urlObj.pathname;}catch(err){// Do nothing
         
     | 
| 
       1191 
1196 
     | 
    
         
             
              }}const url=getUrlWithoutHash(pageUrl);const{title}=document;const referrer=getReferrer();return {path,referrer,referring_domain:getReferringDomain(referrer),search,title,url,tab_url:tabUrl};};
         
     | 
| 
       1192 
1197 
     | 
    
         | 
| 
       1193 
     | 
    
         
            -
              const POLYFILL_URL=`https://polyfill.io/v3/polyfill.min.js?features=${Object.keys(legacyJSEngineRequiredPolyfills).join('%2C')}`;const POLYFILL_LOAD_TIMEOUT=10*1000;// 10 seconds
         
     | 
| 
      
 1198 
     | 
    
         
            +
              const POLYFILL_URL=`https://polyfill.io/v3/polyfill.min.js?version=3.111.0&features=${Object.keys(legacyJSEngineRequiredPolyfills).join('%2C')}`;const POLYFILL_LOAD_TIMEOUT=10*1000;// 10 seconds
         
     | 
| 
       1194 
1199 
     | 
    
         
             
              const POLYFILL_SCRIPT_ID='rudderstackPolyfill';
         
     | 
| 
       1195 
1200 
     | 
    
         | 
| 
       1196 
1201 
     | 
    
         
             
              class CapabilitiesManager{constructor(errorHandler,logger){this.logger=logger;this.errorHandler=errorHandler;this.externalSrcLoader=new ExternalSrcLoader(this.errorHandler,this.logger);this.onError=this.onError.bind(this);this.onReady=this.onReady.bind(this);}init(){try{this.prepareBrowserCapabilities();this.attachWindowListeners();}catch(err){this.onError(err);}}/**
         
     | 
| 
         @@ -1547,7 +1552,7 @@ 
     | 
|
| 
       1547 
1552 
     | 
    
         
             
              this.startLifecycle();}// Start lifecycle methods
         
     | 
| 
       1548 
1553 
     | 
    
         
             
              /**
         
     | 
| 
       1549 
1554 
     | 
    
         
             
                 * Orchestrate the lifecycle of the application phases/status
         
     | 
| 
       1550 
     | 
    
         
            -
                 */startLifecycle(){O(()=>{try{switch(state.lifecycle.status.value){case'mounted':this.onMounted();break;case'browserCapabilitiesReady':this.onBrowserCapabilitiesReady();break;case'configured':this.onConfigured();break;case'pluginsLoading':break;case'pluginsReady':this.onPluginsReady();break;case'initialized':this.onInitialized();break;case'loaded':this.onLoaded();break;case'destinationsLoading':break;case'destinationsReady':this.onDestinationsReady();break;case'ready':this.onReady();break;default:break;}}catch(err){const issue='Failed to load the SDK';this.errorHandler.onError(getMutatedError(err,issue),ANALYTICS_CORE);}});}onBrowserCapabilitiesReady(){// initialize the preloaded events enqueuing
         
     | 
| 
      
 1555 
     | 
    
         
            +
                 */startLifecycle(){O(()=>{try{switch(state.lifecycle.status.value){case'mounted':this.onMounted();break;case'browserCapabilitiesReady':this.onBrowserCapabilitiesReady();break;case'configured':this.onConfigured();break;case'pluginsLoading':break;case'pluginsReady':this.onPluginsReady();break;case'initialized':this.onInitialized();break;case'loaded':this.onLoaded();break;case'destinationsLoading':break;case'destinationsReady':this.onDestinationsReady();break;case'ready':this.onReady();break;case'readyExecuted':default:break;}}catch(err){const issue='Failed to load the SDK';this.errorHandler.onError(getMutatedError(err,issue),ANALYTICS_CORE);}});}onBrowserCapabilitiesReady(){// initialize the preloaded events enqueuing
         
     | 
| 
       1551 
1556 
     | 
    
         
             
              retrievePreloadBufferEvents(this);this.prepareInternalServices();this.loadConfig();}onLoaded(){this.processBufferedEvents();// Short-circuit the life cycle and move to the ready state if pre-consent behavior is enabled
         
     | 
| 
       1552 
1557 
     | 
    
         
             
              if(state.consents.preConsent.value.enabled===true){state.lifecycle.status.value='ready';}else {this.loadDestinations();}}/**
         
     | 
| 
       1553 
1558 
     | 
    
         
             
                 * Load browser polyfill if required
         
     | 
| 
         @@ -1578,7 +1583,7 @@ 
     | 
|
| 
       1578 
1583 
     | 
    
         
             
              dispatchSDKEvent('RSA_Initialised');}/**
         
     | 
| 
       1579 
1584 
     | 
    
         
             
                 * Emit ready event
         
     | 
| 
       1580 
1585 
     | 
    
         
             
                 */ // eslint-disable-next-line class-methods-use-this
         
     | 
| 
       1581 
     | 
    
         
            -
              onReady(){state.eventBuffer.readyCallbacksArray.value.forEach(callback=>{try{callback();}catch(err){this.errorHandler.onError(err,ANALYTICS_CORE,READY_CALLBACK_INVOKE_ERROR);}});// Emit an event to use as substitute to the ready callback
         
     | 
| 
      
 1586 
     | 
    
         
            +
              onReady(){state.lifecycle.status.value='readyExecuted';state.eventBuffer.readyCallbacksArray.value.forEach(callback=>{try{callback();}catch(err){this.errorHandler.onError(err,ANALYTICS_CORE,READY_CALLBACK_INVOKE_ERROR);}});// Emit an event to use as substitute to the ready callback
         
     | 
| 
       1582 
1587 
     | 
    
         
             
              dispatchSDKEvent('RSA_Ready');}/**
         
     | 
| 
       1583 
1588 
     | 
    
         
             
                 * Consume preloaded events buffer
         
     | 
| 
       1584 
1589 
     | 
    
         
             
                 */processBufferedEvents(){// This logic has been intentionally implemented without a simple
         
     | 
| 
         @@ -1601,7 +1606,7 @@ 
     | 
|
| 
       1601 
1606 
     | 
    
         
             
                   * If destinations are loaded or no integration is available for loading
         
     | 
| 
       1602 
1607 
     | 
    
         
             
                   * execute the callback immediately else push the callbacks to a queue that
         
     | 
| 
       1603 
1608 
     | 
    
         
             
                   * will be executed after loading completes
         
     | 
| 
       1604 
     | 
    
         
            -
                   */if(state.lifecycle.status.value==='ready'){try{callback();}catch(err){this.errorHandler.onError(err,ANALYTICS_CORE,READY_CALLBACK_INVOKE_ERROR);}}else {state.eventBuffer.readyCallbacksArray.value. 
     | 
| 
      
 1609 
     | 
    
         
            +
                   */if(state.lifecycle.status.value==='ready'){try{callback();}catch(err){this.errorHandler.onError(err,ANALYTICS_CORE,READY_CALLBACK_INVOKE_ERROR);}}else {state.eventBuffer.readyCallbacksArray.value=[...state.eventBuffer.readyCallbacksArray.value,callback];}}page(payload,isBufferedInvocation=false){const type='page';if(!state.lifecycle.loaded.value){state.eventBuffer.toBeProcessedArray.value=[...state.eventBuffer.toBeProcessedArray.value,[type,payload]];return;}this.errorHandler.leaveBreadcrumb(`New ${type} event`);state.metrics.triggered.value+=1;this.eventManager?.addEvent({type:'page',category:payload.category,name:payload.name,properties:payload.properties,options:payload.options,callback:payload.callback});// TODO: Maybe we should alter the behavior to send the ad-block page event even if the SDK is still loaded. It'll be pushed into the to be processed queue.
         
     | 
| 
       1605 
1610 
     | 
    
         
             
              // Send automatic ad blocked page event if ad-blockers are detected on the page
         
     | 
| 
       1606 
1611 
     | 
    
         
             
              // Check page category to avoid infinite loop
         
     | 
| 
       1607 
1612 
     | 
    
         
             
              if(state.capabilities.isAdBlocked.value===true&&payload.category!==ADBLOCK_PAGE_CATEGORY){this.page(pageArgumentsToCallOptions(ADBLOCK_PAGE_CATEGORY,ADBLOCK_PAGE_NAME,{// 'title' is intentionally omitted as it does not make sense
         
     |